Python 中的滤波器设计和频率提取

2024-03-12

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

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

  1. 我读到在许多应用程序中,最好使用scipy.signal.filtfilt over scipy.signal.lfilter。当然当我申请的时候filtfilt根据我的数据,我得到了看起来明显更平滑的瞬时频率信号。我想知道两者之间的主要区别,同时记住我希望获得尽可能接近“真实”瞬时频率的输出。

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

EDIT

In response to flebool, below are some images of the data I am looking at. First, a comparison of filt and filtfilt: Comparison of <code>filt</code> and <code>filtfilt</code> Both the above signals have had the same Butterworth filter applied (although the filter function is different), followed by extraction of instantaneous frequency (which is what is plotted, as a function of time). filtfilt seems to shift and smooth the data. Is one of these signals a better approximation of the "true" signal?

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

Second, the effect of increasing the Butterworth filter size: Widening the filter This is for the same subset of data as figure 1. The legend shows the lower and upper bound for the filter, respectively (the red trace is the filt version of the data in figure 1).

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


一些稀疏的评论:

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

2) 不存在“真正的”瞬时频率,除非信号是用特定音调专门生成的。不过,根据我的经验,在许多情况下,展开希尔伯特变换的相位效果很好。随着噪声与信号强度之比的增加,它变得越来越不可靠。

3)关于下图,你说有时你需要一个大的带通滤波器。这是因为信号很长,并且瞬时频率在 500 到 800 Hz 之间移动吗?如果是这样,您可能需要对信号进行加窗,使其达到滤波信号在傅立叶频谱中具有明显峰值的长度,提取该峰值,根据该峰值定制带通滤波器,将希尔伯特应用于加窗信号,提取相位,过滤相位。

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

如果只是1次谐波+噪声,我会在瞬时相位上再次低通+希尔伯特+提取瞬时相位+低通

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 中的滤波器设计和频率提取 的相关文章

随机推荐