FFT 的比例输出 (MATLAB)

Scale output of FFT (MATLAB)

我正在使用 MATLAB 中的 FFT 命令对音频 (.wav) 数据进行一些傅立叶变换。输入值是介于 -1.0 和 1.0

之间的数字

我的理解是对FFT的输出取绝对值(模)后,得到的值应该是有幅度单位的,但实际值在千位左右。这没有意义,因为理论上我应该能够对傅里叶分量求和以获得原始信号。我觉得输出也应该在 0 和 1 之间,所以这里是什么?我的猜测是 FFT 算法将它夸大了,但我不确定使用什么值来缩小它。

FFT 是一种用于计算离散傅里叶变换 (DFT) 的算法。 inverse DFT (IDFT) 在其定义中有一个 1/N 比例因子。也许这就是让您感到困惑的原因。来自维基百科:

  • DFT(从有限序列x到傅立叶系数X):

  • IDFT(从X回到x):

因此,只需将 ifft 应用于 fft 的结果,您就会得到原始结果。例如:

>> x = linspace(-1,1,5)
x =
   -1.0000   -0.5000         0    0.5000    1.0000

>> y = fft(x)
y =
        0            -1.2500 + 1.7205i  -1.2500 + 0.4061i  -1.2500 - 0.4061i  -1.2500 - 1.7205i

>> abs(y)
ans =
         0    2.1266    1.3143    1.3143    2.1266 %// note values greater than 1

>> ifft(y)
ans =
   -1.0000   -0.5000    0.0000    0.5000    1.0000

事实上,IDFT 可以 expressed in terms of the DFT 应用复共轭和参考比例因子。用F表示DFT,用F-1表示IDFT,用*,[=表示复共轭19=]

在上面的例子中,

>> 1/numel(y) * conj(fft(conj(y)))
ans =
   -1.0000   -0.5000    0.0000    0.5000    1.0000

在 Matlab 中使用以下代码从 1 缩放到(大致)0。

dataDFT=abs(fft(data)); % Take the complex magnitude of the fft of your data
dataDFTScaled=dataDFT/max(dataDFT); % Divide by the maximum value

您不希望它缩放到零,因为那样会导致无法在对数图上查看。