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

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

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

滑動窗口濾波器的原理與實現(xiàn)

CHANBAEK ? 來源:明解嵌入式 ? 作者:Sharemaker001 ? 2023-04-19 11:35 ? 次閱讀

前言

嵌入式開發(fā)程序中涉及數(shù)據(jù)采樣如傳感器采樣,AD采樣等如果直接讀取信號后,將信號值直接參與后續(xù)邏輯處理,若程序無軟件濾波,會導(dǎo)致靜態(tài)或者動態(tài)采樣時:

1、信號曲線相對沒有那么平滑。

2、同時可能存在脈沖干擾導(dǎo)致邏輯判斷錯誤。

在信號處理系統(tǒng)中,輸入信號通常含有各種噪聲和干擾。 為對信號進行準(zhǔn)確的測量和控制,必須削弱或濾除被測信號中的噪聲和干擾。 因此在工程應(yīng)用需要使用軟件濾波,軟件濾波也稱數(shù)字濾波,是通過一定的算法削弱噪聲的影響。 在實際的開發(fā)過程中使用了滑動窗口濾波算法來對傳感器的數(shù)據(jù)采樣進行濾波處理。

一、圖解滑動窗口濾波器的原理

1、建立采樣窗口和濾波窗口,自定義各窗口長度大小。

圖片

2、當(dāng)數(shù)據(jù)樣本點數(shù)未填滿采樣窗口,對采樣窗口內(nèi)的數(shù)據(jù)累加做平均值計算。

例如此時采樣窗口內(nèi)數(shù)據(jù)采樣點只有4個,小于定義的采樣窗口長度,則將4個值累加后再做平均值計算。

圖片

3、當(dāng)數(shù)據(jù)樣本點數(shù)已填滿采樣窗口,進行冒泡排序后,去除n個最大值及最小值后,對濾波窗口內(nèi)的數(shù)據(jù)累加做平均值運算。

例如此時采樣窗口內(nèi)數(shù)據(jù)采樣點有7個,已填滿定義長度大小的采樣窗口,則分別去除自定義的1個最大值和1個最小值后,對剩余濾波窗口內(nèi)的數(shù)據(jù)累加后再做平均值計算。

圖片

4、新的數(shù)據(jù)樣本到來,移除采樣窗口中時間最早的點(FIFO),重復(fù)上述3操作。

圖片

二、滑動窗口濾波器的特點

1、經(jīng)過濾波處理后,濾除了噪聲干擾,數(shù)據(jù)波動穩(wěn)定平滑。

2、每采樣一個新數(shù)據(jù),就將最早采集的那個數(shù)據(jù)丟掉,因此每進行一次采樣,就可計算出一個新的平均值,從而加快了數(shù)據(jù)處理的速度。

3、可以根據(jù)實時性的要求和需要濾波后數(shù)據(jù)的平滑度來設(shè)置采樣窗口和濾波窗口的大小。

4、當(dāng)采樣的數(shù)據(jù)量非常大時,這時的采樣窗口會設(shè)置很大,那么窗口需要消耗一定的內(nèi)存空間。

5、當(dāng)采樣數(shù)據(jù)越多,數(shù)據(jù)實時性越差,當(dāng)數(shù)據(jù)突然發(fā)生較大變化時,不能被立刻檢測到,無法及時處理突發(fā)事件。

三、滑動窗口濾波器的C++代碼實現(xiàn)

1、基本思路

1、在工程根目錄下新建filter文件夾,將源文件filter.cpp和頭filter.h放在文件夾中供修改調(diào)用。

2、頭文件:

(1)定義濾波算法函數(shù)中的可修改宏值;

(2)聲明定義的濾波函數(shù)模板;

(3)使用extern的方式聲明實例化后的模板函數(shù)。

3、源文件:

(1)定義需要使用濾波算法的函數(shù)模板;

(2)在定義的函數(shù)模板后進行函數(shù)實例化操作,通過這樣的方法實現(xiàn)具體的模板函數(shù)。

2、頭文件filter.h

#ifndef _FILTER_H_
#define _FILTER_H_


