短時幅度譜估計在語音增強中的研究和應用

2020-09-30 15:01:17

        語音處理過程中受到各種各樣噪聲的干擾,不但降低了語音品質,而且還將使整個系統無法正常工作。因此,為了消除噪聲干擾,在現代語音處理技術中,工業上一般採用語音增強技術來改善語音品質從而提高系統效能。

       本論文基於短時幅度譜估計來研究語音增強,主要介紹了功率譜相減、維納濾波法,並介紹了這幾種語音增強方法的基本原理和實現方法。通過研究,我們得到在白噪聲的條件下,這些語音增強方法具有很好的增強效果,可作為開發實用語音增強方法的基礎。

********************************************************************

clc,clear

[x, fs]=wavread('no1.wav');

sound(x, fs);                    % 播放此音訊

snr1=SNR(x,0.002*randn(1))

time=(1:1024)/fs;      

figure(1);

plotspec(x,1/fs);       %原始的語音訊號時域和頻域分析

y=wiener(x,fs);        %通過維納濾波器進行語音訊號的增強

figure(2);

plotspec(y,1/fs);       %原始的語音訊號時域和頻域分析

sound(y, fs);          %播語音增強後的音訊

snr2=SNR(y,0.002*randn(1))

這段程式碼主要含義為首先讀取一個語音訊號,然後對這個訊號進行頻譜分析,最後將這個語音訊號通過維納濾波,並對維納濾波以後的訊號進行頻譜分析從而對比語音增強前後兩次效果。

在這裡我們主要自定義了以下幾個函數:SNRplotspec,wiener分別為訊雜比計算函數,頻譜分析函數,維納濾波函數。其中wiener函數是系統的主要函數,通過這個函數,我們就可以完成語音訊號的增強處理。然後通過plotspec進行訊號的頻譜分析。

其中維納濾波主要過程如下:

********************************************************************

%維納濾波

for k=1:nf

     if k<=NNoise

        SpeechFlag=0;

        NoiseCounter=NNoise;

    else

           NoiseMargin=3;

           HangOver=8;

           SpectralDist= 20*(log10(ymag(:,k))-log10(MN));

           SpectralDist(find(SpectralDist<0))=0;

           Dist=mean(SpectralDist);

           if (Dist < NoiseMargin)

            NoiseFlag=1;

            NoiseCounter=NoiseCounter+1;

           else

            NoiseFlag=0;

            NoiseCounter=0;

           end

           if (NoiseCounter > HangOver)

           SpeechFlag=0;   

           else

           SpeechFlag=1;

           end

     end

下面我們來對比分析以後的效果。 

圖4-1 原始訊號的時域頻域訊號分析

    通過執行程式,通聽覺上可以感受到該語音訊號有明顯的雜音,聽起來很不舒服。通過執行後結果,我們可以看到,該語音訊號的時域部分,在每次人發音間隔之間具有明顯的噪聲干擾也就是我們所謂的噪聲。

圖4-2 通維納濾波進行語音增強後的訊號的時域頻域訊號分析

    通過語音濾波以後,從聽覺好可以聽到語音已經變的清晰,沒用明顯的雜音干擾,分析其訊號頻譜,可以看到,其有效頻率和高頻的幅度比變大,說明通過語音增強後音質得到了明顯的改善。