6

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

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

  1. 我已经读过,在许多应用程序中,最好使用scipy.signal.filtfiltover scipy.signal.lfilter。当然,当我应用filtfilt到我的数据时,我会得到一个看起来更平滑的瞬时频率信号。我想知道两者之间的主要区别,记住我想得到一个尽可能接近“真实”瞬时频率的输出。

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

编辑

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

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

二、增加巴特沃斯滤波器大小的效果: 加宽过滤器 这是针对与图 1 相同的数据子集。图例分别显示了滤波器的下限和上限(红色轨迹是filt图 1 中数据的版本) .

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

4

2 回答 2

1

一些稀疏的评论:

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

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

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

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

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

于 2013-06-27T08:23:39.013 回答
1

对于您的第一个问题,我无法明智地谈论,但 scipy 通常有据可查,因此我将开始阅读他们的一些内容。

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

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

于 2013-06-25T16:31:59.450 回答