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