【问题标题】:Time signal shifted in amplitude, FIR filter with scipy.signal时间信号幅度偏移,带有 scipy.signal 的 FIR 滤波器
【发布时间】:2014-04-24 16:05:54
【问题描述】:

我正在使用scipy.signal(使用 firwin 函数)在 Python 中实现带通滤波器。我的原始信号由两个频率组成(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] 的滤波信号。

【问题讨论】:

    标签: python scipy filtering


    【解决方案1】:

    您可能需要查看文档:http://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.firwin.html

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

    不确定这是否可行。

    【讨论】:

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

    所以最后我调整了一个滤波器来获得零频率和另一个带通滤波器来获得 600 Hz 频率。 Passzero 必须仅对于 zerofrequency 为真,然后它才能工作。 我对相位延迟还不满意,但我正在努力解决。

    1) 带通 600 Hz:

    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

    【讨论】:

      猜你喜欢
      • 2015-03-05
      • 2014-05-06
      • 2018-04-22
      • 1970-01-01
      • 2013-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-03
      相关资源
      最近更新 更多