upsuper 发表于 2006-10-13 09:30

高手救命啊!小弟感激不尽啊.有关用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]
查看完整版本: 高手救命啊!小弟感激不尽啊.有关用matlab去噪的.