zoukankan      html  css  js  c++  java
  • 一阶RC低通滤波器详解(仿真+matlab+C语言实现)

    如果本文帮到了你,帮忙点个赞;
    如果本文帮到了你,帮忙点个赞;
    如果本文帮到了你,帮忙点个赞;

    HPF 一阶RC高通滤波器详解(仿真+matlab+C语言实现)
    LPF 一阶RC低通滤波器详解(仿真+matlab+C语言实现)

    1 预备知识

    低通滤波器(LPF)可以滤除频率高于截止频率的信号,类似的还有高通滤波器,带通滤波器,带阻滤波器。一阶RC低通滤波器的电路如下图所示;

    在这里插入图片描述
    参考了Wiki了,然后推导了一遍;首先输入输出的关系如下;
    Vin(t)Vout(t)=Ri(t) V_{in} (t)- V_{out}(t) = Ri(t)
    所以电容的Qc(t)Q_{c}(t)的充电时间为 tt因此满足以下条件;
    {Qc(t)=CVout(t)i(t)=dQcdt egin{cases} Q_{c}(t) = CV_{out}(t) cdots ①\ \ i(t) = cfrac{dQ_{c}}{dt} cdots ② end{cases}
    所以由①,②可得:
    Vin(t)Vout(t)=RCdVoutdt V_{in} (t)- V_{out}(t) = RCcfrac{dV_{out}}{dt} cdots ③
    将方程进行离散化,如果输入VinV_{in}和输出输入VoutV_{out}按照 Tigtriangleup_{T}的时间采样,那么可以将输入和输出序列化,则
    VinV_{in}序列化为:
    (x1,x2,x3,xn1,xn)(x_{1},x_{2},x_{3}cdots,x_{n-1},x_{n})
    VoutV_{out}序列化为:
    (y1,y2,y3,yn1,yn)(y_{1},y_{2},y_{3}cdots,y_{n-1},y_{n})

    因此可以将③式转化为:
    xiyi=RCyiyi1T x_{i} - y_{i} = RCcfrac{y_{i}-y_{i-1}}{igtriangleup_{T}}cdots④

    因此最终滤波输出的序列 yiy_{i} 如下所示;
    在这里插入图片描述
    同样进行简化之后可以得到;
    yi=αxi+(1α)yi1 y_{i} = alpha*x_{i} + (1-alpha)*y_{i-1}

    后面可以根据这个公式进行程序设计;
    另外,截止频率fcf_{c}满足;
    fc=12πRC f_{c} = cfrac{1}{2pi RC} cdots ⑤ \

    2 simulink 仿真

    这里直接根据公式③构建一搞Subsystem
    Vin(t)Vout(t)=RCdVoutdt V_{in} (t)- V_{out}(t) = RCcfrac{dV_{out}}{dt}
    Subsystem
    在这里插入图片描述
    整体的仿真图如下:
    在这里插入图片描述
    其中Sine Wave频率设置为2*pi*50
    在这里插入图片描述
    其中Sine Wave1频率设置为2*pi
    在这里插入图片描述
    所以这里需要使得2*pi*50的信号衰减,所以根据,截止频率fcf_{c}的计算公式,可以改变增益的值,具体如下所示;
    在这里插入图片描述

    3 simulink 运行结果

    最终的仿真的运行结果如下图所示;
    Gain Value0.005
    在这里插入图片描述
    Gain Value0.0318
    在这里插入图片描述

    4 matlab实现

    根据公式yi=αxi+(1α)yi1 y_{i} = alpha*x_{i} + (1-alpha)*y_{i-1}
    实现数字一阶RC低通滤波器,具体matlab程序如下;

    
    Serial = 0:0.1:100;
    Fs = 1;
    Phase = 0;
    Amp = 1;
    
    % 高频信号
    N0 = 2*pi*Fs*Serial - Phase;
    X0 = Amp*sin(N);
    subplot(4,1,1);
    plot(X0);
    
    % 低频信号
    Fs = 0.02;
    N1 = 2*pi*Fs*Serial - Phase;
    X1 = Amp*sin(N1);
    subplot(4,1,2);
    plot(X1);
    
    % 高频低频叠加的信号
    X2=X0+X1;
    subplot(4,1,3);
    plot(X2);
    
    %Xi-Yi=RC*(Yi - Yi-1)/DetalT
    len = length(X2);
    X3=X2;
    p=0.05;
    
    % 一阶RC滤波得到X3
    for i=2:len
        X3(i) = p*X2(i)+(1-p)*X3(i-1);
    end
    
    subplot(4,1,4);
    plot(X3);
    

    5 matlab运行结果

    运行结果如下所示;
    在这里插入图片描述

    6 C语言实现

    low_filter.h

    typedef struct
    {
         int16_t  Input;
         int16_t  Output[2];
         int32_t  FilterTf;		
         int32_t  FilterTs;
         int32_t  Kr;
         int32_t  Ky;
    	
    } low_filter;
    
    
    void low_filter_init(low_filter *v);
    int16_t low_filter_calc(low_filter *v);
    

    其中;

    • FilterTs为采样时间;
    • FilterTfRC时间常数

    具体参考下图;
    在这里插入图片描述
    low_filter.c

    void low_filter_init(low_filter *v){
    	
         v->Kr = v->FilterTs*1024/(v->FilterTs + v->FilterTf);
         v->Ky = v->FilterTf*1024/(v->FilterTs + v->FilterTf);
    }
    
    int16_t low_filter_calc(low_filter *v){
    
    	int32_t tmp = 0;
    
    	tmp = ((int32_t)v->Kr*v->Input + v->Ky*v->Output[1])/1024;
    	
    	if(tmp>32767){
    		tmp = 32767;
    	}
    	
    	if( tmp < -32768){
    		tmp = -32768;
    	}
    	
        v->Output[0] = (int16_t)tmp;
        v->Output[1] = v->Output[0];
    	return v->Output[0];
    }
    

    7 C语言运行结果

    实际测试结果
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    基于jQuery和Bootstrap的手风琴垂直菜单
    JavaScript右下角信息提示插件Notyf
    强大的jQuery幻灯片播放插件 支持全拼、拖拽和下载等功能
    较常用的Math方法及ES6中的扩展
    ES6 完全使用手册
    如何用纯 CSS 创作一个小球上台阶的动画
    BZOJ_1503_[NOI2004]郁闷的出纳员_权值线段树
    BZOJ_2815_[ZJOI2012]灾难 倍增lca + 构造
    BZOJ_3316_JC loves Mkk_ 二分答案 + 单调队列
    BZOJ_1260_[CQOI2007]涂色paint _区间DP
  • 原文地址:https://www.cnblogs.com/unclemac/p/12783347.html
Copyright © 2011-2022 走看看