为什么我的 NAudio FFT 结果与 MATLAB 的结果相差 4 倍?

Why does my NAudio FFT result differ from MATLAB by a factor of 4?

以下 C# NAudio 代码产生的结果与 MATLAB 的结果相差 4 倍。为什么会发生这种情况,其中一个是不正确的?

Complex[] tmp = new Complex[4];
tmp[0].X = 1.0f;
tmp[1].X = 0.5f;
tmp[2].X = 1.0f;
tmp[3].X = 0.25f;
tmp[0].Y = 0.0f;
tmp[1].Y = 0.0f;
tmp[2].Y = 0.0f;
tmp[3].Y = 0.0f;
FastFourierTransform.FFT(true, 2, tmp);

音频输出:

0.6875 + 0.0000i
0.0000 - 0.0625i
0.3125 + 0.0000i
0.0000 + 0.0625i

MATLAB 输出:

2.7500 + 0.0000i
0.0000 - 0.2500i
1.2500 + 0.0000i
0.0000 + 0.2500i

Discrete Fourier transform 及其逆需要一定的归一化,以便 ifft(fft(x))==x。这种标准化的完成方式因实施而异。

在这种情况下,NAudio 似乎选择了与 MATLAB 不同的归一化。

MATLAB 使用最常见的归一化,其中 k=0 处的 fft(x) 等于 sum(x),逆变换做同样的事情但除以 n(样本数)。这也是Wikipedia page for the DFT中描述的等式。在这种情况下,逆变换与傅立叶级数的方程相匹配。

NAudio 似乎在正向变换中除以 n,这样在 k=0 你有 mean(x).

鉴于以上情况,您可以使用第一个频率仓(直流分量)来验证使用的是什么归一化(假设有直流分量,如果信号有零意味着这将不起作用):如果DC分量等于所有样本值之和,则使用"common"归一化。在对称定义的情况下,它也可以等于总和除以 sqrt(n),其中正向和反向变换进行相同的归一化。在 NAudio 的情况下,它将等于总和除以 n(即样本值的平均值)。通常,将直流分量除以样本值之和。结果 q 是使用的归一化项。逆变换应该有一个归一化项 1/qn.