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

时间:2018-06-11 21:15:39

标签: c# fft naudio

以下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);

NAUDIO OUTPUT:

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

MATLAB OUTPUT:

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

1 个答案:

答案 0 :(得分:5)

Discrete Fourier transform及其反转需要某种规范化,以便ifft(fft(x))==x。这种规范化的完成方式从实现变为实现。

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

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

NAudio似乎在前向变换中按n进行除法,以便在k=0 mean(x)时进行sqrt(n)

鉴于上述情况,您可以使用第一个频率仓(DC分量)来验证使用了哪个归一化(假设有一个DC分量,如果信号具有零均值则不起作用):如果DC分量等于所有样本值的总和,然后使用“共同”标准化。在对称定义的情况下,它也可以等于除以n的和,其中正向和反向变换携带相同的归一化。在NAudio的情况下,它将等于除以q的总和(即样本值的平均值)。通常,取DC分量并将其除以样本值的总和。结果1/qn是使用的规范化术语。逆变换应具有归一化项@@datefirst