Python 时间信号振幅偏移,带scipy.signal的FIR滤波器

Python 时间信号振幅偏移,带scipy.signal的FIR滤波器,python,scipy,filtering,Python,Scipy,Filtering,我正在Python中使用scipy.signal(使用firwin函数)实现一个带通滤波器。我的原始信号由两个频率组成(w_1=600Hz,w_2=800Hz)。可能会有更多的频率,这就是为什么我需要一个带通滤波器 在这种情况下,我想过滤600赫兹左右的频带,所以我把600+/-20赫兹作为截止频率。当我实现滤波器并使用lfilter在时域中再现信号时,频率很好 振幅也以正确的幅度再现。但问题是信号在y方向上移动。例如:s(t)=s_1(t)+s_2(t)withs_1(t)=sin(w_1 t

我正在Python中使用
scipy.signal
(使用firwin函数)实现一个带通滤波器。我的原始信号由两个频率组成(w_1=600Hz,w_2=800Hz)。可能会有更多的频率,这就是为什么我需要一个带通滤波器

在这种情况下,我想过滤600赫兹左右的频带,所以我把600+/-20赫兹作为截止频率。当我实现滤波器并使用lfilter在时域中再现信号时,频率很好


振幅也以正确的幅度再现。但问题是信号在y方向上移动。例如:
s(t)=s_1(t)+s_2(t)
with
s_1(t)=sin(w_1 t)+3
s_2(t)=sin(w_2 t)
返回一个在0左右变化但不在[2,4]左右的滤波信号

您可能需要查看文档:

检查参数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)

但不确定这是否可行。

因此,最后我调整了一个滤波器以获得零频率,另一个带通滤波器以获得600 Hz频率。Passzero必须为真,只有零频率才有效。 我还不满意阶段延迟,但我正在努力

1) 带通600赫兹:
taps\u bp=bandpass\u fir(NTAP、低切、高切、fs)

带通滤波器的函数
def bp_fir(NTAP、低切、高切、fs、窗口='hamming')
taps=scipy.signal.firwin(ntaps,[低切,高切],nyq,过零=假)
回程分接头

2) 零频率滤波器
taps\uZeroFrequency=zero\uFIR(ntaps,zerofreq=1,fs)

零频率滤波器的函数
def zero\u fir(NTAP、zerofreq、fs、window='hamming')
taps=scipy.signal.firwin(ntaps,[zerofreq],nyq,pass_zero=True)

返回点击

Ok,这对我更好地理解firwin函数有很大帮助。你的代码给了我完整信号的零频率。因此,我得到了参考信号(具有相当高的增益,因为由于pass_zero=True,增益被缩放,因此增益(f=0)=1)。此外,滤波信号包括零频率(my+3)。是这样吗?