FFT过滤器与python中的lfilter

时间:2011-11-07 14:41:52

标签: python filter fft

在Python中使用带通滤波器进行信号传输时遇到了一些麻烦。尝试过以下事情:

  • “手动”执行方框窗口,即对信号进行FFT,应用 过滤一个方框窗口并做IFFT回到时间 域。
  • 使用scipy.signal模块,我使用firwin2构建 过滤,然后过滤到过滤。

另外我已经在音频程序Cool Edit中完成了相同的过滤,并比较了上述两个测试的结果。

可以看出(我是新用户,所以我无法发布我的png图),FFT和scipy.signal的结果非常不同。与Cool编辑的结果相比,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编辑中的过滤使用与scipy.signal(hanning window,window width 512)相同的设置完成。或者我完全错了。

祝你好运, 安德斯

以上代码:

enter image description here

与Cool Edit相比:

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:0)

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

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

这可以解释您所看到的结果(但不完全相同)吗?