举例:基于频域维纳滤波的语音增强
还是利用上面的模型:
y(n)=x(n)+w(n)
这里y(n)是麦克风接收的带噪语音,x(n)是干净语音信号,w(n)为白噪声。显然相关函数我们无法得知。
利用一种近似的处理思路:利用前面几个分帧不带语音,估计噪声,从而得到噪声的功率谱近似,利用带噪语音功率减去噪声功率,得到
H(ωk) = Pxy(ωk) / Pyy(ωk) = Pxx(ωk) / (Pxx(ωk)+Pnn(ωk)) = (Pyy(ωk)−Pnn(ωk))/ Pyy(ωk)
利用估计出的维纳滤波器,即可实现信号的频域滤波。这里只是想到的一个实际例子,至于参数估计、迭代方式则是百花齐放了。
附上主要代码:
nw = 512; ni = 64;
NIS = 100;
Y = fft(enframe(y,hamming(nw),ni)');
Yab = abs(Y);
Nest = mean(Yab(:,1:NIS),2);
Yest = zeros(size(Y));
for i = 1:size(Y,2)
Yest(:,i) = Yab(:,i).*((Yab(:,i)-Nest)./Yab(:,i));
end
Ye = Yest.*exp(1j*angle(Y));
result = zeros(1,length(y));%estimation
for i =1:size(Y,2);
pos = ((i-1)*ni+1):((i-1)*ni+nw);
result(pos) = result(pos)+real(ifft(Ye(:,i))).';
end
result = result/max(abs(result));
上面思路处理结果:
可以看出维纳降噪多少还是有些效果的,H(ωk) = Pxy(ωk) / Pyy(ωk) = Pxx(ωk) / (Pxx(ωk)+Pnn(ωk))= 11 + 1/SNR可以看出SNR越小,维纳滤波器衰减越大。