数字滤波器的简单使用
完整版请参考:
- https://mazhaoxin.github.io/2019/10/05/Brief_of_Digital_Filter/
- http://483v7j.coding-pages.com/2019/10/05/Brief_of_Digital_Filter/
模拟电路工程师不会对基于RLC的滤波器感到陌生,但对于数字滤波器或离散时间域滤波器就没那么熟悉了。今天我想总结一下简单的数字滤波器的分析方法、常用模拟滤波器对应的数字滤波器实现以及模拟滤波器的离散时间域建模方法。
模拟滤波器基本知识
模拟滤波器处理的是模拟信号,即对时间域上连续、电压域上也连续的信号进行处理。实现滤波功能的主要方式是利用电感、电容这类储能器件的特性,对于基于运算放大器的有源滤波器,还利用了反馈原理。
数字滤波器基本知识
基本结构
而数字滤波器处理的是数字信号,即对时间域上离散、电压域上也离散的信号进行处理,在数值与具体信号之间还存在编码问题。数字滤波器通常由乘法器、加法器和存储器构成。其中存储器通常用锁存器实现,框图上记为z−1z^{-1}z−1,即对输入进行了TsT_sTs的延迟,也称作“延1拍”或“打1拍”,这里的TsT_sTs为数字滤波器工作时钟的周期。
根据滤波器的输出是否会参与下一次运算,数字滤波器可以分为有限冲击响应(FIR)和无限冲击响应(IIR)两种。通俗地讲,就是看输出是由有限的输入决定,还是由在此之前所有的输入决定。如下图所示,对于FIR滤波器而言,当n=j+1n = j+1n=j+1时Y[n]Y[n]Y[n]便与X[0]X[0]X[0]没有关系了;而同样的情况下对于IIR滤波器而言,X[0]X[0]X[0]还可以通过Y[n−1]Y[n-1]Y[n−1]对Y[n]Y[n]Y[n]施加影响。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KPKR5pEO-1584195469021)(/img/in-post/{{page.id | replace:’/’,’-’}}/Diagram_FIR_IIR_Filter.png)]
因为FIR滤波器不会无限地积累,因此它是绝对稳定的。但因为同样的原因,FIR滤波器不能实现DC处的极点。
频域响应
从上一节不难推出滤波器的传递函数:
- 对于FIR滤波器,有
Y[n]=∑i=0jbiX[n−i]Y[n]=\sum_{i=0}^{j}{b_iX[n-i]}Y[n]=i=0∑jbiX[n−i]
→Y[z]=∑i=0jbiX[z]z−i\rightarrow Y[z]=\sum_{i=0}^{j}{b_iX[z]z^{-i}}→Y[z]=i=0∑jbiX[z]z−i
→H(z)=Y[z]/X[z]=∑i=0jbiz−i\rightarrow H(z) = Y[z]/X[z] = \sum_{i=0}^{j}{b_iz^{-i}}→H(z)=Y[z]/X[z]=i=0∑jbiz−i - 类似的,对于IIR滤波器,有
H(z)=Y[z]/X[z]=∑i=0jbiz−i/(1−∑i=0kaiz−i)H(z) = Y[z]/X[z] = \sum_{i=0}^{j}{b_iz^{-i}} / (1 - \sum_{i=0}^{k}{a_iz^{-i}})H(z)=Y[z]/X[z]=i=0∑jbiz−i/(1−i=0∑kaiz−i)
再将z=es⋅Ts,s=j⋅ωz = e^{s\cdot T_s}, s=j\cdot\omegaz=es⋅Ts,s=j⋅ω代入即可计算出相应的频域响应。
需要注意的是,和数字信号一样,数字滤波器的传递函数也是周期延拓的,因此只需要看0∼fs/20 \sim f_s/20∼fs/2之间的即可。
常用滤波器的实现
下面列几种在模拟电路中常用的滤波器对应到数字域中的实现方法。
积分器
这个应该很容易想到,只要把输出延1拍后再送到输入相加即可,其框图可以表示如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RUExlPjv-1584195469024)(/img/in-post/{{page.id | replace:’/’,’-’}}/Diagram_Intergrator.png)]
易得它的传递函数是H(z)=1/(1−z−1)H(z) = 1/(1-z^{-1})H(z)=1/(1−z−1),将z=es⋅Tsz = e^{s\cdot T_s}z=es⋅Ts代入后可得H(s)=1/(1−e−sTs)H(s)=1/(1-e^{-sT_s})H(s)=1/(1−e−sTs),当sTs<<1sT_s<<1sTs<<1时做泰勒展开式替换便可得到H(s)=1/(sTs)=fs/sH(s)=1/(sT_s)=f_s/sH(s)=1/(sTs)=fs/s,即在低频处其传函与模拟积分器一致。下图所示的是数字滤波器和模拟滤波器实现的积分器的幅频和相频曲线对比(取fs=25MHzf_s=25MHzfs=25MHz,下同)。不难看出,当频率小于fsf_sfs一个数量级时幅频曲线吻合的很好,但相频曲线逐渐地出现了偏差。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X2aYXqTY-1584195469027)(/img/in-post/{{page.id | replace:’/’,’-’}}/Bode_Intergrator.png)]
微分器/差分器
微分器也不难想到,用当前的输入减去上一次的输入即可,它的框图如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yn42jygi-1584195469030)(/img/in-post/{{page.id | replace:’/’,’-’}}/Diagram_Differential.png)]
同样可得其传递函数为H(z)=1−z−1H(z)=1-z^{-1}H(z)=1−z−1,以及相应的频响曲线如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gMUgBpRl-1584195469033)(/img/in-post/{{page.id | replace:’/’,’-’}}/Bode_Differential.png)]
一阶RC低通滤波器
考虑如下图所示的一阶RC低通滤波器,电容上保持的电压(也就是当前YYY的值)为Y[n−1]Y[n-1]Y[n−1],经过一段很小的时间Δt\Delta tΔt后,有一定的电流经过电阻流向了电容,电流的大小为I[N]=(X[N]−Y[n−1])/RI[N]=(X[N]-Y[n-1])/RI[N]=(X[N]−Y[n−1])/R,那么电容上电压的变化值是ΔY=I[N]⋅Δt/C\Delta Y = I[N]\cdot \Delta t/CΔY=I[N]⋅Δt/C,即当前的输出电压为
Y[n]=Y[n−1]+ΔY=Y[n−1]+(X[N]−Y[n−1])⋅Δt/(RC)Y[n]=Y[n-1]+\Delta Y = Y[n-1]+(X[N]-Y[n-1])\cdot \Delta t/(RC)Y[n]=Y[n−1]+ΔY=Y[n−1]+(X[N]−Y[n−1])⋅Δt/(RC)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eCSN7dXb-1584195469036)(/img/in-post/{{page.id | replace:’/’,’-’}}/Diagram_RC.png)]
若把Δt\Delta tΔt当作TsT_sTs,便可得到对应数字滤波器的传函H(z)=k/(1−(1−k)z−1)H(z)=k/(1-(1-k)z^{-1})H(z)=k/(1−(1−k)z−1),其中k=Ts/(RC)k=T_s/(RC)k=Ts/(RC)。其框图和频响曲线如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e1IpQ6RQ-1584195469040)(/img/in-post/{{page.id | replace:’/’,’-’}}/Diagram_RC_Z.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H2urVX2x-1584195469041)(/img/in-post/{{page.id | replace:’/’,’-’}}/Bode_RC.png)]
一阶RC高通滤波器
由HRC=1−HCRH_{RC}=1-H_{CR}HRC=1−HCR,可得一阶RC高通滤波器的传递函数为
H(z)=1−k/(1−(1−k)z−1)=(1−k)(1−z−1)/(1−(1−k)z−1)H(z)=1-k/(1-(1-k)z^{-1})=(1-k)(1-z^{-1})/(1-(1-k)z^{-1})H(z)=1−k/(1−(1−k)z−1)=(1−k)(1−z−1)/(1−(1−k)z−1)
对应的频响曲线如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-14agva2N-1584195469043)(/img/in-post/{{page.id | replace:’/’,’-’}}/Bode_CR.png)]
PID算法与级联
在自动控制领域,常用PID控制算法来处理反馈误差信号。其中P表示比例(proportional)、I表示积分(integral)、D表示微分(differential)。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AmUB9Akx-1584195469046)(/img/in-post/{{page.id | replace:’/’,’-’}}/Diagram_PID.png)]
从幅频曲线的角度很容易理解,比例单元的幅频曲线是条水平直线,积分器和微分器的幅频曲线分别是斜向下方和斜向上方的直线,不同曲线叠加在一起时靠上部的会占主导。然后通过级联可以构成我们想要的频响,就像折纸一样。
在处理滤波器级联问题时需要注意几点与模拟滤波器不同的地方:
- 模拟滤波器存在负载效应,如两级RC滤波器级联后表现出来的极点与其各自单独工作时的不同,而数字滤波器不存在这个效应;
- 当数字滤波器级联时为了便于收敛时序通常需要锁存结果,这样会产生latency,导致更大的相位误差,在闭环使用时需要尤其注意;
- 对于固定的目标传递函数,滤波器的工作频率越高,频响越准确;
- 当数字滤波器与连续时间域的模块相连时,需要考虑零阶保持(ZOH)的影响,即级联HZOH=(1−z−1)/(s⋅Ts)H_{ZOH}=(1-z^{-1})/(s\cdot T_s)HZOH=(1−z−1)/(s⋅Ts),它也会贡献额外的相移;
- 当不同工作频率的数字滤波器级联时即构成了
多采样率系统
,需要在接口处增加抽样/插值器,并小心处理因此带来的镜像信号问题。
滞后超前滤波器
滞后超前滤波器是在type-II PLL中常用的环路滤波器,它的幅频曲线如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i9cdVlLS-1584195469047)(/img/in-post/{{page.id | replace:’/’,’-’}}/Bode_PLL_LPF.png)]
显然可以由一个积分单元加一个比例单元,再级联一个一阶低通组成。而一阶低通可以由积分单元加负反馈构成,整体的框图如下图所示(其中k1=2πfz/fs,k2=2πfp/fsk1=2\pi f_z/f_s, k2=2\pi f_p/f_sk1=2πfz/fs,k2=2πfp/fs):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mNY6T9DR-1584195469051)(/img/in-post/{{page.id | replace:’/’,’-’}}/Diagram_PLL_LPF.png)]
其对应的频响曲线如下图所示(其中fz=30kHz,fp=1MHz,fs=25MHzf_z=30kHz, f_p=1MHz, f_s=25MHzfz=30kHz,fp=1MHz,fs=25MHz)。可以看到相位在我们关心的地方是有几度的误差的,解决这个问题的唯一方案是提高fsf_sfs:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-K2O3h5Cd-1584195469052)(/img/in-post/{{page.id | replace:’/’,’-’}}/Bode_PLL_LPF_2.png)]
fs/2f_s/2fs/2频点陷波滤波器
前面举的几个例子好像都是模拟滤波器实现起来很简单,但数字滤波器很复杂的情况,接下来举一个模拟滤波器不方便做,而数字滤波器很轻松的例子。
fs/2f_s/2fs/2频点陷波滤波器,顾名思义即是只滤除在fs/2f_s/2fs/2处的单音干扰。其传函是H(z)=(1+z−1)/2H(z)=(1+z^{-1})/2H(z)=(1+z−1)/2,从传函上不难看出就是把相邻的两拍输入求平均,因此也叫移动平均(MA)。
在K线图上常见的MA5、MA20等也是类似的算法,但只是用来滤除高频扰动,而非单音干扰。
它的频响曲线如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jDh1kCcc-1584195469053)(/img/in-post/{{page.id | replace:’/’,’-’}}/Bode_notch_1.png)]
模拟滤波器的离散时间域建模
在对电路做行为级建模时,通常需要在离散时间域实现模拟滤波器的行为,以提高仿真效率。
如果可以写出滤波器的传递函数,便可以用上述的滤波器组合出来。而对于非常复杂的滤波器,则可以采用一种通用的方法实现。
- 首先根据电路的特性选择适合的fsf_sfs,一般不能小于最大极点频率的10倍;
- 然后给需要建模的电路施加阶跃响应,阶跃时的transition time不能小于1/fs1/f_s1/fs;
- 对电路的输出做采样,采样频率为fsf_sfs;
- 对采样结果求微分,并从阶跃处开始取值,直到接近0,得到一个序列[bi][b_i][bi];
- 建立FIR滤波器,滤波器的系数即为[bi][b_i][bi]。
如果电路在DC处存在极点,可以先用理想器件把极点抵消掉再做仿真,建模时通过积分器级联FIR滤波器来实现。
以PLL中的LPF为例,先把DC处的极点拿掉,仿真得到阶跃响应曲线,然后采样、求微分得到FIR滤波器的参数,如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oE5VxRKi-1584195469055)(/img/in-post/{{page.id | replace:’/’,’-’}}/StepResp_PLL_LPF.png)]
根据前面得到的参数配置FIR滤波器(FIR的工作频率为25MHz,阶数为30),并级联上积分器补回DC处的极点,得到最终的离散时间域滤波器模型。建模前后的频响曲线如下图所示:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B8FPtJS7-1584195469058)(/img/in-post/{{page.id | replace:’/’,’-’}}/Bode_PLL_LPF_3.png)]
如果将工作频率提升一倍,可以得到更好的效果,但此时FIR的阶数也要翻一番。
如果想通过给定幅频曲线直接产生滤波器参数,可以参考MATLAB中的firls
函数。而且MATLAB还提供了连续时间域滤波器转换为离散时间域滤波器的函数c2d
、bilinear
等,其中也有很多有趣的细节,如果感兴趣可以自行查询资料,不再赘述。
至此,从模拟的角度对数字滤波器的总结告一段落,要知道真正在通信等领域用的数字滤波器更多是Butterworth、Chebyshev、Bessel、Elliptic等高阶滤波器,它们的设计可以参阅Signal Processing Toolbox
中的滤波器部分。
数字滤波器的简单使用相关推荐
- 数字滤波器概念及设计
数字滤波器概念及设计 数字滤波器分类 滤波器相关函数 常见滤波器 平均滤波器 平滑滤波器 限幅滤波器 中值滤波器 数字滤波器(digital filter)是一个离散时间系统,通常按照预定的算法,将输 ...
- 寻找市场中的Alpha—WorldQuant的阿尔法设计理念(上)
本文旨在向读者介绍Alpha的相关基本概念,以及寻找和检验Alpha的主要流程和方法.在上篇中我们梳理了 WorldQuant经典读本FindingAlphas的概要以及WebSim的使用,在下篇中我 ...
- 寻找市场中的Alpha(上):WorldQuant的阿尔法设计理念
本文旨在向读者介绍Alpha的相关基本概念,以及寻找和检验Alpha的主要流程和方法.之前我们梳理了 WorldQuant经典读本FindingAlphas的概要以及WebSim的使用,在下篇中我们会 ...
- matlab滤波器设计双陷滤波,基于MATLAB 双线性变换法IIR 滤波器的设计
摘要:滤波是信号处理的基础,因此滤波器的设计也就成为数字信号处理的基本问题之一.数字滤波是对数字信号处理不可或缺的环节,其好处远远大于模拟滤波器.本文应用MATLAB,实现了用双线性变换法设计IIR滤 ...
- 数字IC经典电路(4)——经典滤波器的实现(滤波器简介及Verilog实现)
数字IC经典电路(4)-经典数字滤波器(滤波器简介及verilog实现) 写在前面的话 数字滤波器分类 经典数字滤波器 FIR滤波器 FFT-FIR滤波器 并行FIR滤波器 串行FIR滤波器 CIC滤 ...
- matlab简单分析数字滤波器FIR
时域FIR滤波器 华中科技大学<数字信号分析理论实践>第六单元 FIR滤波器 学习总结记录 FIR 滤波器脉冲响应函数设计法 MATLAB 中 FIR 滤波器设计函数 fir2() f = ...
- iir数字滤波器_手把手教系列之一阶数字滤波器设计实现(附代码)
[导读] 前面分享了 IIR/FIR/mean/梳状数字滤波器的具体设计实现,这几种使用起来或许觉得计算量大,相对复杂.实际工程应用中通常有必要过滤来自传感器或音频流的数据,以抑制不必要的噪声.有的应 ...
- (多图) 基于Verilog HDL的FIR数字滤波器设计与仿真
引言:数字滤波器是语音与图像处理.模式识别.雷达信号处理.频谱分析等应用中的一种基本的处理部件,它能满足波器对幅度和相位特性的严格要求,避免模拟滤波器所无法克服的电压漂移.温度漂移和噪声等问题.有限冲 ...
- FDATOOL设计数字滤波器
IIR滤波器的MATLAB设计 1 FDATool界面设计 1.1 FDATool的介绍 FDATool(Filter Design&Analysis Tool)是MATLAB信号处 ...
- matlab设计长度为50的滤波器,实验5 基于Matlab的数字滤波器设计
实验五 基于Matlab 的数字滤波器设计 实验目的:加深对数字滤波器的常用指标和设计过程的理解. 实验原理:低通滤波器的常用指标如下所述,其典型规格如下: ?? ????????≤≤≤≤+≤≤-πδ ...
最新文章
- httpd启动不能加载模块
- 更改sybase下设备名
- gateway整合hystrix
- 两数之和 II - 输入有序数组
- C语言再学习--关键字
- LVS(7)——NAT实践
- [原]TCP/UDP使用细节备忘
- 服务器突然关机的操作系统日志,一台R410 服务器不定时宕机,系统日志只有“上一次系统是意外关闭”...
- Kubernetes 真的很复杂吗?
- UNITY服务器登录验证设计,Unity游戏登录模块流程(需验证)
- FFT【快速傅里叶变换】FWT【快速沃尔什变换】
- redis九大数据类型数据结构及底层源码
- python调用sdk接口_基于聚合数据的短信API接口调用示例-Python版
- Vue高德地图自定义信息窗内绑定点击事件
- html个人中心网页,个人中心页面.html
- 【流媒体服务器Mediasoup】多人音视频架构、流媒体的比较、mediasoup介绍 (一)
- 2019icpc计算机程序设计大赛,常熟理工学院新闻网
- 验证性分析---相关假设检验
- 鲁大师Q1手机流畅榜发布,OPPO Find X3 Pro夺冠!
- linux如何查看硬盘的转速