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 中的快速傅里叶变换不能正常工作的主要内容,如果未能解决你的问题,请参考以下文章