我正在使用scipy.signal
在Python中实现带通滤波器(使用firwin函数)。我的原始信号由两个频率组成(w_1 = 600Hz,w_2 = 800Hz)。可能会有更多频率,这就是我需要带通滤波器的原因。
在这种情况下,我想过滤600 Hz左右的频段,因此我将600 +/- 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]`。
答案 0 :(得分:1)
您可能需要查看文档:{{3}}
检查参数pass_zero。
具体来说,缺少3.0是0频率,非周期性或“DC”偏移。你不应该从输出信号中得到这个3.0。但是,如果你是坚决的,请尝试:
scipy.signal.firwin(numtaps, [1,600-20,600+20,800-20,800+20,nyquist], pass_zero=True)
不确定这是否会奏效。
答案 1 :(得分:0)
所以最后我调整了一个滤波器以获得零频率,另一个频道滤波器调整到600 Hz频率。 Passzero必须是真正的零频率才有效。 我对相位延迟还不满意,但我正在努力。
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
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