事件的起因是下图1,朋友偶然说到一阶低通滤波器,借此来详细介绍一阶低通滤波器的原理,并附上matlab仿真程序代码。图1中的一阶低通数字滤波器的公式为Eq(1):

y(n) = q*x(n) + (1-q)*y(n-1)    Eq(1)

其中,y(n)表示当前的输出,x(n)表示当前的输入,y(n-1)表示上一次的输出(图1中的符号不标准,因为一般时域用小写,频域或Z域用大写)。Eq(1)为差分方程,在分析离散系统时常用差分方程,而求解差分方程通常在z域实现,z变换使问题分析变得简单。这是一个IIR滤波器,那什么是FIR滤波器?什么是IIR滤波器呢?FIR滤波器是有限输入有限输出,换句话说当输入为0时输出也为0,系统无反馈;而IIR滤波器在输入为0时也可以有输出,由于增加了反馈回路,系统有不稳定发散的可能,因此IIR的分析要比FIR复杂一点。

                                                                            图1

我们将公式Eq(1)进行z变换得到z域传递函数。见Eq(2),注意其中z域的大写,我们要符合规范。根据Eq(2),系统具有一个极点z=1-q和一个零点z=0,我们这里关心的是极点。当极点处于z域单位圆内时,系统是稳定的,否则系统为不稳定系统会发散。单位圆是个重要的概念,z域的单位圆等同于s域的虚轴向左卷绕成z域的单位圆(s域中极点处于虚轴左边系统稳定)。分析z域的幅频响应(IIR的相位非线性这里不表)是在单位圆上进行的,z=r*exp(jw),单位圆上模值为1,所以z=exp(jw)(e的j*w次幂),根据欧拉公式exp(jw)
= cos(w)+j*sin(w),我们得到Eq(3)。我们可以借助matlab来方便的求出H(w)的幅频响应,后面会给出代码,我们先来看结果见图2.

 

当q和采样时间的参数和图1保持一致时(q=0.0565
fs=3.333k即300us),幅频响应见图2,在横坐标为30hz时的幅值为0.708约等于0.707(-3dB点),我们简单分析一下图2,一阶低通滤波器的通带。。。。额。。图中看着比较窄,而且不平坦和理想一阶低通滤波器相比差距明显,但是对于高频干扰抑制效果明显,而且简单易实现,很多单片机应用中就会使用此滤波器。

                                                                图2 

 图5是仿真的时域结果,其中黑色线是理想信号,红色线是带躁信号,蓝色线是去噪后的信号,由于使用一阶低通滤波器后的信号波形和理想波形比较接近,所以图3中识别的不是很清晰。图4是结果局部示意图,这样可以清晰地看到理想信号、滤波前的带躁信号和滤波后的“干净”信号的时域波形情况。

                                                                             
   图3 

                                                                             
        图4 

代码:
%名称:数字一阶低通滤波器 clc; clear; close all; t=0.0003; %采样周期为300us fs = 1/t; %采样频率 w =
-3.14:0.001:3.14; %横坐标分辨率,z域单位圆中w为+-pi q=0.0565; %系数 f =
(q*cos(w)+q*1i*sin(w))./(cos(w)-(1-q)+1i*sin(w));%传递函数 am=abs(f); %求幅值
w=w*(fs/2/pi); %z域w和采样频率之间的换算 plot(w,am); %答应幅频响应曲线
xlabel('Frequency(Hz)','fontsize',17); ylabel('Amplitude','fontsize',17);
%%%%%%%%信号处理 tt = 0:0.0003:25; y_ideal = sin(0.5*tt); %理想信号 y_noise =
awgn(y_ideal,35); %带噪信号 y_proce = y_noise; %去燥后的信号 n=length(y_proce); for i=2:n
y_proce(i) = q *y_noise(i) + (1-q)*y_proce(i-1); end figure(2);
plot(tt,y_noise,'r');hold on; plot(tt,y_ideal,'k','lineWidth',2); hold on;
plot(tt,y_proce,'b'); hold on; xlabel('Time(s)'); ylabel('Amp(v)');
 

技术
©2020 ioDraw All rights reserved
2020前端学习路线收集整理【C语言】乘法表29岁“退休程序员”郭宇: 有钱的人不一定自由,自由的人不一定有钱python gui界面实例-Python GUI编程完整示例pytorch训练过程中GPU利用率低学习java 的第一节课vue element-ui实现input输入框金额数字添加千分位对于面试官的问答: 你在项目组里拿到一个项目是怎么开展的呢???算法题的输入大总结小程序表单中 多个循环input 如何取每个input的值