一阶RC低通滤波

部署运行你感兴趣的模型镜像

一阶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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
程序初步优化

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

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);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

滤波分析: 
当滤波系数为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
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52

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

这里写图片描述

这里写图片描述

这里写图片描述

-

-

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

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

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

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

<think>嗯,用户这次的需求很明确,聚焦在RC低通滤波电路上。虽然之前讨论过放大电路的波特图,但现在的引用材料完全转向了滤波器设计,需要切换技术框架。 用户提供的三个引用很有价值:引用[1]给出了基础设计公式,引用[2]解释了滤波本质,引用[3]则涉及数字化实现。这提示我需要覆盖从模拟电路到数字转换的全链条知识。特别注意到用户截取了RC参数计算案例(f=1kHz时R=1.6kΩ),说明ta可能正在进行实际设计。 考虑到用户前次询问过波特图,这里可以建立连接:滤波电路的幅频特性正是波特图的应用场景。准备在幅频响应小节强调这点,并补充相移特性——虽然用户没提,但相位信息对音频等应用很重要。 技术细节需要特别注意三个要点:首先是转折频率公式$f_c=\frac{1}{2\pi RC}$的物理意义(电荷累积/释放过程),其次是阻抗失配问题(引用[2]提到负载效应),最后是数字实现的差分方程推导(引用[3]的a参数)。数字化部分要解释清楚连续系统到离散系统的转换关系,比如T采样周期与RC时间常数的量纲统。 用户可能隐含的深层需求是故障排查,比如实际截止频率偏移问题。考虑在滤波器设计环节加入"常见问题"模块,特别说明当信号源阻抗较高时,等效电阻R需包含源内阻的理论修正。 注意到系统指令要求严格使用LaTeX格式,所有公式都要套$...$或$$...$$。计划用独立公式块展示关键方程如-20dB/十倍频程特性,行内公式处理像$\tau=RC$这类简写。数字实现部分的递归方程要特别注意上下标排版清晰性(例如y(n-1)的下标)。 </think>以下是RC低通滤波电路的原理、设计及应用详解,结合引用材料进行技术分析: --- ### **、工作原理** 1. **物理基础**: 利用电容的**电压不能突变**特性,高频信号被电容$C$旁路,低频信号通过电阻$R$输出。 - 截止频率公式: $$f_c = \frac{1}{2\pi RC}$$ 例:当$f_c=1\text{kHz}, C=0.1\mu\text{F}$时,$R \approx 1592\Omega$(取标称值$1.6\text{k}\Omega$)[^1]。 2. **频率响应特性**: - **幅频特性**: $$|H(j\omega)| = \frac{1}{\sqrt{1+(\omega RC)^2}}$$ - $\omega < \omega_c$时:增益$\approx 1$(通带) - $\omega > \omega_c$时:增益以**-20dB/十倍频程**衰减 - **相频特性**: $$\phi(\omega) = -\arctan(\omega RC)$$ 输出相位滞后输入,在$f_c$处滞后45°[^2]。 --- ### **二、电路设计** #### **1. 无源RC滤波(基础型)** ```mermaid graph LR Vin-->R-->Vout Vout-->C-->GND ``` - **参数设计步骤**: 1. 确定目标截止频率$f_c$ 2. 选择电容$C$(常用0.01μF~10μF) 3. 计算电阻$R = \frac{1}{2\pi f_c C}$ - **局限**: 负载效应明显,带载后$f_c$漂移(输出阻抗高)[^2]。 #### **2. 有源RC滤波(优化型)** ```mermaid graph LR Vin-->R1-->OPAMP["运放-端"] OPAMP-->Vout C1["C"]-->OPAMP GND-->C1 Vout-->R2-->OPAMP ``` - **优势**: - 运放提供高输入阻抗、低输出阻抗 - 增益可调:$A_v = 1 + \frac{R_2}{R_1}$ - **设计要点**: 运放带宽需$>10f_c$(避免自身相移影响)[^2]。 #### **3. 数字实现(软件滤波)** - **差分方程**: $$y(n) = a \cdot x(n) + (1-a) \cdot y(n-1)$$ 其中: $$a = \frac{T}{T + RC}, \quad T=\text{采样周期}$$ - **参数映射**: - 数字域截止频率:$f_{L} = \frac{a}{2\pi T(1-a)}$ - 等效RC时间常数:$t_\tau = \left( \frac{1}{a} - 1 \right) T$[^3]。 --- ### **三、典型应用场景** 1. **信号去噪**: 衰减传感器信号中的高频干扰(如EMI噪声)[^2]。 2. **音频处理**: 限制扬声器高频响应(避免高音失真)。 3. **ADC抗混叠**: 在ADC前端滤除$>f_s/2$的高频分量($f_s$=采样率)。 4. **电源滤波**: 整流电路后平滑直流电压(如$C=100\mu\text{F}, R=0$的特殊情况)。 --- ### **四、性能优化与误差分析** | 问题 | 原因 | 解决方案 | |------|------|----------| | 截止频率偏移 | 电容容差(±10%~20%) | 选用C0G/NP0电容或并联微调电容 | | 负载效应 | 后级输入阻抗过低 | 增加电压跟随器缓冲 | | 高频衰减不足 | 寄生电感影响 | 采用贴片元件,缩短走线 | > **关键参数验证**: > 通过Multisim波特图仪观测-3dB点($f_c$处增益=0.707),相位滞后45°[^1]。 --- ### **五、与理想滤波器的差异** - **过渡带平缓**:RC滚降仅**-20dB/十倍频程** (四巴特沃斯滤波器可达-80dB/十倍频程) - **相移非线性**:群延迟$\tau = RC$(导致信号失真) - **解决方案**:高滤波器或数字FIR/IIR滤波器 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值