【滤波器学习笔记】一阶RC低通滤波

article/2025/10/19 6:47:19

一阶RC低通滤波

从模拟到数字
本文整理自网络、《匠人手记》等书籍文章

  • 模拟电路低通滤波时域、频域
  • 软件低通滤波

典型电路

这里写图片描述
图1 典型RC电路
直流、交流、脉冲信号都可以用它

时域

电容电流:

Ic=dqdt=d(CUo)dt=CdUodt

基尔霍夫电压定律得:
Ui=RCdUodt+Uo

Ui的单位是伏特,RC的单位为秒,τ=RC;
解得:
Uo(t)=Ui(1e(t/RC))

假设电容初始电压值为0
R=1000Ω
C=4.7uF
Ui=1V
t=0.0001~0.1s
τ=RC
Vc(τ)=0.632
这里写图片描述
图2 一阶RC系统的阶跃响应曲线

频域

u1=Ui;u2=Uo;
以电容电压作为输出,电路的网络函数为:

H(jω)=U2U1=1jωCR+1jωC=11+jωRC

令ωc=
1RC=1τ

ωc即为截止频率;

幅值和相角函数:

|H(jω)|=11+(ωωc)2

θ(ω)=arctanωωc

各变量取值:
R=1000Ω
C=4.7uF

j=1

ω=1RC

fc=12πRC

A(f)=1j2πfRC+1

|A(fc)|=0.707
θ(f)=180arg(A(f))π

θ(fc)=-45

f=0.001、1、…….100000

幅频和相频特性图:
这里写图片描述
图3
这里写图片描述
图4
幅频特性图的对数表示:
这里写图片描述
图5

-当ω<ωc时,幅值是平行于坐标的直线,基本无衰减; 

-当ω>>ωc时,是斜率与-20dB/十倍频成比例的一条直线; 

-当ω=ωc时,增益衰减至0.707,即-3dB,相位滞后45度,对应低通滤波器,该频率通常被称为截止频率。

缺点:
采用这种模拟滤波器抑制低频干扰时,要求滤波器有较大的时间常数和高精度的RC网络,增大时间常数要求增大R值,其漏电流也随之增大,从而降低了滤波效果;

软件上的一阶低通滤波

优点:

-采用数字滤波算法来实现动态的RC滤波,则能很好的克服模拟滤波器的缺点;
-在模拟常数要求较大的场合这种算法显得更为实用;
-其对于周期干扰有良好的抑制作用,
-比较节省RAM空间

缺点

-不足之处是带来了相位滞后,导致灵敏度低
-同时它不能滤除频率高于采样频率的二分之一(称为奈奎斯特频率)的干扰(例如采样频率为100Hz,则它不能滤除50Hz以上的干扰信号)对于高于奈奎斯特频率的干扰信号,应该采用模拟滤波器。
-对没有乘、除法运算指令的单片机来说,程序运算工作量较大

基本滤波算法:

算法由来:
频率分析中一阶RC低通滤波在S域的传递函数:

VoutVin=1RCs+1,(s=jω)

通过z变换(方法很多,如一阶前向差分、双线性变换等这里用一阶后向差分法)
s=1z(1)T,T

带入S域传递函数中:

Y(z)X(z)=1RC1z(1)T+1=TRC(1z(1))+T

推导转化为差分方程后可得:
Y(n)=TT+RCX(n)+RCT+RCY(n1)

通过Z变换把S域的传递函数转化成时域的差分方程,分析可得到

一阶RC数字滤波的基本算法

X为输入,Y为滤波后得输出值,则:

Y(n)=aX(n)+(1a)Y(n1)

a为与RC值有关的一个参数,称为滤波系数,其值决定新采样值在本次滤波结果中所占的权重,其值通常远小于1,当采样间隔t足够小的时候,

a=tRC

-滤波系数越小,滤波结果越平稳,但是灵敏度越低;
-滤波系数越大,灵敏度越高,但是滤波结果越不稳定

-本次输出值主要取决于上次滤波输出值,当前采样值对本次输出贡献比较小,起到修正作用;

-截止频率:

fl=a2πt

例如:t=0.5s (f=2Hz), a=1/32
则fl=(1/32)/(2*3.14*0.5)=0.01Hz;

基本程序:

按照一阶滤波的基本原理与公式写程序,如下:

/*程序中整数运算比小数运算快,为加快程序的处理速度,为计算方便,a取一整数,1-a用256-a来代替,a则取0~255,代表新采样值在滤波结果中的权重(也可将1-a的基数改为100-a,计算结果做相应处理,这里不做说明)*/#define a 128 char value; //上次滤波值
char filter()
{char new_value;new_value=get_ad();//本次采样值return(256-a)*value/256+a*new_value/256;
}

程序初步优化

