1

我有一个正在开发的应用程序,它利用了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,然后对某些点进行平均?我做了很多搜索,无法弄清楚在这种特殊情况下他们做了什么来获得他们的输出。

4

2 回答 2

3

来自官方 MATLAB 文档

FFT 函数(fft、fft2、fftn、ifft、ifft2、ifftn)基于名为FFTW的库。

为了在 N 为复合时(即 N = N 1 N 2时)计算 N 点 DFT,FFTW 库使用Cooley-Tukey 算法分解问题,该算法首先计算大小为 N 2的 N 1变换,然后计算大小为 N 1的 N 2变换。

当 N 是质数时,FFTW 库首先使用Rader 算法将 N 点问题分解为三个 (N – 1) 点问题。然后,它使用上述 Cooley-Tukey 分解来计算 (N – 1) 点 DFT。

我不确定 Apple 的 Accelerate Framework 如何计算此类 FFT,但我更喜欢 MATLAB 来产生正确的结果。

于 2012-08-27T06:47:06.343 回答
0

这不能解决您的问题,但我注意到计算。如果您对结果进行平方,绝对值是一种浪费的操作。如果速度是一个问题,把它拿出来。此外,不是计算 x^2 而是计算 x*x。您可以更快地获得相同的结果。不知道效率差异是否会很明显,但是当更便宜同样简单或更简单时,计算上更昂贵是没有意义的。

于 2012-11-10T14:25:40.723 回答