基于谱减法的语音增强Matlab代码显示波形及语谱图
时间: 2024-03-18 11:41:16 浏览: 93
以下是基于谱减法的语音增强Matlab代码,包括显示波形和语谱图的部分:
```matlab
% 读取语音文件
[x, fs] = audioread('speech.wav');
% 设置参数
winLen = 20; % 窗口长度,单位毫秒
winShift = 10; % 窗口移动步长,单位毫秒
fftSize = 512; % FFT长度
alpha = 3; % 谱减法的平滑系数
beta = 5; % 谱减法的阈值系数
noiseWinSize = 20; % 噪声估计窗口大小,单位毫秒
% 将参数转换为样本数
winLen = round(winLen / 1000 * fs);
winShift = round(winShift / 1000 * fs);
noiseWinSize = round(noiseWinSize / 1000 * fs);
% 分帧并进行加窗
frames = enframe(x, winLen, winShift);
frames = frames .* hamming(winLen);
% 计算每帧的功率谱
psd = abs(fft(frames, fftSize, 2)) .^ 2;
% 计算每帧的噪声功率谱
noisePsd = min(psd(:, 1:noiseWinSize), [], 2);
% 进行谱减法增强
for i = 1:size(psd, 2)
% 计算信噪比
snr = psd(:, i) ./ noisePsd;
% 计算噪声门限
thres = beta * noisePsd .* snr.^(-alpha);
thres(snr < 1) = beta * noisePsd(snr < 1);
% 进行谱减法
psd(:, i) = max(psd(:, i) - thres, 0);
end
% 合成增强后的语音信号
enhancedFrames = real(ifft(psd, fftSize, 1));
enhancedFrames = enhancedFrames(1:winLen, :);
enhanced = overlapadd(enhancedFrames, winShift);
% 显示波形
subplot(211);
plot(x);
title('原始语音波形');
subplot(212);
plot(enhanced);
title('增强后的语音波形');
% 显示语谱图
subplot(211);
spectrogram(x, hamming(winLen), winLen-winShift, fftSize, fs, 'yaxis');
title('原始语音语谱图');
subplot(212);
spectrogram(enhanced, hamming(winLen), winLen-winShift, fftSize, fs, 'yaxis');
title('增强后的语音语谱图');
```
代码中使用了 `enframe` 和 `overlapadd` 函数来进行分帧和重叠相加,使用了 `spectrogram` 函数来显示语谱图。需要注意的是,在谱减法中,需要先估计噪声功率谱,以便计算门限。在本代码中,使用了每帧前 `noiseWinSize` 个样本的最小值作为噪声功率谱,但这种方法可能不够准确,需要根据具体情况进行调整。
阅读全文