嵌入式–滑动平均滤波算法

嵌入式–滑动平均滤波

​ 滑动平均值滤波是指先在RAM中建立一个数据缓冲区,依顺序存放N个采样数据,每采进一个新数据,就将最早采集的那个数据丢掉,而后求包括新数据在内的N个数据的算术平均值。这样,每进行一次采样,就可计算出一个新的平均值,从而加快了数据处理的速度。

​ 具体实现看代码

头文件 smooth.h

#ifndef __SMOOTH_H
#define __SMOOTH_H

#include <stdint.h>

/* 滑动平均滤波结构体 */ 
typedef struct{
    int16_t index;            // 当前索引
    uint16_t len;             // pBuf 长度
    float* pBuf;            // 数据缓冲区
    float sum;              // 数据累加器
}Smooth;

/*----------------------------------------------------------------------------*/
/**@brief   滑动平均滤波器初始化
   @param   pSmooth  滑动平均滤波器指针,buff 缓冲区,size 缓冲区大小
   @return  none
   @note
*/
/*----------------------------------------------------------------------------*/
void Smooth_Init(Smooth* pSmooth, float* buff, uint16_t size);

/*----------------------------------------------------------------------------*/
/**@brief   滑动平均滤波器滤波
   @param   pSmooth  滑动平均滤波器指针,当前测量值
   @return  当次平均后输出值
   @note
*/
/*----------------------------------------------------------------------------*/
float Smooth_Filter(Smooth* pSmooth, float dat);

#endif //__SMOOTH_H

源文件 protocol.c

#include "Smooth.h"

void Smooth_Init(Smooth* pSmooth, float* buff, uint16_t size)
{
    pSmooth->index = -1;
    pSmooth->pBuf = buff;
    pSmooth->len = size;
    pSmooth->sum = 0.0f;    
}

float Smooth_Filter(Smooth* pSmooth, float dat)
{
    float result = 0.0f;
    int i = 0;
    if(pSmooth->index == -1)
    {
        for(i = 0; i < pSmooth->len; i++)
        {
            pSmooth->pBuf[i] = dat;    
        }
        pSmooth->sum = 0;
        pSmooth->index = 0;
        result = dat;
    }
    else
    {
        pSmooth->pBuf[pSmooth->index] = dat; 
        pSmooth->sum += dat;    
        pSmooth->index++;
        if(pSmooth->index > pSmooth->len)
        {
            pSmooth->index = 0;
            pSmooth->sum = 0;
        }
        result = pSmooth->sum / pSmooth->len;
    }
    return result;
}
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值