C++ 基于递归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)

我使用基数-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);
    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);