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

【单片机】实现一个简单的ADC滤波器

实现一个 ADC的滤波器,PT1 滤波器(也称为一阶低通滤波器),用于对输入信号进行滤波处理。

typedef struct PT1FilterSettings PT1FilterSettings;
struct PT1FilterSettings
{//! last Filter output valueuint32_t filtValOld;//! Tn..FilterTimeConstant, Ts...Sampletime, F Faktor =2^Fuint32_t filtConst1; //! (Ts+Tn)*F in 2^nuint32_t filtConst2; //! Ts*Fuint32_t filtConst3; //! Tn*Fuint8_t filtFactor; 	//! 2^F
};/*************************************************************************************************/
/*! \brief   PT1 filter for all channels, setting are used from the observers\param   uint16_t uiSignalFiltIn ... input valuePT1FilterSettings *filterSettings ... filter instance of observer\return  uint16_t filtert value\callgraph -**************************************************************************************************/
uint16_t pt1Filter(uint16_t uiSignalFiltIn, PT1FilterSettings *filterSettings)
{ // -------- info ----------------// 32Bit PT1 Filter (Euler Forward)uint32_t signalFiltOut;// ------ Filter initialization to first signal sample ----if (!filterSettings->filtValOld)  {filterSettings->filtValOld = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; //load first value}signalFiltOut  = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; 	//scale value with factorsignalFiltOut  = (filterSettings->filtConst2*signalFiltOut); 							//multiply with sample timesignalFiltOut  = signalFiltOut + (filterSettings->filtConst3*filterSettings->filtValOld); //add old value multiplied with the time constantsignalFiltOut >>= filterSettings->filtConst1;															//scale down the sum filterSettings->filtValOld = signalFiltOut;																//save value for next samplereturn (signalFiltOut >> filterSettings->filtFactor);											//return value devided by the factor
}

下面逐行解释这段代码的功能和工作原理。

函数定义

uint16_t pt1Filter(uint16_t uiSignalFiltIn, PT1FilterSettings *filterSettings)
  • 参数

    • uiSignalFiltIn:输入信号,类型为 uint16_t(16 位无符号整数)。
    • filterSettings:指向 PT1FilterSettings 结构体的指针,包含滤波器的设置参数。
  • 返回值:返回滤波后的信号,类型为 uint16_t

代码解析

uint32_t signalFiltOut;
  • 定义一个 32 位无符号整数 signalFiltOut,用于存储滤波后的信号。
滤波器初始化
if (!filterSettings->filtValOld)  
{filterSettings->filtValOld = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; //load first value
}
  • 检查 filtValOld 是否为零(即滤波器是否未初始化)。
  • 如果是,则将输入信号左移 filtFactor 位并赋值给 filtValOld,这相当于初始化滤波器的状态。
滤波计算
signalFiltOut  = (uint32_t)uiSignalFiltIn << filterSettings->filtFactor; 	//scale value with factor
  • 将输入信号左移 filtFactor 位,进行缩放。
signalFiltOut  = (filterSettings->filtConst2 * signalFiltOut); 							//multiply with sample time
  • 将缩放后的信号乘以 filtConst2,通常用于与采样时间相关的计算。
signalFiltOut  = signalFiltOut + (filterSettings->filtConst3 * filterSettings->filtValOld); //add old value multiplied with the time constant
  • filtValOld(上一个滤波输出值)乘以 filtConst3,并与当前信号相加。这一部分实现了滤波器的递归特性。
signalFiltOut >>= filterSettings->filtConst1; //scale down the sum 
  • signalFiltOut 右移 filtConst1 位,进行缩放,通常用于调整输出信号的范围。
filterSettings->filtValOld = signalFiltOut; //save value for next sample
  • 将当前的滤波输出值保存到 filtValOld,以便在下一个采样时使用。
返回值
return (signalFiltOut >> filterSettings->filtFactor); //return value divided by the factor
  • 返回滤波后的信号,右移 filtFactor 位以恢复到原始范围。

总结

这段代码实现了一个 PT1 滤波器,使用了简单的递归公式来平滑输入信号。主要步骤包括:

  1. 初始化滤波器状态。
  2. 对输入信号进行缩放。
  3. 结合当前信号和上一个滤波输出值进行加权计算。
  4. 更新滤波器状态以备下次使用。
  5. 返回滤波后的信号。

