1. 代码

这段代码实现了一个一阶低通滤波器(也称为指数加权移动平均滤波器)。它适用于需要平滑数据、减少噪声的场合。以下是一些常见的应用场景:

传感器数据平滑:在嵌入式系统或物联网设备中,传感器(如温度、湿度、加速度计、陀螺仪)的读数可能含有高频噪声,通过一阶低通滤波可以平滑数据,使其更稳定。

去抖动(Debouncing):在读取机械开关或按钮输入时,可能会因为机械振动产生多次快速变化(抖动),使用滤波可以消除抖动,获得稳定的状态。

音频处理:在音频信号处理中,低通滤波可以用于去除高频噪声或实现简单的音效。

控制系统:在控制系统中,滤波器可以用于平滑反馈信号,避免执行器因噪声产生不必要的频繁动作。

电池电压监测:电池电压可能会因为负载变化而波动,滤波可以得到一个更稳定的电压值,用于准确估计电池电量。

运动控制:在机器人或无人机中,对姿态或位置数据进行滤波,可以使运动更加平稳。

经济与金融:在股票价格或经济指标分析中,使用移动平均来平滑短期波动,突出长期趋势。

计算机视觉:对连续的视频帧中的特征(如目标位置)进行滤波,以减少检测误差带来的跳动。

注意:该滤波器的效果取决于ALPHA的取值。ALPHA越接近1,滤波器的响应越快(但平滑效果差),越接近0则平滑效果越好(但滞后越严重)。需要根据具体应用调整ALPHA的值。

另外,该代码使用了全局变量lastResult来保存上一次的滤波结果,因此在多次调用中会保持状态。需要注意的是,在多任务或中断环境中使用全局变量可能需要防止竞态条件(例如通过加锁或使用原子操作)。

#define ALPHA 0.3  // 滤波系数(0<ALPHA<1)float lastResult = 0;  // 上一次滤波结果
float firstOrderFilter(float currentVal) {float result = ALPHA * currentVal + (1 - ALPHA) * lastResult;lastResult = result;  // 更新历史值
return result;
}

2. html演示

