1 巴特沃斯滤波设计步骤

①归一化处理。即令λ=ω/ωpλ=ω/ω_pλ=ω/ωp​
②计算阶数,截止频率和通带频率比;
ωsω_sωs​是阻带截止频率,ωpω_pωp​是通带截止频率,δsδ_sδs​是阻带应达到的最小衰减
λs=ωs/ωpλ_s=ω_s/ω_pλs​=ωs​/ωp​
N=log⁡(10(δs/10)−1)log⁡λsN=\frac{\log\sqrt{(10^{(δ_s/10)}-1)}}{log⁡λ_s }N=log⁡λs​log(10(δs​/10)−1)​​
③构造归一化系统函数H§,其极点为pk=e(j(2k+N−1)π/2N),k=1,2,3…Kp_k=e^{(j(2k+N-1)π/2N)},k=1,2,3…Kpk​=e(j(2k+N−1)π/2N),k=1,2,3…K,则有:
H(p)=1((p−p1)(p−p2)….(p−pN))H(p)=\frac{1}{((p-p_1 )(p-p_2 )….(p-p_N))}H(p)=((p−p1​)(p−p2​)….(p−pN​))1​
④得到滤波器系统函数。
H(s)=H(p)∣(p=s⁄λsωp)H(s)=H(p)|_{(p=s⁄λ_s ω_p )}H(s)=H(p)∣(p=s⁄λs​ωp​)​

2 实例


3 python代码实现

由于笔算IIR滤波器参数较为复杂,本代码采用scipy中的butter滤波器直接计算出相应的参数,python实现IIR滤波算法较为简单,在该代码中被略去,有需要者,私聊博主。
感兴趣的读者可以对比计算得到的滤波器参数和教程中计算得到的参数,会发现其值与教材中计算的相差无几。

