我试图在python中使用numpy数组设计一个IIR Notch滤波器,并使用scipy librairy从导入的波形文件中删除正弦音(我使用波形模块这样做)。我的文件是由Adobe试听生成的:它是一个纯正弦波@ 1.2 kHZ,采样@ 48,96或192 kHz,以便有一个"伪周期"我的圆形fft的数据(只是问我是否不够清楚)
以下是我用来实现滤镜系数的代码(我从文章"Second-order IIR Notch Filter Design and implementation of digital signal processing system" by C. M. Wang & W. C. Xiao获得系数)
f_cut = 1200.0
wn = f_cut/rate
r = 0.99
B, A = np.zeros(3), np.zeros(3)
A[0],A[1],A[2] = 1.0, -2.0*r*np.cos(2*np.pi*wn), r*r
B[0],B[1],B[2] = 1.0, -2.0*np.cos(2*np.pi*wn), 1.0
filtered = signal.lfilter(B, A, data_flt_R, axis=0)
其中data_flt_R
是一个包含float64类型右通道的numpy数组,rate
是我的采样频率。我使用matplotlib模块绘制频率响应和我的数据的fft,以查看是否一切正常。
N = len(data_flt_R)
w, h = signal.freqz(B,A, N)
pyplot.subplot(2,1,1)
pyplot.semilogx(w*rate/(2*np.pi), 20*np.log10(np.absolute(h)))
fft1 = fftpack.fft(data_flt_R, N)
fft_abs1 = np.absolute(fft1)
ref = np.nanmax(fft_abs1)
dB_unfiltered = 20*np.log10(fft_abs1/ref)
fft2 = fftpack.fft(filtered, N)
fft_abs2 = np.absolute(fft2)
dB_filtered = 20*np.log10(fft_abs2/ref)
abs = fftpack.fftfreq(N,1.0/rate)
pyplot.subplot(2,1,2)
pyplot.semilogx(abs,dB_unfiltered,'r', label='unfiltered')
pyplot.semilogx(abs,dB_filtered,'b', label='filtered')
pyplot.grid(True)
pyplot.legend()
pyplot.ylabel('power spectrum (in dB)')
pyplot.xlim(10,rate/2)
pyplot.xlabel('frequencies (in Hz)')
这就是我得到的:
我不了解我在fc之前和之后得到的结果和价值观。难道我不会得到一个看起来像红色但没有主峰的情节吗?为什么我的HF有坡度?这是否与窗口相关联?
此外,如果我改变采样频率和/或数据长度(16/24或32位),结果会改变。谁能开导我?