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];
}
我在 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];
}