c# - 来自 fft 结果的功率谱密度 C#

标签 c# matlab signal-processing fft spectral-density

我有一个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/

相关文章:

algorithm - 过滤和平滑算法

c# - 是否有可能对象被释放但不为 NULL

matlab - 将字符串中的每个非字母或数字字符替换为另一个字符

audio - .wav 样本的解释

linux - 如何使用matlab检查Linux中端口是否空闲

matlab - 如何将每行都带有复选框的表/结构导入到 GUI,然后将选择列表导出到 MATLAB?

audio - 示波器上显示的音频信号上的振铃伪影

c# - 我的 url 编码有什么问题?

c# - Entity Framework 中的模型跟踪

c# - .Net 中最简单的唯一标识符是什么?