91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

信號(hào)處理:指數(shù)移動(dòng)平均 (EMA) 濾波器

海闊天空的專欄 ? 來(lái)源: Mustahsin Zarif ? 作者: Mustahsin Zarif ? 2025-10-04 18:35 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

作者: Mustahsin Zarif

之前我們?cè)凇?a target="_blank">信號(hào)處理簡(jiǎn)介》一文中已經(jīng)見過(guò)了兩類濾波器:有限脈沖響應(yīng) (FIR) 濾波器和無(wú)限脈沖響應(yīng) (IIR) 濾波器。我們看到了移動(dòng)平均濾波器如何同時(shí)以 FIR 和 IIR 形式表示,但如果它們相互比較又各具哪些優(yōu)勢(shì)呢?

回顧我之前博客中的例子,我們可以將 FIR 濾波器展開為如下形式:

y[5] = (x[5]+x[4]+x[3]+x[2]+x[1]+x[0])/5,

在這里,我們看到我們需要:

  1. 5 次乘法和
  2. 4 次求和運(yùn)算。

乘法運(yùn)算的計(jì)算成本特別高。因此,如果我們?cè)俅尾榭?IIR 形式,我們會(huì)發(fā)現(xiàn)它只需要:

  1. 3 次乘法和
  2. 2 次求和運(yùn)算

y[6]=(x[6]+y[5]-x[1])/5

這大大降低了計(jì)算成本!這對(duì)于單片機(jī)嵌入式設(shè)備來(lái)說(shuō)非常好,因?yàn)樗鼈冊(cè)诿總€(gè)離散時(shí)間步驟上執(zhí)行計(jì)算所消耗的資源更少。

例如,當(dāng)我對(duì)采用 FIR 和 IIR 形式的 11 點(diǎn)移動(dòng)平均濾波器使用 Python 函數(shù) ‘time.time’ 時(shí),所有參數(shù)(窗口大小、采樣率、樣本大小等)相同,我分別得到以下運(yùn)行時(shí)間結(jié)果:51 ms、27 ms。

離散時(shí)間IIR 濾波器示例

現(xiàn)在我們已經(jīng)了解了為什么 IIR 濾波器在單片機(jī)上表現(xiàn)更好了,讓我們看一個(gè)使用 Arduino UNO 和 DFRobot MPU6050 慣性測(cè)量單元 (IMU) 的示例項(xiàng)目(圖 1)。我們將對(duì) IMU 數(shù)據(jù)應(yīng)用指數(shù)移動(dòng)平均 (EMA) 濾波器,以查看原始數(shù)據(jù)和平滑數(shù)據(jù)之間的差異。

圖 1:MPU6050 與 Arduino Uno 之間的連接框圖。(圖片來(lái)源:Mustahsin Zarif)

圖 2:MPU6050 與 Arduino Uno 之間的連接。(圖片來(lái)源:Mustahsin Zarif)

指數(shù)移動(dòng)平均濾波器具有遞歸形式:

y[n] = α*x[n] + (1- α)*y[n-1]

它之所以是遞歸,是因?yàn)槲覀儨y(cè)量的任何當(dāng)前輸出也取決于先前的輸出;即系統(tǒng)具有記憶。

常數(shù) alpha () 決定了我們想要賦予當(dāng)前輸入相對(duì)于先前輸出多大的權(quán)重。為了清楚起見,讓我們展開方程得到:

y[n] = α x[n] + (1- α ) (α*x[n?1]+(1?α)*y[n?2])

y[n] = αx[n] + (1- α ) x[n?1]+α (1?α)2x[n?2])+ ...

y[n] = k=0nα*(1?α)k*x[n?k]

我們看到,alpha 越大,當(dāng)前輸入對(duì)當(dāng)前輸出的影響就越大。這是好事,因?yàn)槿绻到y(tǒng)在不斷演進(jìn),過(guò)去的值不能代表當(dāng)前的系統(tǒng)。另一方面,如果系統(tǒng)突然發(fā)生瞬間異常變化,情況就會(huì)變得很糟糕;在這種情況下,我們希望我們的輸出能夠遵循之前輸出所遵循的趨勢(shì)。

事不宜遲,現(xiàn)在讓我們看看 EMA 濾波器的代碼是如何用于 MPU6050 的。

EMA 濾波器代碼:

副本#include < wire.h >
#include < mpu6050.h >