这种滤波器常用于信号处理,能够有效去除高频噪声,平滑信号变化。

相关文章:

【单片机】实现一个简单的ADC滤波器

实现一个 ADC的滤波器&#xff0c;PT1 滤波器&#xff08;也称为一阶低通滤波器&#xff09;&#xff0c;用于对输入信号进行滤波处理。 typedef struct PT1FilterSettings PT1FilterSettings; struct PT1FilterSettings {//! last Filter output valueuint32_t filtValOld;//…...

开源 vGPU 方案 HAMi 解析

开源 vGPU 方案 HAMi 一、k8s 环境下 GPU 资源管理的现状与问题 &#xff08;一&#xff09;资源感知与绑定 在 k8s 中&#xff0c;资源与节点紧密绑定。对于 GPU 资源&#xff0c;我们依赖 NVIDIA 提供的 device-plugin 来进行感知&#xff0c;并将其上报到 kube-apiserver…...

备考蓝桥杯:顺序表详解(静态顺序表,vector用法)

目录 1.顺序表的概念 2.静态顺序表的实现 总代码 3.stl库动态顺序表vector 测试代码 1.顺序表的概念 要理解顺序表&#xff0c;我们要先了解一下什么是线性表 线性表是n个具有相同特征的数据元素的序列 这就是一个线性表 a1是表头 a4是表尾 a2是a3的前驱 a3是a2的后继 空…...

OA系统如何做好DDOS防护

OA系统如何做好DDOS防护&#xff1f;在数字化办公蔚然成风的当下&#xff0c;OA&#xff08;办公自动化&#xff09;系统作为企业内部管理与协作的神经中枢&#xff0c;其安全性和稳定性直接关系到企业的日常运营效率、信息流通效率以及长远发展。OA系统不仅承载着企业内部的日…...

使用 Python 的 pyttsx3 库进行文本转语音

1. 什么是 pyttsx3&#xff1f; 1.1 pyttsx3 是一个 Python 库&#xff0c;它可以将文本转换为语音。与其他文本转语音库&#xff08;如 gTTS&#xff09;不同&#xff0c;pyttsx3 不依赖于网络服务&#xff0c;它使用本地的 TTS&#xff08;Text-to-Speech&#xff09;引擎&a…...

如何在Windows上编译OpenCV4.7.0

前言 ​ 参考&#xff1a;Win10 下编译 OpenCV 4.7.0详细全过程&#xff0c;包含xfeatures2d 这里在其基础上还出现了一些问题&#xff0c;仅供参考。 正文 一、环境 1、win10 2、cmake-gui 3、opencv4.7.0 4、VS2019 二、编译过程 1、下载需要的文件&#xff1a; 通…...

【玩转全栈】----Django连接MySQL

阅前先赞&#xff0c;养好习惯&#xff01; 目录 1、ORM框架介绍 选择建议 2、安装mysqlclient 3、创建数据库 4、修改settings&#xff0c;连接数据库 5、对数据库进行操作 创建表 删除表 添加数据 删除数据 修改&#xff08;更新&#xff09;数据&#xff1a; 获取数据 1、OR…...

25/1/4 算法笔记<强化学习> 生成对抗模仿学习

基于生成对抗网络的模仿学习&#xff0c;假设存在一个专家智能体&#xff0c;其策略可以看成最优策略&#xff0c;我们就可以通过直接模仿这个专家在环境中交互的动作数据来训练一个策略&#xff0c;并不需要用到环境提供的奖励信息。 生成对抗模仿学习GAIL实质上就是模仿了专家…...

Flink维表方案选型

Iceberg Iceberg 采用全量预加载数据的方式将维度表数据全部加载到内存中进行关联&#xff0c;虽然可以避免频繁访问外部数据库&#xff0c;但对计算节点的内存消耗很高&#xff0c;不能适用于数量很大的维度表。除此之外&#xff0c;当 Iceberg 维表数据更新后&#xff0c;可…...

Oracle Database 23ai 新特性: UPDATE 和 DELETE 语句的直接联接

