Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中实现分块低通IIR滤波器_Python_Scipy_Signal Processing - Fatal编程技术网

在Python中实现分块低通IIR滤波器

在Python中实现分块低通IIR滤波器,python,scipy,signal-processing,Python,Scipy,Signal Processing,这个问题类似于,但我将其重新定义为Python实现问题,以便与我所寻求的解决方案更加一致 我想实现一个低通IIR滤波器,它对几乎实时的音频块进行操作(每个块441个数据点x100Hz=44.1kHz)。有很多嗡嗡声的人工制品。我想这与我如何使用scipy.signal方法和设置初始条件有关 首先,我试图通过DSP论坛上的对话来理解我所做的事情背后的理论,但我早就忘记了我的DSP大学课程,所以这对我来说没有多大意义。接下来,我尝试了很多很多的代码组合,唯一有效的(没有工件)是函数和参数的非常具体的

这个问题类似于,但我将其重新定义为Python实现问题,以便与我所寻求的解决方案更加一致

我想实现一个低通IIR滤波器,它对几乎实时的音频块进行操作(每个块441个数据点x100Hz=44.1kHz)。有很多嗡嗡声的人工制品。我想这与我如何使用scipy.signal方法和设置初始条件有关

首先,我试图通过DSP论坛上的对话来理解我所做的事情背后的理论,但我早就忘记了我的DSP大学课程,所以这对我来说没有多大意义。接下来,我尝试了很多很多的代码组合,唯一有效的(没有工件)是函数和参数的非常具体的组合

Bparam,Aparam=signal.iirfilter(2,0.020,b类型=‘低通’,模拟=
False,ftype='butter')#二阶巴特沃斯系数
Z=信号.lfilter_zi(Bparam,Aparam)#初始条件计算的一部分
IC=Z*(前置信号[:-1])[0:2]#反转前置信号,然后抓取
#只有最后两个元素
filteredSignal,=signal.lfilter(Bparam、Aparam、inputSignal、zi=IC)
#结果是连续的、清晰的
prevSignal=filteredSignal#保存以备下次通过
我用两种方法测试我的过滤器。第一种是输入信号为np.sin波,预期输出为无失真正弦波。第二种方法是添加一些奇数谐波(构造一个带限方波),并验证结果与低通滤波器一样,具有更小的谐波振幅

当阶数为二阶时,上述代码符合预期,但阶数较高时,会出现失真。例如,我尝试将IC范围设置为[0:4],但效果似乎不一样。

在@Warren的论文中(IMHO非常出色),分批过滤长信号部分帮助回答了我的问题。除了该部分提供的示例代码外,我还通过以下方式形成了
sos
阵列:

Bparam,Aparam=signal.iirfilter(2,0.02,
B类型='低通',模拟=假,F类型='黄油')
Z、 P,K=signal.tf2zpk(Bparam,Aparam)
sos=信号zpk2sos(Z,P,K)

我也在高通滤波器上试过,最高可达8阶,没有问题

请看我的使用说明第6页开始的“分批过滤长信号”一节。@Wareen Weckesser您能帮我解决在python中实现2个低通过滤器的问题吗?