我正在做一个项目,在Python中找到多分量音频信号的瞬时频率。我目前正在使用巴特沃斯带通滤波器与scipy.signal.lfilter
相结合来提取我想要的频率区域。然后我使用解析信号(来自scipy.signal.hilbert
)来得到瞬时相位,这个相位可以被展开以给出频率。在
作为信号处理的相对新手,我有两个主要问题:
我读过很多应用程序中,最好使用scipy.signal.filtfilt
而不是{filtfilt
应用到我的数据中时,我得到了一个看起来更平滑的瞬时频率信号。我想知道这两者之间的主要区别,记住我希望得到尽可能接近“真实”瞬时频率的输出。
瞬时频率数据是非平稳的,这意味着在某些情况下,我必须使用一个更宽的带通滤波器来捕获所有我想要的数据。这似乎给我的信号引入了额外的噪声和偶尔的不稳定性。有没有办法解决这类问题,例如用一个更好设计的过滤器?
编辑
作为对flebool的回应,下面是一些我正在查看的数据的图片。首先,比较filt
和{filtfilt
似乎在移动和平滑数据。这些信号中的一个是“真”信号的更好的近似值吗?在
请注意,此图仅显示特定信号的子集。在
第二,增加巴特沃斯过滤器尺寸的效果:
这与图1中的数据子集相同。图例分别显示了过滤器的下限和上限(红色轨迹是图1中数据的filt
版本)。在
虽然这里可能不清楚我为什么要使用更大的通带,但在某些情况下,数据可能位于600和800Hz之间的不同点。在这里,我需要一个更广泛的过滤器设计。你可以看到随着滤波器变宽,额外的噪声进入跟踪;我想知道是否有办法优化/改进我的滤波器设计。在
一些稀疏的评论:
1)最上面的图片:我无法评论filt和filt之间的最佳选择,尽管filt频率的变化令人担忧。您可以通过对filt信号应用低通滤波器来获得类似的结果。在
2)没有“真实”的瞬时频率,除非信号是以特定音调生成的。根据我的经验,展开希尔伯特变换的相位在很多情况下都能做得很好。随着噪声与信号强度之比的增大,它的可靠性越来越低。在
3)关于底部图片,你说有时你需要一个大的带通滤波器。这是因为信号很长,瞬时频率在500到800赫兹之间移动吗?如果是这样的话,您可能需要继续对信号加窗,使滤波后的信号在傅里叶频谱中有一个明显的峰值,提取该峰值,根据该峰值定制您的带低音滤波器,将Hilbert应用于加窗信号,提取相位,过滤相位。在
如果你确定信号除了噪音和你感兴趣的谐波之外还有其他谐波,这是值得做的,而且这需要一段时间。在这样做之前,我想确定我得到的数据是错误的。在
如果只是1次谐波+噪声,我将低通+hilbert+提取瞬时相位+在瞬时相位上再次低通
对于你的第一个问题,我不能说得很聪明,但是scipy通常都有很好的文档记录,所以我会开始阅读他们的一些东西。在
对于你的第二个问题,一个更好设计的过滤器肯定会有帮助。你说数据是“非平稳的”,你知道它会在哪里吗?或者它可能占据什么样的频率?例如,如果信号集中在你事先知道的3个频率中的1个,你可以有三个不同的滤波器,并在所有3个频率中运行信号(当然,只有一个提供你想要的输出)。在
如果你不知道关于信号的知识,我会先做一个更宽的BPF,然后做一些峰值检测,当你知道你想要的数据的位置时,应用一个更严格的BPF
相关问题 更多 >
编程相关推荐