当前位置: 首页 > news >正文

5.4 常用滤波算法

文章目录

  • 代码
    • filter.c
    • filter.h

代码

filter.c

#include <stdio.h>
#include "stm32f429xx.h"
#include <string.h>
/*
限幅滤波A方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A),每次检测到新值时判断: 如果本次值与上次值之差<=A,则本次值有效,如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值。B优点: 能有效克服因偶然因素引起的脉冲干扰。C缺点: 无法抑制那种周期性的干扰,平滑度差。A值可根据实际情况调整value为有效值,new_value为当前采样值滤波程序返回有效的实际值
*/
#define DEVIATION  10
float limit_filter(float new_value)
{static int num = 0;static float value = 0;  //需要赋一个初值num ++;if(num == 1)value = new_value;if ( ( new_value - value > DEVIATION ) || ( value - new_value > DEVIATION )){return value;}else{	value = new_value;return new_value;}
}int limit_filter_test(void)
{int  i = 0;float result[20];int a[20] = {15,11,65536,13,16,18,21,100,25,25,31,35,120,38,9,46,50,58,68,5};for(i = 0; i < 20; i++){result[i] = limit_filter(a[i]);//printf("result:%f \n", result);}return 0;
}////*
中位值滤波法A方法: 取之前采样的N次(N取奇数),把N次采样值按大小排列,取中间值为本次有效值。B优点: 能有效克服因偶然因素引起的波动干扰,对温度、液位的变化缓慢的被测参数有良好的滤波效果。C缺点: 对流量、速度等快速变化的参数不宜。排序采用冒泡法 只需要移动最后一个元素即可
*/
#define MIDDLE_FILTER_N  3float middle_filter( float new_value)
{static int mid_filter_count;static float value_buf[MIDDLE_FILTER_N];float temp_buff[MIDDLE_FILTER_N];float temp ;unsigned char count, i;mid_filter_count++;//记录数据for ( count = 0; count < MIDDLE_FILTER_N - 1; count++){value_buf[count] = value_buf[count + 1] ;}value_buf[MIDDLE_FILTER_N - 1] = new_value;__nop();//复制数据for(i=0;i<MIDDLE_FILTER_N;i++){temp_buff[i] = value_buf[i];}//冒泡法排序for(char  k=0;k<MIDDLE_FILTER_N-1;k++)  {		for(char  j=0;j<MIDDLE_FILTER_N-1-k;j++){if(temp_buff[j]>temp_buff[j+1]){temp=temp_buff[j];temp_buff[j]=temp_buff[j+1];temp_buff[j+1]=temp;}}}if(mid_filter_count < MIDDLE_FILTER_N)return new_value;elsereturn temp_buff[(MIDDLE_FILTER_N - 1) / 2];		
}int middle_filter_test(void)
{int  i = 0;float result[20];int a[20] = {15,11,65536,13,16,18,21,100,25,25,31,35,120,38,9,46,50,58,68,5};for(i = 0; i < 20; i++){result[i] = middle_filter(a[i]);//printf("result:%f \n", result);}return 0;
}//
/*算术平均滤波法A方法: 连续取N个采样值进行算术平均运算,N值较大时:信号平滑度较高,但灵敏度较低;N值较小时:信号平滑度较低,但灵敏度较高。N值的选取:一般流量,N=12;压力:N=4。B优点: 适用于对一般具有随机干扰的信号进行滤波,这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动。C缺点: 对于测量速度较慢或要求数据计算速度较快的实时控制不适用,比较浪费RAM 。无需每次求一编所有的和,减去第一个数据加上新数据
*/#define AVERAGE_N 5
float average_filter(float new_value)
{static float value_buf[AVERAGE_N];float average_sum = 0;unsigned char count;//记录数据for ( count = 0; count < AVERAGE_N - 1; count++){value_buf[count] = value_buf[count + 1] ;}value_buf[AVERAGE_N - 1] = new_value;__nop();//复制数据for(uint8_t i=0;i<AVERAGE_N;i++){average_sum += value_buf[i];}return (average_sum /(AVERAGE_N * 1.0) );
}int average_filter_test(void)
{int  i = 0;float result[20];int a[20] = {15,11,65536,13,16,18,21,100,25,25,31,35,120,38,9,46,50,58,68,5};for(i = 0; i < 20; i++){result[i] = average_filter(a[i]);//printf("result:%f \n", result);}return 0;
}/
/*
一阶滞后滤波法A方法: 取a=0~1,本次滤波结果=(1-a)*本次采样值+a*上次滤波结果。B优点: 对周期性干扰具有良好的抑制作用,适用于波动频率较高的场合。C缺点:相位滞后,灵敏度低,滞后程度取决于a值大小,不能消除滤波频率高于采样频率的1/2的干扰信号。alpha=0~1
//公式:	Y(n)=a*X(n)+(1-a)*Y(n-1)整理后得:Y(n)=Y(n-1)+a*(X(n)-Y(n-1))
*/#define 	alpha  0.05
float low_pass_filter(float value)	
{	static float out_last = 0; //上一次滤波值	float out;	out = out_last + alpha*(value - out_last);	out_last = out;	return out;	
}
int low_pass_filter_test(void)
{int  i = 0;float result[10];int a[10] = {15,11,65,13,31,15,16,17,68,15};for(i = 0; i < 20; i++){result[i] = low_pass_filter(a[i]);//printf("result:%f \n", result);}return 0;
}///
#include <stdio.h>
#include <stdint.h>
/*
加权递推平均滤波法A方法: 是对递推平均滤波法的改进,即不同时刻的数据加以不同的权,通常是,越接近现时刻的资料,权取得越大,给予新采样值的权系数越大,则灵敏度越高,但信号平滑度越低。B优点: 适用于有较大纯滞后时间常数的对象和采样周期较短的系统。C缺点: 对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号,不能迅速反应系统当前所受干扰的严重程度,滤波效果差。coe数组为加权系数表,存在程序存储区。
*/#define WEIGHT_AVERAGE_N 3 //12uint8_t  coe[WEIGHT_AVERAGE_N] = {1, 2, 3};//, 4, 5, 6, 7, 8, 9, 10, 11, 12};
uint8_t  sum_coe = 1 + 2 + 3;// + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12;
float weighted_filter(float new_value)
{static float weight_average_buf[WEIGHT_AVERAGE_N];uint8_t count;float  sum = 0;//记录数据for ( count = 0; count < WEIGHT_AVERAGE_N - 1  ; count++){weight_average_buf[count] = weight_average_buf[count+ 1] ;}weight_average_buf[WEIGHT_AVERAGE_N - 1] = new_value;__nop();for (count = 0 ; count < WEIGHT_AVERAGE_N; count++)sum += weight_average_buf[count] * coe[count];return (sum / (sum_coe * 1.0));
}int weighted_filter_test(void)
{int  i = 0;float result[10] ;int a[10] = {15,11,25,13,31,15,16,17,68,15};for(i = 0; i < 10; i++){result[i] = weighted_filter(a[i]);//printf("result:%f \n", result);}return 0;
}///
#include <stdio.h>
#include <stdint.h>/*
消抖滤波法A方法: 设置一个滤波计数器,将每次采样值与当前有效值比较: 如果采样值=当前有效值,则计数器清零。如果采样值 >当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出),如果计数器溢出,则将本次值替换当前有效值,并清计数器。B优点: 对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动。C缺点: 对于快速变化的参数不宜,如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。
*/
#define SHAKE_N 3//12
float shake_filter( float new_value , float now_value)
{static uint8_t count = 0;if(now_value != new_value){count++;if (count >= SHAKE_N){count = 0;return new_value;}}return now_value;
}int shake_filter_test()
{int  i = 0;float result[10]={0};int a[10] = {15,11,255,13,31,15,16,17,68,15};for(i = 0; i < 9; i++){result[i] = shake_filter(a[0],a[i+1]);//printf("result:%f \n", result);}return 0;
}

filter.h

#ifndef  _FILTER_H_
#define  _FILTER_H_
int limit_filter_test(void); 		//限幅滤波
int middle_filter_test(void);		//中值滤波
int average_filter_test(void);	//平均值滤波
int low_pass_filter_test(void);	//一阶低通滤波
int weighted_filter_test(void);	//加权递推平均滤波法
int shake_filter_test(void);		//消抖滤波法
#endif

相关文章:

5.4 常用滤波算法

文章目录 代码filter.cfilter.h 代码 filter.c #include <stdio.h> #include "stm32f429xx.h" #include <string.h> /* 限幅滤波A方法&#xff1a; 根据经验判断&#xff0c;确定两次采样允许的最大偏差值&#xff08;设为A&#xff09;&#xff0c;每…...

【算法系列篇】双指针

文章目录 前言什么是双指针算法1.移动零1.1 题目要求1.2 做题思路1.3 Java代码实现 2.复写零2.1 题目要求2.2 做题思路2.3 Java代码实现 3.快乐数3.1 题目要求3.2 做题思路3.3 Java代码实现 4.盛最多水的容器4.1 题目要求4.2 做题思路4.3 Java代码实现 5.有效三角形的个数5.1 题…...

Web和云开发,Rust会起飞?

Web和云开发&#xff0c;Rust会起飞&#xff1f; 一、前言 二、大厂偏爱&#xff0c;Rust的未来 三、Rust做Web的雄心 四、有必要换Rust做Web&#xff1f; 1.效率和性能 2.可靠性和可维护性 五、Rust先苦后甜 六、用Rust前的几个问题 七、开发界的强者 一、前言 去年…...

深度学习项目学习

文章目录 torchvisiontorchvision.transforms.Compose()类 DataLoader类torch.nntorch.nn.Moudletorch.nn.Sequential模型容器nn.CrossEntropyLoss()交叉熵损失函数 numpynumpy.random. shuffle(x) torchvision torchvision和pytorch的关系&#xff1a; torchvision是PyTorch的…...

【3Ds Max】弯曲命令的简单使用

简介 在3ds Max中&#xff0c;"弯曲"&#xff08;Bend&#xff09;是一种用于在平面或曲面上创建弯曲效果的建模命令。使用弯曲命令&#xff0c;您可以将对象沿特定轴向弯曲&#xff0c;从而创建出各种弯曲的几何形状。以下是使用3ds Max中的弯曲命令的基本步骤&…...

opencv基础:几个常用窗口方法

开始说了一些opencv中的一些常用方法。 namedWindow方法 在OpenCV中&#xff0c;namedWindow函数用于创建一个窗口&#xff0c;并给它指定一个名字。这个函数的基本语法如下&#xff1a; import cv2cv2.namedWindow(窗口名称, 标识 )窗口名称&#xff1a;其实窗口名称&…...

web后端解决跨域问题

目录 什么是跨域问题 为什么限制访问 解决 什么是跨域问题 域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。但是一般情况下不能这么做&#xff0c;它是由浏览器的同源策略造成的&#xff0c;是浏览器对js施加的安全…...

06 json数据解析和列表控件

内容回顾 json数据解析 json ----- 对要传输的数据进行封装的工具 json是由json数组([]) 和 json对象({})在qt中,对JSON数据进行处理(解析和打包) JSON数据处理所要包含的类: QJsonDocument -----它的作用是将数据转换成json文档 QJsonArray ---- json数组,就是封装多个…...

分布式 - 消息队列Kafka:Kafka生产者架构和配置参数

文章目录 1. kafka 生产者发送消息整体架构2. Kafka 生产者重要参数配置01. acks02. 消息传递时间03. linger.ms04. buffer.memory05. batch.size06. max.in.flight.requests.per.connection07. compression.type08. max.request.size09. receive.buffer.bytes和 send.buffer.b…...

MAUI+Blazor:windows 打包踩坑

文章目录 前言MSIX安装文件如何发布选择Windows平台旁加载自定义签名版本号安装 总结 前言 最近打算研究一下MAUIBlazor&#xff0c;争取在今年年底之前彻底搞懂MAUIBlazor的安装模式&#xff0c; MSIX安装文件 Windows 4种安装程序格式MSI&#xff0c;EXE、AppX和MSIX优缺点…...

web集群学习:搭建 LNMP应用环境

目录 LNMP的介绍&#xff1a; LNMP组合工作流程&#xff1a; FastCGI介绍&#xff1a; 1、什么是 CGI 2、什么是 FastCGI 配置LNMP 1、部署LNMP环境 2、配置LNMP环境 LNMP的介绍&#xff1a; 随着 Nginx Web 服务的逐渐流行&#xff0c;又岀现了新的 Web 服务环境组合—…...

我的创作纪念日(256天)

前言 结缘 我与csdn的结缘&#xff0c;之前在创作纪念日&#xff08;128天&#xff09;便已提到&#xff0c;今在此便不再多言 收获 很惭愧&#xff0c;自六月底至八月中旬&#xff0c;因为忙于找工作&#xff0c;奔赴面试求职之际&#xff0c;写博客没有像之前那么勤&#x…...

Vue 转 React 指南

原文&#xff1a; https://icheng.github.io/2023/08/10/Vue%E8%BD%ACReact%E6%8C%87%E5%8D%97/ JSX 先介绍 React 唯一的一个语法糖&#xff1a;JSX。 理解 JSX 语法并不困难&#xff0c;简单记住一句话&#xff0c;遇到 {} 符号内部解析为 JS 代码&#xff0c;遇到成对的 …...

Oracle外部表ORACLE_LOADER方式加载数据

当数据源为文本或其它csv文件时&#xff0c;oracle可通过使用外部表加载数据方式&#xff0c;不需要导入可直接查询文件内的数据。 1、如下有一个文件名为&#xff1a;test1.txt 的数据文件。数据文件内容为&#xff1a; 2、使用sys授权hr用户可读写 DATA_PUMP_DIR 目录权限&a…...

【RocketMQ】NameServer总结

NameServer是一个注册中心&#xff0c;提供服务注册和服务发现的功能。NameServer可以集群部署&#xff0c;集群中每个节点都是对等的关系&#xff08;没有像ZooKeeper那样在集群中选举出一个Master节点&#xff09;&#xff0c;节点之间互不通信。 服务注册 Broker启动的时候会…...

Wordcloud | 风中有朵雨做的‘词云‘哦!~

1写在前面 今天可算把key搞好了&#xff0c;不得不说&#x1f3e5;里手握生杀大权的人&#xff0c;都在自己的能力范围内尽可能的难为你。&#x1f602; 我等小大夫也是很无奈&#xff0c;毕竟奔波霸、霸波奔是要去抓唐僧的。 &#x1f910; 好吧&#xff0c;今天是词云&#x…...

《孤注一掷》现实版:29万打水漂,华为程序员也躲不过的诈骗

明天周五&#xff0c;约吗&#xff1f; 不管怎样&#xff0c;反正播妞已经订好了《孤注一掷》的电影票。不为别的&#xff0c;《孤注一掷》太敢拍了&#xff01;&#xff01;&#xff01; 美女荷官在线发牌&#xff0c;高知程序员在线养“猪”&#xff0c;诈骗头目“虔诚”拜…...

C语言库函数之 qsort 讲解、使用及模拟实现

引入 我们在学习排序的时候&#xff0c;第一个接触到的应该都是冒泡排序&#xff0c;我们先来复习一下冒泡排序的代码&#xff0c;来作为一个铺垫和引入。 代码如下&#xff1a; #include<stdio.h>void bubble_sort(int *arr, int sz) {int i 0;for (i 0; i < sz…...

Maven之mirrorof范围

mirrorOf 是 central 还是 * 的问题 在配置阿里对官方中央仓库的镜像服务器时&#xff0c;我们使用到了 <mirror> 元素。 <mirror><id>aliyunmaven</id><mirrorOf>central</mirrorOf><name>阿里云公共仓库</name><url>…...

游戏中的UI适配

引用参考&#xff1a;感谢GPT UI适配原理以及常用方案 游戏UI适配是确保游戏界面在不同设备上以不同的分辨率、屏幕比例和方向下正常显示的关键任务。下面是一些常见的游戏UI适配方案&#xff1a; 1.分辨率无关像素&#xff08;Resolution-Independent Pixels&#xff09;&a…...

【Linux命令详解 | gzip命令】 gzip命令用于压缩文件,可以显著减小文件大小

文章标题 简介一&#xff0c;参数列表二&#xff0c;使用介绍1. 基本压缩和解压2. 压缩目录3. 查看压缩文件内容4. 测试压缩文件的完整性5. 强制压缩6. 压缩级别7. 与其他命令结合使用8. 压缩多个文件9. 自动删除原文件 总结 简介 在Linux中&#xff0c;gzip命令是一款强大的文…...

IP 协议的相关特性和数据链路层相关知识总结

目录 IP 协议的相关特性 一、IP协议的特性 二、 IP协议数据报格式 三、 IP协议的主要功能 1. 地址管理 动态分配 IP地址 NAT机制 NAT背景下的通信 IPV6 2. 路由控制​​​​​​​ 3.IP报文的分片与重组 数据链路层相关知识 1、以太网协议&#xff08;Ethernet&#xff09; 2.M…...

探索C语言中的常见排序算法

探索C语言中的常见排序算法 排序算法是计算机科学中至关重要的基础知识之一&#xff0c;它们能够帮助我们对数据进行有序排列&#xff0c;从而更高效地进行搜索、插入和删除操作。在本篇博客中&#xff0c;我们将深入探讨C语言中的一些常见排序算法&#xff0c;包括它们的工作…...

【UE】Web Browser内嵌网页在场景中的褪色问题

使用WebBrowser放置在场景中时&#xff0c;网页颜色会出现异常的褪色。 这是因为 Web 浏览器插件以 sRGB 格式输出其颜色数据&#xff0c;而 Widget/3D Widget 需要线性 RGB 格式的数据。 可以通过创建在 3D Widget 中使用的新材质&#xff08;而不是默认的 Widget3DPassthr…...

rust入门系列之Rust介绍及开发环境搭建

Rust教程 Rust基本介绍 网站: https://www.rust-lang.org/ rust是什么 开发rust语言的初衷是&#xff1a; 在软件发展速度跟不上硬件发展速度&#xff0c;无法在语言层面充分的利用硬件多核cpu不断提升的性能和 在系统界别软件开发上&#xff0c;C出生比较早&#xff0c;内…...

embed mongodb 集成spring

在property文件下添加 de.flapdoodle.mongodb.embedded.version5.0.5 spring.mongodb.embedded.storage.oplog-size0不指定数据库&#xff0c;会使用test&#xff0c; port默认是0&#xff0c;随机端口号。 oplog-size mac默认是192mb, 其他系统会使用5%的磁盘可用空间&#x…...

ssh远程连接服务器

一、远程连接服务器简介 二、连接加密技术简介 三、ssh服务配置 四、用户登录ssh服务 Enforcing会强制限制&#xff0c;如端口为22&#xff0c;可以访问&#xff0c;如果是2000端口&#xff0c;不能使用 Permissive是宽容的模式&#xff0c;不限制使用端口 Enforcing会重启失败…...

性能分析之MySQL慢查询日志分析(慢查询日志)

一、背景 MySQL的慢查询日志是MySQL提供的一种日志记录,他用来记录在MySQL中响应的时间超过阈值的语句,具体指运行时间超过long_query_time(默认是10秒)值的SQL,会被记录到慢查询日志中。 慢查询日志一般用于性能分析时开启,收集慢SQL然后通过explain进行全面分析,一…...

每日一练 | mongo集群如何创建分片键

文章目录 MongoDB是什么什么是分片键环境如何设置分片键 MongoDB是什么 MongoDB 是一个基于分布式文件存储的数据库 什么是分片键 分片&#xff1a;每个分片包含分片数据的一部分。每个分片可以部署为副本集。 而分片键的作用就是把数据按一定的条件分布到各个分片中&#…...

Postman

Postman 简介下载安装 简介 Postman 是一款用于测试和开发 API&#xff08;应用程序编程接口&#xff09;的工具&#xff0c;它提供了用户友好的界面和丰富的功能&#xff0c;帮助开发者轻松地创建、测试、调试和文档化各种类型的 API。无论是在构建 Web 应用、移动应用还是其…...