滑動均值濾波的matlab和Java實(shí)現(xiàn)

最近時間在研究濾波算法,目的是為了更好的識別音頻數(shù)據(jù)轩拨。因?yàn)橛行┮纛l數(shù)據(jù)里面的雜波太多,很難識別院喜,所以需要先對其進(jìn)行過濾亡蓉,才能解析識別。為此喷舀,我先在matlab上做了仿真.采用的很多濾波算法砍濒,最后選擇了對我這個效果最好的,滑動均值濾波硫麻。

什么是滑動均值濾波

滑動平均濾波就是把連續(xù)取得的N個采樣值看成一個隊(duì)列爸邢,隊(duì)列的長度固定為N,每次采樣得到一個新數(shù)據(jù)放到隊(duì)尾拿愧,并丟掉原來隊(duì)首的一次數(shù)據(jù)杠河,把隊(duì)列中的N個數(shù)據(jù)進(jìn)行平均運(yùn)算,就可以獲得新的濾波結(jié)果

具體的matlab代碼

clear
clc
load boxinfo.mat  %載入音頻數(shù)據(jù)
T = data;
figure(1)
plot(T,'-*')
title('原始數(shù)據(jù)')
hold on;
%% 
%滑動平滑濾波
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
plot(T1,'r-o')
grid
legend('原始數(shù)據(jù)','濾波之后')

濾波前后對比圖

濾波前后對比圖
濾波前后對比圖

簡單分析一下

經(jīng)過滑動濾波之后浇辜,波形整體變得平滑券敌,這里我們重點(diǎn)關(guān)注一下x軸附近的點(diǎn),可以發(fā)現(xiàn)奢赂,在波形與x軸交叉的地方陪白,波形都平穩(wěn)過度,這極大方便的我們后期進(jìn)行統(tǒng)計(jì)膳灶。

窗口大小選擇

從代碼中我們可以發(fā)現(xiàn)窗口大小我們選擇的是10咱士,如何選擇窗口大小立由,這里我們需要進(jìn)行一些簡單的分析和測試。如果x軸附近的噪點(diǎn)數(shù)量(一上一下)比較多序厉,那么窗口大小就應(yīng)該大一些锐膜,反之,小一些弛房。但是過大又會出現(xiàn)過擬合的現(xiàn)象道盏,所以可以多取幾個值,然后對比一下文捶,選擇一個最好的即可荷逞。

不同的窗口大小對比圖

不同的窗口大小對比圖
不同的窗口大小對比圖

簡單分析一下

從圖中我們可以很明顯的看出,當(dāng)N=4的時候粹排,濾波效果還不是很好种远,在x軸附近依然有噪點(diǎn)(一上一下),當(dāng)N=7的時候顽耳,已經(jīng)基本滿足我們的要求坠敷,圖形已經(jīng)可以很平穩(wěn)的過度了,但是從右邊的標(biāo)記處可以看出還是不是很平穩(wěn)射富,所以可以繼續(xù)提高N值膝迎,當(dāng)N=10的時候,波形就完全能夠達(dá)到我們的要求胰耗,所以取10即可限次。

滑動濾波的Java實(shí)現(xiàn)


/*
 * 功能 對音頻數(shù)據(jù)進(jìn)行滑動濾波,使其更好的識別  時間:2015/9/11
 */
public class MovingAverageFilter implements IAudioSignalFilter {
    private static final int WINDOWS = 1;
    private short[] mTemp = null; // 只聲明暫時不初始化,用來記錄最后得不到均值處理的點(diǎn)
    private short[] mBufout = null;
    private int mWindowSize = WINDOWS;

    public MovingAverageFilter(int size) {
        mWindowSize = size;
    }

