如何计算对数空间功率谱?

信息处理 自由度
2021-12-27 23:54:41

我想计算一个功率谱,其中频率是对数间隔的。

Welch 的方法中,在所得功率谱的频率分辨率和平均数(即结果中的误差)之间存在折衷。我希望这种权衡是动态的,即减少低频点的平均值,以便在低频下获得更精细的分辨率。

有没有标准的方法来做到这一点?

我想一种方法是最初pwelch使用非常高的分辨率(平均数较少),然后使用对数分箱重新组合得到的光谱。

2个回答

我找到了一篇直接解决这个问题的论文:

论文的前几张图很好地说明了该算法解决的问题,并且参考文献包含了其他方法的有用参考书目(恒定 Q 变换、回火傅里叶变换、调查文章等)。

他们的方法不是对现有的基于 FFT 的功率谱估计的输出进行重新组合,而是仅在感兴趣的(对数间隔的)频率上计算离散傅里叶变换。对于要估计的每个频率,它们基本上实现了 Welch 算法,但是为每个频率专门选择了一个变换长度(因此还有平均值的数量)。每个频率仓的计算使用整个时间序列,但分段不同。结果具有理想的特性,即分辨率(bin 宽度)是频率的平滑函数,并且可以将结果校准为功率谱密度或功率谱。

Matlab 实现在这里:https ://github.com/tobin/lpsd

在此处输入图像描述 披露:本文的作者与我在同一机构。

在这种情况下,我将使用最小二乘法来计算一些已知值列表的频率。最常见的方法是 Lomb 方法。它的工作原理与 FFT 或 DFT 非常相似,但它只会计算每个确定频率的频率,并且它可以处理丢失的数据,如果这是一个问题。思路如下:

  1. 确定频率列表(w) 在其上进行计算,它适合您希望采样的所需频带。
  2. 给定频率w, 采样时间tj, 和值Xj,求频率的幂如下:

Px(ω)=12([jXjcosω(tjτ)]2jcos2ω(tjτ)+[jXjsinω(tjτ)]2jsin2ω(tjτ))

请注意,这不会像 FFT 那样很好地扩展,因此只有在所需频率的数量远低于收集所有数据所需的 FFT 时,我才会这样做。

否则,可以对 FFT 或 DFT 进行插值方法或任何其他重新采样。