Skip to main content
 首页 » 编程设计

python之大多数系数为零时如何进行IIR滤波

2025年05月04日10kevingrace

我要用 Python 做什么音频效果。比如最简单的回声效果公式:

y[n] = x[n] + k*y[n-1000] 

这是一个 IIR 滤波器,可以通过 scipy.signal 中的 lfilter() 计算:

import numpy as np 
import time 
import scipy.signal as signal 
 
pulse = np.zeros(10000) 
pulse[0] = 1.0 
 
a = np.zeros(1000) 
a[[0,999]] = 1, -0.7 
 
start = time.clock() 
out = signal.lfilter([1], a, pulse) 
print time.clock() - start 
 
import pylab as pl 
pl.plot(out) 
pl.show() 

问题是:a的大部分系数都为零,可以很快计算出滤波器,但是lfilter()无法实现这一点,使用所有的零系数。

我知道我可以为这个最简单的示例编写一些特定的计算代码,但我正在寻找一个通用的解决方案。

请您参考如下方法:

试试这个:

import scipy 
import scipy.signal as sig 
import time 
 
# Input signal. 
x = scipy.randn(50000) 
 
# Filter coefficients. 
a = scipy.zeros(1001) 
a[[0,-1]] = [1, -0.7] 
 
# Method using lfilter. 
start = time.clock() 
y0 = sig.lfilter([1], a, x) 
end = time.clock() - start 
print end 
 
# Method using for loop. 
start = time.clock() 
y1 = x 
for i in range(1000, y1.size): 
    y1[i] += 0.7*y1[i-1000] 
end = time.clock() - start 
print end 
 
# Check that both outputs are equal. 
print scipy.square(y0-y1).sum() 

在我的笔记本电脑上:方法 1 为 0.38 秒,方法 2 为 0.13 秒。

注意:对于N个样本的延迟,必须设置a[N],而不是a[N-1]。