天天看點

C語言實作的滑動平均濾波算法

    最近采集壓力傳感器的電壓信号,采集到的資料波動挺大的,是以采用濾波的方法進行處理一下。

    因為在matlab中依靠matlab的畫圖函數很容易看到濾波後的資料圖像,進而驗證濾波效果。

    是以首先将采集到的原始資料儲存到TXT文檔裡面,然後導入到matlab中,在matlab中對資料進行濾波。

    在matlab中采用了三種濾波方法:1、滑動平均濾波 2、中值濾波 3、卡爾曼濾波

    在對比了三種濾波之後的圖像之後,選擇了第一種滑動平均濾波的方法。在matlab中有專門的函數:smooth(變量),但是我們要用C語言實作這個功能。

    我依據滑動平均濾波的原理進行了程式編寫,對于資料開始部分和結尾部分做了一些改變,得到的濾波效果還不錯,與matlab的濾波效果差異很小。

    話不多說,上代碼:

#define size 6000//數組大小
#define N 12//滑動平均濾波計算平均值時所取的點數
/*上面兩句在使用下面這個函數的時候加到程式的開頭*/
void Smooth(float data[])
{
    Sum1=0;
    for(int j=0;j<size;j++)
    {
        if(j<N/2)
        {
            for(int k=0;k<N;k++)
            {
                Sum1+=data[j+k];
            }
            data[j]=Sum1/N;
        }
        else
            if(j<size -N/2)
            {
                for(int k=0;k<N/2;k++)
                {
                    Sum1+=(data[j+k]+data[j-k]);
                }
                data[j]=Sum1/N;
            }
            else
            {
                for(int k=0;k<size-j;k++)
                {
                    Sum1+=data[j+k];
                }
                for(int k=0;k<(N-size+j);k++)
                {
                    Sum1+=data[j-k];
                }
                data[j]=Sum1/N;
            }
        Sum1=0;
    }
}
           

    這是我根據我寫的滑動平均算法做了點改動,下面看看濾波效果圖

C語言實作的滑動平均濾波算法

 藍色的線是原始資料圖像,紅色的線是濾波之後的資料圖像

C語言實作的滑動平均濾波算法

    這張圖中紅色的是原始資料圖像,綠色的線是matlab自帶的smooth函數濾波之後的圖像,藍色的線是我自己用C語言寫的濾波算法濾波之後的資料圖像,都是濾波20次。

    可以看出這個移動平均濾波算法能夠達到要求,并且可以和matlab中的smooth函數相比。

    就講到這裡吧,如果有問題可以在評論區留言,希望能夠對大家有用,謝謝大家觀看。

繼續閱讀