C++ 基于递归fft计算的故障分割
我使用基数-2算法在复向量上执行fft。我递归地将我的输入分成两组,第一组和第二组,然后对第一组和第二组执行复杂的加法*旋转因子 函数完成了,但是当我试图输出结果向量时,我收到了一个分段错误。怎么了C++ 基于递归fft计算的故障分割,c++,math,fft,C++,Math,Fft,我使用基数-2算法在复向量上执行fft。我递归地将我的输入分成两组,第一组和第二组,然后对第一组和第二组执行复杂的加法*旋转因子 函数完成了,但是当我试图输出结果向量时,我收到了一个分段错误。怎么了 int main(int argc, char *argv[]){ int n = 8; complex<double> *x = new complex<double>[n]; // Test data x[0] = sin(M_PI/2)
int main(int argc, char *argv[]){
int n = 8;
complex<double> *x = new complex<double>[n];
// Test data
x[0] = sin(M_PI/2);
x[1] = sin(0);
x[2] = sin(0);
x[3] = sin(0);
x[4] = sin(0);
x[5] = sin(0);
x[6] = sin(0);
x[7] = sin(0);
for(int i = 0; i<n; i++){
cout << x[i] << endl;
}
fft(x,n);
cout << endl;
for(int i = 0; i<n; i++){
cout << x[i] << endl;
}
}
void fft(complex<double> *X, int N){
if(N < 1){return;}
double w = 2 * M_PI / (N/2);
for(int i = 0; i<N/2; i++){
double ang = w * i;
complex<double> tw(cos(ang),sin(ang)); // twiddle factor
complex<double> first_half = X[i];
complex<double> second_half = X[i+N/2];
X[i] = first_half+second_half;
X[i+N/2] = (first_half-second_half) * tw;
cout << X[i] << " " <<X[i+N/2] << endl;;
}
fft(X,N-1);
fft(X+N/2,N-1);
}
intmain(intargc,char*argv[]){
int n=8;
复合物*x=新的复合物[n];
//测试数据
x[0]=sin(μPI/2);
x[1]=sin(0);
x[2]=sin(0);
x[3]=sin(0);
x[4]=sin(0);
x[5]=sin(0);
x[6]=sin(0);
x[7]=sin(0);
对于(int i=0;i
这将超出范围;数组的后半部分的大小只有N/2
。我的傅立叶理论有点生疏,但我想你需要
fft(X, N/2);
fft(X+N/2, N/2);
提示:使用std::vector
而不是new
。例如,当您担心越界时,可以使用.at()
成员函数。在这种情况下,您应该只使用常规的复数x[n];
(如果可以,请选择固定大小)。我会记住这一点。谢谢。有人对多余的刷新进行了评论。使用endl
告诉流打印一个尾行字符,然后刷新缓冲区。通常,您不关心立即刷新缓冲区,因此只发送一个换行符“\n”
。哇,我不知道。我喜欢这样感谢所有这些让我的代码更高效的技巧。非常感谢,我将在继续编码时大胆地编辑并记住。这里有一些编辑。我没有修复N-1错误。后面的调用不需要N-N/2
。@DyP:这与N/2
相同;经典FFT要求总体大小为2的幂,因此大小为每一个较小的变换都是偶数。如果N是偶数,那么N/2==N-N/2。谢谢你,先生。这解决了我的问题。
fft(X, N/2);
fft(X+N/2, N/2);