递归fft计算中的分段错误

segmentation fault on recursive fft computation

本文关键字:分段 错误 fft 计算 递归      更新时间:2023-10-16

我使用dif-radix-2算法对复向量执行fft。我递归地将我的输入分为两组,第一组和第二组,然后对第一半和第二部分执行复杂的加法*旋转因子。

函数完成了,但当我试图输出结果向量时,我收到了一个Segmentation错误。怎么了?

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);
}
fft(X+N/2,N-1);

这将是越界的;阵列的第二半部分的大小仅为CCD_ 1。我的傅立叶理论有点生疏,但我想你想要

fft(X, N/2);
fft(X+N/2, N/2);