#define MAX_SENSOR_NUM 9   //使用濾波時的傳感器數(shù)量
#define MAX_DATA_NUM 9     //最大采樣點數(shù)量,即采樣窗口長度
#define WINDOW_DATA_NUM 5  //濾波窗口長度
//去除采樣窗口內(nèi)最大最小值的數(shù)量,這里去除兩個最大和兩個最小 
#define REMOVE_MAXMIN_NUM ((MAX_DATA_NUM - WINDOW_DATA_NUM)/2)  


//extern double m_dataList[MAX_SENSOR_NUM][MAX_DATA_NUM];


//聲明定義的函數(shù)模板
template<typename InType> InType Filter_SlidingWindowAvg(int index, InType data);
//使用extern的方式聲明實例化后的模板函數(shù),根據(jù)實際需要自定義數(shù)據(jù)類型
extern template short Filter_SlidingWindowAvg(int index, short data);
extern template unsigned int Filter_SlidingWindowAvg(int index, unsigned int data);


#endif

3、源文件filter.cpp

#include 
#include "Filter.h"


using namespace std;
//定義各個傳感器的數(shù)據(jù)采樣點列表
double m_dataList[MAX_SENSOR_NUM][MAX_DATA_NUM] = {0};
//滑窗均值濾波,使用函數(shù)模板可用于適配不同數(shù)據(jù)類型的采樣點
template<typename InType>
InType Filter_SlidingWindowAvg(int index, InType data)   
{
    static int dataNum[MAX_SENSOR_NUM] = {0}; //定義記錄傳感器的采樣點個數(shù)
    int i;
    double sum = 0;
    double out = 0;
    double array[MAX_DATA_NUM] = {0};

    //數(shù)據(jù)采樣點在采樣窗口內(nèi)移動,F(xiàn)IFO操作
    for(i = MAX_DATA_NUM - 2; i >= 0; i--)
        m_dataList[index][i+1] = m_dataList[index][i];

    m_dataList[index][0] = data;
    //數(shù)據(jù)采樣點數(shù)量小于采樣窗口長度,對采樣窗口數(shù)據(jù)累加后進行平均值運算                                     
    if(dataNum[index] < MAX_DATA_NUM) 
    {
        dataNum[index]++;
        for(i = 0; i < dataNum[index]; i++)
        {
            sum += m_dataList[index][i];
        }
        out = sum / dataNum[index];
    }
    //數(shù)據(jù)采樣點已填滿采樣窗口,進行排序后,去除n個最大值及最小值后,對濾波窗口內(nèi)的數(shù)據(jù)累加后進 
    //行平均值運算   
    else        
    {  
        for(i = 0; i < MAX_DATA_NUM; i++)
        {
            array[i] = m_dataList[index][i];
        }
        //利用C++標(biāo)準(zhǔn)庫的sort函數(shù)進行排序,這里使用默認(rèn)的升序
        sort(array, array + MAX_DATA_NUM);

        int start = (MAX_DATA_NUM - WINDOW_DATA_NUM) / 2; //start = REMOVE_MAXMIN_NUM

        for(i = start; i < start + WINDOW_DATA_NUM; i++)
        {
            sum += array[i];
        }
        out = sum / WINDOW_DATA_NUM;
    }
    return out;
}


//對函數(shù)模板進行函數(shù)實例化操作,根據(jù)實際需要自定義數(shù)據(jù)類型
template short Filter_SlidingWindowAvg(int index, short data);
template unsigned int Filter_SlidingWindowAvg(int index, unsigned int data);

四、滑動窗口濾波器的C代碼實現(xiàn)

1、基本思路

1、在工程根目錄下新建filter文件夾,將頭filter.h和源文件filter.c放在文件夾中供修改調(diào)用。

2、頭文件:

(1)定義濾波算法函數(shù)中的可修改宏值;

(2)聲明定義的濾波算法函數(shù);

3、源文件:

(1)定義冒泡排序功能函數(shù);

(2)定義濾波算法功能函數(shù)。

2、頭文件filter.h

#ifndef _FILTER_H_
#define _FILTER_H_


