假设我们先后应用了3个过滤器:
b, a = iirfilter(...) # or bilinear(...) or anything else producing b, a
y = lfilter(b, a, x)
b, a = iirfilter(...)
y = lfilter(b, a, y)
b, a = iirfilter(...)
y = lfilter(b, a, y)
如何获取与3个过滤器等效的系数b2
,a2
,这样我们只需一次通过lfilter
就可以找到结果: < / p>
y = lfilter(b2, a2, x)
?
编辑:卷积似乎无效:
fs = 44100
b2, a2 = iirfilter(2, 2.0/fs * np.asarray([40, 60]), btype='bandstop') # 50 hz reject
b3, a3 = iirfilter(2, 2.0/fs * np.asarray([85, 115]), btype='bandstop') # 100 hz reject
b = np.convolve(b2, b3)
a = np.convolve(a2, a3)
w, h = signal.freqz(b, a, worN=10000)
给予:
我尝试使用np.convolve的same
,full
,valid
参数,但没有一个解决问题。
答案 0 :(得分:2)
您可以分别对分子和分母进行卷积
import scipy as sp
import scipy.signal as sig
# Individual filters
b1, a1 = sig.iirfilter(...)
b2, a2 = sig.iirfilter(...)
# Cascaded filter
a = sp.convolve(a1, a2)
b = sp.convolve(b1, b2)
y = sig.lfilter(b, a, x)
例如,给定的采样率太高,并且复合滤波器的阶数不够长,以致于无法对彼此靠近的零点进行很大的拒绝。降低采样率,然后内插44.1 kHz。
这里是采样率降低到4410 Hz的结果。
fs = 4410.0
b2, a2 = sig.iirfilter(2, 2.0/fs * sp.asarray([40, 60]), btype='bandstop') # 50 hz reject
w2, h2 = sig.freqz(b2, a2, worN=4096)
b3, a3 = sig.iirfilter(2, 2.0/fs * sp.asarray([85, 115]), btype='bandstop') # 100 hz reject
w3, h3 = sig.freqz(b3, a3, worN=4096)
b = sp.convolve(b2, b3)
a = sp.convolve(a2, a3)
w, h = sig.freqz(b, a, worN=4096)
f = w/2.0*fs
然后将IIR滤波器的输出通过10倍插值滤波器,以回到44.1 kHz的采样率。
或,降低过滤器顺序:
fs = 44100.0
b2, a2 = sig.iirfilter(1, 2.0/fs * sp.asarray([40, 60]), btype='bandstop') # 50 hz reject
w2, h2 = sig.freqz(b2, a2, worN=4096)
b3, a3 = sig.iirfilter(1, 2.0/fs * sp.asarray([85, 115]), btype='bandstop') # 100 hz reject
w3, h3 = sig.freqz(b3, a3, worN=4096)
b = sp.convolve(b2, b3, 'full')
a = sp.convolve(a2, a3, 'full')
w, h = sig.freqz(b, a, worN=4096)
以44.1 kHz的原始采样率产生