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

Python中的滤波器设计与频率提取,python,scipy,filtering,signal-processing,time-frequency,Python,Scipy,Filtering,Signal Processing,Time Frequency,我正在做一个项目,用Python计算多分量音频信号的瞬时频率。我目前正在使用Butterworth带通滤波器结合scipy.signal.lfilter来提取我想要的频率区域。然后,我使用分析信号(来自scipy.signal.hilbert)来获得瞬时相位,可以将其展开以给出频率 作为信号处理的相对新手,我有两个主要问题: 我已经了解到,在许多应用程序中,最好使用scipy.signal.filter而不是scipy.signal.lfilter。当然,当我对我的数据应用filtfilt时,我

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

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

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

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

  • 编辑

    为了回应弗莱布尔,下面是我正在查看的一些数据图像。首先,比较
    filt
    filtfilt
    : 过滤器和
    过滤器
    “> 上述两个信号都应用了相同的巴特沃斯滤波器(尽管滤波器功能不同),然后提取瞬时频率(这是绘制的时间函数)。
    filtfilt
    似乎会移动并平滑数据。其中一个信号更接近“真实”信号吗

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

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


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

    对于您的第一个问题,我无法明智地谈论,但scipy通常都有很好的文档记录,因此我将开始阅读他们的一些内容

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

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

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

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

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

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


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

    谢谢你的回答。我有一个大致的想法(精确到几百赫兹)指信号所占用的频带。问题是不同的信号占用不同宽度的频率空间。一些信号看起来是非平稳的,而另一些信号则更“规则”“。我的意思是,有些信号在其频率分布中有一个窄的峰值,但另一些信号在频率分布中往往有一个宽的,甚至多个峰值。这是后一种类型的信号,似乎在滤波器设计方面给我带来了问题。各位,如果能看到一些数据来更好地了解问题,那将是一件好事。1)我认为
    filter
    的频移可能与
    lfilter
    引起90度的相移有关。当
    filtfilt
    沿信号向前然后向后运行时,此移位被纠正。我们看到的效果似乎只是减少了噪音。2) 我们的信噪比确实很差。3) 这就是为什么我有时需要一个大的带通。该信号包含您在上面看到的频率的多个谐波,其中一些是我们需要的。这就是为什么我们使用带通,而不是低通。但是,是否可以使用Bandpa的组合