我试图使用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()
有人可以解释为什么幅度响应有差异吗?
非常感谢你的帮助。
最佳答案
查看图表可知,用filtfilt
滤波的信号在频域中的峰值幅度为4.43x107,而使用lfilter
滤波的信号则为4.56x107。换句话说,使用filtfilt
滤波的信号的峰值幅度为0.97,而使用
现在我们应该注意,scipy.signal.filtfilt
两次应用过滤器,而scipy.signal.lfilter
仅一次应用过滤器。结果,输入信号衰减了两倍。为了确认这一点,我们可以看看您使用的巴特沃思滤波器的频率响应(通过iirfilter
获得)围绕输入音的归一化频率100/2500 = 0.04
:
这确实表明,使用该滤波器确实会在0.04的频率下导致〜0.97的衰减。