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)