目录

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

前言

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

原理

滑动平均滤波器本质是一个低通滤波器,可以看成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. dlib的编译和安装
  2. schema get_ddl
  3. 修复虚拟磁盘LVM表
  4. .NET 实现并行的几种方式(二)
  5. div css 圆角样式
  6. linux模拟cpu过载,linux下模拟CPU占用100%小程序
  7. 日本乐天要求员工学编程,AI 进中小学课堂,全民编程时代来了!
  8. xycms留言板 php 1.5,XYCMS留言板PHP版 v1.9
  9. c# chart 各个属性_C# WINFORM项目Chart控件显示问题
  10. 第二次作业,问卷星的使用
  11. 批处理——详解%~dp0 %~nx0
  12. 浩方对战平台原理分析
  13. 自动文本摘要经典模型TextSum运行录
  14. JAVA 用户登录图形验证码
  15. 河南大学计算机学院魏倩,何欣-计算机与信息工程学院官网
  16. 梦笔记:又是个次日预言梦
  17. 【ParaView教程】2.9 绘图
  18. openstackAZ配置
  19. 阶乘 最后一个不为0的数
  20. linux使用apt安装软件解析不了域名

热门文章

  1. Ext ColumnModel
  2. easyui使用mergeCells合并单元格后第一行行高过大
  3. 2022CCPC广州站H - GameX Gym - 104053H
  4. Android虚拟机权限问题
  5. 想给项飙先生推荐几本开源之书:对其最近一个演讲的回应
  6. Object转Map
  7. 初识C语言——常见的输入函数(一)
  8. glui.h无法找到描述+解决+测试
  9. 计算机网络中的网桥,一个动画看懂网络原理之网桥的工作原理
  10. 送书啦~《Android App开发进阶与项目实战》