import numpy as np
import math
from sympy import *
from scipy import signal
import scipy
import matplotlib
import matplotlib.pyplot as plt
from scipy.fftpack import fft,ifft
plt.rcParams['font.sans-serif'] = ['SimHei']
matplotlib.rcParams['axes.unicode_minus'] =False#设计一巴特沃斯带通滤波器
#通带下限频率150Hz
#通带上限频率200Hz
#下阻带下限频率100Hz
#上阻带下限频率250Hz
#通带衰减不大于3dB
#阻带衰减不小于18dB
#采样间隔T = 0.001sfp_l = 150
fp_h = 200fs_l = 100
fs_h = 250
T    = 0.001
fs   = int(1/T)wp_l = 2*np.pi*fp_l * T
wp_h = 2*np.pi*fp_h * T
ws_l = 2*np.pi*fs_l * T
ws_h = 2*np.pi*fs_h * TWp_l = np.tan(wp_l/2)
Wp_h = np.tan(wp_h/2)
Ws_l = np.tan(ws_l/2)
Ws_h = np.tan(ws_h/2)#计算中心频率
W_o = Wp_l*Wp_h
#计算通带带宽
W_BW = Wp_h-Wp_l#对频率指标归一化
H_sl = Ws_l/W_BW
H_sh = Ws_h/W_BWH_pl = Wp_l/W_BW
H_ph = Wp_h/W_BWH_o  = H_pl*H_ph#进行频率变换
L_p  = (H_ph**2 - H_o)/H_ph
L_sl = (H_sl**2 - H_o)/H_sl
L_sh = (H_sh**2 - H_o)/H_shif(abs(L_sh)<abs(L_sl)):L_s = L_sh
else:L_s = L_sl
#print(L_s)
#设计模拟低通滤波器
G_p = 3
G_s = 18
#确定滤波器阶数
N = math.log(np.sqrt(10**(G_s/10)-1),10)/math.log(L_s,10)
print(N)
#取大于N的数作为滤波阶数
#if(int(N)>N):
#    N=int(N)/2
#else:
#    N = (int(N)+1)/2
if(int(N)<N):N=int(N)+1
print(N)
fl = fp_l
fh = fp_h
Wn = [fl*2/fs,fh*2/fs]
x=np.linspace(0,1,fs)
#设置需要采样的信号
signal_array = np.sin(2*np.pi*500*x)
for i in range(10):if 100*i != 500:signal_array+=np.sin(2*np.pi*100*x*i)#+np.sin(2*np.pi*175*x)+np.sin(2*np.pi*350*x)+np.sin(2*np.pi*500*x)noise_size = len(signal_array)
noise_array =  np.random.normal(0, 2, noise_size)
mu = 0
sigma = 0.12
import random
noise_array = random.gauss(mu,sigma)adc_value=[]
test = []
for i in range(noise_size):adc_value.append(random.gauss(mu,sigma))test.append(1)
#signal_array= np.array(adc_value) + np.array(test)
signal_size = len(signal_array)
K = np.arange(signal_size)
T1 = signal_size/fs
frequency_array = K/T1/10
#计算源信号的FFT
signal_fft=fft(signal_array)                     #快速傅里叶变换
signal_fft_abs=abs(fft(signal_array))                # 取模
signal_fft_abs_norm=abs(fft(signal_array))/((len(signal_array)/2))           #归一化处理
signal_fft_abs_norm_half= signal_fft_abs_norm[range(int(len(signal_array)/2))]  #由于对称性,只取一半区间
signal_fft_abs_size =np.arange(len(signal_array))        # 频率
IIR_filter=filter()#计算巴特沃夫滤波器参数
b_weight,a_weight = scipy.signal.butter(N, Wn, btype='bandpass')
#利用计算得到的滤器参数进行滤波
IIR_Output =  IIR_filter.IIR_F(signal_array,a_weight,b_weight)
IIR_Output_Size = len(IIR_Output)plt.figure(1)
plt.subplot(221)
plt.title('原始信号')  # 定义标题
plt.plot(signal_array[0:1000],'g')
plt.subplot(222)
plt.title('滤波后的信号')  # 定义标题
#
#t=np.sin(2*np.pi*500*x)
#plt.plot(t[0:1000],'g')
#plt.plot(signal_array[0:1000],'g')
plt.plot(IIR_Output[0:1000],'b')
plt.show()IIR_Output = np.array(IIR_Output)
IIR_Output_fft=fft(IIR_Output)                     #快速傅里叶变换
IIR_Output_fft_abs=abs(fft(IIR_Output))                # 取模
IIR_Output_fft_abs_norm=abs(fft(IIR_Output))/((len(IIR_Output)/2))           #归一化处理
IIR_Output_fft_abs_half = IIR_Output_fft_abs_norm[range(int(len(IIR_Output)/2))]  #由于对称性,只取一半区间
IIR_Output_fft_abs_size = np.arange(len(IIR_Output_fft_abs_norm))        # 频率
plt.subplot(223)
plt.title('原始信号FFT')  # 定义标题
plt.plot(signal_fft_abs_size[0:1000],signal_fft_abs_norm[0:1000],'g') #显示原始信号的FFT模值
plt.subplot(224)
plt.title('滤波后的信号FFT')  # 定义标题
plt.plot(signal_fft_abs_size[0:1000],IIR_Output_fft_abs_norm[0:1000],'r',label='FFT')
#plt.legend('滤波后信号FFT')
plt.show()
plt.figure(2)w, h = signal.freqz(b_weight, a_weight)
plt.semilogx(w, 20 * np.log10(abs(h)),markersize = 15)
plt.title('巴特沃斯滤器频率响应')
plt.xlabel('Frequency [radians / second]')
plt.ylabel('Amplitude [dB]')
plt.margins(0, 0.1)
plt.grid(which='both', axis='both')
plt.axvline(100, color='green') # cutoff frequency
plt.show()

4 运行结果

通过对比下图,可见滤波后的频谱图显示无关频道的信号得到有效衰减,但是滤波后的信号,仍然没有得到较好的信号信息,这里可以采用零相移滤波器来实现可得到更好的滤波效果。


可见滤波效果并不是特别好,若提高采样频率,将T=0.0001,得到如下结果:

