我有一个正在开发的应用程序,它利用了Apple 的 Accelerate Framework FFT 函数,我试图让它模仿Matlab 的 FFT 函数的功能。我将当前代码设置为输出方式与我在 matlab 中的输出方式完全相同。唯一不输出相同的情况是数据数组中的元素数量!= 以 2 为底的对数(FFT 技术上必需的)。我想知道是否有人知道 Matlab 函数是如何处理这种情况的。如果我使用苹果代码来做,它会产生不同的结果。
注意:我不是简单地调用 fft(x)。我也 FFT 移位并取绝对值并将其平方。我也在苹果代码中反映了这些,因为它们不受 FFT 的直接影响。他们在事后被调用。
示例 1 - 16 个元素(对数基数 2): 类似的输出
Matlab调用:
x = 1:16;
Fxx = abs(fftshift(fft(x))).^2;
Fxx =
Columns 1 through 7
64 66.5322 74.9807 92.5736 128 207.3490 437.0193
Columns 8 through 14
1681.5451 18496 1682.5451 437.0193 207.3490 128 92.5736
Columns 15 through 16
74.9807 66.5322
*由于篇幅原因省略了苹果代码
苹果输出:
Fxx[0] = 64.000000
Fxx[1] = 66.532232
Fxx[2] = 74.980664
Fxx[3] = 92.573612
Fxx[4] = 128.000000
Fxx[5] = 207.349044
Fxx[6] = 437.019336
Fxx[7] = 1681.545112
Fxx[8] = 18496.000000
Fxx[9] = 1681.545112
Fxx[10] = 437.019336
Fxx[11] = 207.349044
Fxx[12] = 128.000000
Fxx[13] = 92.573612
Fxx[14] = 74.980664
Fxx[15] = 66.532232
示例 2 - 10 个元素(非对数基数 2):不同的输出
Matlab调用:
x = 1:10;
Fxx = abs(fftshift(fft(x))).^2;
Fxx =
Columns 1 through 7
25 27.6393 38.1966 72.3607 261.8034 3025 261.8034
Columns 8 through 10
72.3607 38.1966 27.6393
*由于篇幅原因省略了苹果代码
苹果输出:
Fxx[0] = 16.000000
Fxx[1] = 45.250000
Fxx[2] = 18.745166
Fxx[3] = 32.000000
Fxx[4] = 109.254834
Fxx[5] = 1296.000000
Fxx[6] = 109.254834
Fxx[7] = 32.000000
Fxx[8] = 18.745166
Fxx[9] = 45.250000
如您所见,它们在第一个示例和第二个示例中显然产生了相同的输出。我已经用正负输入进行了测试,唯一不同的是它们不是对数基数 2。有谁知道 Matlab 如何处理这个问题?也许它用 0 填充数组,直到它的对数基数为 2,然后对某些点进行平均?我做了很多搜索,无法弄清楚在这种特殊情况下他们做了什么来获得他们的输出。