【下位机软件】平均值滤波之鬼斧神工算法

平均值滤波之鬼斧神工算法

摘自:http://www.cnblogs.com/ifpga/archive/2012/10/07/2713530.html

十种经典软件滤波算法中,可以看到很多算法都是平均值滤波算法变种,事实上最常用的也还是平均值滤波算法。但传统的平均值滤波算法很占内存,每次运算都要求累加和,再求平均值,导致运算效率不高。
 今天介绍一种超简洁超高效的平均滤波算法,此算法是以前搞单片机时一老师所创(单片机上的内存简直是寸土寸金),仅仅用三个变量,就完成了平均值滤波的计算。刚开始看到这个算法是只觉得很佩服,后来用了各种各样的算法后,才感到此算法简直到了鬼斧神工的地步(别以为看完后觉得太简单没啥大不了的,正是因为太简单才突出了它的了不起,最开始能想到将一个复杂的算法简化到无法再简的地步非一般功力所能做到的)。
  
 在该基础上,我们再演变出一种带死区和限幅控制的队列平均值实用算法。
 采样值 C、累加器 S,平均值 A,采样次数 N
  
 传统的平均值滤波算法:
 S = C(1) + C(2) + ... + C(N)
 A = S / N
 需要用循环来计算累加和,比较耗时,C(1~N)是缓存,随采样数N增大,所需内存量也增大
  
 向队列平均值算法推进:
 S = C(1) + C(2) + ... + C(N) (第一次)
 C(x) = C(x + 1) (队列前移)
 C(N) = C
 S = S - C(1) + C(N)
 A = S / N
 运算量有所改进(用指针维护循环队列,不实际移动数据),占用内存问题不变
  
 鬼斧神工算法:
 初始化:A=初始值,S=A*N
 S = S - A + C
 A = S / N
 就这么简单,三个变量(N可以是常数),只要 S 的量程足够,N可以任意调整。
 可以看出,此算法是从队列平均值算法演变而来,因没有了队列,每次计算时不知道该丢弃的最老的一个采样值是多少,这里用了个替代的办法,丢弃上次计算出的平均值。
 去掉了缓存维护,节省内存空间,同时也将运算量压缩到了最小,执行效率非常高。调试时容易修改采样数。
  
 优化算法:
 此算法的核心思想还是平均值滤波,虽然改进了运算量和内存占用,但同样继承了平均值滤波法 N 值较大时平滑度好,反应迟钝的特点。
 为此,对算法引入 S7-200 系统滤波程序中死区的概念:采样值偏差在死区范围内时,进行滤波计算,采样值偏差在死区范围以外时直接使用采样值,达到快速反应的效果。
 再溶合限幅滤波法去掉偶然的干扰脉冲:采样值偏差在限幅范围内时,进行滤波计算,采样值偏差在限幅范围以外时直接丢弃,使用上次滤波输出值。显然,限幅值应该大于死区值。
  
 将此算法写成两个子函数(也可以做成库)
 ① 主滤波程序 AveFilter
 
 
  入口参数:
  EN  : 调用使能位
  bType :采样值类型,‘W‘=整型、‘F‘=浮点型、‘D‘(或其它)=长整型,参数类型:字节
  wHi : 采样值高位字(采样值为整型是,实参必须为0),参数类型,2字节
  wLo : 采样值低位字,参数类型,2字节
  rDie : 滤波死区,参数类型:浮点数
  rMaxErr : 最大允许偏差,参数类型:浮点数
  rLen :滤波队列长度,参数类型:浮点数
 出/入口参数:
  rSum :累加和,参数类型:浮点数
  rAve :滤波输出平均值,参数类型:浮点数
 命令行:CALL   AveFilter, ‘W‘, 0, SMW28, 640.0, 32000.0, 4.0, VD0, VD4
  
 注意:本程序采样值是参数类型可适应的,用 wHi/wLo 的组合来适应整型、长整型、浮点型的参数类型输入,避免使用多个相同的子程序来适应不同类型的输入参数。由 bType 来指定输入的参数类型。
  
 ②滤波器初始化程序 InitFilter
 
  
 入口参数:
  EN  : 调用使能位
  rInit :初始值(一般为0),参数类型:浮点数
  rLen : 滤波队列长度,参数类型:浮点数
 出/入口参数:
  rSum :累加和,参数类型:浮点数
  rAve :滤波输出平均值,参数类型:浮点数
  命令行:CALL   InitFilter, 0.0, 4.0, VD0, VD4

时间: 2024-11-08 09:57:49

【下位机软件】平均值滤波之鬼斧神工算法的相关文章

[自娱自乐] 4、超声波测距模块DIY笔记(四)——终结篇·基于C#上位机软件开发

