/********************************************************************** Copyright (c) 1991 MPEG/audio software simulation group, 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, 508-493-2241, e-mail: pan@3d.enet.dec.com * * * * VERSION 3.9 * * 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; } }