天天看點

應用譜減法進行語音去噪的算法研究

衆所周知,語言是人類傳播資訊和表達感情的重要媒介,在人類的交流中起着極其重要的作用。二十一世紀是資訊科學的世紀,行動電話、數字助聽器、車載導航系統等各種各樣的人機互動語音處理系統在人們的日常生活中的應用越來越多。是以,對人們交流中最常用的語音來說,對其進行處理在現代資訊進行中就占有極為重要的地位。

語音信号處理技術一直以來都是國内外學者研究的熱點,它跨聲學、信号處理、仿生學等多個學科,應用前景廣闊。然而在人們的語音通信過程中,不可避免地會受到來自周圍環境、傳輸媒介引入的噪聲,通信裝置内部的電噪聲,乃至其他講話者的幹擾。這些很強的背景噪聲幹擾,嚴重影響通話品質、影響了語音通信的正常進行。語音識别系統同樣也會受到背景噪聲的影響,背景噪聲的存在不僅嚴重破壞了語音信号原有的模型參數和聲學特性,導緻許多語音處理系統服務品質的降低,而且會影響系統輸出語音的可懂程度,使聽衆産生聽覺疲勞。語音增強目的就是從被污染的語音信号中,提取盡可能純淨的原始語音,改善語音品質,使聽者不覺的疲勞,并且能夠提高語音的可懂度。在上述情況下,語音增強技術作為一種預處理技術,是消除這些噪聲幹擾的一個最重要的手段,它通過對帶噪語音進行處理來改善語音品質,使人們易于接受或提高語音處理系統的性能。

有關抗噪聲技術的研究,早在60年代起就已引起人們的注意,此後人們一直锲而不舍地進行這方面的研究,并取得了豐富的研究成果,現在各種的不同的學科的專門知識也引入到語音處理領域。對于增強被加性噪聲污染的語音信号這一問題,近些年來,有了一定的進展。下面對國内外語音增強研究的常用方法作介紹。

頻譜相減法:單聲道語音增強方法中目前常用的是一類基于短時譜幅度估計的語音增強方法,該方法認為語音信号的感覺不重要,沒有必要精确計算。文獻[2]中通過實驗為此提供了一定的依據,文獻[3]中則證明在一定條件下語音相位的最小均方誤差(MMSE)估計就是帶噪語音相位本身,是以,基于STSA估計的語音增強方法一般都是直接采用帶噪語音的相位作為增強語音的相位。基于STSA估計的語音增強方法包括譜減法及其各種變形,MMSE估計法等。譜減法通過從帶噪語音的STSA中直接減去噪聲的平均譜幅度來得到增強語音的STSA,實作起來簡單,但是剩餘噪聲大,并且産生不舒服的“音樂噪聲”。後來,Ephraim等人 提出了STSA的MMSE估計法,部分解決了“音樂噪聲”問題,但在帶噪語音SNR較低時其剩餘噪聲還是很大,尤其是當信噪比小于5dB時。本文中介紹一種改進譜減法,他相對于傳統譜減法有很好的去噪效果。

自适應噪聲對消法:适用于在帶噪語音信号采集過程中同時能獲得參考噪聲源的自适應噪聲對消技術,已日趨成熟。據專家報告:運用此技術增強帶噪語音,在實驗環境中,信噪比SNR有40dB左右的改善,在實際中也有20dB左右的提高。

小波變換法:頻譜相減法是在短時平穩假定的基礎上,采用固定窗傅立葉變換,時—頻分辨率均是固定不變的。然而對某些“嚴格非平穩” 的語音,這種分析模糊了語音的細節特征,小波變換正是滿足這一需要的有力工具。

在本次語音信号的去噪研究中,使用的純淨語音檔案是利用window錄音裝置錄制的wav格式的語音檔案。wav檔案是Windows标準的檔案格式,wav檔案作為多媒體中使用的聲波檔案格式之一。采樣速率是指聲音信号在“模→數”轉換過程中機關時間内采樣的次數。程式實作中我們用wavread讀取wav語音檔案,傳回抽樣資料、抽樣速率、每一抽的比特數。仿真程式如下:

