7 static void FFT (float data[], LONG nn, LONG isign);
8 static void RealFFT (float data[], LONG n, LONG isign);
9 static void MyFFT (double *real_vet, double *im_vet, long n, int m, int ind, double cf);
15 /* Disable SAS/C floating point error handler */
16 void __stdargs _CXFERR(int code)
23 GLOBALCALL void Filter (WORD *data, LONG len)
29 /* Calculate nearest power of 2 */
30 for (i = len-1, nn = 1; i != 0; i >>= 1)
33 if (!(fftdata = AllocVec (sizeof (float) * nn * 2, MEMF_CLEAR)))
36 /* Fill array of complex numbers (imaginary part is always set to 0) */
37 for (i = 0; i < len; i++)
38 fftdata[i] = (float) data[i];
41 /* Obtain frequency spectrum */
42 RealFFT (fftdata, nn>>1, 1);
45 for (i = 0; i < nn; i++)
46 fftdata[i*2] *= (i/nn) * 4;
48 /* Return to time domain */
49 RealFFT (fftdata, nn>>1, -1);
50 for (i = 0; i < len; i++)
53 /* Put filtered data */
54 for (i = 0; i < len; i++)
55 data[i] = (WORD) fftdata[i];
62 GLOBALCALL void Filter (WORD *data, LONG len)
68 /* Calculate nearest power of 2 */
69 for (i = len-1, nn = 1, mm = 0; i != 0; i >>= 1)
75 if (!(fftdata = AllocVec (sizeof (double) * nn * 2, MEMF_CLEAR)))
78 /* Fill array of complex numbers (imaginary part is always set to 0) */
79 for (i = 0; i < len; i++)
80 fftdata[i] = (float) data[i];
83 /* Obtain frequency spectrum */
84 MyFFT (fftdata, fftdata + nn, nn>>1, mm, +1, 1.0/32768.0);
87 // for (i = 0; i < nn; i++)
88 // fftdata[i] *= (i/nn) * 4;
90 /* Return to time domain */
91 MyFFT (fftdata, fftdata + nn, nn>>1, mm, -1, 1.0);
93 // for (i = 0; i < len; i++)
96 /* Put filtered data */
97 for (i = 0; i < len; i++)
98 data[i] = (WORD) fftdata[i];
105 #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr
107 static void FFT (float data[], LONG nn, LONG isign)
109 int n,mmax,m,j,istep,i;
110 double wtemp,wr,wpr,wpi,wi,theta;
119 SWAP(data[j],data[i]);
120 SWAP(data[j+1],data[i+1]);
123 while (m >= 2 && j > m)
134 theta=6.28318530717959/(isign*mmax);
135 wtemp=sin(0.5*theta);
136 wpr = -2.0*wtemp*wtemp;
140 for (m=1;m<mmax;m+=2)
142 for (i=m;i<=n;i+=istep)
145 tempr=wr*data[j]-wi*data[j+1];
146 tempi=wr*data[j+1]+wi*data[j];
147 data[j]=data[i]-tempr;
148 data[j+1]=data[i+1]-tempi;
152 wr=(wtemp=wr)*wpr-wi*wpi+wr;
153 wi=wi*wpr+wtemp*wpi+wi;
160 static void RealFFT (float data[], LONG n, LONG isign)
162 int i,i1,i2,i3,i4,n2p3;
163 float c1=0.5,c2,h1r,h1i,h2r,h2i;
164 double wr,wi,wpr,wpi,wtemp,theta;
167 theta=3.141592653589793/(double) n;
179 wtemp=sin(0.5*theta);
180 wpr = -2.0*wtemp*wtemp;
187 i4=1+(i3=n2p3-(i2=1+(i1=i+i-1)));
188 h1r=c1*(data[i1]+data[i3]);
189 h1i=c1*(data[i2]-data[i4]);
190 h2r = -c2*(data[i2]+data[i4]);
191 h2i=c2*(data[i1]-data[i3]);
192 data[i1]=h1r+wr*h2r-wi*h2i;
193 data[i2]=h1i+wr*h2i+wi*h2r;
194 data[i3]=h1r-wr*h2r+wi*h2i;
195 data[i4] = -h1i+wr*h2i+wi*h2r;
196 wr=(wtemp=wr)*wpr-wi*wpi+wr;
197 wi=wi*wpr+wtemp*wpi+wi;
201 data[1] = (h1r=data[1])+data[2];
202 data[2] = h1r-data[2];
206 data[1]=c1*((h1r=data[1])+data[2]);
207 data[2]=c1*(h1r-data[2]);
216 static void MyFFT (double *real_vet, double *im_vet, long n, int m, int ind, double cf)
218 long l, i, j, nbut, ngrup, nc;
225 // Ordinamento binario del vettore
228 for (i = 0 ; i< n-1; i++)
232 t_real = real_vet[j];
234 real_vet[j] = real_vet[i];
235 im_vet[j] = im_vet[i];
236 real_vet[i] = t_real;
249 for(l=0; l<m; l++) //Ciclo esterno Log2(N)
253 for(but = 0; but < nbut; but++) //Ciclo medio: numero di farfalle
255 arg = PI * but / nbut; // M_PI e' la costante PI Greco
257 w_im = (-1)*ind*sin(arg);
258 for(grup = 0; grup < ngrup; grup++) //Ciclo interno: numero di gruppi
260 primo = 2*nbut*grup + but;
261 secondo = primo + nbut;
262 t_real = w_real * real_vet[secondo] - w_im * im_vet[secondo];
263 t_im = w_real * im_vet[secondo] + w_im * real_vet[secondo];
264 real_vet[secondo] = real_vet[primo] - t_real;
265 im_vet[secondo] = im_vet[primo] - t_im;
266 real_vet[primo] += t_real;
267 im_vet[primo] += t_im;
273 if (cf != 1.0) // Modifica di Bernardo
274 for(i = 0; i < n; i++)