Python中滤波器设计与频率提取

2024-09-27 09:32:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个项目,在Python中找到多分量音频信号的瞬时频率。我目前正在使用巴特沃斯带通滤波器与scipy.signal.lfilter相结合来提取我想要的频率区域。然后我使用解析信号(来自scipy.signal.hilbert)来得到瞬时相位,这个相位可以被展开以给出频率。在

作为信号处理的相对新手,我有两个主要问题:

  1. 我读过很多应用程序中,最好使用scipy.signal.filtfilt而不是{}。当然,当我将filtfilt应用到我的数据中时,我得到了一个看起来更平滑的瞬时频率信号。我想知道这两者之间的主要区别,记住我希望得到尽可能接近“真实”瞬时频率的输出。

  2. 瞬时频率数据是非平稳的,这意味着在某些情况下,我必须使用一个更宽的带通滤波器来捕获所有我想要的数据。这似乎给我的信号引入了额外的噪声和偶尔的不稳定性。有没有办法解决这类问题,例如用一个更好设计的过滤器?

编辑

作为对flebool的回应,下面是一些我正在查看的数据的图片。首先,比较filt和{}: Comparison of <code>filt</code> and <code>filtfilt</code> 上述两个信号都应用了相同的巴特沃斯滤波器(尽管滤波器功能不同),然后提取瞬时频率(即绘制的时间函数)。filtfilt似乎在移动和平滑数据。这些信号中的一个是“真”信号的更好的近似值吗?在

请注意,此图仅显示特定信号的子集。在

第二,增加巴特沃斯过滤器尺寸的效果: Widening the filter 这与图1中的数据子集相同。图例分别显示了过滤器的下限和上限(红色轨迹是图1中数据的filt版本)。在

虽然这里可能不清楚我为什么要使用更大的通带,但在某些情况下,数据可能位于600和800Hz之间的不同点。在这里,我需要一个更广泛的过滤器设计。你可以看到随着滤波器变宽,额外的噪声进入跟踪;我想知道是否有办法优化/改进我的滤波器设计。在


Tags: 数据项目过滤器signal信号情况scipy音频
2条回答

一些稀疏的评论:

1)最上面的图片:我无法评论filt和filt之间的最佳选择,尽管filt频率的变化令人担忧。您可以通过对filt信号应用低通滤波器来获得类似的结果。在

2)没有“真实”的瞬时频率,除非信号是以特定音调生成的。根据我的经验,展开希尔伯特变换的相位在很多情况下都能做得很好。随着噪声与信号强度之比的增大,它的可靠性越来越低。在

3)关于底部图片,你说有时你需要一个大的带通滤波器。这是因为信号很长,瞬时频率在500到800赫兹之间移动吗?如果是这样的话,您可能需要继续对信号加窗,使滤波后的信号在傅里叶频谱中有一个明显的峰值,提取该峰值,根据该峰值定制您的带低音滤波器,将Hilbert应用于加窗信号,提取相位,过滤相位。在

如果你确定信号除了噪音和你感兴趣的谐波之外还有其他谐波,这是值得做的,而且这需要一段时间。在这样做之前,我想确定我得到的数据是错误的。在

如果只是1次谐波+噪声,我将低通+hilbert+提取瞬时相位+在瞬时相位上再次低通

对于你的第一个问题,我不能说得很聪明,但是scipy通常都有很好的文档记录,所以我会开始阅读他们的一些东西。在

对于你的第二个问题,一个更好设计的过滤器肯定会有帮助。你说数据是“非平稳的”,你知道它会在哪里吗?或者它可能占据什么样的频率?例如,如果信号集中在你事先知道的3个频率中的1个,你可以有三个不同的滤波器,并在所有3个频率中运行信号(当然,只有一个提供你想要的输出)。在

如果你不知道关于信号的知识,我会先做一个更宽的BPF,然后做一些峰值检测,当你知道你想要的数据的位置时,应用一个更严格的BPF

相关问题 更多 >

    热门问题