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

Ale*_*exS 2 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);
Run Code Online (Sandbox Code Playgroud)

NAUDIO输出:

0.6875 + 0.0000i
0.0000 - 0.0625i
0.3125 + 0.0000i
0.0000 + 0.0625i
Run Code Online (Sandbox Code Playgroud)

MATLAB输出:

2.7500 + 0.0000i
0.0000 - 0.2500i
1.2500 + 0.0000i
0.0000 + 0.2500i
Run Code Online (Sandbox Code Playgroud)

Cri*_*ngo 5

离散傅立叶变换及其逆需要一定的标准化,这样ifft(fft(x))==x。标准化的完成方式因实现而异。

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

MATLAB使用最常见的归一化方法,其中fft(x)at k=0等于sum(x),逆变换执行相同的操作,但除以n(样本数)。这也是DFTWikipedia页面中描述的等式。在这种情况下,逆变换与傅立叶级数的方程匹配。

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

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