当前位置: 首页 > 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…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...