基于谱减法的声音去噪
譜減法模型
實(shí)際聽覺環(huán)境中,肯定是含有噪聲的,那摻雜有噪聲的聲音信號中原聲音信號和噪聲信號是如何體現(xiàn)的呢?一種普遍被使用的方法是:采集到的聲音信號永遠(yuǎn)都是原信號與噪聲信號的疊加,即
模型是信號的直接疊加,這就要滿足:原信號與噪聲信號不相關(guān)。其實(shí)有些情況下這個(gè)條件是不滿足的,所以依然有很多其他的模型,如有人認(rèn)為原信號和噪聲信號是卷積的關(guān)系。當(dāng)然,這些都是模型,還沒有明確的理論證明那種是對的,反正哪種好用我們就撿誰。譜減法就是基于噪聲的加法模型。
語音信號本身是非平穩(wěn)過程,但假如取很短的一段(10~30ms),則具有短時(shí)平穩(wěn)特性。因此,使用窗函數(shù)取含噪語音信號的一幀(N點(diǎn))進(jìn)行處理。信號疊加模型兩邊同時(shí)進(jìn)行傅里葉變換,并取模,
則對原信號幅值的估計(jì)就可通過|S(k)|=|Y(k)|-|N(k)|求得,但僅這樣存在2個(gè)問題:
因此,譜減法考慮到這兩點(diǎn),其流程如下:
圖注:譜減法流程圖
在語音增強(qiáng)的應(yīng)用中,由于人耳對相位信息的感知不敏感,信號恢復(fù)時(shí)仍使用的相位信息為帶噪信號的相位,相位信息保存在哪里呢?我們知道FFT的結(jié)果是復(fù)數(shù),
?(w)?就是相位,具體一些,復(fù)數(shù)在直角坐標(biāo)系上表示,
圖注:關(guān)于保持相位不變
在上面的譜減法流程中,考慮噪聲的高斯分布特性,用噪聲的均值E[N(k)]替換N(k),考慮減完后可能為負(fù)值的情況,將值小于0的部分全部截?cái)酁?,這樣處理雖然帶來一定的方便性,但同時(shí)引入了新的噪聲,習(xí)慣上稱之為“音樂噪聲”。通過FFT譜進(jìn)行譜減法并不是最普遍的方法,更多情況下是用功率譜代替FFT譜。
圖注:功率譜的譜減法
Matlab的譜減法實(shí)例
<pre name="code" class="plain">clc clear all;% 選擇.wav音頻文件 [fname,pname]=uigetfile(...{'*.wav';'*.*'},...'Input wav File'); [x,fs] = audioread(fullfile(pname,fname));x = x(1:8912,1); % 如果是雙聲道,取單通道 N = length(x); % 幀長 max_x = max(x); noise_add = random('norm', 0, 0.1*max_x, [N,1]);% 添加高斯噪聲 y = x + noise_add; noise_estimated = random('norm', 0, 0.1*max_x, [N,1]); fft_y = fft(y); fft_n = fft(noise_estimated); E_noise = sum(abs(fft_n)) / N; mag_y = abs(fft_y); phase_y = angle(fft_y); % 保留相位信息 mag_s = mag_y - E_noise; mag_s(mag_s<0)=0;% 恢復(fù) fft_s = mag_s .* exp(1i.*phase_y); s = ifft(fft_s);subplot(311);plot(x);ylim([-1.5,1.5]);title('原始干凈信號'); subplot(312);plot(y);ylim([-1.5,1.5]);title('加噪信號'); subplot(313);plot(real(s));ylim([-1.5,1.5]);title('譜減法去噪后信號');圖注:Matlab譜減法去噪
上圖取了一段wav文件的腳步聲,從第二張圖到第3張圖,有一些去噪效果,但信號本身也有衰減。譜減法應(yīng)用范圍還是很有限,在實(shí)際應(yīng)用中,主要限制在環(huán)境噪聲的特性上大部分情況不是簡單的高斯特性,而且也很難滿足噪聲加法模型,另外,在譜減之后截?cái)酁?引入的新的音樂噪聲至今沒辦法完全解決。但在高SNR的條件下,使用譜減法進(jìn)行語音信號的增強(qiáng)確也能達(dá)到不錯(cuò)的效果。
參考文獻(xiàn)
總結(jié)
以上是生活随笔為你收集整理的基于谱减法的声音去噪的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Matlab设计滤波器(FDAT)
- 下一篇: 深入浅出讲解谱减法