MPU6050 mpu;

#define BUFFER_SIZE 11  // Window size

float accelXBuffer[BUFFER_SIZE];
float accelYBuffer[BUFFER_SIZE];
float accelZBuffer[BUFFER_SIZE];
int bufferCount = 0;  

void setup() {
  Serial.begin(115200);
  Wire.begin();

  mpu.initialize();

  if (!mpu.testConnection()) {
    Serial.println("MPU6050 connection failed!");
    while (1);
  }

  int16_t ax, ay, az;
  for (int i = 0; i < BUFFER_SIZE; i++) {
    mpu.getMotion6(&ax, &ay, &az, NULL, NULL, NULL);
    accelXBuffer[i] = ax / 16384.0;
    accelYBuffer[i] = ay / 16384.0;
    accelZBuffer[i] = az / 16384.0;
  }
  bufferCount = BUFFER_SIZE;
}

void loop() {
  int16_t accelX, accelY, accelZ;

  mpu.getMotion6(&accelX, &accelY, &accelZ, NULL, NULL, NULL);

  float accelX_float = accelX / 16384.0;
  float accelY_float = accelY / 16384.0;
  float accelZ_float = accelZ / 16384.0;

  if (bufferCount < BUFFER_SIZE) {
    accelXBuffer[bufferCount] = accelX_float;
    accelYBuffer[bufferCount] = accelY_float;
    accelZBuffer[bufferCount] = accelZ_float;
    bufferCount++;
  } else {
    for (int i = 1; i < BUFFER_SIZE; i++) {
      accelXBuffer[i - 1] = accelXBuffer[i];
      accelYBuffer[i - 1] = accelYBuffer[i];
      accelZBuffer[i - 1] = accelZBuffer[i];
    }
    accelXBuffer[BUFFER_SIZE - 1] = accelX_float;
    accelYBuffer[BUFFER_SIZE - 1] = accelY_float;
    accelZBuffer[BUFFER_SIZE - 1] = accelZ_float;
  }

//calculate EMA using acceleration values stored in buffer
  float emaAccelX = accelXBuffer[0];
  float emaAccelY = accelYBuffer[0];
  float emaAccelZ = accelZBuffer[0];
  float alpha = 0.2;

  for (int i = 1; i < bufferCount; i++) {
    emaAccelX = alpha * accelXBuffer[i] + (1 - alpha) * emaAccelX;
    emaAccelY = alpha * accelYBuffer[i] + (1 - alpha) * emaAccelY;
    emaAccelZ = alpha * accelZBuffer[i] + (1 - alpha) * emaAccelZ;
  }

  Serial.print(accelX_float); Serial.print(",");
  Serial.print(accelY_float); Serial.print(",");
  Serial.print(accelZ_float); Serial.print(",");
  Serial.print(emaAccelX); Serial.print(",");
  Serial.print(emaAccelY); Serial.print(",");
  Serial.println(emaAccelZ);

  delay(100);
}
< /mpu6050.h >< /wire.h >

當(dāng)我們運(yùn)行此代碼并檢查串口繪圖儀時(shí),我們可以看到 x、y 和 z 軸方向加速度的成對(duì)粗糙和平滑線條,其中窗口大小為 11 和 alpha 值為 0.2(圖 3 至 5)。

圖 3:x 方向的原始加速度值和濾波后的加速度值。(圖片來(lái)源:Mustahsin Zarif)

圖 4:y 方向的原始加速度值和濾波后的加速度值。(圖片來(lái)源:Mustahsin Zarif)

圖 5:z 方向的原始加速度值和濾波后的加速度值。(圖片來(lái)源:Mustahsin Zarif)

讓代碼的智能化更進(jìn)一步

我們現(xiàn)在知道,與 FIR 濾波器相比,IIR 濾波器更適合用作控制器,因?yàn)樗璧那蠛秃统朔ㄓ?jì)算明顯較少。然而,當(dāng)我們實(shí)現(xiàn)這段代碼時(shí),執(zhí)行的計(jì)算并不只有求和和乘法:每當(dāng)有新的時(shí)間樣本進(jìn)入時(shí),我們都必須移動(dòng)樣本,而這個(gè)過(guò)程在后臺(tái)需要計(jì)算能力。因此,我們可以借助循環(huán)緩沖區(qū),而不是在每個(gè)采樣時(shí)間間隔移動(dòng)所有樣本。

