gpt4 book ai didi

python - 为什么 scipy.filtfilt 和 scipy.lfilter 之间的幅度响应存在差异?

转载 作者:太空宇宙 更新时间:2023-11-03 17:39:46 52 4
gpt4 key购买 nike

我试图使用 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()

有人可以解释一下为什么震级响应存在差异吗?

非常感谢您的帮助。 lfilt vs filtfilt

最佳答案

查看图表可以看出,使用 filtfilt 滤波后的信号在频域中的峰值幅度为 4.43x107,而频域峰值幅度为 4.56x107 用于使用 lfilter 过滤的信号。换句话说,使用 filtfilt 滤波后的信号的峰值幅度为使用

滤波时的 0.97

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

enter image description here

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

关于python - 为什么 scipy.filtfilt 和 scipy.lfilter 之间的幅度响应存在差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30745449/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com