- import matplotlib.pyplot as plt
- from scipy import signal
- #函数原型参考[1]
- #w0中心频率
- #Q品质因数,Q=w0/BW,w0为中心频率,BW为-3dB带宽。当
- #BW越小,Q越大,陷波器过滤中心频率的同时对原始信号的影响越小
- #fs为数字信号的采样频率
- b,a = signal.iirnotch(w0=50,Q=30,fs=1000)
- #陷波器的幅频响应,fre是频率,h的模表示某个频率下的幅度值
- fre,h = signal.freqz(b,a,fs=fs)
- plt.plot(fre, 20*np.log10(abs(h)))
- plt.show()
陷波器的幅频响应,品质因数Q=30
当品质因素Q=5,其他参数不变时的幅频响应
对比Q=5与Q=30可以看到,Q越小,-3dB的带宽越宽,过滤原始信号频率的同时,还会对原始信号有更大的影响。
最后,我们利用Q=30的陷波器,看看他的滤波效果,见下面代码。
- # -*- coding: utf-8 -*-
- import numpy as np
- import matplotlib.pyplot as plt
- from scipy import signal
- fs = 1000.0
- t = np.arange(fs) / fs
- s_50hz = np.sin(2*np.pi*50*t)
- s_100hz = np.cos(2*np.pi*100*t)
- s = s_50hz + s_100hz
- b,a = signal.iirnotch(50,Q=30,fs=1000)
- #lfilter的函数原型参见[2]
- y = signal.lfilter(b,a,s)
- plt.subplot(3,1,1)
- plt.ylabel('50Hz+100Hz')
- plt.plot(t, s)
- plt.subplot(3,1,2)
- plt.ylabel('100Hz')
- plt.plot(t, s_100hz)
- plt.subplot(3,1,3)
- plt.ylim(-1.1,1.1)
- plt.ylabel('filtered waveform')
- plt.plot(t, y)
- plt.show()
运行代码后,出现下图:
在上图中的第三个图就是把50Hz过滤掉的剩余波形,对照100Hz的余弦信号,可以看到经过馅波滤波器过滤后的波形在0.6之前幅度有所变化,这是由于滤波器的初始条件所致。而在0.6以后的波形与100H的余弦波几乎是一样的,这说明这个馅波滤波器是起到过滤作用了。
[1]https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.signal.iirnotch.html#scipy.signal.iirnotch
[2]https://docs.scipy.org/doc/scipy/reference/reference/generated/scipy.signal.lfilter.html#scipy.signal.lfilter