前言 上一节我们已经基本上把超声波硬件的发射和接收模块全部做好了,接下来我们着手开发一个软硬结合的基于C#的平面定位软件! 目录 一.整体思路 二.效果提前展示 2-1.软件部分展示 2-2.硬件部分展示 三.基于C#的客户端软件说明 3-1.整体框架介绍: 3-2.部分技术细节介绍 3-2-1.串口操作 3-2-2.JiSuan函数说明及核心算法介绍 四.阶段小结 五.相关链接 一.整体思路 >_<" 如下图,利用我们上三节开发的超声波发射与接收设备构成一个:2固定接收头+1可移动

串口操作包括 java上位机 嵌入式c下位机

一环境 1.1 Keil uVision4 http://pan.baidu.com/s/1o6A331w 1.2 STC http://pan.baidu.com/s/1jGpCUTC 1.3 Myeclipse 8.5 http://pan.baidu.com/s/1jGABEaM 1.4 需导入的jar包RXTX http://pan.baidu.com/s/1ntwsvRr 首先把rxtxParallel.dll和rxtxSerial.dll复制到jdk目录的bin目录下面 然后把RXT

4.PMAC下位机-工具安装和使用

PMAC应该看成一台独立的电脑,它有自己的实时操作系统,为了更方便简单的使用,PMAC有自己的一套操作语言来对PMAC的输入输出信号进行控制(IO.电机等信号).和大多数的嵌入式开发一样,PMAC提供一套PC工具来方便查看PMAC控制卡的各种状态变量和编写.调试PMAC程序. 本文介绍PMAC配套工具PEWin32(这里推荐使用PEWin32 PRO,不推荐使用PEWin32 PRO 2,这个新版本有很多bug且不稳定),下一节介绍下位机相关知识,再下一节讲PMAC的下位机编程,这些都是在pew

5.PMAC下位机-下位机编程简介

PMAC的下位机编程涉及三方面的内容:手动操作.运动(Program)程序和PLC程序.这里主要是介绍各个方面的基础编程方面的东西,还有许多需要自行去探索. 变量 PMAC的下位机实际上是一种类Basic的编程语言,但是又类似汇编语言,所有变量的存储空间都是预先分配好的,操作的时候存储数据只能在指定的几种变量类型和变量名中存储,整个系统的参数也是存储在变量中. 变量类型和作用如下: I变量:卡,电机和编码器等的参数变量,用于设置电机的速度,精度,回零等数值,以及坐标系的状态,编码器的反馈形式,P

Linux服务器压测/拷机软件收集

最近公司采购了一批服务器,于是收集了一些拷机软件来压测服务器硬件性能.硬件的稳定相对来说比较重要,7x24小时无间断运行,主要看三个硬件:CPU.内存.硬盘. 下面是收集的一些教程,可能网址已经失效了,但可以根据软件名去查找一些使用教程. 专业的测试软件为LTP,但功能太复杂,没看懂.参考:https://github.com/linux-test-project/ltp 一.压测软件: stresslinux super pi prime mprime nbench cpuburn gamut

开源串口 Ymodem 上位机软件

概述 上位机使用Qt开发,计划整合多个工具为一体,用作以后的调试工具. 当前完成功能: 1.串口调试 支持hex和ascii 码发送,接受. 支持自动添加回车换行. 支持定时发送,最短间隔100ms,最大2000ms. 2.Ymodem-IAP升级 选择文件,启动升级之后会间隔100ms 向下位机发送S,等待下位机应答'C',开始通过Ymodem 发送bin文件. 3.和校验计算 4.快速打开计算器 计划中的功能 1.网络调试功能,支持TCP和UDP调试. 2.支持MQTT订阅发布协议. 3.G

ROS主题发布订阅控制真实的机器人下位机

先模拟控制小乌龟 新建cmd_node.ccpp文件: #include"ros/ros.h" #include"geometry_msgs/Twist.h" //包含geometry_msgs::Twist消息头文件 #include <stdlib.h> #include<stdlib.h> int main(int argc, char **argv) { ros::init(argc, argv, "cmd_node&quo

上位机软件需求说明书100元

上位机软件需求说明书 设备搜索指令 PC机器通过串口发送 BRSR 主机将搜索到的所有蓝牙设备名称发送给PC机器,发送格式为" BRSR"name"\n 例如,现在有三个蓝牙设备"AMOMCU_1"."AMOMCU_1"."AMOMCU_1 ".接收该这令后,串口返回数据: BRSR"AMOMCU_1" BRSR"AMOMCU_2" BRSR"AMOMCU_3&quo

下位机单片机c语言发送数据到串口,上位机pc机java语言获取端口数据

环境: Windows7 64b,jdk64b,myeclipse8.5,rxtx开发包,STC,keil,格西烽火,51单片机,rs232USB转串口线. 下位机c代码 #include <reg51.h> #include <string.h> #define INBUF_LEN 7   //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3,count=0; bit           rea