我們的做法是:用一個(gè)指針來(lái)記住傳入的數(shù)據(jù)樣本的索引。然后,每次指針指向緩沖區(qū)中的最后一個(gè)元素時(shí),它接下來(lái)都會(huì)指向緩沖區(qū)的第一個(gè)元素,新數(shù)據(jù)將替換之前存儲(chǔ)在這里的數(shù)據(jù),因?yàn)檫@是現(xiàn)在我們不再需要的最舊數(shù)據(jù)(圖 6)。因此,這種方法允許我們跟蹤緩沖區(qū)中最舊的樣本并替換該樣本,而不必每次都移動(dòng)樣本以將新數(shù)據(jù)放入數(shù)組的最后一個(gè)元素中。

圖 6:循環(huán)緩沖區(qū)示例圖。(圖片來(lái)源:Mustasin Zafir)

這是使用循環(huán)緩沖區(qū)的 EMA 濾波器實(shí)現(xiàn)的代碼。您能嘗試對(duì)陀螺儀而不是對(duì)加速計(jì)運(yùn)行這段代碼嗎?也可以嘗試使用不同的系數(shù)!

使用循環(huán)緩沖區(qū)代碼的 EMA 濾波器:

副本#include < wire.h >

#include < mpu6050.h >

MPU6050 mpu;

#define BUFFER_SIZE 11  // Window size

float accelXBuffer[BUFFER_SIZE];

float accelYBuffer[BUFFER_SIZE];

float accelZBuffer[BUFFER_SIZE];

int bufferIndex = 0;  

void setup() {

  Serial.begin(115200);

  Wire.begin();
 

  mpu.initialize();


  if (!mpu.testConnection()) {

    Serial.println("MPU6050 connection failed!");

    while (1);

  }

  int16_t ax, ay, az;

  for (int i = 0; i < BUFFER_SIZE; i++) {

    mpu.getMotion6(&ax, &ay, &az, NULL, NULL, NULL);

    accelXBuffer[i] = ax / 16384.0;

    accelYBuffer[i] = ay / 16384.0;

    accelZBuffer[i] = az / 16384.0;

  }

}

void loop() {

  int16_t accelX, accelY, accelZ;

  mpu.getMotion6(&accelX, &accelY, &accelZ, NULL, NULL, NULL);

  float accelX_float = accelX / 16384.0;

  float accelY_float = accelY / 16384.0;

  float accelZ_float = accelZ / 16384.0;

  accelXBuffer[bufferIndex] = accelX_float;

  accelYBuffer[bufferIndex] = accelY_float;

  accelZBuffer[bufferIndex] = accelZ_float;

  bufferIndex = (bufferIndex + 1) % BUFFER_SIZE; //circular buffer implementation 

  float emaAccelX = accelXBuffer[bufferIndex];

  float emaAccelY = accelYBuffer[bufferIndex];

  float emaAccelZ = accelZBuffer[bufferIndex];

  float alpha = 0.2;

  for (int i = 1; i < BUFFER_SIZE; i++) {

    int index = (bufferIndex + i) % BUFFER_SIZE;

    emaAccelX = alpha  accelXBuffer[index] + (1 - alpha)  emaAccelX;

    emaAccelY = alpha  accelYBuffer[index] + (1 - alpha)  emaAccelY;

    emaAccelZ = alpha  accelZBuffer[index] + (1 - alpha)  emaAccelZ;

  }

  Serial.print(accelX_float); Serial.print(",");

  Serial.print(emaAccelX); Serial.print(",");

  Serial.print(accelY_float); Serial.print(",");

  Serial.print(emaAccelY); Serial.print(",");

  Serial.print(accelZ_float); Serial.print(",");

  Serial.println(emaAccelZ);

  delay(100);

}
< /mpu6050.h >< /wire.h >

結(jié)語(yǔ)

在這篇博客中,我們討論了 IIR 和 FIR 濾波器之間的區(qū)別,重點(diǎn)討論了它們的計(jì)算效率。通過(guò)從 FIR 到 IIR 所需運(yùn)算次數(shù)減少這一小例子,我們可以想象當(dāng)應(yīng)用規(guī)模化時(shí) IIR 濾波器的效率會(huì)有多高,這對(duì)于硬件能力有限的實(shí)時(shí)應(yīng)用非常重要。

