如何在Python中估计信号在给定频率下的功率随时间变化

4 投票
1 回答
2530 浏览
提问于 2025-04-16 11:33

我想找个好方法来估算一个信号的功率(比如每秒采样10,000次)在时间上与某个频率(比如50赫兹)之间的关系。我可以计算出信号的频谱图,然后在目标频率上切一片出来。不过这样似乎不太高效,因为我只关心在一个频率上的功率随时间的变化。我知道在一个确切的频率上,功率是零(在极限情况下),所以我想计算一下在目标频率附近一个小频率范围内的信号功率。

我现在的“解决方案”是使用Matplotlib的mlab.specgram()函数,它会返回一个二维的功率数组,然后我再从中切片。不过我对此不太满意,因为我不完全信任这个mlab.specgram()函数,因为它在处理不同信号时计算频谱图所需的时间差别很大(即使它们的长度相同)。

1 个回答

7

有很多方法可以做到这一点。一种简单但有效的方法是使用带通滤波器(设置在50Hz),这样可以去掉其他所有信号,然后计算最后N个样本的均方根功率。

另一种方法是做一个窗口化的快速傅里叶变换(FFT),但其实不需要做完整的FFT,只计算你想要的那个频率的值。窗口可以随便选,比如用Kaiser窗,参数设置为8。单个频率的离散傅里叶变换(DFT)就是信号和e^(i*n*w)的乘积之和(这里的w是你采样率下的50Hz,n是一个计数器)。

其实可能还有更简单的方法。这要看你想要抵抗什么干扰,信号变化有多快,以及你是否预期会有噪声或其他信号混在里面。如果你不是要从一堆杂音中挑出一个信号,那就不需要做得那么复杂。

撰写回答