幅度偏移的时间信号,使用scipy.signal进行FIR滤波
我正在用Python实现一个带通滤波器,使用的是scipy.signal
库里的firwin函数。我的原始信号包含两个频率(w_1=600Hz,w_2=800Hz)。可能还有很多其他频率,所以我需要一个带通滤波器。
在这种情况下,我想过滤掉600Hz附近的频率,所以我设定了600Hz上下各20Hz作为截止频率。当我实现这个滤波器,并用lfilter函数在时间域中重现信号时,频率是正常的。
幅度也被正确地重现了。但是问题是信号在y轴上发生了偏移。举个例子:s(t)=s_1(t)+s_2(t)
,其中s_1(t)=sin(w_1 t)+3
和s_2(t)=sin(w_2 t)
,返回的滤波信号在0附近波动,而不是在[2,4]之间。
2 个回答
你可能想看看这个文档:http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.firwin.html
注意一下参数 pass_zero。
具体来说,缺少的 3.0 是指 0 频率的部分,也就是非周期的“直流”偏移。你不应该从输出信号中得到这个 3.0。不过,如果你坚持的话,可以试试:
scipy.signal.firwin(numtaps, [1,600-20,600+20,800-20,800+20,nyquist], pass_zero=True)
不过我不确定这样做是否有效。
最后,我调整了一个滤波器来获取零频率,另外又用了一个带通滤波器来获取600赫兹的频率。对于零频率,passzero必须设为真,这样它才能正常工作。虽然我对相位延迟还不太满意,但我正在努力改进。
1) 600赫兹的带通滤波器:
taps_bp = bandpass_fir(ntaps, lowcut, highcut, fs)
带通滤波器的函数
def bp_fir(ntaps, lowcut, highcut, fs, window = 'hamming')
taps = scipy.signal.firwin(ntaps,[lowcut, highcut],nyq, pass_zero=False)
return taps
2) 零频率滤波器
taps_zerofrequency = zero_fir(ntaps, zerofreq=1, fs)
零频率滤波器的函数
def zero_fir(ntaps, zerofreq, fs, window = 'hamming')
taps = scipy.signal.firwin(ntaps,[zerofreq],nyq, pass_zero=True)
return taps