Skip to main content
 首页 » 编程设计

python之FFT滤波器与python中的lfilter

2025年05月04日10findumars

在 Python 中将带通滤波器应用于信号时,我遇到了一些麻烦。已尝试以下操作:

  • “手动”制作方框窗口,即对信号进行 FFT,应用 使用框窗口进行过滤,然后进行 IFFT 以返回时间 域。
  • 使用 scipy.signal 模块,我使用 firwin2 构建 filter 然后 lfilter to 过滤。

此外,我在音频程序Cool Edit中做了同样的过滤,并比较了以上两个测试的结果。

可以看出(我是新用户,所以我不能发布我的 png 图),FFT 和 scipy.signal 的结果非常不同。与 Cool edit 的结果相比,FFT 很接近,但不完全相同。代码如下:

# imports  
from pylab import * 
import os 
import scipy.signal as signal 
 
# load data  
tr=loadtxt('tr6516.txt',skiprows=1) 
 
sr = 500            # [samples/s] 
nf = sr/2.0         # Nyquist frequence 
W = 512            # Window widht for filtering 
N=float(8192)       # Fourier settings 
Ns = len(tr[:,0])   # Total number of samples 
 
# Create inpulse responce from the filter 
fv=12.25 
w    =0.5 
r    =0.5*w 
Hz=[0, fv-w-r, fv-w, fv+w, fv+w+r, nf] 
ff=[0, 0,      1,    1,    0,      0] 
b = signal.firwin2(W,Hz,ff,nfreqs=N+1,nyq=nf) 
SigFilter = signal.lfilter(b, 1, tr[:,1]) 
 
# Fourier transform 
X1 = fft(tr[:,1],n=int(N)) 
X1 = fftshift(X1) 
F1 = arange(-N/2.0,N/2.0)/N*sr 
 
# Filter data 
ff=[0,1,1,0] 
fv=12.25 
w    =0.5 
r    =0.5*w 
Hz=[fv-w-r,fv-w,fv+w,fv+w+r] 
k1=interp(-F1,Hz,ff)+interp(F1,Hz,ff) 
X1_f=X1*k1 
X1_f=ifftshift(X1_f) 
x1_f=ifft(X1_f,n=int(N)) 

谁能向我解释为什么会有这种差异? Cool edit 中的过滤是使用与 scipy.signal 中相同的设置完成的(汉宁窗口,窗口宽度 512)。还是我完全弄错了。

最好的问候, 安德斯

以上代码:

与酷编辑相比:

请您参考如下方法:

微小的差异可以通过库使用不同的算法来解释,这些算法累积的错误略有不同。

例如,如果您使用基数 2 FFT、 split 基数 FFT 和普通 DFT 计算 DFT,结果都会略有不同。事实上,普通 DFT 的精度比 FFT 的所有体面的实现都差,因为它使用更多的浮点运算,因此它会累积更多的误差。

这能否解释您所看到的接近(但不完全相同)的结果?