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


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

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

    预备知识

    高通滤波器(HPF-high pass filter)可以滤除频率低于截止频率的信号,类似的还有低通滤波器,带通滤波器,带阻滤波器。一阶RC高通滤波器的电路如下图所示;
    在这里插入图片描述

    关于电容

    首先对电容的几个公式做一下补充;
    电容大小CC满足;
    C=qV C=cfrac{q}{V} cdots①
    其中 qq 是电容所带的电荷量,VV 是电容两端的电势差;
    另外,电流相当于单位时间流过导体的电荷量;因此电流 ii 满足;
    i=dqdt i = cfrac{dq}{dt}cdots②

    根据①,②可以得到电容大小 CC 和电容的电流 ii 以及两端电压 VV 的关系;
    i(t)=Cdv(t)dti(t) = Ccfrac{dv(t)}{dt}

    HPF的推导

    由以上电路可知,假设电流为 i(t)i(t),则可知
    {Vout=Ri(t)i(t)=CdQc(t)dt egin{cases} V_{out} = Ri(t) cdots③ \ i(t) = Ccfrac{dQ_c(t)}{dt} cdots④\ end{cases}
    电容两端的电压为 Vc(t)V_c(t) 根据基尔霍夫定律,满足;
    Vin+VC+Vout=0-V_{in} + V_C + V_{out} = 0

    所以结合①,③,④可以得到;
    Qc(t)=C(Vin(t)Vout(t))Q_c(t) = C( V_{in}(t) - V_{out}(t)) cdots ⑤

    根据 ③,④,⑤ 可以得到以下关系;
    Vout=C(dVindtdVoutdt)I(t)R=RC(dVindtdVoutdt) V_{out} = overbrace{ C( cfrac{dV_{in}}{dt} - cfrac{dV_{out}}{dt}) }^{I(t)} R = RC(cfrac{dV_{in}}{dt} - cfrac{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})

    根据⑥式可以进行离散化,因此最终滤波输出的序列 yiy_{i} 如下所示;
    yi=RC(xixi1Tyiyi1T) y_{i} = RC(cfrac{x_{i}-x_{i-1}}{igtriangleup_{T}} -cfrac{y_{i}-y_{i-1}}{igtriangleup_{T}} )cdots⑦
    将⑦再进一步简化得到;

    在这里插入图片描述

    yi=αyi1+α(xixi1) y_{i} = alpha y_{i-1} + alpha(x_i - x_{i-1})

    其中 α=RCRC+Talpha = cfrac{RC}{RC+igtriangleup_{T}}

    所以换成得到;
    RC=T(α1α)RC = igtriangleup_{T}(cfrac{alpha}{1-alpha}) cdots⑧

    另外截止频率和低通滤波器的相同;
    fc=12πRCf_c = cfrac{1}{2pi RC}

    将⑧式代入可以得到截止频率和 αalpha 的关系;
    fc=1α2παTf_c = cfrac{1-alpha}{2pi alpha igtriangleup_{T}}
    这个公式便于简化后面程序以及截止频率的计算。

    simulink 仿真

    这里根据公式⑥构建simulink的子模块subsystem
    Vout=RC(dVindtdVoutdt) V_{out} = RC(cfrac{dV_{in}}{dt} - cfrac{dV_{out}}{dt})
    具体如下所示;
    在这里插入图片描述
    整体的仿真如下图所示;
    在这里插入图片描述
    其中Sine Wave频率设置为2*pi*40,频率为40赫兹;
    在这里插入图片描述

    其中Sine Wave1频率设置为2*pi*4,频率为4赫兹;

    在这里插入图片描述

    所以这里需要使得2*pi*4的信号衰减,所以根据,截止频率 fcf_c 的计算公式,可以改变增益的值,具体如下所示;
    在这里插入图片描述
    这里RC增益为0.005,因此
    fc=12πRC=12π0.00531.8f_c = cfrac{1}{2pi RC} = cfrac{1}{2pi *0.005} approx 31.8

    simulink 运行结果

    在这里插入图片描述

    matlab 实现

    matlab根据以下这个公式进行数字滤波器的设计;
    yi=αyi1+α(xixi1) y_{i} = alpha y_{i-1} + alpha(x_i - x_{i-1})
    另外 αalpha 的值如何确定需要参考⑧式;

    Serial = 0:0.1:100;
    Fs = 1;
    Phase = 0;
    Amp = 1;
    
    N0 = 2*pi*Fs*Serial - Phase;
    X0 = Amp*sin(N0);
    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);
    
    len = length(X2);
    X3=X2;
    p=0.75;
    
    for i=2:len
        X3(i) = p*X3(i-1)+p*(X2(i)- X2(i-1))
    end
    
    subplot(4,1,4);
    plot(X3);
    

    简单地分析一下,代码中的X1X2X3

    • X1频率为1
    • X2频率为0.02

    {α=p=0.75T=0.1fc=1α2παT egin{cases} alpha = p=0.75 \ igtriangleup_{T} = 0.1 \ f_c = cfrac{1-alpha}{2pi alpha igtriangleup_{T}} end{cases}

    因此可以得到截止频率如下;
    fc=0.252π0.750.10.53f_c=cfrac{0.25}{2pi *0.75* 0.1} approx 0.53

    matlab 运行结果

    在这里插入图片描述

    C语言实现

    typedef struct
    {
         int16_t  Input[2];
         int16_t  Output[2];
         int32_t  FilterTf;		
         int32_t  FilterTs;
         int32_t  Ky;
    } high_filter;
    
    void high_filter_init(high_filter *v);
    int16_t high_filter_calc(high_filter *v);
    

    其中;

    • FilterTs为采样时间 Tigtriangleup_{T}
    • FilterTfRC时间常数;
    • Input[0]表示 xix_i
    • Input[1]表示 xi1x_{i-1}
    • Output[0]表示 yiy_i
    • Output[1]表示 yi1y_{i-1}
    • Ky表示RCRC+Tcfrac{RC}{RC+igtriangleup_{T}}

    参考公式如下所示;
    在这里插入图片描述

    void high_filter_init(high_filter *v){	
         v->Ky = v->FilterTf*1024/(v->FilterTs + v->FilterTf);
    }
    
    int16_t high_filter_calc(high_filter *v){
    
    	int32_t tmp = 0;
    
    	tmp = ((int32_t)v->Ky*v->Output[1] + v->Ky*(v->Input[0] - v->Input[1]))/1024;
    	if(tmp>32767){
    		tmp = 32767;
    	}
    	
    	if( tmp < -32768){
    		tmp = -32768;
    	}
    	
        v->Output[0] = (int16_t)tmp;
        v->Output[1] = v->Output[0];
        v->Input[1] = v->Input[0];
    	return v->Output[0];
    }
    
  • 相关阅读:
    requirejs学习笔记
    Java日期时间处理
    Linux安装ftp服务
    软考真题之设计模式
    《Microsoft Visio 2013 Step by Step.pdf》
    《C++实践之路.pdf》源码
    Python基础与进阶
    微信小程序实战[01]
    常用资源网站
    ECLIPS-S测井系统下的仪器挂接 [CV模块]
  • 原文地址:https://www.cnblogs.com/unclemac/p/12783346.html
Copyright © 2020-2023  润新知