算数平均滤波需要多次采样后才能得出一个有效值,如果被检测量变化较快,多次采样后才输出一次有效值,表现就是系统反应迟钝。将当前采样值与之前连续的历史采样值进行平均,这样每次采样结束即可得出有效值。因为参与计算的历史值个数固定且内容不断前移覆盖更新,类似滑动的数据块窗口,因此成为滑动平均滤波算法。

假如窗口为6,即每次使用最近5个历史值与当前最新值求算数平均值,输出一个有效值;下个周期再覆盖最早时间的点做同样操作。类似环形数组,求最近6个值的平均值。

#define SUM_WIN_SIZE  6int history[SUM_WIN_SIZE];//历史值,其中history[SUM_WIN_SIZE-1]为最近的记录int buff_init=0;//前SUM_WIN_SIZE-1次填充后才能开始输出
int index=0;//环形数组可放数据的位置int filter(int current)
{int i;int sum=0;if(buff_init==0){history[index]=current;index++;if(index>=(SUM_WIN_SIZE-1)){buff_init=1;//index有效范围是0-5,前面放到5,下一个就可以输出}return 0xFFFF;//当前无法输出,做个特殊标记区分}else{history[index]=current;index++;if(index>=SUM_WIN_SIZE){index=0;//index有效最大5,下次再从0开始循环覆盖}for(i=0;i<SUM_WIN_SIZE;i++){sum+=history[i];}return sum/SUM_WIN_SIZE;}
}

滑动平均滤波,输出的结果与先前历史记录有关,假如故意突然改变物理量,需要几个采样周期,输出结果才逐渐接近真实值,实际一般情况下,越新的数据权重越大,历史记录权重应该减少,对滑动窗口中的数据分配不同的加权系数,进行加权平均值。

每个数据分配不同的加权系数,1/K+2/K +3/K +4/K +5/K +6/K =1。则K=1+2+3+4+5+6 可以简化所有数据整体乘以K,减少浮点运算。

最终的加权和再除以K即可。

#define SUM_WIN_SIZE  6int history[SUM_WIN_SIZE];//历史值,其中history[SUM_WIN_SIZE-1]为最近的记录int buff_init=0;//前SUM_WIN_SIZE-1次填充后才能开始输出
int index=0;//环形数组可放数据的位置int factor[SUM_WIN_SIZE]={1,2,3,4,5,6};//加权系数
int K=21;//1+2+3+4+5+6int filter(int current)
{int i,j;int sum=0;if(buff_init==0){history[index]=current;index++;if(index>=(SUM_WIN_SIZE-1)){buff_init=1;//index有效范围是0-5,前面放到5,下一个就可以输出}return 0xFFFF;//当前无法输出,做个特殊标记区分}else{history[index]=current;index++;if(index>=SUM_WIN_SIZE){index=0;//index有效最大5,下次再从0开始循环覆盖}j=index;for(i=0;i<SUM_WIN_SIZE;i++){//注意i=0的值并不是最早的值sum+=history[j]*factor[i];//注意防止数据溢出j++;if(j==SUM_WIN_SIZE){j=0;}}return sum/K;}
}

【嵌入式算法】滑动平均滤波法相关推荐

  1. C 语言实现的滑动平均滤波算法,滑动平均滤波算法(递推平均滤波法)

    /// ///滑动平均滤波算法(递推平均滤波法) /// /// /// GN为数组value_buf[]的元素个数,该函数主要被调用,利用参数的数组传值 /// private const int ...

  2. 单片机ADC采样算法----限幅平均滤波法

    限幅平均滤波法相当于"限幅滤波法"+"递推平均滤波法",每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理. 下面看C代码的实现 #define ...

  3. 单片机ADC采样算法----中位值平均滤波法

    中位值平均滤波法滤波法就是通过连续采样N个数据,然后对数据从小到大排序,然后去掉最大值和最小值,对剩余的N-2个值计算算数平均值.也就是中位值滤波和算数平均滤波的结合. 下面看C代码的实现 #defi ...

  4. MATLAB实现滑动平均滤波法的实例(移动平均滤波器)

    原始信号 0.03    -1.46    -0.26    -0.47    -1.46    -0.06    -0.47    -1.27    0.15    -0.47    -1.47   ...

  5. 滑动平均滤波c语言_常用滤波算法及C语言程序实现

    1.限幅滤波法(又称程序判断滤波法) A.方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A) 每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效 如果本次值与上次值之差 ...

  6. 滑动平均滤波c语言_11种经典软件滤波算法及其波形效果图(附C语言程序)

    (后页附带C语言程序) 注意注意注意:(图像中红线都是经过滤波的)1.限幅滤波法(又称程序判断滤波法) A.方法: 根据经验判断,确定两次采样允许的最大偏差值(设为 A) 每次检测到新值时判断: 如果 ...

  7. 滑动平均滤波_11种滤波算法程序大全(含源代码分享)

    1.限幅滤波法(又称程序判断滤波法) /*A.名称:限幅滤波法(又称程序判断滤波法)B.方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A), 每次检测到新值时判断: 如果本次值与上次值之差& ...

  8. python 曲线平滑处理——方法总结(Savitzky-Golay 滤波器、make_interp_spline插值法和convolve滑动平均滤波)

    文章目录 1 插值法对曲线平滑处理 1.1 插值法的常见实现方法 1.2 拟合和插值的区别 1.3 代码实例 2 Savitzky-Golay 滤波器实现曲线平滑 2.1 问题描述 2.2 Savit ...

  9. python 滤波_[开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve)

    [开发技巧]·Python极简实现滑动平均滤波(基于Numpy.convolve) ​ 1.滑动平均概念 滑动平均滤波法(又称递推平均滤波法),时把连续取N个采样值看成一个队列 ,队列的长度固定为N ...

最新文章

  1. eclipse 新建maven项目报错Could not resolve archetype org.apache.maven.archetype修改配置
  2. mysql为什么没有nvarchar,关于mysql:为什么不将每个VARCHAR指定为VARCHAR(65535)?
  3. Java中“==”和equals()的区别
  4. boost::hana::test::TestGroup用法的测试程序
  5. 从linux内核启动,学习Linux内核启动过程:从start_kernel到init
  6. 用实力给自己正名,YOLOv5:道路损伤检测我最强!GRDDC'2020大赛报告
  7. sql domain credentail
  8. 必杀技———SQL基础整理系列(一)
  9. C#酒店客房管理系统设计与实现
  10. 关于android的外文论文,毕业论文外文翻译-Android开发
  11. 2019年9月全国程序员工资统计
  12. 纯C++版俄罗斯方块
  13. 如何摆脱NAS中的振动和噪音
  14. 伽利略定位系统的历史
  15. 网络安全方面的专业词汇中英文对照
  16. C++的html模板库——google-ctemplete
  17. 20145339顿珠达杰 《信息安全系统设计基础》第0周学习总结
  18. 游戏中接入第三方渠道时 关于meta-data的一些小问题
  19. STLINK,ST-LINK Utility无法连接单片机
  20. 实习、校招面试的一点经验

热门文章

  1. Java爬虫框架WebMagic
  2. 在CANoe/CANalyzer中给CAN Log.asc/blf文件“瘦身”
  3. 图像均值、标准差、变异系数的意义
  4. 06-图6. 公路村村通(30)
  5. 【傻妞对接微信】傻妞对接微信机器人VLW,最新插件。
  6. 男士身高180厘米,体重多少合适
  7. 云计算——详细思维导图
  8. 嵌入式面试题(五、Linux操作系统)
  9. 【什么是哈希, 什么是哈希冲突,怎么解决哈希冲突? 】
  10. 玩转 Scrapy 框架 (一):Item Pipeline 的使用