【问题标题】:Why is there a difference in magnitude response between scipy.filtfilt and scipy.lfilter?为什么 scipy.filtfilt 和 scipy.lfilter 之间的幅度响应存在差异?
【发布时间】:2015-06-10 01:11:36
【问题描述】:

我试图使用 python 的 scipy 模块过滤信号,我想看看 lfilter 或 filtfilt 哪个更好。 我试图比较它们,我从我的 mwe 得到了以下情节

import numpy as np
import scipy.signal as sp
import matplotlib.pyplot as plt

frequency = 100.             #cycles/second
samplingFrequency = 2500.         #samples/second
amplitude = 16384   
signalDuration = 2.3
cycles = frequency*signalDuration

time = np.linspace(0, 2*np.pi*cycles, signalDuration*samplingFrequency)
freq = np.fft.fftfreq(time.shape[-1])
inputSine = amplitude*np.sin(time)
#Create IIR Filter
b, a = sp.iirfilter(1, 0.3, btype = 'lowpass')

#Apply filter to input
filteredSignal = sp.filtfilt(b, a, inputSine)
filteredSignalInFrequency = np.fft.fft(filteredSignal)
filteredSignal2 = sp.lfilter(b, a, inputSine)
filteredSignal2InFrequency = np.fft.fft(filteredSignal2)

plt.close('all')
plt.figure(1)
plt.title('Sine filtered with filtfilt')
plt.plot(freq, abs(filteredSignalInFrequency))
plt.subplot(122)
plt.title('Sine filtered with lfilter')
plt.plot(freq, abs(filteredSignal2InFrequency))

print max(abs(filteredSignalInFrequency))
print max(abs(filteredSignal2InFrequency))
plt.show()

有人能解释一下为什么幅度响应会有所不同吗?

非常感谢您的帮助。

【问题讨论】:

    标签: python scipy signal-processing


    【解决方案1】:

    查看您的图表显示,使用filtfilt 过滤的信号在频域中的峰值幅度为 4.43x107,而信号的峰值幅度为 4.56x107使用lfilter 过滤。换句话说,用filtfilt 过滤的信号的峰值幅度是用

    过滤时的 0.97

    现在我们应该注意到scipy.signal.filtfilt 应用了过滤器两次,而scipy.signal.lfilter 只应用了一次。结果,输入信号衰减两倍。为了确认这一点,我们可以查看您使用的 Butterworth 滤波器(通过 iirfilter 获得)在输入音调的归一化频率 100/2500 = 0.04 附近的频率响应:

    这确实表明该滤波器的应用确实会在 0.04 的频率处导致约 0.97 的衰减。

    【讨论】:

      猜你喜欢
      • 2016-03-23
      • 1970-01-01
      • 2013-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多