我正在做一个项目,以在 Python 中查找多分量音频信号的瞬时频率。我目前正在使用一个 Butterworth 带通滤波器结合scipy.signal.lfilter
来提取我想要的频率区域。然后我使用解析信号(来自scipy.signal.hilbert
)来获得瞬时相位,可以将其展开以给出频率。
作为信号处理的新手,我有两个主要问题:
我已经读过,在许多应用程序中,最好使用
scipy.signal.filtfilt
overscipy.signal.lfilter
。当然,当我应用filtfilt
到我的数据时,我会得到一个看起来更平滑的瞬时频率信号。我想知道两者之间的主要区别,记住我想得到一个尽可能接近“真实”瞬时频率的输出。瞬时频率数据是非平稳的,这意味着在某些情况下,我必须使用更宽的带通滤波器来捕获所有我想要的数据。这似乎在我的信号中引入了额外的噪声和偶尔的不稳定性。有没有办法处理这些问题,例如设计更好的过滤器?
编辑
作为对 flebool 的回应,下面是我正在查看的数据的一些图像。首先,比较filt
和filtfilt
:
上述两个信号都应用了相同的巴特沃斯滤波器(尽管滤波器功能不同),然后提取瞬时频率(这是绘制的,作为时间的函数)。filtfilt
似乎移动和平滑数据。这些信号之一是否更接近“真实”信号?
请注意,此图仅显示特定信号的子集。
二、增加巴特沃斯滤波器大小的效果:
这是针对与图 1 相同的数据子集。图例分别显示了滤波器的下限和上限(红色轨迹是filt
图 1 中数据的版本) .
虽然这里可能不清楚为什么我会使用更大的通带,但在某些情况下,数据可能位于例如 600 和 800Hz 之间的不同点。正是在这里,我需要更广泛的过滤器设计。您可以看到随着滤波器变宽,额外的噪声进入迹线;我想知道是否有办法优化/改进我的过滤器设计。