嵌入式–滑动平均滤波
滑动平均值滤波是指先在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;
}