菜鸟求助,看不懂一维快速傅里叶变换的VC实现
yzh浣熊 2014-03-21 04:39:22 程序如下:
希望有大神帮忙解答
//循环变量
int i, k, r;
//申请临时复数缓冲区buf1,长度为n
ComplexNumber *buf1=new ComplexNumber[n];
//将arrayBuf拷贝进buf1
memcpy(buf1,arrayBuf,sizeof(ComplexNumber)*n);
//申请临时复数缓冲区buf2,长度为n
ComplexNumber *buf2=new ComplexNumber[n];
//将arrayBuf数组元素基2抽取并重新排列
//若0、1、2、3、4、5、6、7八点序列对调后变作0、4、2、6、1、5、3、7
int t1,t2;
for(r=1;pow(2,r)<n;r++){
t1=pow(2,r);
t2=pow(2,r-1);
for(k=0;k<t1;k++){
for(i=0;i<n/t1;i++){
buf2[k*n/t1+i].real=buf1[k/2*n/t2+i*2+k%2].real;
buf2[k*n/t1+i].imag=buf1[k/2*n/t2+i*2+k%2].imag;
}
}
memcpy(buf1,buf2,sizeof(ComplexNumber)*n);
}
//采用蝶型算法进行快速傅立叶变换
//buf1是第r级的输入,buf2存放第r级的输出
float c,s;
for(r=1;pow(2,r)<=n;r++){
t1=pow(2,r);
for(k=0;k<n/t1;k++){
for(i=t1/2;i<t1;i++){
//加权因子
c=cos(-2*PI*(i-t1/2)/t1);
s=sin(-2*PI*(i-t1/2)/t1);
buf1[k*t1+i].real= buf2[k*t1+i].real*c - buf2[k*t1+i].imag*s;
buf1[k*t1+i].imag=buf2[k*t1+i].imag*c+buf2[k*t1+i].real*s;
}
}
for(k=0; k<n/t1; k++){
for(i=0;i<t1/2;i++){
buf2[k*t1+i].real= buf1[k*t1+i].real+buf1[k*t1+i+t1/2].real;
buf2[k*t1+i].imag= buf1[k*t1+i].imag+buf1[k*t1+i+t1/2].imag;
}
for(i=t1/2;i<t1;i++){
buf2[k*t1+i].real= buf1[k*t1+i-t1/2].real-buf1[k*t1+i].real;
buf2[k*t1+i].imag= buf1[k*t1+i-t1/2].imag-buf1[k*t1+i].imag;
}
}
//第r级的输出存入buf1,作为下一级的输入数据
memcpy(buf1,buf2,sizeof(ComplexNumber)*n);
}
//傅立叶变换的结果存入arrayBuf
memcpy(arrayBuf,buf2,sizeof(ComplexNumber)*n);
//释放缓冲区
delete[]buf2;
delete[]buf1;