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

Posted

技术标签:

【中文标题】Objective-C 中的快速傅里叶变换不能正常工作【英文标题】:Fast Fourier Transform in Objective-C doesn't work fine 【发布时间】:2015-04-29 07:32:29 【问题描述】:

我在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,…]

但我没有得到这个。

【问题讨论】:

假设 log2 有舍入错误,log2 (1024) 可能是 9.99999999999999 向下舍入到 9。 【参考方案1】:

这个循环是错误的:

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

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

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

【讨论】:

您好 Paul,谢谢您的回答,但问题是 ffData.realp[i] 是错误的,例如 ffData.realp[0] 应该是 21478.183372382526,而 i' 的值m 得到的不是这样做后 vDSP_fft_zipD(fft_weights, &fftData, 1, log2((double)(fftLength)), FFT_FORWARD);. 也许他想交错数据。在这种情况下,循环中的增量应该是 (i+=2) ? @Jef:意图并不完全清楚,但是我上面给出的循环的固定版本将交错实数/复数值,而原始版本没有做任何有用的事情。 仅仅因为您的 android 和 Swift 代码给出相同的结果并不意味着它们给出了正确的结果。 嗨@PaulR,我发现了我的问题,问题出在输入数据中,我的输入数据不同。现在我的输入数据很好,这工作正常。感谢您的帮助。问候

以上是关于Objective-C 中的快速傅里叶变换不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV C++(十)----傅里叶变换

音频算法入门-傅里叶变换

快速傅里叶变换

快速傅里叶变换(FFT)详解

OI中的快速傅里叶变换(FFT)

傅里叶变换通俗解释及快速傅里叶变换的python实现