我试图使用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的衰减。

10-06 10:43