【问题标题】:Filter design and frequency extraction in PythonPython中的滤波器设计和频率提取
【发布时间】:2013-06-22 12:57:12
【问题描述】:

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

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

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

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

编辑

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

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

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

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

【问题讨论】:

    标签: python scipy filtering signal-processing time-frequency


    【解决方案1】:

    一些稀疏的cmets:

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

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

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

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

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

    【讨论】:

    • 1) 我认为filtfilt 的频移可能与lfilter 导致90 度的相移有关。当filtfilt 沿着信号向前然后向后运行时,这种偏移被纠正。我们看到的效果似乎只是减少了噪音。 2)我们的信噪比确实很差。 3)这确实是我有时需要大带通的原因。该信号包含您在上面看到的频率的多个谐波,其中一些是我们需要的。这就是我们使用带通而不是低通的原因。但是,带通+希尔伯特+相位+带通的组合可以工作吗?
    • 当然,如果你有其他较低频率的谐波去掉它们,但不要将带通应用于瞬时相位,坚持使用低通,因为瞬时相位的动态可能要慢得多.如果信号真的很嘈杂,那么你的相位信息就会很差,实际上意义不大
    • 感谢您的回复。我们目前获得的数据似乎是我们所期望的(所以我认为我们在消除噪音方面做得很合理)——我只是在寻找可能改进我们现有数据的方法。我将尝试对瞬时相位进行低通滤波——似乎在任何情况下(即使用filtfilt 或添加另一个低通滤波器)都需要一些额外的滤波。你能评论一下重复滤波对信号的影响吗?
    • 要评估瞬时频率,您可以从 Hilbert 中减去瞬时相位的相邻值,以便噪声在减法运算中传播。您还除以时间步长,我猜这是您的采样频率。我对这些时间尺度的低通滤波感觉很好。
    【解决方案2】:

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

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

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

    【讨论】:

    • 感谢您的回复。我对信号占用的频带有一个大致的了解(精确到几百赫兹)。问题是不同的信号占据不同宽度的频率空间。一些信号看起来是非平稳的,而另一些则更“规律”。我的意思是,一些信号在其频率分布中具有窄峰,但其他信号往往在频率分布中具有宽峰甚至多个峰。正是后一种类型的信号似乎给我带来了滤波器设计方面的问题。
    • 各位,如果能看到一些数据来更好地了解问题,那就太好了。
    猜你喜欢
    • 2018-10-19
    • 2011-06-02
    • 2022-01-07
    • 2013-08-22
    • 2023-03-17
    • 2013-07-24
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多