[wavinn,fs,nbits]=wavread('C:\Documents and Settings\妮子的\桌面\1.wav');

為了驗證改進之後算法的去噪能力增強,是以我們在程式開始時加入了輸入信噪比可調的加白噪聲函數awgn,該函數為matlab自帶函數,輸入純淨語音以及要求的信噪比,輸出規定信噪比的語音信号。

在進行進一步處理時都是按幀從資料區取出語音資料,處理完後再取出下一幀,如此反複直到所有語音資料處理完。已取出的一幀語音s(n)要經過加窗處理。加窗實質上是用了一個短時窗w(n)截取信号。由數字信号處理理論可知,兩個信号時域相乘相當于在頻域卷積。矩形窗頻譜旁瓣成分大,滾降衰減速度慢,加這種窗将影響語音信号的高頻部分如頻譜洩漏使得語音信号能量洩漏到其他頻率處。為避免這些影響,通常采用高頻分量幅度較小的窗形,如hamming窗。 

在分幀時可以說幀長是時間和點數,具體的選擇标準是10ms~30ms之間,但是為了友善傅立葉變換,一般說來,幀長取2^n,n為整數。在取資料時,前一幀和後一幀的交疊稱為幀移[29]。幀移和幀長的比值一般取為0~1/2。依據此标準以及實際采樣率,确定了分幀時幀長以及步長的選擇标準。并且,編寫了分幀函數enframe。程式如下:

  1. 幀長步長選擇标準

case 8000         frame_len=256;        step_len=128;

case 10000        frame_len=400;        step_len=200;

case 12000        frame_len=512;        step_len=256;

case 16000        frame_len=800;        step_len=400;

case 44100        frame_len=2048;       step_len=1024;

otherwise         frame_len=1800;       step_len=900;

2)分幀函數enframe(x,win,inc),其中x表示讀取的語音檔案的資訊,win為幀長,inc為

重疊的步長。

function f=enframe(x,win,inc)

nx=length(x(:));

nwin=length(win);

nf = fix((nx-len+inc)/inc);

f=zeros(nf,len);

indf= inc*(0:(nf-1)).';

inds = (1:len);

f(:) = x(indf(:,ones(1,len))+inds(ones(nf,1),:));

    由于漢明窗更适用于頻域處理,是以選用漢明窗,這裡我們應用matlab自帶函數hamming求漢明窗。仿真程式如下:

window=hamming(frame_len);                   %定義漢明窗

fft_inframe(:,i)=fft(enframe(:,i).*window

如圖所示,為在10dB輸入信噪比的情況下,原始程式和去掉窗函數程式輸出波形圖

頻譜圖的對比:

應用譜減法進行語音去噪的算法研究

    從圖中可以看出左下角加窗的程式輸出的波形在非語音部分多餘噪聲較少,且波形相對左上角更加錯落有緻。同時,通過聽兩種方法輸出的聲音,也可以聽出加窗後尖叫的噪聲較少。是以,可以看出通過加窗是可以避免分幀時的截斷效應的。

1)設定幅度小于噪聲信号的語音

a=3;                                         %當a取1時是普通功率譜相減法

abs_inframe2(j,i)<a*abs_noise(j,1)

abs_inframe2(j,i)=a*abs_noise(j,1);

2)功率譜相減

p_wavout(:,i)=sqrt((abs_inframe2(:,i).^2-(a*abs_noise).^2)./abs_inframe(:,i).^2).*fft_inframe(:,i)

3)非語音幀衰減

T=20*log10(mean(abs_wavout./(abs_noise*ones(1,frame_num))));              %求信噪比

T_noise=mean(T(:,1:20),2);

c=10^(-2/3);                                              % 衰減系數為 10^(-1.5)

noise_frame=find(T<T_noise);

繼續閱讀