www.pudn.com > ampegsrc.zip > SUBS.C


/********************************************************************** 
Copyright (c) 1991 ISO/IEC JTC1 SC29 WG1, All Rights Reserved 
subs.c 
**********************************************************************/ 
/********************************************************************** 
 * MPEG/audio coding/decoding software, work in progress              * 
 *   NOT for public distribution until verified and approved by the   * 
 *   MPEG/audio committee.  For further information, please contact   * 
 *   Davis Pan, 708-538-5671, e-mail: pan@ukraine.corp.mot.com        * 
 *                                                                    * 
 * VERSION 4.3                                                        * 
 *   changes made since last update:                                  * 
 *   date   programmers         comment                               * 
 * 2/25/91  Davis Pan           start of version 1.0 records          * 
 * 5/10/91  W. Joseph Carter    Ported to Macintosh and Unix.         * 
 * 7/10/91  Earle Jennings      Ported to MsDos from Macintosh        * 
 *                              Replacement of one float with FLOAT   * 
 * 2/11/92  W. Joseph Carter    Added type casting to memset() args.  * 
 * 4/27/92  Masahiro Iwadare    Added 256 point version for Layer III * 
 **********************************************************************/ 
 
#include "common.h" 
#include "encoder.h" 
 
/***************************************************************************** 
 ************************** Start of Subroutines ***************************** 
 *****************************************************************************/ 
 
/***************************************************************************** 
 * FFT computes fast fourier transform of BLKSIZE samples of data            * 
 *   uses decimation-in-frequency algorithm described in "Digital            * 
 *   Signal Processing" by Oppenheim and Schafer, refer to pages 304         * 
 *   (flow graph) and 330-332 (Fortran program in problem 5)                 * 
 *   to get the inverse fft, change line 20 from                             * 
 *                 w_imag[L] = -sin(PI/le1);                                 * 
 *                          to                                               * 
 *                 w_imag[L] = sin(PI/le1);                                  * 
 *                                                                           * 
 *   required constants:                                                     * 
 *         #define      PI          3.14159265358979                         * 
 *         #define      BLKSIZE     1024                                     * 
 *         #define      LOGBLKSIZE  10                                       * 
 *         #define      BLKSIZE_S   256                                      * 
 *         #define      LOGBLKSIZE_S 8                                       * 
 *                                                                           * 
 *****************************************************************************/ 
#define      BLKSIZE_S   256 
#define      LOGBLKSIZE_S 8 
 
void fft(x_real,x_imag, energy, phi, N) 
FLOAT x_real[BLKSIZE], x_imag[BLKSIZE], energy[BLKSIZE], phi[BLKSIZE]; 
int	N; 
{ 
 int     M,MM1; 
 static int     init=0; 
 int     NV2, NM1, MP; 
 static double  w_real[2][LOGBLKSIZE], w_imag[2][LOGBLKSIZE]; 
 int            i,j,k,L; 
 int            ip, le,le1; 
 double         t_real, t_imag, u_real, u_imag; 
 
 if(init==0) { 
    memset((char *) w_real, 0, sizeof(w_real));  /* preset statics to 0 */ 
    memset((char *) w_imag, 0, sizeof(w_imag));  /* preset statics to 0 */ 
    M = LOGBLKSIZE; 
    for(L=0; L> 1; 
       w_real[0][L] = cos(PI/le1); 
       w_imag[0][L] = -sin(PI/le1); 
    }           
    M = LOGBLKSIZE_S; 
    for(L=0; L> 1; 
       w_real[1][L] = cos(PI/le1); 
       w_imag[1][L] = -sin(PI/le1); 
    }           
    init++; 
 } 
 switch(N) { 
	case BLKSIZE: 
			M = LOGBLKSIZE; 
			MP = 0; 
			break; 
	case BLKSIZE_S: 
			M = LOGBLKSIZE_S; 
			MP = 1; 
			break; 
	default:	printf("Error: Bad FFT Size in subs.c\n"); 
			exit(-1); 
 } 
 MM1 = M-1; 
 NV2 = N >> 1; 
 NM1 = N - 1; 
 for(L=0; L> 1; 
    u_real = 1; 
    u_imag = 0; 
    for(j=0; j> 1; 
    } 
    j = j+k; 
 } 
}