void fft_inv(double* x_int_re, double* x_int_im, int taille) { int size_2=taille>>1, tmp1; double tmp, tmpcos, tmpsin, base=2*M_PI/taille; const double SQ_2=sqrt(2.0);//const double SQ_2=sqrt(2); QVarLengthArray<double> pair_re(size_2), pair_im(size_2), impair_re(size_2), impair_im(size_2);//double pair_re[size_2], pair_im[size_2], impair_re[size_2], impair_im[size_2]; for(int i=0; i<size_2; i++){ tmp1=i<<1; pair_re[i]=x_int_re[tmp1]; pair_im[i]=x_int_im[tmp1]; impair_re[i]=x_int_re[tmp1+1]; impair_im[i]=x_int_im[tmp1+1]; } if(taille>2){ fft_inv(pair_re.data(), pair_im.data(),size_2);//fft_inv(pair_re, pair_im,size_2); fft_inv(impair_re.data(), impair_im.data(),size_2);//fft_inv(impair_re, impair_im,size_2); } for(int i=0; i<size_2; i++){ tmp=base*i; tmpcos=cos(tmp); tmpsin=sin(tmp); x_int_re[i]=(pair_re[i]+impair_re[i]*tmpcos-impair_im[i]*tmpsin)/SQ_2; x_int_im[i]=(pair_im[i]+impair_im[i]*tmpcos+impair_re[i]*tmpsin)/SQ_2; x_int_re[i+size_2]=(pair_re[i]-impair_re[i]*tmpcos+impair_im[i]*tmpsin)/SQ_2; x_int_im[i+size_2]=(pair_im[i]-impair_im[i]*tmpcos-impair_re[i]*tmpsin)/SQ_2; } }
void fft(double* x_int_re, double* x_int_im, int taille) { int size_2 = taille >> 1, tmp1 = 0; double tmp, tmpcos, tmpsin, base = 2*M_PI/taille; #ifdef Q_CC_MSVC const double SQ_2=sqrt(2.0); QVarLengthArray<double> pair_re(size_2), pair_im(size_2), impair_re(size_2), impair_im(size_2); #else const double SQ_2=sqrt(2); double pair_re[size_2], pair_im[size_2], impair_re[size_2], impair_im[size_2]; #endif for(int i=0; i<size_2; i++){ tmp1=(i<<1); pair_re[i]=x_int_re[tmp1]; pair_im[i]=x_int_im[tmp1]; impair_re[i]=x_int_re[tmp1+1]; impair_im[i]=x_int_im[tmp1+1]; } if(taille>2){ #ifdef Q_CC_MSVC fft(pair_re.data(),pair_im.data(),size_2); fft(impair_re.data(),impair_im.data(),size_2); #else fft(pair_re,pair_im,size_2); fft(impair_re,impair_im,size_2); #endif } for(int i=0; i<size_2; i++){ tmp=base*i; tmpcos=cos(tmp); tmpsin=sin(tmp); x_int_re[i]=(pair_re[i]+impair_re[i]*tmpcos+impair_im[i]*tmpsin)/SQ_2; x_int_im[i]=(pair_im[i]+impair_im[i]*tmpcos-impair_re[i]*tmpsin)/SQ_2; x_int_re[i+size_2]=(pair_re[i]-impair_re[i]*tmpcos-impair_im[i]*tmpsin)/SQ_2; x_int_im[i+size_2]=(pair_im[i]-impair_im[i]*tmpcos+impair_re[i]*tmpsin)/SQ_2; } }