    // 均值濾波方法宪郊,輸入一個buf數(shù)組掂恕,返回一個buf1數(shù)組,兩者下表不一樣弛槐,所以定義不同的下表,buf的下表為i依啰,buf1的下表為buf1Sub.
    // 同理乎串,臨時的winArray數(shù)組下表為winArraySub
    public short[] movingAverageFilter(short[] buf) {
        int bufoutSub = 0;
        int winArraySub = 0;
        short[] winArray = new short[mWindowSize];

        if (mTemp == null) {
            mBufout = new short[buf.length - mWindowSize + 1];
            for (int i = 0; i < buf.length; i++) {
                if ((i + mWindowSize) > buf.length) {
                    break;
                } else {
                    for (int j = i; j < (mWindowSize + i); j++) {
                        winArray[winArraySub] = buf[j];
                        winArraySub = winArraySub + 1;
                    }

                    mBufout[bufoutSub] = mean(winArray);
                    bufoutSub = bufoutSub + 1;
                    winArraySub = 0;
                }
            }
            mTemp = new short[mWindowSize - 1];
            System.arraycopy(buf, buf.length - mWindowSize + 1, mTemp, 0,
                    mWindowSize - 1);
            return mBufout;
        } else {
            short[] bufadd = new short[buf.length + mTemp.length];
            mBufout = new short[bufadd.length - mWindowSize + 1];
            System.arraycopy(mTemp, 0, bufadd, 0, mTemp.length);
            System.arraycopy(buf, 0, bufadd, mTemp.length, buf.length); // 將temp和buf拼接到一塊
            for (int i = 0; i < bufadd.length; i++) {
                if ((i + mWindowSize) > bufadd.length)
                    break;
                else {
                    for (int j = i; j < (mWindowSize + i); j++) {
                        winArray[winArraySub] = bufadd[j];
                        winArraySub = winArraySub + 1;
                    }
                    mBufout[bufoutSub] = mean(winArray);
                    bufoutSub = bufoutSub + 1;
                    winArraySub = 0;
                    System.arraycopy(bufadd, bufadd.length - mWindowSize + 1,
                            mTemp, 0, mWindowSize - 1);
                }
            }
            return mBufout;
        }
    }

    public short mean(short[] array) {
        long sum = 0;
        for (int i = 0; i < array.length; i++) {
            sum += array[i];
        }
        return (short) (sum / array.length);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市速警,隨后出現(xiàn)的幾起案子叹誉,更是在濱河造成了極大的恐慌,老刑警劉巖闷旧,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件长豁,死亡現(xiàn)場離奇詭異,居然都是意外死亡忙灼,警方通過查閱死者的電腦和手機(jī)匠襟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門钝侠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酸舍,你說我怎么就攤上這事帅韧。” “怎么了啃勉?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵忽舟,是天一觀的道長。 經(jīng)常有香客問我淮阐,道長叮阅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任泣特,我火速辦了婚禮浩姥,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘群扶。我一直安慰自己及刻,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布竞阐。 她就那樣靜靜地躺著缴饭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪骆莹。 梳的紋絲不亂的頭發(fā)上颗搂,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天,我揣著相機(jī)與錄音幕垦,去河邊找鬼丢氢。 笑死,一個胖子當(dāng)著我的面吹牛先改,可吹牛的內(nèi)容都是我干的疚察。 我是一名探鬼主播,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼仇奶,長吁一口氣:“原來是場噩夢啊……” “哼貌嫡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起该溯,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤岛抄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狈茉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體夫椭,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年氯庆,在試婚紗的時候發(fā)現(xiàn)自己被綠了蹭秋。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扰付。...
    茶點(diǎn)故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖感凤,靈堂內(nèi)的尸體忽然破棺而出悯周,到底是詐尸還是另有隱情,我是刑警寧澤陪竿,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布禽翼,位于F島的核電站,受9級特大地震影響族跛,放射性物質(zhì)發(fā)生泄漏闰挡。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一礁哄、第九天 我趴在偏房一處隱蔽的房頂上張望长酗。 院中可真熱鬧,春花似錦桐绒、人聲如沸夺脾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咧叭。三九已至,卻和暖如春烁竭,著一層夾襖步出監(jiān)牢的瞬間菲茬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工派撕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留婉弹,地道東北人。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓终吼,卻偏偏與公主長得像镀赌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子际跪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容