我有一个Complex[]
(来自 CsCore),它是我的 FFT 的结果。
Complex
有一个浮点实数
和一个浮点虚数
。
据此我计算出以下内容
- 频率:
(双)索引 * 采样率/FftSize;
- 振幅/幅度:
Math.Sqrt(Math.Pow(real, 2) + Math.Pow(imaginary, 2));
- 相位:
Math.Atan(虚数/实数);
如有错误请指正。
据我了解,这是频域信息,它使我能够看到哪些频率在我的样本中最常见。现在我想查看随时间变化的功率密度。 Matlab documentation显示了例子,但我不明白,因为我不懂Matlab。有人可以解释有关此主题的 Matlab 文档或帮助我实现 C# 实现吗?
编辑:
This answer建议简单地平方振幅。这是正确的吗?
最佳答案
确实,正如我在 this other answer 中所述您可以通过对 FFT 结果的幅度求平方来获得功率谱密度 (PSD) 估计值。这基本上就是 Matlab documentation 中的以下行:您引用的状态(最多一个比例因子,这对于大多数只需要比较不同频率分量的相对强度的应用程序来说并不重要):
psdx = (1/(Fs*N)) * abs(xdft).^2;
正如我在其他答案中提到的,并且在 Matlab 文档中也有描述,您可以通过将信号乘以 window function 来获得更好的 PSD 估计。在进行 FFT 之前,并对多个 FFT 结果的平方幅度求平均值。
注意:对于该阶段,您最好使用 Math.Atan2(imaginary, real)
(参见 Math.Atan2
on MSDN ),它涵盖了输入 [ -pi,pi]
范围(而不是仅覆盖 [-pi/2,pi/2]
的 Math.Atan()
)。
关于c# - 来自 fft 结果的功率谱密度 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42806906/