减少乘、除的运算次数以提高运算速度。
具体优化办法:
先将新采样值与上次滤波结果进行比较,然后根据比较采用不同的公式计算,这样程序的运算效率提高了一倍;
化解基本公式可得:

Xn<Y(n1)Yn=Y(n1)(Y(n1)Xn)×a÷256;

Xn>Y(n1)Yn=Y(n1)+(XnY(n1))×a÷256;

流程图:
这里写图片描述

程序:

/*入口:NEW_DATA 新采样值OLD_DATA 上次滤波结果k        滤波系数(0~255)(代表在滤波结果中的权重)出口:         本次滤波结果*/char filter_1(char NEW_DATA,char OLD_DATA,char k)
{int result;if(NEW_DATA<OLD_DATA){result=OLD_DATA-NEW_DATA;result=result*k;result=result+128;//+128是为了四色五入result=result/256;result=OLD_DATA-result;}else if(NEW_DATA>OLD_DATA){result=NEW_DATA-OLD_DATA;result=result*k;result=result+128;//+128是为了四色五入result=result/256;result=OLD_DATA-result;}else result=OLD_DATA;return((char)result);
}

滤波分析:
当滤波系数为30的时候:
这里写图片描述
当滤波系数为128的时候:
这里写图片描述
当滤波系数为200的时候:
这里写图片描述
可见滤波系数越小,滤波结果越平稳,但是灵敏度越低;滤波系数越大,灵敏度越高,但滤波结果也越不稳定;

不足

-灵敏度和平稳度间的矛盾

-小数舍弃带来的误差
比如:本次采样值=25,上次滤波结果=24,滤波系数=10;
根据算法得本次结果=24.0390625
在单片机中,很少采用浮点数,小数部分要么舍弃,要么进行四色五入。这样结果就变成24;假如采样值一直为25那么,结果永远是24;滤波结果和实际数据一直存在无法消除的误差。
严重时会导致,在数据采样数据稳定在某一数值上时,滤波结果曲线偏离实际值(即滤波结果在稳定时与实际结果存在较大误差);

改善办法

改变滤波系数,增大会导致平稳度降低,滤波系数太大滤波也就丧失意义;
将小数位参与计算,会给CPU带来沉重运算压力;

优化方法 —– 动态调整滤波系数

1、实现功能:
-当数据快速变化时,滤波结果能及时跟进,并且数据的变化越快,灵敏度应该越高(灵敏度优先原则)
-当数据趋于稳定,并在一个范围内振荡时,滤波结果能趋于平稳(平稳度优先原则)
-当数据稳定后,滤波结果能逼近并最终等于采样数据(消除因计算中小数带来的误差)
2、调整前判断:
-数据变化方向是否为同一个方向(如当连续两次的采样值都比其上次滤波结果大时,视为变化方向一致,否则视为不一致)
-数据变化是否较快(主要是判断采样值和上一次滤波结果之间的差值)
3、调整原则:
-当两次数据变化不一致时,说明有抖动,将滤波系数清零,忽略本次新采样值
-当数据持续向一个方向变化时,逐渐提高滤波系数,提供本次采样值得权;
-当数据变化较快(差值>消抖计数加速反应阈值)时,要加速提高滤波系数

调整滤波系数的程序流程:

这里写图片描述

几个常量参数及其取值范围:
(不同的取值会影响滤波的灵敏度和稳定度)
1、消抖计数加速反应阈值,取值根据数据情况确定
2、消抖计数最大值,一般取值10;
3、滤波系数增量,一般取值范围为10~30
4、滤波系数最大值,一般取值255;
这里写图片描述

在调用一阶滤波程序前,先调用调整滤波系数程序,对系数进行即时调整

滤波效果

1、当采样数据偶然受到干扰,滤波结果中的干扰完全被滤除
2、当数据在一个范围内振荡时,滤波结果曲线非常平滑,几乎是一根直线
3、当采样数据发生真实的变化时,滤波结果也能比较及时地跟进
4、当采样数据趋于稳定时,滤波结果逐渐逼近并最终等于采样数据

-最终改进算法,兼顾了灵敏度和平稳度的要求;同时又不太消耗系统的RAM;
-只要合理调整几个常量,以使得算法更合适实际应用;

应用

下面是一个使用了动态调整滤波的例子:

程序:

//用MPU6050测得数据;对x轴滤波处理#define Threshold_1     8       //阈值1用于一阶带参滤波器,变化角度大于此值时,计数增加
#define Threshold_2     30      //阈值2用于一阶带参滤波器,计数值大于此值时,增大参数,增强滤波跟随float K_x=0; //滤波系数
u8 new_flag_x=0;//本次数据变化方向
u8 num_x=0;//滤波计数器/*****带系数修改的一阶滤波函数入口: NEW_DATA    新采样的角度值OLD_DATA    上次滤波获得的角度结果k           滤波系数(代表在滤波结果中的权重)flag        上次数据变化方向
出口: result      本次滤波角度结果*/
float filter_1_x(float NEW_DATA,float OLD_DATA,float k,u8 flag)
{//角度变化方向,new_flag=1表示角度增加,=0表示角度正在减小if((NEW_DATA-OLD_DATA)>0)new_flag_x=1;else if((NEW_DATA-OLD_DATA)<0)new_flag_x=0;if(new_flag_x==flag)  //此次变化与前一次变化方向是否一致,相等表示角度变化方向一致{num_x++;if(fabs((NEW_DATA-OLD_DATA))>Threshold_1)//当变化角度大于Threshold_1度的时候,进行计数器num快速增加,以达到快速增大K值,提高跟随性num_x+=5;                           if(num_x>Threshold_2)   //计数阈值设置,当角度递增或递减速度达到一定速率时,增大K值{K_x=k+0.2;          //0.2为K_x的增长值,看实际需要修改num_x=0;}}else {num_x=0;K_x=0.01;     //角度变化稳定时K_x值,看实际修改}OLD_DATA=(1-K_x)*OLD_DATA+K_x*NEW_DATA;return OLD_DATA;
}

上几张图片:
这里写图片描述

这里写图片描述

这里写图片描述

这里写图片描述

-

-

修改程序中的阈值1和阈值2,可获得不同的滤波效果

————————————

再次声明:本文整理自网络、《匠人手记》等书籍文章,仅作为个人学习笔记


http://chatgpt.dhexx.cn/article/X0tYvaWB.shtml

相关文章

一阶低通数字滤波

一阶低通滤波算法&#xff1a; 3、 一阶低通滤波优缺点 一阶低通滤波数学意义&#xff1a;一阶低通滤波法采用本次采样值与上次滤波输出值进行加权&#xff0c;得到有效滤波值&#xff0c;使得输出对输入有反馈作用。 优缺点&#xff1a;滤波系数越小&#xff0c;滤波结果越平稳…

MATLAB—FIR数字滤波器设计

目录&#xff1a; 1 FIR滤波器的原理2 FIR滤波器的特点2.1 相位特性2.1.1 偶对称2.1.2 奇对称 2.2 幅度特性 3 几种滤波器函数3.1 fir1()3.2 fir2()3.3 kaiserord()3.4 firpm() 4 仿真实例4.1 代码4.2 仿真分析 本文是基于MATLAB的数字滤波器设计&#xff0c;所有数据基于计算机…

窗函数法设计FIR中,如何选择窗函数和阶数N

在用窗函数法设计FIR滤波器时&#xff0c;给出了滤波器要求的具体指标&#xff0c;包括通带频率fp、阻带频率fs、通带波纹Rp和阻带衰减As等&#xff0c;有了这些指标后&#xff0c;是否什么窗函数都可以选择呢&#xff1f;答案是否定的。那么怎么选择窗函数呢&#xff1f;在本小…

一阶RC低通滤波器(二)

这篇文章补充下前面讲的一阶低通滤波器。在母线电压采样或是在电机的三相端电压采样时&#xff0c;往往是先分压&#xff0c;再经过RC低通滤波器。电路图如下&#xff1a; 1&#xff1a;先求输出和输入的关系&#xff08;Uao/Ua&#xff09; 从上式可以看出系统相当于一个典…

二阶有源滤波器设计

1引入 为什么要用有源二阶滤波器&#xff1f; (1)从有源来说 对于无源二阶低通滤波器&#xff1a; 其幅頻方程为&#xff1a; 我们从中可以看出其通带截止频率为 有其品质因子为0.372。 我们根据上图得到二阶无源低通滤波器的品质因子只有0.372&#xff0c;如果希望Q大于0.5…

滤波算法——均值滤波,中值滤波,一阶(αβ)滤波,卡尔曼滤波

滤波算法——均值滤波&#xff0c;中值滤波&#xff0c;一阶(αβ)滤波&#xff0c;卡尔曼滤波 因工作涉及到数据滤波(滤噪)处理&#xff0c;汇总了一些网上简单的滤波算法&#xff0c;方便日后查看。 滤波算法包括&#xff1a;均值滤波&#xff0c;中值滤波&#xff0c;一阶…

一阶滤波器

1. 一阶滤波算法的原理 一阶滤波&#xff0c;又叫一阶惯性滤波&#xff0c;或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。 一阶低通滤波的算法公式为&#xff1a; Y(n)αX(n) (1-α)Y(n-1) 式中&#xff1a;α滤波系数&#xff1b;X(n)本次采样值&…

FIR数字滤波器设计

今天给大侠带来FIR数字滤波器设计&#xff0c;由于篇幅较长&#xff0c;分三篇。今天带来第三篇&#xff0c;FIR数字滤波器设计&#xff0c;包括窗函数法设计FIR滤波器、频率采样法设计FIR滤波器以及基于firls函数和remez函数的最优化方法设计FIR滤波器。话不多说&#xff0c;上…

一阶二阶数字滤波器笔记

数字滤波器 一阶数字滤波器时域分析频域分析数字化代码示例 二阶巴特沃斯低通滤波器S域和Z域的频率关系分析巴特沃斯滤波器举例说明代码示例 声明&#xff1a;感谢知乎大佬的文章&#xff0c;原文链接 数字滤波器实现方法是把滤波器所要完成的运算编成程序并让计算机执行,也就…

简单二阶滤波器截止频率的计算

最近刚好学习到这了&#xff0c;而我在网上查资料的时候却非常难找&#xff0c;不少资料讲解不够详细&#xff0c;所以经过我努力也为了为大家做点贡献的想法&#xff0c;以自己的见解写下这篇文章。废话不多说&#xff0c;先从一阶滤波器讲起。 一阶低通滤波器&#xff1a; …

如何确定插值滤波器的阶数

在信号处理中&#xff0c;滤波器的系数我们往往都是通过MATLAB来设计&#xff0c;只要我们知道滤波器的通带截止频率和阻带起始频率&#xff0c;就可以通过MATLAB中的fdatool&#xff08;在MATLAB2020中使用filterDesigner&#xff09;来设计滤波器了。 我们使用归一化的参数来…

标识符无效

表中存在该列&#xff0c;插入的时候却显示 标识符无效&#xff0c;使用dbsql插入报错&#xff0c;自己写入数据没有问题&#xff01; 查资料发现可能和列的大小写有关。这里强调sql一定用全大写来写避免不必要的麻烦&#xff01;但是我改过后发现并不是这个问题…… 问题已解…

ORA-00904 ID 标识符无效 解决方案

msg&#xff1a;"数据访问异常" dev&#xff1a;"ORA-00904&#xff1a;"ID"&#xff1a;标识符无效 ORA&#xff1a;即 Oracle 报错。 标识符无效是因为&#xff1a;SQL语句中&#xff0c;列名&#xff08;ID&#xff09;不在表中。解决方案&#x…

PLSQL ORA-00904 标识符无效

问题在于“COMPONET_ID” 是字符串&#xff0c;无法识别&#xff0c;如果不是字符串&#xff0c;就可以识别

Oracle标识符无效

Oracle在创建表的时候提示“ORA-00904&#xff1a;标识符无效” 原因为最后一行列定义多了一个逗号&#xff0c;去掉即可。

【Oracle相关】坑!使用oracle时,发生标识符无效解决办法

–真是个大坑 使用oracle时,发生标识符无效解决办法 一般出现该错误的原因&#xff1a; 1、列名写错导致 2、使用了关键字作为了列名 但是这次遇到的情况有点奇葩 通过dblink直接查询该表&#xff0c;并没有报出问题&#xff0c;但在存储过程中通过dblink访问就一直报标识符…

ORA-00904 标识符无效 解决方案

ORA&#xff1a;即Oracle报错。 标识符无效&#xff1a;SQL语句中&#xff0c;这个字段名不在表中。 解决方案&#xff1a;修改SQL语句中对应的字段或者修改表里面对应的列名。 在这里我想说一下&#xff0c;因为我用的是hibernate内部封装好的save方法&#xff0c;咱也不能去改…

HQL 标识符无效

这是报错 因为刚学HIbernate&#xff0c;很多小问题其实挺折磨人的 这是代码&#xff08;我根据网上搜索的答案还有自己的判断测试&#xff0c;感觉应该可能是字段没有" "的问题&#xff09; Configuration configuration new Configuration().configure();Session…

ORA-00904:标识符无效(太坑了!!)

ORA-00904:标识符无效 解决办法(Oracle字段名区分大小写的坑) 问题描述 我在使用jpa或者mybatis集成Oracle进行where查询的时候发现一直出现&#xff1a; java.sql.SQLSyntaxErrorException: ORA-00904: “USER0_”.“PWD”: 标识符无效 下面是问题代码&#xff1a; Testvoid…

Unity⭐️VideoPlayer

文章目录 &#x1f6a9; 解决安卓视频播放模糊 &#x1f6a9; 解决安卓视频播放模糊 1️⃣ 设置RawImage的size跟原视频一致 2️⃣ RawImage的抗锯齿Anti-Aliasing改为8 3️⃣ 勾选sRGB 4️⃣ 视频编码设为H264 大家还有什么问题&#xff0c;欢迎在下方留言&#xff01; 如…