📄 voiceenhance.m
字号:
%=============================语音信号增强=================================%
function VoiceEnhance
% 利用谱减法实现语音信号增强
% This program is completed in the hope that it can be used for the voice
% signal enhancing. The main process includes adding noise to the original
% wave,enframing the noisy wave,adding hamming window,spectrum subtracting
% and generating the enhanced wave.
% 读取原始语音信号
FileName = 'test.wav';
[orgSignal,Fs,bits] = wavread(FileName);
% 添加噪声
signal_len = length(orgSignal);
noise = 0.06 * randn(1,signal_len).'; %生成高斯序列
noisyWave = orgSignal + noise;
WaveFile1 = 'noisyWave.wav';
wavwrite(noisyWave,Fs,bits,WaveFile1); %将得到的带噪语音信号写成.wav文件
% 分帧
frame_len = 256; %帧长
frame_step = 128; %帧重叠的长度
frame_sum = ceil((signal_len-frame_len)/frame_step) + 1; %分帧的数量,注意最后一帧长度不够时也算一帧
signal_enframed = zeros(frame_sum,frame_len); %用一个二维矩阵保存
indf = frame_step*(0:(frame_sum-1)).';
inds = (1:frame_len);
if signal_len == frame_len + (frame_sum-1)*(frame_len-frame_step)
signal_enframed(:) = noisyWave(indf(:,ones(1,frame_len))+inds(ones(frame_sum,1),:));
else
zero_sum = frame_len + (frame_sum-1)*(frame_len-frame_step) - signal_len;
signal_temp = [noisyWave;zeros(zero_sum,1)];
signal_enframed(:) = signal_temp(indf(:,ones(1,frame_len))+inds(ones(frame_sum,1),:));
end
% 加hamming窗
win = hamming(frame_len).';
signal_win = signal_enframed .* win(ones(frame_sum,1),:);
% 谱减
y_enhanced = spectrumSub(signal_win,frame_len,frame_sum);
% 各帧信号重新组合
y_enhanced(2:frame_sum,1:frame_step) = y_enhanced(2:frame_sum,1:frame_step) + y_enhanced(1:frame_sum-1,frame_step+1:frame_len); %帧重叠组合
temp1 = [y_enhanced(frame_sum,frame_step+1:frame_len),zeros(1,frame_step)];
temp2 = cat(1,y_enhanced,temp1);
temp3 = temp2(:,1:frame_step);
temp4 = reshape(temp3.',signal_len+zero_sum,1);
signal_enhanced = temp4(1:signal_len,:);
% 输出
WaveFile2 = 'E:\enhanced_signal.wav';
wavwrite(signal_enhanced,Fs,bits,WaveFile2);
%-----做出处理前后图形,给出直观对比
subplot(3,1,1)
plot(orgSignal);
title('Original Voice (n=0.06)');
subplot(3,1,2)
plot(noisyWave);
axis([0 90000 -1 1])
title('Noise Added');
subplot(3,1,3)
plot(signal_enhanced);
axis([0 90000 -1 1])
title('Enhanced Voice');
end
%=========================================================================%
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -