www.pudn.com > pujian.rar > pujian.m


%在噪声环境下语音信号的增强 
%语音信号为读入的声音文件 
%噪声为正态随机噪声 
function [output,mix_signal]=pujian(s) 
 
% s1=wavread('10.wav'); 
% s2=10.*randn(30000,1); 
%  
% s1=s1(1:30000,:); 
% s2=s2(1:30000,:); 
% s=s'; 
s1=s(1,:); 
s2=s(2,:); 
input=s1; 
count=length(input); 
noise=s2; 
signal=input'; 
for i=1:count 
voice(i)=signal(i)+noise(i); 
end 
 
Fv=fft(voice);  
anglev=angle(Fv); 
Fn=fft(noise); 
power1=(abs(Fv)).^2; 
power2=(abs(Fn)).^2; 
power2=power2(:,1); 
power2=power2'; 
power3=power1-power2; 
power4=sqrt(power3); 
Fs=power4.*exp(j*anglev); 
sound=ifft(Fs); 
 
n=1:count; 
 
% figure %对比纯净语音信号和带噪语音信号  
% subplot(2,1,1); 
% plot(n,signal); 
% title('纯净信号') 
% subplot(2,1,2); 
% plot(n,voice); 
% title('带噪信号') 
% pause 
% figure %对比纯净语音信号频谱和带噪信号频谱 
% Fss=fft(signal); 
% subplot(2,1,1); 
% plot(n,abs(Fss)); 
% title('纯净信号频谱') 
% subplot(2,1,2) 
% plot(n,abs(Fv)); 
% title('带噪信号的频谱') 
% pause 
% figure %对比纯净语音信号和输出信号 
% subplot(2,1,1) 
% plot(n,signal); 
% title('纯净信号') 
% subplot(2,1,2) 
% plot(n,sound); 
% title('输出信号') 
% pause 
% figure %对比纯净语音信号频谱和输出语音信号频谱 
% subplot(2,1,1) 
% plot(n,abs(Fss)); 
% title('纯净信号频谱') 
% subplot(2,1,2) 
% plot(n,abs(Fs)); 
% title('输出信号频谱') 
% pause 
% figure %对比纯净语音信号,带噪语音和去噪后的语音 
% subplot(3,1,1) 
% plot(n,signal); 
% title('纯净信号') 
% subplot(3,1,2) 
% plot(n,voice); 
% title('带噪语音') 
% subplot(3,1,3) 
% plot(n,sound); 
% title('去噪后的语音') 
%  set(gcf, 'color', [1 1 1])%设置边界颜色为白色 
%  output=ones(1,count); 
%  output=sound; 
 
%  pause 
max_v=max(voice);% 对带噪信号抽样值点进行归一化处理 
re_voice=voice/max_v; 
%对输出信号抽样点值进行归一化处理 
max_s=max(sound); 
re_sound=sound/max_s; 
% %读出带噪语音信号,存为'1001.wav' 
wavwrite(re_voice,5500,16,'1001'); 
%读出处理后语音信号,存为'1002.wav' 
wavwrite(re_sound,5500,16,'1002'); 
output=wavread('1002'); 
% mix_signal=voice; 
% mix_signal=mix_signal'; 
mix_signal=wavread('1001'); 
 
% figure 
% subplot(2,1,1);plot(mix_signal);   
% subplot(2,1,2);plot(output);   
%%%%%%%%%%%%%%%%%%%%%% 
% %  s1=wavread('10.wav'); 
% % s2=randn(40000,2)/100; 
% %计算输入信噪比 
%  s1=signal'; 
% %  (1:40000,:); 
%  s2=voice'; 
% %  (1:40000,:); 
% % s1=s1(:, 1); 
% % s2=s2(:,2); 
% signal = s1'*s1; 
%  s22= s2-s1; 
% noise=s22'*s22; 
% snr_in=10*log(signal/noise) 
% %计算输出信噪比 
% s2=sound'; 
%  s22= s2-s1; 
% noise=s22'*s22; 
% snr_ont=10*log(signal/noise) 
 
% %输入信噪比 
% s=signal'; 
% s_n=voice'; 
% n=s_n-s; 
% s_power=0; 
% n_power=0; 
% for i=1:length(s) 
%     s_power=s_power+(abs(s(i))).^2; 
%    n_power=n_power+(abs(n(i))).^2;  
% end 
% disp('The snr_in is:') 
% snr_in=10.*log10(s_power/n_power)%the SNR is snr1 
% %输出信噪比 
% % output=y(2,:); 
% output=sound'; 
% y_n=output;%增强后的带噪语音 
% y_n_power=0; 
% for i=1:length(y_n) 
%     y_n_power=y_n_power+(abs(y_n(i))).^2; 
% end 
% n1_power=0;%%在语音起始段估计噪声能量1~5000点 
% for i=1:5000 
%     n1_power=n1_power+(abs(y_n(i))).^2; 
% end 
% n_out_power=8*n1_power;%%%%%%%%%%%%注意这里的数字表示输出带噪语音是估计噪声语音段的几倍 
% y_out_power=y_n_power-n_out_power; 
% disp('The snr_out is:') 
% snr_out=10.*log(y_out_power/n_out_power)