MATLAB滑動平均濾波器設計


滑動平均濾波就是把連續取得的N個采樣值看成一個隊列,隊列的長度固定為N,每次采樣得到一個新數據放到隊尾,並丟掉原來隊首的一次數據,把隊列中的N個數據進行平均運算,就可以獲得新的濾波結果。

java代碼實現:

// N點滑動平均濾波器
public static float[] MovingAverageFilter_NP(float[] InputSig){
        int length = InputSig.length;
        float[] dbRt = new float[length];

        /** N點平滑 */
        dbRt[0] = InputSig[0];
        for (int x = 1; x < length - 1; x++) {
            dbRt[x] = (InputSig[x - 1] + InputSig[x] + InputSig[x + 1]) / N;
        }
        dbRt[length - 1] = InputSig[length - 1];

        return dbRt;
    }
View Code

MATLAB代碼實現:

%N是窗口的大小

for i = 1:L
    m = m+1;
    if i+N-1 > L
        break
    else
        for j = i:N+i-1
            k = k+1;
            W(k) = T(j) ;
        end
        T1(m) = mean(W);
        k = 0;
    end
end
View Code

MATLAB中完整的實現加載音頻,使用滑動平均濾波器來處理音頻:

info = audioinfo('1.mp3');
[y,Fs] = audioread('1.mp3');
T = y;
% sound(y,Fs);
figure;
plot(y);
L = length(T);
N=10;  % 窗口大下
k = 0;
m =0 ;
for i = 1:L
    m = m+1;
    if i+N-1 > L
        break
    else
        for j = i:N+i-1
            k = k+1;
            W(k) = T(j) ;
        end
        T1(m) = mean(W);
        k = 0;
    end
end
figure;
sound(T1,Fs);

plot(T1)
View Code

來看一下兩個音頻圖像的差異,一些噪聲通過滑動平均濾波被消除。聽起來效果不一樣。

第一張是處理之前的音頻。第二張是通過濾波器處理之后的音頻。窗口大小可以自定義設計。但是也要適當的調整,如果太大,則會出現過擬合的效果。可以自行嘗試將N窗口大小取兩個極端值,一個取比較大的值,一個取比較小的值,則會發現這里的區別。

當然還可以使用MATLAB自帶的smooth函數解決。補全代碼:

out_y = smooth(T1,6,'moving');  
sound(out_y,Fs);
figure; 
plot(out_y);  
View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM