all*_*nds 6 python filtering signal-processing scipy time-frequency
我正在开发一个项目来查找Python中多分量音频信号的瞬时频率.我目前正在使用Butterworth带通滤波器结合scipy.signal.lfilter在我想要的频率范围内提取.然后我使用分析信号(from scipy.signal.hilbert)来获得瞬时相位,可以将其解包以提供频率.
作为信号处理的相对新手,我有两个主要问题:
我已经读过,在许多应用程序中,最好使用scipy.signal.filtfiltover scipy.signal.lfilter.当然,当我申请filtfilt我的数据时,我会得到一个非常平滑的瞬时频率信号.我想知道两者之间的主要区别,记住我希望得到一个尽可能接近"真实"瞬时频率的输出.
瞬时频率数据是非平稳的,这意味着在某些情况下我必须使用更宽的带通滤波器来捕获我所需的所有数据.这似乎会在我的信号中引入额外的噪音和偶尔的不稳定性.有没有办法处理这些问题,例如设计更好的过滤器?
编辑
作为对flebool的回应,下面是我正在查看的数据的一些图像.一,比较filt和filtfilt:

请注意,此图仅显示特定信号的子集.
二,增加巴特沃斯滤波器尺寸的效果:
这与图1中的数据子集相同.图例分别显示了过滤器的下限和上限(红色跟踪是filt图1中数据的版本).
虽然这里可能不清楚为什么我会使用更大的通带,但在某些情况下,数据可能位于例如600和800Hz之间的各个点.在这里,我需要更广泛的滤波器设计.随着滤波器变宽,您可以看到额外的噪声进入迹线; 我想知道是否有一种方法可以优化/改进我的滤波器设计.
一些稀疏的评论:
1)上图:我无法评论 filtfilt 和 filtfilt 之间最好的是什么,尽管 filtfilt 频率的变化令人担忧。您可以通过对滤波信号应用低通滤波器来获得类似的结果。
2) 不存在“真正的”瞬时频率,除非信号是用特定音调专门生成的。不过,根据我的经验,在许多情况下,展开希尔伯特变换的相位效果很好。随着噪声与信号强度之比的增加,它变得越来越不可靠。
3)关于下图,你说有时你需要一个大的带通滤波器。这是因为信号很长,并且瞬时频率在 500 到 800 Hz 之间移动吗?如果是这样,您可能需要对信号进行加窗,使其达到滤波信号在傅立叶频谱中具有明显峰值的长度,提取该峰值,根据该峰值定制带通滤波器,将希尔伯特应用于加窗信号,提取相位,过滤相位。
如果您确定信号除了噪声和您感兴趣的谐波之外还有其他谐波,那么这是值得做的,并且需要一段时间。在这样做之前,我想确保我获得的数据是错误的。
如果只是1次谐波+噪声,我会在瞬时相位上再次低通+希尔伯特+提取瞬时相位+低通