目录

  • 前言
  • 原理
  • 代码
  • 讨论
  • 改进
  • 参考文章

前言

使用电机速度做闭环控制时,发现传感器的数据受到了高频噪声的影响,于是想先对其进行滤波处理。

原理

滑动平均滤波器本质是一个低通滤波器,可以看成FIR滤波器的一个特例。其时域表达为

y(k)=1N∑i=0N−1x(k+i)y(k)=\frac{1}{N} \sum_{i=0}^{N-1} x(k+i)y(k)=N1​i=0∑N−1​x(k+i)
,其中N为滤波器长度。

代码

代码比较简单,我就没有注释。大概思想就是设置一个滤波器长度的数组,然后不断更新数组内容,再求平均就可以了。写的时候发现其实用队列写应该会更快,但是我懒了一把,因为单片机性能够用所以就算了,如果有写出来的,欢迎一起讨论哈。

/*滑动平均滤波器长度*/
#define MVF_LENGTH 8
float moving_average_filtre(float xn)
{static int index = -1;static float buffer[MVF_LENGTH];static float sum = 0;float yn = 0;int i = 0;if(index == -1){//初始化for(i = 0; i <MVF_LENGTH; i++){buffer[i] = xn;}sum = xn*MVF_LENGTH;index = 0;}else{sum -= buffer[index];buffer[index] = xn;sum += xn;index++;if(index >= MVF_LENGTH){index = 0;}}yn = sum/MVF_LENGTH;return yn;
}

讨论

滑动平均滤波器的长度选择也是个值得讨论的问题。太短的话消除了不了高频噪声,太长的话延迟比较严重。
参考文章里给出了滤波器长度与系统截止频率的经验公式:
N=0.443∗fs/fco\mathrm{N}=0.443* \mathrm{f}_{\mathrm{s}} / \mathrm{fco}N=0.443∗fs​/fco

其中,fs为采样频率,fco为截至频率。推导的过程简单讲就是假设输入信号为正弦信号,且将离散信号变为连续信号之后,对输出信号进行傅里叶变换,进而得到他们的关系。

滑动平均滤波器频率响应

图片来源:https://www.cnblogs.com/pingwen/p/6670675.html

改进

最近又看到一个改进的计算公式,可以节省计算时间,原理很简单,学而不思则罔啊。

改进后的公式为:

y(k)=y(k−1)+1N(x(k)−x(k−N))y(k)=y(k-1)+\frac{1}{N} (x(k)-x(k-N))y(k)=y(k−1)+N1​(x(k)−x(k−N))

参考文章

截止频率和MAF滤波器长度关系

C语言实现滑动平均滤波器相关推荐

  1. freqz()计算M点滑动平均滤波器的频率响应

    函数说明(建议参考官方文档) freqz(h,w)可以用来求指定的单位脉冲响应向量 h 在一组给定频率点 w 上的频率响应值 由这些频率响应值,可以用函数 real 和 imag 计算实部和虚部,函数 ...

  2. 滑动平均滤波器与CIC滤波器

    文章目录 前言 一.传递函数 1.什么是传递函数 2.FIR与IIR在传递函数上的区别(FIR) 3.FIR与IIR在传递函数上的区别(IIR) 4.FIR的抽头系数/FIR的阶数 5.FIR滤波器的 ...

  3. matlab 滑动平均滤波,滑动平均滤波器实验报告

    滑动平均滤波器实验报告 所属分类:matlab例程 开发工具:matlab 文件大小:798KB 下载次数:19 上传日期:2018-01-27 16:12:36 上 传 者:玉玲珑 说明:  给出一 ...

  4. proteus仿真micropython_基于micropython的滑动平均滤波器

    滑动平均滤波也叫递推平均滤波. 把连续取得的N个采样值看成一个队列,队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据(先进先出原则),把队列中的N个数据进行算术平均运算,获得 ...

  5. c语言实现滑动平均_方格网上观测数据的窗口滑动平均处理——C语言

    1 方格网上观测数据的窗口滑动平均处理 一.题目要求 已知 M 行 N 列方格网上的观测数据, 为了压制其中的高频干扰信 号, 使个观测点之间的数据平滑过渡, 要求编写程序对该方格网上的 数据进行窗口 ...

  6. C语言 实时滑动平均滤波 动态改变滑动框内元素数目

    #直接上代码 #include <stdio.h> #include <malloc.h> typedef unsigned int uint32_t;//uint32_t _ ...

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

    嵌入式–滑动平均滤波 ​ 滑动平均值滤波是指先在RAM中建立一个数据缓冲区,依顺序存放N个采样数据,每采进一个新数据,就将最早采集的那个数据丢掉,而后求包括新数据在内的N个数据的算术平均值.这样,每进 ...

  8. 滑动平均滤波/递推平均滤波算法

    说明: 把连续N个采样值看成一个队列,队列长度固定为N: 每采样到一个新数据放入队尾,就扔掉队首的一个数据.把队列中的N各数据进行平均运算,即获得新的滤波结果. 优点: 对周期性干扰有良好的抑制作用, ...

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

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

最新文章

  1. Docker 入门系列(3)- Docker 容器(创建、启动、终止、进入、删除、导入、导出容器、容器和镜像转化)
  2. 计算机原码、反码、补码详解
  3. war部署到tomcat
  4. Storm 1.0.1发布 .NET 适配也已到来
  5. Linux lua 性能,systemTab动态分析linux下lua性能
  6. 【NOIP2014模拟8.25】设备塔
  7. 20200718每日一句
  8. ubuntu 网易云音乐安装
  9. python中数字转英文_如何用Python实现阿拉伯数字转换英文数字 python3 将中文句子中汉字数字转阿拉伯数字...
  10. 银河麒麟桌面操作系统【telnet配置】
  11. 基于R语言的量表网络分析笔记
  12. 生成淘宝短链tb.cn
  13. 1、孟子·梁惠王上 孟子·梁惠王下
  14. 计算机快速切换快捷键,窗口切换快捷键,详细教您电脑窗口切换小技巧是什么...
  15. pb rows changed between retrieve and update的问题
  16. 噼里啪智能·财税产品技术 VP 张芳:DI 和 AI 双引擎为智能财税保驾护航
  17. regsvr32提示模块加载失败 请确保二进制
  18. 洗礼灵魂,修炼python(41)--巩固篇—从游戏《绝地求生-大逃杀》中回顾面向对象编程...
  19. c语言中字符进行按位与,c语言位运算符的用法
  20. vue实现商品放大镜效果

热门文章

  1. 学编程要先学习数学吗?
  2. Visio图片转Eps格式(图片最大化显示)
  3. Object.freeze()方法
  4. 中年人的第N个HelloWorld
  5. 大学生毕业设计网站 基于SSM母婴儿用品网站 儿童用品商城平台 网上购物商城系统Java Vue MySQL数据库 远程调试 代码讲解
  6. Fedora虚拟机中挂载SD卡不成功
  7. 微信小程序生成自定义参数二维码
  8. 云脉CC慧眼百度搜索版,超强大的图文转换,快速翻译软件
  9. Ce6-DBCO 二氢卟吩-二苯基环辛炔 Ce6-PEG-DBCO
  10. 基于Linux的Microsoft Edge浏览器