高手救命啊!小弟感激不尽啊.有关用matlab去噪的.
现有部分程序,不感肯定对不对.去噪是基于最大似然比准则的.WavData=wavread('D:\0717.wav');
FrameLength=256;
FrameOffset=1/2*FrameLength;
window=hamming(FrameLength);%哈明窗
%求帧数,用fix函数去掉小数
nFrame=fix((length(WavData)-FrameOffset)/(FrameLength-FrameOffset));
%产生随机白噪声,和声音一样大小
RAND=randn(size(WavData));
%预加重
k=2:length(WavData)
WavData(k)=WavData(k)-0.97*WavData(k-1);
data_rand=WavData+RAND; %声音加噪音
%加窗分帧
data=zeros(FrameLength,nFrame);
for k=1:nFrame
for m=1:FrameLength
data(m,k)=window(m)*data_rand((k-1)* (FrameLength-FrameOffset)+m);
end
end
fid=fopen('data+rand预处理后.txt','w+');
fprintf(fid,'%f ',data);
fclose(fid);
%**********************************************
%含噪声音512点dft变换
X=zeros(512,nFrame);
y=fft(data,512);
X=y.*conj(y); %X:512*nFrame的矩阵.
save 'shuju' nFrame FrameLength XRAND
%**********************************************
%*****************************************
load 'shuju'
%求噪声方差
%读噪声
noise=zeros(FrameLength,nFrame);
for k=1:nFrame
for m=1:FrameLength
noise(m,k)=RAND((k-1)* (FrameLength-FrameOffset)+m);
end
end
nfft=512;
V=zeros(nfft,nFrame); %预分配,存放噪声方差
window=hamming(64); %哈明窗
noverlap=32; %数据无重叠
range='twosided'; %频率间隔为,计算全部的频率
for k=1:nFrame
=pwelch(noise(:,k),window,noverlap,nfft,[],range);
V(:,k)=P;
end
%************************************************
%******************************************************
%求似然比
%*******************************************************
a=0.98;
%求postprior SNR:r
r=zeros(512,nFrame);
r=X./V;
%求P[r-1]
p=zeros(512,nFrame);
p=max(r-1,0);
%求prior SNR:E
E=zeros(512,nFrame);
%E的初始值
E(:,1)=a+(1-a)*p(:,1);
E(:,)=a*X(:,)./V(:,)+...
(1-a)*p(:,);
%似然比Sr
Sr=zeros(FrameLength,nFrame);
Sr=1./(1+E).*exp(r.*E./(1+E));
save '似然比' Sr
save'似然比' V
接着要确定一个门限,确定哪一帧是语音,最后把语音帧还原.
哪位大哥有经验,我可以附上更详细的资料.谢谢拉!
页:
[1]