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方法: 根据经验判断,确定两次采样允许的最大偏差值(设为A),每…...

【算法系列篇】双指针
文章目录 前言什么是双指针算法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和云开发,Rust会起飞? 一、前言 二、大厂偏爱,Rust的未来 三、Rust做Web的雄心 四、有必要换Rust做Web? 1.效率和性能 2.可靠性和可维护性 五、Rust先苦后甜 六、用Rust前的几个问题 七、开发界的强者 一、前言 去年…...
深度学习项目学习
文章目录 torchvisiontorchvision.transforms.Compose()类 DataLoader类torch.nntorch.nn.Moudletorch.nn.Sequential模型容器nn.CrossEntropyLoss()交叉熵损失函数 numpynumpy.random. shuffle(x) torchvision torchvision和pytorch的关系: torchvision是PyTorch的…...

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

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

web后端解决跨域问题
目录 什么是跨域问题 为什么限制访问 解决 什么是跨域问题 域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。但是一般情况下不能这么做,它是由浏览器的同源策略造成的,是浏览器对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,争取在今年年底之前彻底搞懂MAUIBlazor的安装模式, MSIX安装文件 Windows 4种安装程序格式MSI,EXE、AppX和MSIX优缺点…...

web集群学习:搭建 LNMP应用环境
目录 LNMP的介绍: LNMP组合工作流程: FastCGI介绍: 1、什么是 CGI 2、什么是 FastCGI 配置LNMP 1、部署LNMP环境 2、配置LNMP环境 LNMP的介绍: 随着 Nginx Web 服务的逐渐流行,又岀现了新的 Web 服务环境组合—…...

我的创作纪念日(256天)
前言 结缘 我与csdn的结缘,之前在创作纪念日(128天)便已提到,今在此便不再多言 收获 很惭愧,自六月底至八月中旬,因为忙于找工作,奔赴面试求职之际,写博客没有像之前那么勤&#x…...
Vue 转 React 指南
原文: https://icheng.github.io/2023/08/10/Vue%E8%BD%ACReact%E6%8C%87%E5%8D%97/ JSX 先介绍 React 唯一的一个语法糖:JSX。 理解 JSX 语法并不困难,简单记住一句话,遇到 {} 符号内部解析为 JS 代码,遇到成对的 …...

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

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

Wordcloud | 风中有朵雨做的‘词云‘哦!~
1写在前面 今天可算把key搞好了,不得不说🏥里手握生杀大权的人,都在自己的能力范围内尽可能的难为你。😂 我等小大夫也是很无奈,毕竟奔波霸、霸波奔是要去抓唐僧的。 🤐 好吧,今天是词云&#x…...

《孤注一掷》现实版:29万打水漂,华为程序员也躲不过的诈骗
明天周五,约吗? 不管怎样,反正播妞已经订好了《孤注一掷》的电影票。不为别的,《孤注一掷》太敢拍了!!! 美女荷官在线发牌,高知程序员在线养“猪”,诈骗头目“虔诚”拜…...

C语言库函数之 qsort 讲解、使用及模拟实现
引入 我们在学习排序的时候,第一个接触到的应该都是冒泡排序,我们先来复习一下冒泡排序的代码,来作为一个铺垫和引入。 代码如下: #include<stdio.h>void bubble_sort(int *arr, int sz) {int i 0;for (i 0; i < sz…...

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

游戏中的UI适配
引用参考:感谢GPT UI适配原理以及常用方案 游戏UI适配是确保游戏界面在不同设备上以不同的分辨率、屏幕比例和方向下正常显示的关键任务。下面是一些常见的游戏UI适配方案: 1.分辨率无关像素(Resolution-Independent Pixels)&a…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...

接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...

DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集
基于深度学习YOLOv11的盲人障碍物目标检测:开启盲人出行新纪元 在全球范围内,盲人及视觉障碍者的出行问题一直是社会关注的重点。尽管技术不断进步,许多城市的无障碍设施依然未能满足盲人出行的实际需求。尤其是在复杂的城市环境中ÿ…...