时间信号在幅度上移位,FIR滤波器用scipy.signal

时间:2014-03-18 18:51:12

标签: python scipy filtering

我正在使用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)+3s_2(t)=sin(w_2 t)会返回一个过滤后的信号,该信号在0左右但不是[2,4]`。

2 个答案:

答案 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必须是真正的零频率才有效。 我对相位延迟还不满意,但我正在努力。

1)带通600 Hz:

taps_bp = bandpass_fir(ntaps, lowcut, highcut, fs)

bandpassfilter的功能

def bp_fir(ntaps, lowcut, highcut, fs, window = 'hamming') taps = scipy.signal.firwin(ntaps,[lowcut, highcut],nyq, pass_zero=False) return taps

2)zerofrequency filter

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