本帖最后由 会笑的星星 于 2021-7-21 13:53 编辑
顾名思义,馅波滤波器就是过滤掉信号中的指定频率而保留需要的频率。比如信号由50Hz的正弦波与100Hz的余弦波组成,其中,50Hz是噪音,我们真正需要的是100Hz信号,此时可以利用50Hz的陷波器过滤噪音从只保留100Hz。我们来看看python当中如何设计这个滤波器,先看滤波器的代码。
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
|