用python进行信号分析(二) - 陷波器设计

[复制链接]
4208|5
手机看帖
扫描二维码
随时随地手机跟帖
会笑的星星|  楼主 | 2021-7-21 13:46 | 显示全部楼层 |阅读模式
本帖最后由 会笑的星星 于 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=30,陷波器.png

当品质因素Q=5,其他参数不变时的幅频响应
Q=5,陷波器.png

对比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()

运行代码后,出现下图:
陷波器滤波效果.png

在上图中的第三个图就是把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





使用特权

评论回复

相关帖子

会笑的星星|  楼主 | 2021-7-21 13:54 | 显示全部楼层

使用特权

评论回复
会笑的星星|  楼主 | 2021-7-21 13:54 | 显示全部楼层
有点冷清,再给自己回一条

使用特权

评论回复
ayl439| | 2021-7-21 17:29 | 显示全部楼层
学习

使用特权

评论回复
luohao316| | 2021-7-22 13:13 | 显示全部楼层
如果有matlab,做这种工作还是用matlab更方便

使用特权

评论回复
红蛋大叔| | 2021-7-24 10:50 | 显示全部楼层
楼主,这些系列不错啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

31

主题

96

帖子

15

粉丝