这段代码实现了一个一阶低通滤波器(指数加权移动平均滤波器),常用于信号处理和传感器数据平滑。下面我将创建一个可视化演示,展示这种滤波器在不同场景下的应用效果。

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>一阶低通滤波器应用</title><style>* {box-sizing: border-box;margin: 0;padding: 0;font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;}body {background: linear-gradient(135deg, #1a2a6c, #b21f1f, #fdbb2d);color: #fff;min-height: 100vh;padding: 20px;}.container {max-width: 1200px;margin: 0 auto;}header {text-align: center;margin-bottom: 30px;padding: 20px;background: rgba(0, 0, 0, 0.3);border-radius: 10px;}h1 {font-size: 2.5rem;margin-bottom: 10px;}.description {font-size: 1.1rem;max-width: 800px;margin: 0 auto;line-height: 1.6;}.applications {display: grid;grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));gap: 20px;margin-bottom: 30px;}.application-card {background: rgba(255, 255, 255, 0.1);backdrop-filter: blur(10px);border-radius: 10px;padding: 20px;box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);transition: transform 0.3s ease;}.application-card:hover {transform: translateY(-5px);}.application-card h3 {font-size: 1.5rem;margin-bottom: 15px;color: #ffcc00;}.application-card p {line-height: 1.5;margin-bottom: 10px;}.demo-container {background: rgba(255, 255, 255, 0.1);backdrop-filter: blur(10px);border-radius: 10px;padding: 20px;margin-top: 30px;box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);}.controls {display: flex;flex-wrap: wrap;gap: 15px;margin-bottom: 20px;align-items: center;}.control-group {display: flex;flex-direction: column;gap: 5px;}label {font-weight: bold;}input[type="range"] {width: 200px;}canvas {width: 100%;height: 300px;background: rgba(0, 0, 0, 0.2);border-radius: 5px;}.code-block {background: #2d2d2d;border-radius: 5px;padding: 15px;margin-top: 20px;overflow-x: auto;font-family: 'Consolas', monospace;}.highlight {color: #ffcc00;font-weight: bold;}@media (max-width: 768px) {.applications {grid-template-columns: 1fr;}.controls {flex-direction: column;align-items: flex-start;}}</style>
</head>
<body><div class="container"><header><h1>一阶低通滤波器应用</h1><div class="description"><p>一阶低通滤波器(指数加权移动平均)用于从信号中去除短期波动,保留长期发展趋势。滤波系数ALPHA(α)决定平滑程度:α越小,平滑效果越强,但滞后越大。</p></div></header><div class="applications"><div class="application-card"><h3>传感器数据处理</h3><p>用于平滑来自加速度计、陀螺仪、温度传感器等的数据,消除噪声和瞬时干扰,提供更稳定的读数。</p></div><div class="application-card"><h3>音频信号处理</h3><p>在音频应用中用于实现低通滤波效果,去除高频噪声,保留低频成分,产生更柔和的音效。</p></div><div class="application-card"><h3>电池电压监测</h3><p>平滑电池电压读数,避免因负载瞬时变化导致的电压波动,提供更准确的电池电量估计。</p></div><div class="application-card"><h3>控制系统</h3><p>在反馈控制系统中过滤传感器读数,防止控制系统对噪声过度反应,提高系统稳定性。</p></div><div class="application-card"><h3>经济数据平滑</h3><p>应用于经济指标和股票价格分析,消除短期波动,更好地展示长期趋势。</p></div><div class="application-card"><h3>计算机视觉</h3><p>在对象跟踪中平滑位置数据,减少检测误差导致的跳跃,提供更流畅的运动轨迹。</p></div></div><div class="demo-container"><h2>滤波器演示</h2><p>调整ALPHA值和噪声水平,观察原始信号与滤波后信号的差异:</p><div class="controls"><div class="control-group"><label for="alpha">ALPHA值: <span id="alpha-value">0.3</span></label><input type="range" id="alpha" min="0.01" max="0.99" step="0.01" value="0.3"></div><div class="control-group"><label for="noise">噪声水平: <span id="noise-value">0.2</span></label><input type="range" id="noise" min="0.05" max="0.5" step="0.05" value="0.2"></div><div class="control-group"><label for="signal-type">信号类型:</label><select id="signal-type"><option value="sine">正弦波</option><option value="square">方波</option><option value="sawtooth">锯齿波</option></select></div><button id="reset" style="padding: 8px 15px; border: none; border-radius: 5px; background: #ffcc00; color: #000; cursor: pointer;">重置图表</button></div><canvas id="chart"></canvas><div class="code-block"><pre><code>#define ALPHA <span id="alpha-code">0.3</span>  // 滤波系数(0<ALPHA<1)
float lastResult = 0;  // 上一次滤波结果float firstOrderFilter(float currentVal) {float result = ALPHA * currentVal + (1 - ALPHA) * lastResult;lastResult = result;  // 更新历史值return result;
}</code></pre></div></div></div><script>// 获取Canvas上下文const canvas = document.getElementById('chart');const ctx = canvas.getContext('2d');// 设置Canvas尺寸canvas.width = canvas.offsetWidth;canvas.height = canvas.offsetHeight;// 初始化变量let ALPHA = 0.3;let noiseLevel = 0.2;let signalType = 'sine';let lastResult = 0;let data = {raw: [],filtered: []};// 初始化图表initializeChart();// 事件监听document.getElementById('alpha').addEventListener('input', function() {ALPHA = parseFloat(this.value);document.getElementById('alpha-value').textContent = ALPHA.toFixed(2);document.getElementById('alpha-code').textContent = ALPHA.toFixed(2);updateChart();});document.getElementById('noise').addEventListener('input', function() {noiseLevel = parseFloat(this.value);document.getElementById('noise-value').textContent = noiseLevel.toFixed(2);updateChart();});document.getElementById('signal-type').addEventListener('change', function() {signalType = this.value;updateChart();});document.getElementById('reset').addEventListener('click', function() {initializeChart();});// 初始化图表function initializeChart() {data = {raw: [],filtered: []};lastResult = 0;updateChart();}// 一阶低通滤波器实现function firstOrderFilter(currentVal) {const result = ALPHA * currentVal + (1 - ALPHA) * lastResult;lastResult = result;return result;}// 生成信号function generateSignal(step, type) {const x = step / 20;switch(type) {case 'sine':return Math.sin(x);case 'square':return Math.sign(Math.sin(x));case 'sawtooth':return 2 * (x - Math.floor(x + 0.5));default:return Math.sin(x);}}// 更新图表function updateChart() {// 清空数据data.raw = [];data.filtered = [];lastResult = 0;// 生成新数据for (let i = 0; i < 300; i++) {const signal = generateSignal(i, signalType);const noise = (Math.random() - 0.5) * noiseLevel;const rawValue = signal + noise;const filteredValue = firstOrderFilter(rawValue);data.raw.push(rawValue);data.filtered.push(filteredValue);}// 绘制图表drawChart();}// 绘制图表function drawChart() {// 清除画布ctx.clearRect(0, 0, canvas.width, canvas.height);// 设置边距const padding = 40;const width = canvas.width - padding * 2;const height = canvas.height - padding * 2;// 绘制网格ctx.strokeStyle = 'rgba(255, 255, 255, 0.1)';ctx.lineWidth = 1;// 水平网格线for (let i = 0; i <= 10; i++) {const y = padding + (i / 10) * height;ctx.beginPath();ctx.moveTo(padding, y);ctx.lineTo(canvas.width - padding, y);ctx.stroke();}// 垂直网格线for (let i = 0; i <= 10; i++) {const x = padding + (i / 10) * width;ctx.beginPath();ctx.moveTo(x, padding);ctx.lineTo(x, canvas.height - padding);ctx.stroke();}// 绘制坐标轴ctx.strokeStyle = '#ffffff';ctx.lineWidth = 2;// X轴ctx.beginPath();ctx.moveTo(padding, canvas.height - padding);ctx.lineTo(canvas.width - padding, canvas.height - padding);ctx.stroke();// Y轴ctx.beginPath();ctx.moveTo(padding, padding);ctx.lineTo(padding, canvas.height - padding);ctx.stroke();// 绘制原始信号(红色)ctx.beginPath();ctx.strokeStyle = '#ff4444';ctx.lineWidth = 2;for (let i = 0; i < data.raw.length; i++) {const x = padding + (i / data.raw.length) * width;const y = canvas.height - padding - ((data.raw[i] + 1.5) / 3) * height;if (i === 0) {ctx.moveTo(x, y);} else {ctx.lineTo(x, y);}}ctx.stroke();// 绘制滤波后信号(黄色)ctx.beginPath();ctx.strokeStyle = '#ffcc00';ctx.lineWidth = 2;for (let i = 0; i < data.filtered.length; i++) {const x = padding + (i / data.filtered.length) * width;const y = canvas.height - padding - ((data.filtered[i] + 1.5) / 3) * height;if (i === 0) {ctx.moveTo(x, y);} else {ctx.lineTo(x, y);}}ctx.stroke();// 绘制图例ctx.font = '14px sans-serif';ctx.fillStyle = '#ff4444';ctx.fillText('原始信号', canvas.width - 150, padding + 20);ctx.fillStyle = '#ffcc00';ctx.fillText('滤波后信号', canvas.width - 150, padding + 40);// 绘制标题ctx.fillStyle = '#ffffff';ctx.font = '16px sans-serif';ctx.fillText('一阶低通滤波器效果演示', padding, padding - 10);// 绘制坐标标签ctx.fillText('时间', canvas.width / 2, canvas.height - 10);ctx.save();ctx.translate(10, canvas.height / 2);ctx.rotate(-Math.PI / 2);ctx.fillText('振幅', 0, 0);ctx.restore();}// 窗口调整大小时重绘图表window.addEventListener('resize', function() {canvas.width = canvas.offsetWidth;canvas.height = canvas.offsetHeight;drawChart();});</script>
</body>
</html>

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/921353.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/921353.shtml
英文地址,请注明出处:http://en.pswp.cn/news/921353.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT-Thread源码分析字节实现socket源码

无论是客户端还是服务器程序&#xff0c;发送的底层都是发送AT指令&#xff1a;1&#xff09;发送命令到串口&#xff1b;2&#xff09;阻塞等待返回结果接收的底层都是1&#xff09;阻塞等待&#xff1b;2&#xff09;被唤醒后拷贝处理数据两者均由后台任务唤醒&#xff0c;后…

keil 5 STM32工程介绍

目录 一、工程文件介绍 1.自动生成的文件 2.自建文件 &#xff08;1&#xff09;USER 文件夹 &#xff08;2&#xff09;FWLIB 文件夹 &#xff08;3&#xff09;CMSIS 文件夹 二、工程创建教程 1.下载固件库 2.创建工程 &#xff08;1&#xff09;创建不完善的工程 …

AI大模型如何重塑日常?从智能办公到生活服务的5个核心改变

AI大模型重塑日常&#xff1a;从智能办公到生活服务的5个核心改变一、引言• 简述AI大模型技术的快速发展背景&#xff0c;说明其已从技术领域逐步渗透到大众日常生活• 提出核心观点&#xff1a;AI大模型正从办公和生活服务两大场景&#xff0c;深度改变人们的行为模式与…

迈威通信从送快递角度教你分清网络二层和三层

还在为网络里的二层、三层概念头大?其实就像送快递那么简单!今天迈威通信用最接地气的方式给你讲明白&#xff5e;网络传输 送快递?没错!二层网络&#xff1a;本地送货员负责同小区的包裹配送(局域网传输)&#xff0c;就像小区里的快递站(对应设备&#xff1a;交换机)&#…

【Linux】网络安全管理:SELinux 和 防火墙联合使用 | Redhat

本专栏文章持续更新&#xff0c;新增内容使用蓝色表示。 往期相关内容 【Linux】权限管理详解&#xff08;三&#xff09;&#xff1a;SELinux安全性管理 | Redhat-CSDN博客 【Linux】网络安全管理&#xff1a;Netfilter、nftables 与 Firewalld | Redhat_linux netfilter-C…

微论-构建完整的智能环:具身智能系统的层级化架构探析

### **构建完整的智能环&#xff1a;具身智能系统的层级化架构探析**#### **引言&#xff1a;迈向与现实交互的智能**人工智能的发展正经历一场从“虚拟”走向“现实”的范式迁移。具身智能&#xff0c;作为这一浪潮的核心&#xff0c;强调智能体必须拥有“身体”&#xff0c;并…

Spring如何解决循环依赖:深入理解三级缓存机制

Spring如何解决循环依赖&#xff1a;深入理解三级缓存机制 引言 在我们之前的文章中&#xff0c;我们探讨了什么是循环依赖以及它带来的问题。作为Java生态系统中最重要的框架之一&#xff0c;Spring Framework在处理循环依赖方面有着独特而精妙的解决方案。今天&#xff0c;让…

HTML第六课:表格展示

HTML第六课&#xff1a;表格展示学生花名册学生花名册 效果示列 代码展示 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html lang"zh-CN"> <head><meta …

医疗行业API管理优化:使用QuickAPI提高数据安全与接口性能

背景与挑战在医疗行业&#xff0c;特别是医院信息系统&#xff08;HIS&#xff09;或其他相关部门&#xff08;如实验室信息系统LIS、药品管理系统等&#xff09;&#xff0c;数据安全和隐私保护一直是核心问题。然而&#xff0c;许多医疗机构仍然面临着以下问题&#xff1a;数…

docker 部署RustDesk服务

最近要用到远程桌面服务&#xff0c;网上的资料很丰富&#xff0c;但是和我的情况有点点区别&#xff0c;我是要搭一台局域网使用的远程桌面服务。 首先是源的问题&#xff1a; 很多都是不能用的&#xff0c;我用的docker桌面版&#xff0c; 其他的不重要&#xff0c;源地址&…

Kubernetes 中为 ZenTao 的 Apache 服务器添加请求体大小限制

本文将详细介绍如何通过修改 Apache 配置模板并在 Kubernetes 中使用 ConfigMap,为 ZenTao 系统添加请求体大小限制(LimitRequestBody)。 背景介绍 在企业级项目管理软件 ZenTao 的部署过程中,我们经常需要对 Apache 服务器进行安全加固。其中一个重要的安全措施是限制客户…

综述 | Agentic RL for LLM的最新进展与未来挑战,idea满满

近年来&#xff0c;大语言模型&#xff08;LLMs&#xff09;和强化学习&#xff08;RL&#xff09;的融合正在彻底改变我们构建和部署AI系统的方式。早期的LLM强化学习&#xff08;LLM-RL&#xff09;主要关注如何通过人类反馈&#xff08;如RLHF&#xff09;让模型生成更符合人…

【代码随想录算法训练营——Day3】链表——203.移除链表元素、707.设计链表、206.反转链表

LeetCode题目链接 https://leetcode.cn/problems/remove-linked-list-elements/ https://leetcode.cn/problems/design-linked-list/ https://leetcode.cn/problems/reverse-linked-list/ 题解 203.移除链表元素 重要的是创立头结点&#xff0c;这点在写题前已经经受过提示。 注…

CI/CD流水线驱动自动化流程深度解析:选型、竞品、成本与资源消耗

目录 一、CI/CD是什么&#xff1f;核心定位与价值 二、选型与竞品分析 (GitLab CI vs. Jenkins vs. GitHub Actions vs. GitLab CI) 三、部署成本分析 四、服务器资源消耗分析 五、给您的最终建议 一、CI/CD是什么&#xff1f;核心定位与价值 CI/CD&#xff08;持续集成/…

工厂办公环境如何实现一台服务器多人共享办公

在现代化工厂的办公环境中&#xff0c;如何通过一台服务器实现多人共享办公是一个既实用又高效的需求。这种方案不仅能降低硬件成本&#xff0c;还能简化IT管理&#xff0c;提高数据安全性。在工厂办公环境中&#xff0c;通过云飞云共享云桌面实现一台服务器多人共享办公&#…

系统性学习数据结构-第三讲-栈和队列

系统性学习数据结构-第三讲-栈和队列1. 栈1.1 栈和队列1.2 栈的实现2. 队列2.1 概念与结构2.2 队列的实现3. 栈和队列算法题3.1 [有效的括号](https://leetcode.cn/problems/valid-parentheses/description/)3.2 [用队列实现栈](https://leetcode.cn/problems/implement-stack-…

硬件(三) 通信方式、串口通信

一、通信类型&#xff08;一&#xff09;并行通信多个比特通过并行线同时传输&#xff0c;传输速率快&#xff0c;但会大量占用芯片资源&#xff0c;在对资源敏感的场景下不太适用。&#xff08;二&#xff09;串行通信把数据拆成单个比特&#xff0c;按顺序在一根总线上发送。…

vsan default storage policy 具体是什么策略?

vSAN Default Storage Policy&#xff08;vSAN 默认存储策略&#xff09;是 VMware vSAN 部署后自动创建的基础存储策略&#xff0c;其核心目标是在“通用性”和“可靠性”之间取得平衡&#xff0c;为大多数虚拟机提供默认的数据保护和存储服务&#xff0c;无需管理员手动创建策…

雨后阳光为何更强烈?

1. 降雨后的辐射是否会增强一般来说&#xff0c;降雨时天空多云&#xff0c;云层对太阳辐射有强烈削弱作用&#xff0c;所以降雨时的短波辐射显著下降。但雨后&#xff0c;空气湿度大、颗粒物被冲刷、天空转晴时&#xff0c;大气透明度会提高&#xff0c;短波辐射相较于降雨前往…

美团发布 | LongCat-Flash最全解读,硬刚GPT-4.1、Kimi!

一、导读 本报告解析了美团LongCat团队推出的LongCat-Flash模型&#xff0c;一个拥有5600亿参数的混合专家模型&#xff08;Mixture-of-Experts, MoE&#xff09;。面对大规模语言模型在计算资源和效率上的挑战&#xff0c;LongCat-Flash旨在实现计算效率与高级智能体&#xf…