在 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 的所有体面的实现都差,因为它使用更多的浮点运算,因此它会累积更多的误差。
这能否解释您所看到的接近(但不完全相同)的结果?
