基于谱减法的语音增强Matlab代码显示波形及语谱图
时间: 2024-03-18 09:41:31 浏览: 49
以下是基于谱减法的语音增强Matlab代码,包括显示波形及语谱图的部分:
```matlab
% 读入语音文件
[x,fs] = audioread('speech.wav');
% 设置参数
winlen = round(20*fs/1000); % 窗长20ms
winshift = round(10*fs/1000); % 帧移10ms
N = 2; % 谱减法中的常数N
% 分帧
frames = enframe(x,winlen,winshift);
% 初始化
Xk_prev = abs(fft(frames(1,:)));
Y = zeros(size(frames));
% 循环处理每一帧
for i=1:size(frames,1)
% 取当前帧的FFT
Xk = abs(fft(frames(i,:)));
% 计算幅度谱增益
G = Xk./(Xk_prev+N);
% 对幅度谱增益进行限制
G(G<0.01) = 0.01;
G(G>10) = 10;
% 乘上幅度谱增益
Y(i,:) = G.*Xk;
% 更新前一帧的FFT
Xk_prev = Xk;
end
% 重构语音信号
y = overlapadd(real(ifft(Y)),winshift);
% 显示波形及语谱图
subplot(2,1,1)
plot(x)
title('原始语音波形')
subplot(2,1,2)
specgram(x,512,fs)
title('原始语音语谱图')
figure
subplot(2,1,1)
plot(y)
title('增强后语音波形')
subplot(2,1,2)
specgram(y,512,fs)
title('增强后语音语谱图')
```
其中,`enframe`和`overlapadd`是分帧和重叠相加的函数,可以在Matlab的Signal Processing Toolbox中找到。`subplot`和`plot`是Matlab用于显示图形的函数,`specgram`是用于显示语谱图的函数。在这段代码中,我们先读入语音文件,然后设置参数,分帧,对每一帧进行谱减处理,最后重构语音信号,并显示波形及语谱图。
阅读全文