马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
现有部分程序,不感肯定对不对.去噪是基于最大似然比准则的.
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 X RAND
%**********************************************
%*****************************************
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'; %频率间隔为[0 1],计算全部的频率
for k=1:nFrame
[P,f]=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(:,[2:nFrame])=a*X(:,[1:nFrame-1])./V(:,[1:nFrame-1])+...
(1-a)*p(:,[2:nFrame]);
%似然比Sr
Sr=zeros(FrameLength,nFrame);
Sr=1./(1+E).*exp(r.*E./(1+E));
save '似然比' Sr
save '似然比' V
接着要确定一个门限,确定哪一帧是语音,最后把语音帧还原.
哪位大哥有经验,我可以附上更详细的资料.谢谢拉! |