一階低通濾波器應用示例(演示)

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…