我們還研究了一個(gè)使用 Arduino Uno 和 MPU6050 IMU 的示例項(xiàng)目,其中我們部署了一個(gè)指數(shù)移動(dòng)平均濾波器來(lái)降低傳感器數(shù)據(jù)中的噪聲,同時(shí)仍然捕捉底層信號(hào)行為。最后,為了提高效率,我們提供了一個(gè)更智能的示例代碼,即采用循環(huán)緩沖區(qū)而不是在每個(gè)時(shí)間間隔移動(dòng)數(shù)據(jù)。

在下一篇博客中,我們將利用 [Red Pitaya] 的 FPGA 功能來(lái)實(shí)現(xiàn)一個(gè) 4 抽頭 FIR 濾波器數(shù)字電路

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 濾波器
    +關(guān)注

    關(guān)注

    162

    文章

    8410

    瀏覽量

    185670
  • 信號(hào)處理
    +關(guān)注

    關(guān)注

    49

    文章

    1143

    瀏覽量

    105091
  • ema
    ema
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    2496
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    滑動(dòng)平均濾波器介紹

    滑動(dòng)平均濾波器在工程中十分常見,這里用C語(yǔ)言設(shè)計(jì)一個(gè)靈活的滑動(dòng)濾波器庫(kù)函數(shù),十分簡(jiǎn)單易用,并且濾波器不使用for循環(huán),大大減少了代碼運(yùn)行時(shí)間。 并且
    發(fā)表于 01-23 08:18

    MAX262微處理器可編程通用有源濾波器:設(shè)計(jì)與應(yīng)用指南

    MAX260/MAX261/MAX262 微處理器可編程通用有源濾波器:設(shè)計(jì)與應(yīng)用指南 在電子設(shè)計(jì)領(lǐng)域,濾波器信號(hào)處理中不可或缺的組件。M
    的頭像 發(fā)表于 01-20 11:05 ?274次閱讀

    自適應(yīng)濾波算法介紹之匹配濾波器的基本原理和應(yīng)用示例

    自適應(yīng)濾波理論在統(tǒng)計(jì)信號(hào)處理中占據(jù)非常重要的地位,在通信、控制、雷達(dá)等領(lǐng)域獲得廣泛應(yīng)用。自適應(yīng)濾波器的基本目標(biāo),是通過(guò)某種方式對(duì)參數(shù)θ(k)進(jìn)行調(diào)整,使
    的頭像 發(fā)表于 01-07 14:52 ?1762次閱讀
    自適應(yīng)<b class='flag-5'>濾波</b>算法介紹之匹配<b class='flag-5'>濾波器</b>的基本原理和應(yīng)用示例

    如何選擇一個(gè)合適的高階低通濾波器

    高階低通濾波器是一種通過(guò)組合多個(gè)二階濾波器級(jí)來(lái)實(shí)現(xiàn)的濾波器,用于抑制高頻信號(hào)并保留低頻信號(hào)。從信號(hào)
    的頭像 發(fā)表于 12-30 15:37 ?727次閱讀
    如何選擇一個(gè)合適的高階低通<b class='flag-5'>濾波器</b>

    中頻信號(hào)處理的“精準(zhǔn)篩子”:杰盈JY-SBP-10.7+帶通濾波器技術(shù)解析

    在高頻 rejection、鏡像抑制與中頻信號(hào)處理領(lǐng)域,9.5-11.5MHz 頻段是信號(hào)提純與干擾管控的關(guān)鍵區(qū)間,對(duì)濾波器的低插損、高選擇性、寬溫可靠性提出了嚴(yán)苛要求。杰盈通訊
    的頭像 發(fā)表于 11-20 15:48 ?489次閱讀
    中頻<b class='flag-5'>信號(hào)</b><b class='flag-5'>處理</b>的“精準(zhǔn)篩子”:杰盈JY-SBP-10.7+帶通<b class='flag-5'>濾波器</b>技術(shù)解析

    信號(hào)處理簡(jiǎn)介:移動(dòng)平均濾波器

    設(shè)計(jì)電路,以任何我們想要的方式控制信號(hào)。我們竟然能夠使用電阻、電容器和運(yùn)算放大器 (op-amps) 等電子元器件組合來(lái)模擬積分和微分等數(shù)學(xué)工具,這著實(shí)令人驚嘆。 例如以下電路(圖1): 圖 1:簡(jiǎn)單的積分電路。(圖片來(lái)源:Mustahsin Zarif) 進(jìn)入拉普拉斯
    的頭像 發(fā)表于 10-04 18:21 ?1877次閱讀
    <b class='flag-5'>信號(hào)</b><b class='flag-5'>處理</b>簡(jiǎn)介:<b class='flag-5'>移動(dòng)</b><b class='flag-5'>平均</b><b class='flag-5'>濾波器</b>

    高頻濾波器精密加工——如何“篩”出純凈信號(hào)?

    高頻濾波器是無(wú)線通信、雷達(dá)、衛(wèi)星導(dǎo)航等領(lǐng)域的核心元件,其作用是精準(zhǔn)篩選特定頻率信號(hào),抑制干擾噪聲。隨著5G、物聯(lián)網(wǎng)等技術(shù)的普及,通信設(shè)備對(duì)濾波器的性能要求愈發(fā)嚴(yán)苛——頻率選擇性更強(qiáng)、插入損耗更低
    的頭像 發(fā)表于 09-24 15:02 ?550次閱讀

    橫河WT5000如何區(qū)別運(yùn)用指數(shù)平均移動(dòng)平均功能?

    橫河功率分析儀都有平均功能,這個(gè)功能包含兩種平均化方法,分別是指數(shù)平均移動(dòng)平均(也叫線性
    的頭像 發(fā)表于 08-19 19:16 ?914次閱讀
    橫河WT5000如何區(qū)別運(yùn)用<b class='flag-5'>指數(shù)</b><b class='flag-5'>平均</b>跟<b class='flag-5'>移動(dòng)</b><b class='flag-5'>平均</b>功能?

    什么是濾波器?維愛普詳細(xì)介紹

    濾波器是一種用于篩選特定頻率信號(hào)或能量的電子元件,通過(guò)允許某些頻率通過(guò)、抑制其他頻率,實(shí)現(xiàn)信號(hào)優(yōu)化或能量?jī)艋?。它在電子設(shè)備、通信系統(tǒng)、電力工程等領(lǐng)域廣泛應(yīng)用,是保障系統(tǒng)穩(wěn)定運(yùn)行的核心組件。
    的頭像 發(fā)表于 06-19 15:08 ?980次閱讀

    常用的數(shù)字濾波器算法及其特性

    常用的軟件濾波器有限幅濾波法、中位值濾波法、算數(shù)平均濾波法、遞推平均
    的頭像 發(fā)表于 06-18 09:04 ?1131次閱讀

    有源濾波器與無(wú)源濾波器的區(qū)別

    濾波器是根據(jù)電路參數(shù)對(duì)電路頻帶寬度的影響而設(shè)計(jì)出來(lái)的工程應(yīng)用電路,濾波器種類很多,有源濾波器和無(wú)源濾波器的區(qū)別我們最簡(jiǎn)單的分別辦法是看看是否需要電源,在作用上最大的區(qū)別在于有源
    的頭像 發(fā)表于 06-18 09:03 ?1826次閱讀

    LC濾波器與電感、電容的區(qū)別:技術(shù)分析與應(yīng)用

    ?LC濾波器與電感、電容的區(qū)別:技術(shù)分析與應(yīng)用摘要LC濾波器是由電感(L)和電容(C)組成的被動(dòng)電路,用于濾除特定頻率的信號(hào),廣泛應(yīng)用于電磁兼容(EMC)、信號(hào)
    的頭像 發(fā)表于 05-12 20:19 ?1627次閱讀
    LC<b class='flag-5'>濾波器</b>與電感、電容的區(qū)別:技術(shù)分析與應(yīng)用

    共模和差模信號(hào)濾波器

    ,干擾電流在兩條線上各流過(guò)二分之一,以地為公共回路;原則上講,這種干擾是比較容易消除的。在實(shí)際電路中由于線路阻抗不平衡,使共模信號(hào)干擾會(huì)轉(zhuǎn)化為不易消除的串?dāng)_干擾。 3 濾波器 濾波器可以抑制交流電源
    發(fā)表于 03-20 16:39

    高帶通TSIF集成濾波器

    低通濾波器 高通濾波器 帶通濾波器 帶阻濾波器 全通濾波器 濾波器類型 作用 頻率特性 應(yīng)用場(chǎng)景
    的頭像 發(fā)表于 03-20 15:42 ?953次閱讀
    高帶通TSIF集成<b class='flag-5'>濾波器</b>