我想在Python中应用自适应滤波器,但无法在线找到有关如何实现此类算法的任何文档或示例.我熟悉使用scipy.signal工具箱设计"静态"过滤器,但我不知道如何设计自适应过滤器.
澄清一下:我有一个S包含噪音的录音信号.在这个录音中有一个"真正的"功能,我想访问,称之为T.我也有估计T.我想设计一个滤波器使得滤波之间的误差S和T最小化.请注意,在这种情况下,静态过滤器没有用,因为我试图过滤非平稳信号.
我正在开发一个项目来查找Python中多分量音频信号的瞬时频率.我目前正在使用Butterworth带通滤波器结合scipy.signal.lfilter在我想要的频率范围内提取.然后我使用分析信号(from scipy.signal.hilbert)来获得瞬时相位,可以将其解包以提供频率.
作为信号处理的相对新手,我有两个主要问题:
我已经读过,在许多应用程序中,最好使用scipy.signal.filtfiltover scipy.signal.lfilter.当然,当我申请filtfilt我的数据时,我会得到一个非常平滑的瞬时频率信号.我想知道两者之间的主要区别,记住我希望得到一个尽可能接近"真实"瞬时频率的输出.
瞬时频率数据是非平稳的,这意味着在某些情况下我必须使用更宽的带通滤波器来捕获我所需的所有数据.这似乎会在我的信号中引入额外的噪音和偶尔的不稳定性.有没有办法处理这些问题,例如设计更好的过滤器?
编辑
作为对flebool的回应,下面是我正在查看的数据的一些图像.一,比较filt和filtfilt:

请注意,此图仅显示特定信号的子集.
二,增加巴特沃斯滤波器尺寸的效果:
这与图1中的数据子集相同.图例分别显示了过滤器的下限和上限(红色跟踪是filt图1中数据的版本).
虽然这里可能不清楚为什么我会使用更大的通带,但在某些情况下,数据可能位于例如600和800Hz之间的各个点.在这里,我需要更广泛的滤波器设计.随着滤波器变宽,您可以看到额外的噪声进入迹线; 我想知道是否有一种方法可以优化/改进我的滤波器设计.
我有一个多行的情节,每个都分开标记.我想在图中加上一个图例,以便识别出各个线条.标签和标记的默认顺序如下所示:
marker:label
marker:label
marker:label
...等等.
由于各种美学原因,我希望我的图例中的列数等于行数(和标签),我使用该ncol选项更改.所以,目前,我的传奇看起来像:
marker:label marker:label marker:label
然而,对于我来说,在这种安排中将标签置于标记之上会更加清楚.我想要的是:
标签标签标签
标记标记
我想知道是否有一种"快速修复"方式来实现这样的传奇.
我正在尝试使用Python将具有时变截止频率的带通滤波器应用于信号.我当前使用的例程将我的信号划分为等长时间段,然后对于每个段,我在将信号合并回来之前应用具有时间特定参数的滤波器.参数基于预先存在的估计.
我似乎遇到的问题是,在应用过滤器后出现的每个时间段的边缘都有"涟漪".这会导致我的信号不连续,这会干扰我的过滤后数据分析.
我希望有人能告诉我是否有任何现有的例程用于在Python中实现具有时变参数的过滤器?或者,我将非常感谢您如何解决这个问题.
编辑 - 我想要做的例子在下面添加.
假设我有一个信号x(t).我想用带参数(100,200)Hz的带通滤波器对前半部分进行滤波.下半场我想用参数(140,240)Hz进行过滤.我迭代x(t),将我的过滤器应用于每一半,然后重新组合结果.一些示例代码可能如下所示:
outputArray = np.empty(len(x))
segmentSize = len(x) / 2
filtParams = [(100, 200), (140, 240)]
for i in range(2):
tempData = x[i*segmentSize:(i+1)*segmentSize]
tempFiltered = bandPassFilter(tempData, parameters=filtParams[i])
outputArray[i*segmentSize:(i+1)*segmentSize] = tempFiltered
Run Code Online (Sandbox Code Playgroud)
(为了节省空间,我们假设我有一个执行带通滤波的功能).
如您所见,数据段不重叠,只是简单地"粘贴"在新数组中.
编辑2 - 我的问题@HD的一些示例代码
首先,感谢您迄今为止的重要贡献.audiolazy包看起来像一个很棒的工具.
如果我更详细地描述我的目标,我认为会更有用.正如我在其他地方发布的那样,我试图使用希尔伯特变换提取信号的瞬时频率(IF).我的数据包含很大的噪音但我对IF信号所在的带宽有很好的估计.然而,我遇到的一个问题是IF通常是非平稳的.因此,使用"静态"滤波器方法时,我经常需要使用宽带通区域,以确保捕获所有频率.
以下代码演示了增加滤波器带宽对IF信号的影响.它包括信号生成功能,使用scipy.signal包的带通滤波器的实现,以及提取结果滤波信号的IF的方法.
from audiolazy import *
import scipy.signal as sig
import numpy as np
from pylab import *
def sineGenerator( ts, f, rate, noiseLevel=None ):
"""generate a sine tone with time, frequency, sample rate and …Run Code Online (Sandbox Code Playgroud)