Oracle Database 23c 引入了一系列令人振奋的新特性&#xff0c;其中一项尤为引人注目的是对 UPDATE 和 DELETE 语句支持直接联接&#xff08;Direct Join&#xff09;。这一新功能极大地简化了复杂数据操作的实现&#xff0c;提升了性能&#xff0c;并为数据库开发者提供了更强…...

机器学习之随机森林算法实现和特征重要性排名可视化

随机森林算法实现和特征重要性排名可视化 目录 随机森林算法实现和特征重要性排名可视化1 随机森林算法1.1 概念1.2 主要特点1.3 优缺点1.4 步骤1.5 函数及参数1.5.1 函数导入1.5.2 参数 1.6 特征重要性排名 2 实际代码测试 1 随机森林算法 1.1 概念 是一种基于树模型的集成学…...

网络安全图谱以及溯源算法

​ 本文提出了一种网络攻击溯源框架&#xff0c;以及一种网络安全知识图谱&#xff0c;该图由六个部分组成&#xff0c;G <H&#xff0c;V&#xff0c;A&#xff0c;E&#xff0c;L&#xff0c;S&#xff0c;R>。 1|11.知识图 ​ 网络知识图由六个部分组成&#xff0c…...

单片机-外部中断

中断是指 CPU 在处理某一事件 A 时&#xff0c;发生了另一事件 B&#xff0c;请求 CPU 迅速去处理(中断发生)&#xff1b;CPU 暂时停止当前的工作(中断响应)&#xff0c; 转去处理事件 B(中断服务)&#xff1b;待 CPU 将事件 B 处理完毕后&#xff0c;再回到原来事件 A 被中断的…...

《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》

《解锁计算机视觉智慧&#xff1a;编程实现图片场景文字描述的开源宝藏》 一、MiniGPT-4&#xff1a;小模型撬动大视觉理解&#xff08;一&#xff09;项目概览&#xff08;二&#xff09;核心亮点&#xff08;三&#xff09;上手体验 二、ClipCap-Chinese&#xff1a;中文场景…...

onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制

文章目录 1. 页面跳转方式2. 你的场景分析3. 页面生命周期4. 总结5. 建议 在微信小程序中&#xff0c;页面跳转时&#xff0c; onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制。以下是详细说明&#xff1a; 1. 页面跳转方式 微信小程序提供了多种页面…...

Visio 画阀门 符号 : 电动阀的画法

本篇文章介绍阀门&#xff0c;很多朋友在利用Visio绘画管道流程简图时&#xff0c;需要进行阀门符号的绘画&#xff0c;而Visio提供的阀门符号种类并不是很齐全。 本篇文章给出电动阀的画法&#xff1a; 下图是液动阀的符号&#xff1a; 首先&#xff0c;找到“更多形状”中的…...

OOM排查思路

K8S 容器的云原生生态&#xff0c;改变了服务的交付方式&#xff0c;自愈能力和自动扩缩等功能简直不要太好用。 有好的地方咱要夸&#xff0c;不好的地方咱也要说&#xff0c;真正的业务是部署于容器内部&#xff0c;而容器之外&#xff0c;又有一逻辑层 Pod 。 对于容器和…...

《Spring Framework实战》10:4.1.4.2.详细的依赖和配置

欢迎观看《Spring Framework实战》视频教程 集合 <list/>、<set/>、<map/>和<props/>元素分别设置Java集合类型list、set、map和properties的属性和参数。以下示例显示了如何使用它们&#xff1a; <bean id"moreComplexObject" class&qu…...

网络安全-XSS跨站脚本攻击(基础篇)

漏洞扫描的原理 1.跨站脚本攻击介绍 xss跨站脚本攻击&#xff1a; xSS 全称&#xff08;Cross site Scripting &#xff09;跨站脚本攻击&#xff0c;是最常见的Web应用程序安全漏洞之一&#xff0c;位于OWASP top 10 2013/2017年度分别为第三名和第七名&#xff0c;XSS是指攻…...

Git的学习和常见问题

文章目录 1.初始化配置2.新建仓库3.添加和提交文件4.git reset 回退版本5.git diff 查看差异6.git rm 删除文件7.文件 .gitigonre8.克隆远程仓库9.将已有的本地仓库关联到远程仓库10.分支的基本操作11.解决合并冲突配置问题 最近基于GeekHour的视频学习Git&#xff0c;记录了一…...

