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语言运行结果

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

  • 相关阅读:
    949. Largest Time for Given Digits
    450. Delete Node in a BST
    983. Minimum Cost For Tickets
    16. 3Sum Closest java solutions
    73. Set Matrix Zeroes java solutions
    347. Top K Frequent Elements java solutions
    215. Kth Largest Element in an Array java solutions
    75. Sort Colors java solutions
    38. Count and Say java solutions
    371. Sum of Two Integers java solutions
  • 原文地址:https://www.cnblogs.com/unclemac/p/12783347.html
Copyright © 2011-2022 走看看