我没有太多的数学背景,但我正在从事的项目的一部分需要单个向量的 FFT。matlab 函数 fft(x) 可以准确地满足我的需要,但是在尝试设置 Accelerate Framework fft 函数后,我得到的结果完全不准确。如果有人对 Accelerate Framework fft 有更多的专业知识/经验,我真的可以使用一些帮助来找出我做错了什么。我的 fft 设置基于我在 google 上找到的一个示例,但没有教程或任何产生不同结果的东西。
EDIT1:根据迄今为止的答案改变了一些东西。它似乎在进行计算,但它不会以任何接近 matlab 的方式输出它们
这是 matlab 的 fft 文档:http: //www.mathworks.com/help/techdoc/ref/fft.html
** 注意:出于示例目的,两个示例中的 x 数组将为 {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}
Matlab代码:
x = fft(x)
Matlab输出:
x =
1.0e+02 *
Columns 1 through 4
1.3600 -0.0800 + 0.4022i -0.0800 + 0.1931i -0.0800 + 0.1197i
Columns 5 through 8
-0.0800 + 0.0800i -0.0800 + 0.0535i -0.0800 + 0.0331i -0.0800 + 0.0159i
Columns 9 through 12
-0.0800 -0.0800 - 0.0159i -0.0800 - 0.0331i -0.0800 - 0.0535i
Columns 13 through 16
-0.0800 - 0.0800i -0.0800 - 0.1197i -0.0800 - 0.1931i -0.0800 - 0.4022i
目标C代码:
int log2n = log2f(16);
FFTSetupD fftSetup = vDSP_create_fftsetupD (log2n, kFFTRadix2);
DSPDoubleSplitComplex fft_data;
fft_data.realp = (double *)malloc(8 * sizeof(double));
fft_data.imagp = (double *)malloc(8 * sizeof(double));
vDSP_ctoz((COMPLEX *) ffx, 2, &fft_data, 1, nOver2); //split data (1- 16) into odds and evens
vDSP_fft_zrip (fftSetup, &fft_data, 1, log2n, kFFTDirection_Forward); //fft forward
vDSP_fft_zrip (fftSetup, &fft_data, 1, log2n, kFFTDirection_Inverse); //fft inverse
vDSP_ztoc(&fft_data, 2, (COMPLEX *) ffx, 1, nOver2); //combine complex back into real numbers
目标 C 输出:
ffx 现在包含:
272.000000
-16.000000
-16.000000
-16.000000
0.000000
0.000000
0.000000
0.000000
0.000000
10.000000
11.000000
12.000000
13.000000
14.000000
15.000000
16.000000