从原理到选型:WDM波分复用技术全解析与应用指南

1. WDM波分复用技术基础入门 第一次接触WDM这个概念是在2013年参加某运营商骨干网改造项目时。当时客户指着机房密密麻麻的光纤问我&#xff1a;"能不能在不更换现有光缆的情况下&#xff0c;把传输容量提升8倍&#xff1f;"这个问题直接把我问住了。后来在华为专家的…...

无侵入式Allegro许可证使用数据采集方案

无侵入式Allegro许可证使用收数据方案拿这些个年我跟各种许可证打交道&#xff0c;从最开始的Named User整到并发许可、角色绑定&#xff0c;真是踩过不少坑。你要是想解决阿里云、Enovia、3DEXPERIENCE这伙软件的许可证管理问题&#xff0c;传统方法要么成本高&#xff0c;要么…...

别再死记硬背‘三层两网’了!用一张图看懂智能变电站的‘大脑’、‘神经’和‘手脚’

智能变电站解剖课&#xff1a;用人体系统秒懂"三层两网"架构 第一次走进智能变电站控制室时&#xff0c;那些闪烁的指示灯、跳动的数据曲线和密集的机柜总让人联想到科幻电影里的场景。但当你把整个系统想象成一个人的身体——大脑负责思考决策&#xff0c;神经系统…...

从“开盲盒”到“当导演”:我是如何用ControlNet的8个模型,把AI绘画变成精准设计工具的

从“开盲盒”到“当导演”&#xff1a;我是如何用ControlNet的8个模型&#xff0c;把AI绘画变成精准设计工具的 作为一名UI设计师&#xff0c;我曾经对AI绘画又爱又恨。爱的是它能瞬间生成几十种风格的概念图&#xff0c;恨的是这些图总像开盲盒——你永远不知道下一张是惊喜还…...

PINCE代码注入实战:.so文件注入完全指南

PINCE代码注入实战&#xff1a;.so文件注入完全指南 【免费下载链接】PINCE Reverse engineering tool for linux games 项目地址: https://gitcode.com/gh_mirrors/pi/PINCE PINCE是一款强大的Linux游戏逆向工程工具&#xff0c;专注于动态链接库注入技术&#xff0c;为…...

06OpenCVSharp角点检测与检测平整度

06OpenCVSharp 角点检测 检测平整度。 代码仅供参考。工厂里检测金属板平整度这事可太常见了。老师傅拿个游标卡尺左量右测&#xff0c;咱们程序猿当然要琢磨怎么用代码搞定。今天说个骚操作——用角点检测判断平面平整度&#xff0c;听着不靠谱&#xff1f;别急&#xff0c;看…...

终极内存管理指南:如何用Mem Reduct让你的电脑运行如飞 [特殊字符]

终极内存管理指南&#xff1a;如何用Mem Reduct让你的电脑运行如飞 &#x1f680; 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/me…...

MATLAB伯德图进阶:精准标注谐振点与-3dB带宽的实现方法

1. 伯德图基础与谐振点概念解析 伯德图是控制系统工程师最常用的频率特性分析工具之一&#xff0c;它由幅频特性和相频特性两条曲线组成。我第一次接触伯德图是在研究生阶段的自动控制原理课上&#xff0c;当时教授在黑板上画出的那条神奇的曲线&#xff0c;让我对频率响应分析…...

【数据结构与算法】堆(大顶堆小顶堆堆排序)

&#x1f468;‍&#x1f4bb; 关于作者&#xff1a;会编程的土豆 “不是因为看见希望才坚持&#xff0c;而是坚持了才看见希望。” 你好&#xff0c;我是会编程的土豆&#xff0c;一名热爱后端技术的Java学习者。 &#x1f4da; 正在更新中的专栏&#xff1a; 《数据结构与算…...

突破数字身份验证瓶颈:phone2qq革新手机号-QQ号关联查询技术

突破数字身份验证瓶颈&#xff1a;phone2qq革新手机号-QQ号关联查询技术 【免费下载链接】phone2qq 项目地址: https://gitcode.com/gh_mirrors/ph/phone2qq 副标题&#xff1a;如何在45秒内完成传统6分钟的身份验证流程&#xff1f; 一、问题溯源&#xff1a;数字身份…...