单片机低通滤波算法_单片机滤波算法 - CSDN
精华内容
参与话题
  • 算法学习笔记之一阶低通滤波算法

    万次阅读 多人点赞 2016-09-27 11:33:17
    一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。  一阶低通滤波算法公式为:  Y(n)=αX(n) (1-α)Y(n-1)   式中:α=滤波系数;X(n)=本次采样值;Y(n-1)=...


     1. 一阶滤波算法的原理 

    一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。 

    一阶低通滤波的算法公式为:

                             Y(n)=αX(n) (1-α)Y(n-1) 

      式中:α=滤波系数;X(n)=本次采样值;Y(n-1)=上次滤波输出值;Y(n)=本次滤波输出值。 

    一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,使得输出对输入有反馈作用。

     2. 一阶滤波算法的程序(适用于单个采样) 

    #define a   0.01                // 滤波系数a(0-1)
    
    char value;                    //滤波后的值
    char new_value;                 //  新的采样值
    
    char filter() 
    { 
    char new_value; 
    new_value = get_ad(); 
    return 0.01*value + (1-0.01)*new_value;
     }

    </pre><pre>


    3. 一阶滤波算法的不足 


    1. 关于灵敏度和平稳度的矛盾 

         

          滤波系数越小,滤波结果越平稳,但是灵敏度越低;

          滤波系数越大,灵敏度越高,但是滤波结果越不稳定。


         一阶滤波无法完美地兼顾灵敏度和平稳度。有时,我们只能寻找一个平衡,在可接受的灵敏度范围内取得尽可能好的平稳度。而在一些场合,我们希望拥有这样一种接近理想状态的滤波算法。
    即:

         当数据快速变化时,滤波结果能及时跟进(灵敏度优先);

         当数据趋于稳定,在一个固定的点上下振荡时,滤波结果能趋于平稳(平稳度优先)。

     

    2. 关于小数舍弃带来的误差 


       一阶滤波算法有一个鲜为人知的问题:小数舍弃带来的误差。 比如: 本次采样值=25,上次滤波结果=24,滤波系数=10, 根据滤波算法:

          本次滤波结果=(25*10+24*(256-10))/256=24.0390625 
       但是,我们在单片机运算中,很少采用浮点数。因此运算后的小数部分要么舍弃,要么进行四舍五入运算。这样一来,本例中的结果24.0390625就变成了24。假如每次采样值都=25,那么滤波结果永远=24。也就是说滤波结果和实际数据一直存在无法消除的误差。

    展开全文
  • 一阶RC滤波器的算法实现(低通和高通)

    万次阅读 多人点赞 2018-09-27 11:36:26
    目前,项目需要处理信号。目标信号是特定频率范围内...1、一阶RC低通滤波器的算法实现 1.1 算法推导 1.2 波特图 1.3 用C语言实现  2、一阶RC高通滤波器的原理以及实现 2.1 原理推导 2.2 波特图 2.3 用C语言...

    目前,项目需要处理信号。目标信号是特定频率范围内的信号。高频视为干扰。而一阶RC滤波器容易实现。但是网上资料往往没有详细的推导。因此在这里把笔记记下。本文的优势是比较详细,参数配置都有公式依据。

    目录

    1、一阶RC低通滤波器的算法实现

    1.1 算法推导

    1.2 波特图

    1.3 用C语言实现

     2、一阶RC高通滤波器的原理以及实现

    2.1 原理推导

    2.2 波特图

    2.3 用C语言实现

    3 上机测试


    1、一阶RC低通滤波器的算法实现

    1.1 算法推导

    一阶RC滤波器的硬件电路如图:

    图中输入电压是Vi,电阻R,电容C,输出电压为Vo。

    假设电路的输出阻抗很大(即不带任何负载),输入阻抗很小(理想情况)。可以得到以下公式:

    V_o = \frac{1}{1+j\omega RC}V_i

    电容的阻抗是Z_C = \frac{1}{j\omega C}

    \omega = 2\pi f

    截止频率f_{cut} = \frac{1}{2\pi RC},此频率下的信号,通过这个电路,输出电压和输入电压的关系式是V_o = \frac{1}{1+j}V_i

    或者时域上的表达式:

    V_o = V_i - RC\frac{dV_o}{dt}

    上式离散后,可以得到:

    V_o\left ( k \right )=\frac{V_i\left ( k \right )+\frac{RC}{T_s}V_o\left ( k-1 \right )}{1+\frac{RC}{T_s}}

    假如要过滤掉10KHz以上的频率,可以选择fcut = 1K,并计算RC的值,代入上式。

    1.2 波特图

    用Octave或者Matlab可以得到传递函数的波特图:

    fcut =1000;
    RC=1/2/pi/fcut;
    %pkg load control   %Octave用的读取control包
    y1 = tf(1,[RC,1])
    bode(y1)

    以上波特图可见,在截止频率处(\omega =2\pi f,代入f=1k,可得截至角频率是6283 rad/s),信号会衰减到原来的0.707。这电路对频率大于截止频率的高频信号,具有比较强的衰减作用,同时对该信号有比较大的相位移动。

     

    1.3 用C语言实现

    C语言的实现1

    /**
      * @brief  implement 1 order RC low pass filter
      *         raw data filtered by a simple RC low pass filter@cufoff=5Hz
      * @param  Vi 		: 	Vi(k)
      * @param  Vi_p 	: 	Vi(k-1)
      * @param  Vo 		: 	Vo(k)
      * @param  Vo_p 	: 	Vo(k-1)
      * @note   This example shows a simple way to report end of conversion
      *         and get conversion result. You can add your own implementation.
      * @retval None
      */
    void LowPassFilter_RC_1order(float *Vi, float *Vo, float *Vo_p, float sampleFrq )
    {
    	float CutFrq, RC, Cof1, Cof2;
    		
    	//low pass filter @cutoff frequency = 5 Hz		
    	CutFrq = 5;
    	RC = (float)1.0/2.0/PI/CutFrq;
    	Cof1 = 1/(1+RC*sampleFrq);
    	Cof2 = RC*sampleFrq/(1+RC*sampleFrq);
    	*Vo = Cof1 * (*Vi) + Cof2 * (*Vo_p);		
    	
    	//update 	
    	*Vo_p = *Vo;		
    }

    调用例子:

    
    float b_ADCLoad1Volt, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;
    
    
    LowPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);

    C语言实现2:

    
    //*********** Structure Definition ********//
    typedef struct {
    	float  Vi;
    	float  Vo_prev;
    	float  Vo;
    	float  Fcutoff;
    	float  Fs;
    } LPF_1orderRC_F;
    //*********** Structure Init Function ****//
    void LPF_1orderRC_F_init(LPF_1orderRC_F *v)
    {
    	v->Vi=0;
    	v->Vo_prev=0;
    	v->Vo=0;
    
    	//low pass filter @cutoff frequency = 5 Hz		
    	v->Fcutoff=5;
    
    	// execute 1000 every second
    	v->Fs=1000;
    }
    
    //*********** Function Definition ********//
    float LPF_1orderRC_F_FUNC(LPF_1orderRC_F *v)
    {
    	float RC, Cof1, Cof2;
    		
    	RC = (float)1.0/2.0/PI/v->Fcutoff;
    	Cof1 = 1/(1+RC*v->Fs);
    	Cof2 = RC*v->Fs/(1+RC*v->Fs);
     
    	v->Vo = Cof1 * v->Vi + Cof2 * v->Vo_prev;
     
    	v->Vo_prev = v->Vo;
    	
    	return v->Vo;
    }
    
    LPF_1orderRC_F lpf_1orderrc_handle;
    
    

    调用方式:

    ...
    int main(void)
    {
        ...
        LPF_1orderRC_F_init(&lpf_1orderrc_handle);    //初始化
        while(1)
        {
            ...
            if(flag_1ms==1)
            {
                lpf_1orderrc_handle.Vi = ADCresult;        //假设ADCresult是ADC采样结果
                LPF_1orderRC_F_FUNC(&lpf_1orderrc_handle);    //usage
    	    FilteredResult = lpf_1orderrc_handle.Vo;    //FilteredResult存放滤波结果
            }
        }
    }
    
    

     

     

     

     2、一阶RC高通滤波器的原理以及实现

    2.1 原理推导

    这是一节RC高通滤波器的原理图:

    V_o = \frac{1}{1+\frac{1}{j\omega RC}}V_i

    截止频率f_{cut} = \frac{1}{2\pi RC}

    写成时域上的表达式:

    V_o = C\frac{d\left ( V_i - V_o \right )}{dt}R

    离散化后得到:

    V_o\left ( k \right )=\left ( V_i\left ( k \right )-V_i\left ( k-1 \right )+V_o\left ( k-1 \right ) \right )\frac{RC}{RC+T_s}

    根据设定的截止频率,假如目标频率是50Hz,截止频率可以整定为0.5Hz,过滤低频分量,而不影响目标信号的采集。

    RC = \frac{1}{2\pi f_{cut}}

    2.2 波特图

    传递函数可又频域函数转换得到,将s=j\omega带入频域公式。得到:

    V_o = \frac{RCs}{RCs+1}V_i

    Octave绘制波特图:

    fcut =0.5;
    RC=1/2/pi/fcut;
    pkg load control
    y1 = tf([RC,0],[RC,1])
    bode(y1)

     

     

    高通滤波器对截至频率以上的信号无大影响,信号能正常经过滤波器。但是该滤波器对截至频率以下的信号,具有较大的影响。和截至频率相比,频率越小,衰减作用越明显。同时在相位图中可见,对频率越低的信号,相位移动也越大。

     

    2.3 用C语言实现

    C语言的实现1:

    void HighPassFilter_RC_1order(float *Vi, float *Vi_p, float *Vo, float *Vo_p, float sampleFrq )
    {
    	float CutFrq, RC, Coff;
    		
    	//high pass filter @cutoff frequency = 0.5 Hz		
    	CutFrq = 0.5;
    	RC = (float)1.0/2.0/PI/CutFrq;
    	Coff = RC/(RC + 1/sampleFrq);
    	*Vo = ((*Vi) - (*Vi_p) +(*Vo_p) )*Coff ;		
    	
    	//update 	
    	*Vo_p = *Vo;	
    	*Vi_p = *Vi;		
    }
    

    调用例子:

    
    float b_ADCLoad1Volt, b_ADCLoad1VoltPrv, b_ADCLoad1VoltFltr, b_ADCLoad1VoltFltrPrv;
    
    
    HighPassFilter_RC_1order(&b_ADCLoad1Volt, &b_ADCLoad1VoltPrv, &b_ADCLoad1VoltFltr, &b_ADCLoad1VoltFltrPrv, 1000.0);

    调用时,1000是指每秒需要执行这个函数1000次。

    C语言实现2:

    
    #define PI 3.1415
    
    
    //*********** Structure Definition ********//
    typedef struct {
    	float  Vi;
    	float  Vi_prev;
    	float  Vo_prev;
    	float  Vo;
    	float  Fcutoff;
    	float  Fs;
    } HPF_1orderRC_F;
    //*********** Structure Init Function ****//
    void HPF_1orderRC_F_init(HPF_1orderRC_F *v)
    {
    	v->Vi=0;
    	v->Vi_prev=0;
    	v->Vo_prev=0;
    	v->Vo=0;
    
    	//high pass filter @cutoff frequency = 0.05 Hz		
    	v->Fcutoff=0.05;
    
    	// execute 1000 every second
    	v->Fs=1000;
    }
    
    //*********** Function Definition ********//
    float HPF_1orderRC_F_FUNC(HPF_1orderRC_F *v)
    {
    	float RC, Coff;
     
    	RC = (float)1.0/2.0/PI/v->Fcutoff;
    	Coff = RC/(RC + 1/v->Fs);
    	v->Vo = (v->Vi - v->Vi_prev + v->Vo_prev ) * Coff;
     
    	//update 	
    	v->Vo_prev = v->Vo;
    	v->Vi_prev = v->Vi;	
    	
    	return v->Vo;
    }
    
    HPF_1orderRC_F hpf_1orderrc_handle;

    调用例子:

    ...
    int main(void)
    {
        ...
        HPF_1orderRC_F_init(&hpf_1orderrc_handle);    //初始化
        while(1)
        {
            ...
            if(flag_1ms==1)
            {
                hpf_1orderrc_handle.Vi = ADCresult;        //假设ADCresult是ADC采样结果
                
                FilteredResult = HPF_1orderRC_F_FUNC(&hpf_1orderrc_handle);//FilteredResult存放滤波结果  
            }
        }
    }
    
    

     

    3 上机测试

    板子上面MCU采用STM32F103C8,外扩了USB转UART模块,外扩了PIR+运放模块。

    在STM32F103C8上面,PA7连接了某信号源。USART1和FT232模块连接,与电脑通信。

    单片机对PA7的采样信号进行滤波处理,目的是把目标信号的直流部分和高频部分滤除,得到0.05Hz-5Hz以内的分量。

    上位机使用了SerialChart-0.3.4,把信号波形显示。效果如下图。数据第一列是时间戳,第二列是原始数据,第三列是滤波后的数据。Chart中,蓝色是第二列原始数据,红色是第三列滤波后的数据。

    可以看到,滤波器对直流信号有衰减作用。

    展开全文
  • 一阶滤波,又叫一阶惯性滤波,或一阶低通滤波,软件实现RC低通滤波器的功能。 - 滤波系数越小,滤波结果越平稳,灵敏度越低 - 滤波系数越大,灵敏度越高,但滤波结果越不稳定 一阶滤波无法完美地兼顾灵敏度和平稳...

    本文整理自网络,参考文献附在文末,侵权请联系!


    1. 一阶低通滤波算法原理

    一阶滤波,又叫一阶惯性滤波,或一阶低通滤波,软件实现RC低通滤波器的功能。

    Y(n)=αX(n)+(1α)Y(n1)Y(n)=αX(n) + (1-α)Y(n-1)

    式中:αα为滤波系数,X(n)X(n)为本次采样值,Y(n1)Y(n-1)为上次滤波输出值,Y(n)Y(n)为本次滤波输出值
    在这里插入图片描述

    2. 一阶滤波算法的特点

    • 对于周期干扰有良好的抑制作用(优)

    • 带来了相位滞后,导致灵敏度低(缺)

    • 不能滤除频率高于采样频率的二分之一(称为奈奎斯特频率)的干扰(例如采样频率为100Hz,则它不能滤除50Hz以上的干扰信号)(缺)

    • 滤波系数越小,滤波结果越平稳,灵敏度越低

    • 滤波系数越大,灵敏度越高,但滤波结果越不稳定

    一阶滤波无法完美地兼顾灵敏度和平稳度。有时,我们只能寻找一个平衡,在可接受的灵敏度范围内取得尽可能好的平稳度。而在一些场合,我们希望拥有这样一种接近理想状态的滤波算法。即:当数据快速变化时,滤波结果能及时跟进(灵敏度优先);当数据趋于稳定,在一个固定的点上下振荡时,滤波结果能趋于平稳(平稳度优先)。

    3. 基本算法的例程

    案例1:油门数据滤波

    // 油门滤波
    thr_lpf+=(1/(1+1/(2.0f*3.14f*T)))*(height_thr-thr_lpf)
    

    案例2:

    #define a   0.01                // 滤波系数a(0-1) 
    
    static float oldOutData = 0;
    
    char filter(void)
    {
        nowData  = get_Data(); 
        nowOutData = a * nowData  + (1.0f - a) * oldOutData;
        oldOutData = nowOutData;
        return nowOutData;  
    }
    
    
    /*
    程序中整数运算比小数运算快,为加快程序的处理速度,
    为计算方便,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}
    

    案例3:MATLAB测试

    % 一阶低通滤波器测试
    close all;
    t = 0.003;
    A = 1/(1+(1/(2*pi*t)));
    tt = 0:t:25;
    y = sin(0.5*tt);
    y_noise = awgn(y,35);
    y_proce = y_noise;
    for i = 2:length(y)
        y_proce(i) = (1-A) * y_proce(i-1) + A * y_noise(i);
    end
    
    plot(tt,y,'r');
    figure(2)
    plot(tt,y_noise,'g');hold on;
    plot(tt,y_proce,'b');
    hold off;
    

    4. 优化:减少乘、除的运算次数以提高运算速度

    思路:先将新采样值与上次滤波结果进行比较,然后根据比较采用不同的公式计算,这样程序的运算效率提高了一倍

    在这里插入图片描述
    在这里插入图片描述

    /*入口: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);
    }
    

    分析:

    • 仍然存在灵敏度与平温度之间的矛盾
    • 小数舍弃带来的误差(单片机很少采用浮点数,小数位要么舍弃要么四舍五入)

    5. 改进:动态调整滤波系数

    实现功能:

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

    在这里插入图片描述
    几个常量参数及其取值范围(不同的取值会影响滤波的灵敏度和稳定度):

    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;
    }
    
    

    参考文献:

    展开全文
  • 什么事低通滤波,先一下百度百科上的定义。 算法实现的公式如下: y(n) = q*x(n) + (1-q)*y(n-1) 其中Y(n)为输出,x(n)为输入,y(n-1)为上一次输出值,其中q为滤波系数。取值范围为0--1. 也就是说若q...

      关于低通滤波,先看一下百度百科上的定义。

    算法实现的公式如下:

     y(n) = q*x(n) + (1-q)*y(n-1)    

    其中Y(n)为输出,x(n)为输入,y(n-1)为上一次输出值,其中q为滤波系数。取值范围为0--1.

    也就是说若q=0.5时,这个公式代表的意思就是取本次采样值的50%,加上上一次采样值的50%,做为本次的采样结果。也就是说每次的采样结果都和上一次的采样结果相关。

    看一下在单片机中C代码的实现

    //参数:com 为采样的原始数值
    //返回值:iData 经过一阶滤波后的采样值
    unsigned int lowV( unsigned int com )
    {
        static unsigned int iLastData;    //上一次值
        unsigned int iData;               //本次计算值
        float dPower = 0.1;               //滤波系数
        iData = ( com * dPower ) + ( 1 - dPower ) * iLastData; //计算
        iLastData = iData;                                     //存贮本次数据
        return iData;                                         //返回数据
    }
    
    //主函数
    void main( void )
    {
      while( 1 )
        {
            val1 = ReadVol_CH3() ;         //   读取AD采样值   
            val3 = lowV( val1 );           //   采样值经过一阶滤波算法
            printf("A%d\r\n",val1);        //   打印采样值
            printf("B%d\r\n",val3);        //   打印经过滤波算法后的采样值
        }
    }

    通过ADC采样输入电压,然后将采样值经过一阶滤波运算,通过串口分别打印采样值和经过一阶滤波运算后的值。

    通过串口波形显示软件可以看到采样的结果为:

          当滤波系数q=0.1时,本次采样数据占采样结果的10%,上一次采样数据占采样结果的90%,也就是说采样数据突变时对采样结果影响不大,采样的波形比较平滑。

            由上面的波形也可以看出,蓝色波形为原始数据波形,波动范围比较大,橙色波形为经过一阶滤波算法后的波形,波形比较平稳。

      将q值改为0.5时,看看采样情况。

    可以看到当滤波系数增大到0.5时,本次采样数据和上次采样数据对结果的影响分别占50%。通过波形可以看到,经过滤波后的波形也出现了波动,但是波动范围相对于原始波形来说小了一点。

    将q值继续增大,改为0.9时,看看采样情况。

    通过波形可以看到将采样系数增大后,本次采样数据对采样结果影响占到了90%,经过一阶滤波后的波形基本和原始波形保持了同步,实时性比较好,但是稳定性会差一点。

    通过不同滤波系数的对比发现:

      滤波系数越小,滤波结果越平稳,但是灵敏度越低;

      滤波系数越大,灵敏度越高,但是滤波结果越不稳定。

    在实际应用中根据不同的需求,选择合适的滤波系数,以满足系统要求。

    展开全文
  • 一个非常适合单片机滤波算法

    千次阅读 2015-04-17 11:55:54
    连接:http://bbs.21ic.com/icview-170880-1-1.html -------------------------------------------------以下为原文 ------------------- 连接:...单片机大多资源小,算法占用
  • 单片机中常用的一些滤波算法

    千次阅读 2013-11-14 13:14:23
    0 引言 在单片机的数据采集系统中,测量通道串入随机干扰是难免的,从而使A/D转换送入单片机的数据存在误差,这种因随机干扰产生的误差称为随机误差。随机误差虽然无法预测...1 常用的数字滤波算法及实现 在单片机
  • 6种常见的单片机数字滤波算法

    千次阅读 2018-01-26 15:32:43
    但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。 在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰...
  • 一阶低通滤波算法

    千次阅读 2018-07-12 16:33:11
    1. 一阶滤波算法的原理 一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。 一阶低通滤波的算法公式为: Y(n)=αX(n) (1-α)Y(n-1) 式中:α=滤波系数;X(n)=本次...
  • 一阶低通滤波

    2019-09-24 16:27:11
    从硬件电路和软件算法上都能一定程度的减少噪声达到滤波的目的,本文主要讲解软件使用低通滤波算法来滤波ADC采样值的方法。 一阶低通滤波(又叫惯性滤波)算法 算法原理   滤波算法公式: Y(n) = a * X(n) + ...
  • 这篇把单片机数字滤波算法讲绝了

    千次阅读 2018-01-28 13:59:04
    但在某些特定场合,不可避免地要用到数学运算,尽管单片机并不擅长实现算法和进行复杂的运算。下面主要是介绍如何用单片机实现数字滤波。在单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的...
  • 三轴加速计中一阶低通滤波算法

    千次阅读 2016-09-13 15:25:50
    文章出处:http://www.docin.com/p-745334438.html
  • 低通滤波(一阶)

    千次阅读 2017-09-14 16:59:24
    一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。 一阶低通滤波算法公式为: Y(n)=(1-α) * Y(n-1) + αX(n) 式中:α=滤波系数;X(n)=本次采样值;Y(n-1)=上次...
  • 【滤波器学习笔记】一阶RC低通滤波

    万次阅读 多人点赞 2016-08-31 18:10:50
    一阶RC低通滤波从模拟到数字 本文整理自网络、《匠人手记》等书籍文章 模拟电路低通滤波时域、频域 软件低通滤波 典型电路 图1 典型RC电路 直流、交流、脉冲信号都可以用它时域电容电流: Ic=dqdt=d(C∙Uo)dt=...
  • 实战低通滤波和卡尔曼滤波

    热门讨论 2020-05-09 18:12:47
    背景 滤波这个词对任何一个工科生都不会陌生,尤其是做控制或者信号方面的从业者和学生。我们不仅可以通过硬件滤波也...那么本次就从理论到实践,从公式推导到算法实现来学习一阶低通滤波器和卡尔曼滤波器。 所需...
  • 文章目录01 - 一阶滞后滤波算法简介02 - 硬件低通滤波器03 - 稳定滤波的原理04 - 实际应用与...  一阶滞后滤波又称作RC低通滤波、一阶滤波、一阶惯性滤波、一阶低通滤波等,下文统一称为一阶滞后滤波。 01 - 一阶...
  • 常用数字滤波算法总结

    千次阅读 2017-05-08 11:46:30
    单片机进行数据采集时,会遇到数据的随机误差,随机误差是由随机干扰引起的,其特点是在相同条件下测量同一量时,其大小和符号会现无规则的变化而无法预测,但多次测量的结果符合统计规律。为克服随机干扰引起的...
  • 算法学习之:一阶滞后滤波算法

    万次阅读 2018-05-21 15:52:36
    1. 一阶滤波算法的原理 一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。 一阶低通滤波的算法公式为: Y(n)=αX(n) (1-α)Y(n-1) 式中:α=滤波系数;X(n)=本次...
  • 一阶RC低通滤波

    万次阅读 2017-04-24 10:59:39
    一阶RC低通滤波 从模拟到数字  本文整理自网络、《匠人手记》等书籍文章 模拟电路低通滤波时域、频域软件低通滤波 典型电路   图1 典型RC电路  直流、交流、脉冲信号都可以用它 时域 电容...
1 2 3 4 5 ... 20
收藏数 819
精华内容 327
关键字:

单片机低通滤波算法