gpt4 book ai didi

python - FFT滤波器与python中的lfilter

转载 作者:太空宇宙 更新时间:2023-11-04 06:38:06 24 4
gpt4 key购买 nike

在 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)。还是我完全弄错了。

最好的问候,安德斯

以上代码:

enter image description here

与酷编辑相比:

enter image description here

enter image description here

最佳答案

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

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

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

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

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