将带通滤波器应用于Python中的信号时遇到一些麻烦。尝试了以下方法:


手动执行Box窗口,即对信号执行FFT,将
用一个框窗口进行过滤,然后执行IFFT以返回到时间
域。
使用scipy.signal模块,在其中我使用firwin2来构建
过滤,然后lfilter进行过滤。


此外,我在音频程序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中相同的设置完成(汉宁窗口,窗口宽度512)。还是我完全错了。

最好的祝福,
安德斯

上面的代码:



与酷编辑相比:

最佳答案

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

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

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

关于python - FFT过滤器vs Python中的lfilter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8037990/

10-15 12:44