www.pudn.com > howtofft_src.zip > Fourier.cpp
/********************************************************/ /* WARNING: */ /* This code cannot be used in any aplication */ /* without permition of the author */ /* for more information please read the license in the */ /* Numerical Recipies in C book or go to www.nr.com */ /* this is mearly an example of how to use it */ /********************************************************/ #include "StdAfx.h" #include#include ".\fourier.h" #define SWAP(a,b) tempr=(a);(a)=(b);(b)=tempr CFourier::CFourier(void) { pi=4*atan((double)1);vector=NULL; } CFourier::~CFourier(void) {if(vector!=NULL) delete [] vector; } // FFT 1D void CFourier::ComplexFFT(float data[], unsigned long number_of_samples, unsigned int sample_rate, int sign) { //variables for the fft unsigned long n,mmax,m,j,istep,i; double wtemp,wr,wpr,wpi,wi,theta,tempr,tempi; //the complex array is real+complex so the array //as a size n = 2* number of complex samples //real part is the data[index] and //the complex part is the data[index+1] //new complex array of size n=2*sample_rate if(vector!=NULL) delete [] vector; vector=new float [2*sample_rate]; //put the real array in a complex array //the complex part is filled with 0's //the remaining vector with no data is filled with 0's for(n=0; n i) { SWAP(vector[j],vector[i]); SWAP(vector[j+1],vector[i+1]); if((j/2)<(n/4)){ SWAP(vector[(n-(i+2))],vector[(n-(j+2))]); SWAP(vector[(n-(i+2))+1],vector[(n-(j+2))+1]); } } m=n >> 1; while (m >= 2 && j >= m) { j -= m; m >>= 1; } j += m; } //end of the bit-reversed order algorithm //Danielson-Lanzcos routine mmax=2; while (n > mmax) { istep=mmax << 1; theta=sign*(2*pi/mmax); wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; for (m=1;m (pow(vector[fundamental_frequency],2)+pow(vector[fundamental_frequency+1],2))){ fundamental_frequency=i; } } //since the array of complex has the format [real][complex]=>[absolute value] //the maximum absolute value must be ajusted to half fundamental_frequency=(long)floor((float)fundamental_frequency/2); }