Python 实现巴特沃斯滤波器相关推荐

  1. python实现陷波滤波器、低通滤波器、高斯滤波器、巴特沃斯滤波器

    在一幅图像中,其低频成分对应者图像变化缓慢的部分,对应着图像大致的相貌和轮廓,而其高频成分则对应着图像变化剧烈的部分,对应着图像的细节(图像的噪声也属于高频成分). 滤波器 低通滤波器 高通滤波器 陷 ...

  2. 巴特沃斯滤波器——python实现

    butter()函数是求Butterworth数字滤波器的系数向量,在求出系数后对信号进行滤波时需要用scipy.signal.filtfilt(). 需要安装scipy包. 函数butter() 设 ...

  3. 巴特沃斯滤波器应用场合_巴特沃斯数字低通滤波器设计及应用

    龙源期刊网 http://www.qikan.com.cn 巴特沃斯数字低通滤波器设计及应用 作者:汪其锐 王桂华 王永军 来源:<山东工业技术> 2016 年第 24 期 摘 要:现实生 ...

  4. 巴特沃斯滤波器 python_巴特沃斯、切比雪夫、贝塞尔滤波器的区别

    巴特沃斯滤波器.切比雪夫滤波器.贝塞尔滤波器均包括模拟滤波器和数字滤波器两种形式. 数字滤波器是指完成信号滤波处理功能的,用有限精度算法实现的离散时间线性非时变系统,其输入是一组数字量,其输出是经过变 ...

  5. 数字信号处理——巴特沃斯滤波器设计

    设计思路 这里采用间接法设计数字滤波器(先设计模拟滤波器再设计数字滤波器) 滤波器理解: 1.数字滤波器可以用H(z),h(n)or系统差分方程来表示,对应的就是一个系统,信号输入该系统即可改变其所含 ...

  6. 数字信号处理公式变程序(四)——巴特沃斯滤波器(下)

    之前已经讲过巴特沃斯滤波器的基础知识和数字滤波器求系统函数的代码实现,本节讲如何使用数字滤波器的系统函数实现对信号的滤波. 注:可能会有不足或者理解偏差的地方,路过的高人请不吝赐教. OK,开始! = ...

  7. 巴特沃斯滤波器、切比雪夫、椭圆滤波

    滤波器概述 滤波器的作用就是过滤波形,过滤掉不需要的波形成分,与在时间上截取某一部分波形相区别,这个波形成分一般用频率来描述,也可以用模拟角频率核数字角频率来描述.从滤波器的通带范围可以分为低通.高通 ...

  8. java巴特沃斯滤波器编程_EMG信号的低通巴特沃斯滤波器

    使用matlab中自带的randn函数产生一组随机数,作为EMG信号,然后EMG信号的采样率为2048hz.这里随机数产生的随机数种子采用的机遇系统时钟的随机数种子.系统输入有两个,一个是仿真时间,单 ...

  9. Matlab语音信号去噪程序,使用低通巴特沃斯滤波器

    Matlab语音信号去噪程序,使用低通巴特沃斯滤波器. 1.读取一段歌曲的信号,绘制时域频域图,并播放. 2.添加正弦噪声: 3.设计巴特沃斯低通滤波器: 4.使用滤波器去除噪声,并画出时域频域图,播 ...

最新文章

  1. itext 添加空格_借助 iText 用代码在 PDF 中创建空白签名域
  2. [转载]学习数据库分表和分库思想
  3. 安装Cocoapods详细教程
  4. Python 练习册,每天一个小程序
  5. python学多久能写东西的软件有哪些_怎么自学python,大概要多久?
  6. html5同心圆代码,HTML5/Canvas 鼠标跟随的同心圆
  7. 打破行业壁垒!阿里云OpenSearch开启个性化搜索里程碑
  8. Gui+jdbc+mysql实现图书管理
  9. html svg画图
  10. 小程序技术可以提升桌面应用安全等级?
  11. win7的附件计算机没了,win7系统附件工具不见了的解决方法
  12. 计算广告基本概念入门总结
  13. wmic冻结进程_WMIC的用法
  14. 批量爬取某图片网站的图片
  15. 微型计算机的硬件系统主要核心软件,计算机硬件系统最核心的是什么
  16. hdu 6447YJJ's Salesman 离散化+树状数组+DP
  17. C# dateTime类型之subTract用法
  18. mysql 复合索引(联合索引) a b c的使用
  19. Percona Server 安装
  20. Shell 脚本一键安装,Oracle 21C 单机版抢先体验

热门文章

  1. 开源且免费:全面评估排名前五的缺陷管理工具
  2. echart 折线图设置y轴单位_echartsY轴双坐标单位切换
  3. ORACLE: 解决“不是有效的导出文件,头部验证失败” , DMP文件版本转换器
  4. 坦克世界服务器停机维护提前结束,《坦克世界》2月25日服务器停机维护公告
  5. 揭开Outlook Express编辑器的奥秘
  6. surface 3安装android x86,Surface Phone新技能:Win10 Mobile红石3支持x86模拟器
  7. 使用unicode编码识别中文字符、字母和数字,包括生僻汉字
  8. 替代glup和grunt,使用npm自动化构建项目
  9. angularjs 获取复选框的值_侠客行第二季来袭,教你如何快速获取侠名值_DNF游戏新闻 - 地下城与勇士 - DNF...
  10. 做社区团购需要面临的问题