#define MAX_SENSOR_NUM 9   //使用濾波時的傳感器數(shù)量
#define MAX_DATA_NUM 9     //最大采樣點數(shù)量,即采樣窗口長度
#define WINDOW_DATA_NUM 5  //濾波窗口長度
//去除采樣窗口內(nèi)最大最小值的數(shù)量,這里去除兩個最大和兩個最小 
#define REMOVE_MAXMIN_NUM ((MAX_DATA_NUM - WINDOW_DATA_NUM)/2)  


//extern double m_dataList[MAX_SENSOR_NUM][MAX_DATA_NUM];


//聲明定義的函數(shù)
double Filter_SlidingWindowAvg(int index, double data);


#endif

3、源文件filter.c

#include "Filter.h"


//定義各個傳感器的數(shù)據(jù)采樣點列表
double m_dataList[MAX_SENSOR_NUM][MAX_DATA_NUM] = {0};


//冒泡排序
void BubbleSort(int array[], int len)
{
    int temp;
    //外層循環(huán)控制排序的趟數(shù),n個元素排序需要循環(huán)n-1次
    for(int i=0; i

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

    關(guān)注

    2552

    文章

    51276

    瀏覽量

    755065
  • 嵌入式
    +關(guān)注

    關(guān)注

    5087

    文章

    19150

    瀏覽量

    306374
  • 濾波器
    +關(guān)注

    關(guān)注

    161

    文章

    7851

    瀏覽量

    178488
  • C++
    C++
    +關(guān)注

    關(guān)注

    22

    文章

    2113

    瀏覽量

    73738
  • AD采樣
    +關(guān)注

    關(guān)注

    0

    文章

    23

    瀏覽量

    16029
收藏 人收藏

    評論

    相關(guān)推薦

    梳狀濾波器以及積分梳狀濾波器的FPGA實現(xiàn)

    作者:lee 在實現(xiàn)多級CIC濾波器前我們先來了解滑動平均濾波器、微分、積分以及梳狀
    的頭像 發(fā)表于 11-21 09:57 ?5812次閱讀
    梳狀<b class='flag-5'>濾波器</b>以及積分梳狀<b class='flag-5'>濾波器</b>的FPGA<b class='flag-5'>實現(xiàn)</b>

    基于FPGA的多級CIC濾波器原理

    實現(xiàn)多級CIC濾波器前我們先來了解滑動平均濾波器、微分、積分以及梳狀
    的頭像 發(fā)表于 12-03 11:55 ?5878次閱讀
    基于FPGA的多級CIC<b class='flag-5'>濾波器</b>原理

    數(shù)字濾波器的設(shè)計和實現(xiàn)

    濾波器設(shè)計是一個創(chuàng)建滿足指定濾波要求的濾波器參數(shù)的過程。濾波器實現(xiàn)包括濾波器結(jié)構(gòu)選擇和
    的頭像 發(fā)表于 10-31 10:38 ?1623次閱讀
    數(shù)字<b class='flag-5'>濾波器</b>的設(shè)計和<b class='flag-5'>實現(xiàn)</b>

    3*3窗口生成模塊,用于生成濾波滑動窗口,得到窗口內(nèi)的所有元素數(shù)據(jù)

    誰有用Verilog寫的3*3的模塊代碼,3*3窗口生成模塊,用于生成濾波滑動窗口,得到窗口內(nèi)的所有元素數(shù)據(jù)。可否分享一下,謝謝。誰有代碼
    發(fā)表于 08-24 20:06

    有源濾波器中數(shù)字低通濾波器的設(shè)計及其DSP實現(xiàn)

    有源濾波器中數(shù)字低通濾波器的設(shè)計及其DSP實現(xiàn)摘要:介紹了基于瞬時無功功率理論的ip iq 諧波檢測方法及對低通濾波器的要求,分析討論了數(shù)字低通濾波
    發(fā)表于 05-13 17:19 ?90次下載

    滑動濾波器型譜分析在極窄帶濾波中的應(yīng)用

    【摘 要】滑動濾波器型譜分析是通過短時傅立葉變換來進行實時譜分析的,本文詳細(xì)分析了其用作濾波器時的頻域特性。給出了極窄帶濾波器的具體
    發(fā)表于 05-22 20:46 ?1203次閱讀
    <b class='flag-5'>滑動</b><b class='flag-5'>濾波器</b>型譜分析<b class='flag-5'>器</b>在極窄帶<b class='flag-5'>濾波</b>中的應(yīng)用

    詳細(xì)解析濾波器的定義,濾波器的特性,濾波器的工作原理,濾波器的分類,濾波器的典型電路原理圖

    濾波器的基礎(chǔ)是諧振電路,只要能構(gòu)成諧振電路組合就可實現(xiàn)濾波器。濾波器有4種基本原型,即低通濾波器、帶通
    發(fā)表于 05-03 16:20 ?1.8w次閱讀
    詳細(xì)解析<b class='flag-5'>濾波器</b>的定義,<b class='flag-5'>濾波器</b>的特性,<b class='flag-5'>濾波器</b>的工作原理,<b class='flag-5'>濾波器</b>的分類,<b class='flag-5'>濾波器</b>的典型電路原理圖

    通過滑動平均濾波器解決數(shù)控系統(tǒng)加減速控制的跳變問題

    本文通過在直線加減規(guī)劃之后,通過滑動平均濾波器來解決加速度的跳變問題,在不改變原有程序結(jié)構(gòu)的情況下,實現(xiàn)了和S形曲線等效的加減速效果。
    的頭像 發(fā)表于 04-29 08:30 ?4787次閱讀
    通過<b class='flag-5'>滑動</b>平均<b class='flag-5'>濾波器</b>解決數(shù)控系統(tǒng)加減速控制的跳變問題

    采用FPGA實現(xiàn)多級CIC濾波器的四倍抽取一

    實現(xiàn)多級CIC濾波器前我們先來了解滑動平均濾波器、微分、積分以及梳狀
    發(fā)表于 06-22 10:35 ?3000次閱讀
    采用FPGA<b class='flag-5'>實現(xiàn)</b>多級CIC<b class='flag-5'>濾波器</b>的四倍抽取一

    高斯濾波器的原理和實現(xiàn)

    高斯濾波器是一種線性濾波器,能夠有效的抑制噪聲,平滑圖像。其作用原理和均值濾波器類似,都是取濾波器窗口內(nèi)的像素的均值作為輸出。
    發(fā)表于 09-01 11:09 ?8774次閱讀
    高斯<b class='flag-5'>濾波器</b>的原理和<b class='flag-5'>實現(xiàn)</b>

    空間濾波器matlab實現(xiàn)

    空間濾波器的調(diào)整取決于濾波器的類型,比如均值濾波器可以調(diào)整濾波器的大小,中值濾波器可以調(diào)整濾波器
    發(fā)表于 02-16 09:40 ?917次閱讀
    空間<b class='flag-5'>濾波器</b>matlab<b class='flag-5'>實現(xiàn)</b>

    高通濾波器和低通濾波器的關(guān)系

    高通濾波器和低通濾波器是互補的,它們可以組合使用,從而實現(xiàn)更復(fù)雜的濾波功能。例如,可以將高通濾波器和低通
    發(fā)表于 02-17 17:47 ?5060次閱讀

    腔體濾波器和介質(zhì)濾波器的區(qū)別

    腔體濾波器和介質(zhì)濾波器都是常見的微波濾波器,它們的主要區(qū)別在于工作原理和實現(xiàn)方式。
    發(fā)表于 02-27 11:44 ?4039次閱讀

    滑動窗口算法技巧

    說起滑動窗口算法,很多讀者都會頭疼。這個算法技巧的思路非常簡單,就是維護一個窗口,不斷滑動,然后更新答案么。LeetCode 上有起碼 10 道運用
    的頭像 發(fā)表于 04-19 10:55 ?920次閱讀
    <b class='flag-5'>滑動</b><b class='flag-5'>窗口</b>算法技巧

    emi濾波器是什么濾波器

    會對電子設(shè)備的正常工作產(chǎn)生影響,甚至導(dǎo)致設(shè)備損壞。因此,EMI濾波器在電子設(shè)備中具有非常重要的作用。 EMI濾波器的原理 EMI濾波器的基本原理是利用濾波器對電磁波進行選擇性傳輸或阻斷
    的頭像 發(fā)表于 08-25 15:59 ?1145次閱讀