以下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
答案 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
。