为什么我的 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
.
以下 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
.