單片機數字濾波算法怎麼實現?(附代碼)

單片機數字濾波算法怎麼實現?(附代碼)

單片機數字濾波算法怎麼實現?(附代碼)


資料來源: https://mp.weixin.qq.com/s?__biz=MzAxNTc4MTc1Ng==&mid=2649378408&idx=3&sn=646d64b5b6c45f47c7b7d3a701d663b8&chksm=83e0347bb497bd6dcfa8212c3412b6ea1d7d1a68eb8639868eb9887800f84944e6f351504212&scene=126&sessionid=1607302967&key=7906d1860b93eb8f75dbaaa6300c89fbb80b55f3064ca8cf0d540996361ea34d36bb5941253cba8b3d5c3993ca67bd4b8fc8e681a29156eb295d67f214a1ab76367b743f2c4b3f0c783778e1b6b79059a2f2810f3a1ff234033243ed9b7c2d488f8df61b16e8caf0744adf7b2f7b5f770b68645773e65ff92742510361cf8426&ascene=1&uin=MjIwODk2NDgxNw%3D%3D&devicetype=Windows+10+x64&version=6300002f&lang=zh_TW&exportkey=AjmyxpxvD7HUuo5xvgR%2BvDI%3D&pass_ticket=MO1%2F7jo2htVKI2%2BGAjKDIjtKkJhX4E3y4KbwwjTrlIX2T0KmAw4tjOZ1eP%2BEr%2B71&wx_header=0


採用數字濾波算法克服隨機干擾的誤差具有以下優點:
    01.數字濾波無需其他的硬件成本,只用一個計算過程,可靠性高,不存在阻抗匹配問題。尤其是數字濾波可以對頻率很低的信號進行濾波,這是模擬濾波器做不到的。

    02.數字濾波使用軟件算法實現,多輸入通道可共用一個濾波程序,降低系統開支。

    03.只要適當改變濾波器的濾波程序或運算,就能方便地改變其濾波特性,這對於濾除低頻干擾和隨機信號會有較大的效果。



程式碼:

☆限幅濾波法(濾波器)

/*
說明:限幅濾波法主要用於處理變化較為緩慢的數據,如溫度、物體的位置等。使用時,關鍵要選取合適的門限制A。通常這可由經驗數據獲得,必要時可通過實驗得到。
*/

#define A //允许的最大差值

char data; //上一次的数据

char filter()
{

    char datanew; //新数据变量

    datanew=get_data(); //获得新数据变量

    if((datanew-data)>A||(data-datanew>A))
    {

        return data;
    }
    else
    {
        return datanew;
    }
}


☆中值濾波法(濾波器)

/*
該運算的過程是對某一參數連續採樣N次(N一般為奇數),然後把N次採樣的值按從小到大排列,再取中間值作為本次採樣值,整個過程實際上是一個序列排序的過程。
說明:中值濾波比較適用於去掉由偶然因素引起的波動和採樣器不穩定而引起的脈動干擾。若被測量值變化比較慢,採用中值濾波法效果會比較好,但如果數據變化比較快,則不宜採用此方法。
*/
#define N 11 //定义获得的数据个数
char filter()
{
    char value_buff[N]; //定义存储数据的数组
    char count,i,j,temp;
    for(count=0;count<N;count++)
    {
        value_buf[count]=get_data();
        delay(); //如果采集数据比较慢,那么就需要延时或中断
    }
    for(j=0;j<N;j++)
    {
        if(value_buff[i]>value_buff[i+1])
        {
            temp=value_buff[i];
            value_buff[i]=value_buff[i+1];
            value_buff[i+1]=temp;
        }
    }
    return value_buff[(N-1)/2];
}


☆算術平均濾波法(濾波器)

/*
該算法的基本原理很簡單,就是連續取N次採樣值後進行算術平均。
說明:算術平均濾波算法適用於對具有隨機干擾的信號進行濾波。這種信號的特點是有一個平均值,信號在某一數值附近上下波動。信號的平均平滑程度完全到決於N值。當N較大時,平滑度高,靈敏度低;當N較小時,平滑度低,但靈敏度高。為了方便求平均值,N一般取4、8、16、32之類的2的整數冪,以便在程序中用移位操作來代替除法。
*/
char filter()
{
    int sum=0;
    for(count=0;count<N;count++)
    {
        sum+=get_data();
        delay():
    }
    return (char)(sum/N);
}


☆加權平均濾波法(濾波器)

/*
由於前面所說的“算術平均濾波算法”存在平滑度和靈敏度之間的矛盾。為了協調平滑度和靈敏度之間的關係,可採用加權平均濾波。它的原理是對連續N次採樣值分別乘上不同的加權係數之後再求累加,加權係數一般先小後大,以突出後面若干採樣的效果,加強系統對參數變化趨勢的認識。各個加權係數均小於1的小數,且滿足總和等於1的結束條件。這樣加權運算之後的累加和即為有效採樣值。其中加權平均數字濾波的數學模型是:

式中:D為N個採樣值的加權平均值:XN-i為第Ni次採樣值;N為採樣次數;Ci為加權係數。加權係數Ci體現了各種採樣值在平均值中所佔的比例。一般來說採樣次數越靠後,取的比例越大,這樣可增加新採樣在平均值中所佔的比重。加權平均值濾波法可突出一部分信號抵制另一部分信號,以提高采樣值變化的靈敏度。
*/

char codejq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; //code数组为加权系数表,存在程序存储区
char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
{
    char count;
    char value_buff[N];
    int sum=0;
    for(count=0;count<N;count++)
    {
        value_buff[count]=get_data();
        delay();
    }
    for(count=0;count<N;count++)
    {
        sum+=value_buff[count]*jq[count];
    }
    return (char)(sum/sum_jq);
}


☆滑動平均濾波等(濾波器)

/*
以上介紹和各種平均濾波算法有一個共同點,即每獲取一個有效採樣值必須連續進行若干次採樣,當採速度慢時,系統的實時得不到保證。這裡介紹的滑動平均濾波算法只採樣一次,將一次採樣值和過去的若干次採樣值一起求平均,得到的有效採樣值即可投入使用。如果取N個採樣值求平均,存儲區中必須開闢N個數據的暫存區。每新採集一個數據便存入暫存區中,同時去掉一個最老數據,保存這N個數據始終是最新更新的數據。採用環型隊列結構可以方便地實現這種數據存放方式。
*/

char value_buff[N];
char i=0;
char filter()
{
    char count;
    int sum=0;
    value_buff[i++]=get_data();
    if(i==N)
    {
        i=0;
    }

    for(count=0;count<N;count++)
    {
        sum+=value_buff[count];
    }
	
    return (char)(sum/N);
}

One thought on “單片機數字濾波算法怎麼實現?(附代碼)

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *