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…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》
这段 Python 代码是一个完整的 知识库数据库操作模块,用于对本地知识库系统中的知识库进行增删改查(CRUD)操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 📘 一、整体功能概述 该模块…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
宇树科技,改名了!
提到国内具身智能和机器人领域的代表企业,那宇树科技(Unitree)必须名列其榜。 最近,宇树科技的一项新变动消息在业界引发了不少关注和讨论,即: 宇树向其合作伙伴发布了一封公司名称变更函称,因…...
