Objective-C 中的快速傅里叶变换无法正常工作

Fast Fourier Transform in Objective-C doesn't work fine

我在 Objective-C 中有一个方法接收 array of doubles 然后它使用 Fast Fourier Transform,但是 FFT 的出口与什么不匹配我想。

谁能帮帮我,我不知道自己做错了什么?

这是我的方法,其中 fftLength 是 4096:

-(double(*)) doFFT:(double(*))data{
    double (*fft) = malloc((fftLength * 2) * sizeof(double));

    FFTSetupD fft_weights = vDSP_create_fftsetupD((log2((double)(fftLength))), kFFTRadix2);

    DSPDoubleSplitComplex fftData;
    //fftData.imagp = fftMagnitudes;

    fftData.imagp = (double*)malloc(fftLength * sizeof(double));
    fftData.realp = (double*)malloc(fftLength * sizeof(double));

    for (int i=0; i< fftLength; i++) {
        fftData.realp[i] = (double)data[i];
        fftData.imagp[i] = (double)0.0;

    }

    vDSP_fft_zipD(fft_weights, &fftData, 1, log2((double)(fftLength)), FFT_FORWARD);

    for(int i = 0;i<fftLength * 2;i++){
        fft[i] = fftData.realp[i];
        fft[i+1] = fftData.imagp[i];
    }

    return fft;
}

这是我输入数据的一部分:

[0.0,2.092731423889438E-4, 8.858534436404497E-4,0.0013714427743574675,0.0012678166431137061,-9.650789019044481E-4,-0.002852548808273958,-0.005176802258252122,-0.007281581949909022,-0.00575977878132905,…]

结果应该是:

[21478.183372382526,0.0,-10190.412374839314,…]

但我没听懂。

这个循环是错误的:

for(int i = 0;i<fftLength * 2;i++){
    fft[i] = fftData.realp[i];
    fft[i+1] = fftData.imagp[i];
}

假设您想要交错 real/complex 输出数据,那么它应该是:

for(int i = 0; i < fftLength; i++) {
    fft[i * 2] = fftData.realp[i];
    fft[i * 2 + 1] = fftData.imagp[i];
}