基于MATLAB实现传统谱减法以及两种改进的谱减法(增益函数谱减法、多带谱减法)的语音增强

基于MATLAB实现传统谱减法以及两种改进的谱减法(增益函数谱减法、多带谱减法)的语音增强代码示例:

传统谱减法

matlab 复制代码
function enhanced = traditional_spectral_subtraction(noisy, fs, wlen, inc, NIS, a, b)
    % 参数说明:
    % noisy - 带噪语音信号
    % fs - 采样频率
    % wlen - 帧长
    % inc - 帧移
    % NIS - 前导无话段帧数
    % a - 过减因子
    % b - 增益补偿因子

    % 计算噪声功率谱
    noise_frames = buffer(noisy(1:NIS*inc), wlen, wlen-inc);
    noise_frames = noise_frames(:, 1:NIS);
    noise_power = mean(abs(fft(noise_frames)).^2, 2);

    % 分帧
    frames = buffer(noisy, wlen, wlen-inc);
    num_frames = size(frames, 2);

    % 初始化增强后的语音
    enhanced = zeros(size(noisy));

    % 谱减法处理
    for i = 1:num_frames
        % FFT
        X = fft(frames(:, i));
        X_mag = abs(X);
        X_phase = angle(X);

        % 谱减法
        S_mag = max(X_mag - a * sqrt(noise_power), b * sqrt(noise_power));

        % 逆FFT
        S = S_mag .* exp(1j * X_phase);
        enhanced_frame = real(ifft(S));

        % 重叠相加
        enhanced((i-1)*inc+1:(i-1)*inc+wlen) = enhanced((i-1)*inc+1:(i-1)*inc+wlen) + enhanced_frame;
    end
end

增益函数谱减法

matlab 复制代码
function enhanced = gain_function_spectral_subtraction(noisy, fs, wlen, inc, NIS, alpha, beta)
    % 参数说明:
    % noisy - 带噪语音信号
    % fs - 采样频率
    % wlen - 帧长
    % inc - 帧移
    % NIS - 前导无话段帧数
    % alpha - 过减因子
    % beta - 增益补偿因子

    % 计算噪声功率谱
    noise_frames = buffer(noisy(1:NIS*inc), wlen, wlen-inc);
    noise_frames = noise_frames(:, 1:NIS);
    noise_power = mean(abs(fft(noise_frames)).^2, 2);

    % 分帧
    frames = buffer(noisy, wlen, wlen-inc);
    num_frames = size(frames, 2);

    % 初始化增强后的语音
    enhanced = zeros(size(noisy));

    % 谱减法处理
    for i = 1:num_frames
        % FFT
        X = fft(frames(:, i));
        X_mag = abs(X);
        X_phase = angle(X);

        % 增益函数
        G = (X_mag - alpha * sqrt(noise_power)) ./ X_mag;
        G = max(G, beta);

        % 增强后的频谱
        S_mag = G .* X_mag;

        % 逆FFT
        S = S_mag .* exp(1j * X_phase);
        enhanced_frame = real(ifft(S));

        % 重叠相加
        enhanced((i-1)*inc+1:(i-1)*inc+wlen) = enhanced((i-1)*inc+1:(i-1)*inc+wlen) + enhanced_frame;
    end
end

多带谱减法

matlab 复制代码
function enhanced = multiband_spectral_subtraction(noisy, fs, wlen, inc, NIS, num_bands)
    % 参数说明:
    % noisy - 带噪语音信号
    % fs - 采样频率
    % wlen - 帧长
    % inc - 帧移
    % NIS - 前导无话段帧数
    % num_bands - 子带数量

    % 计算噪声功率谱
    noise_frames = buffer(noisy(1:NIS*inc), wlen, wlen-inc);
    noise_frames = noise_frames(:, 1:NIS);
    noise_power = mean(abs(fft(noise_frames)).^2, 2);

    % 分帧
    frames = buffer(noisy, wlen, wlen-inc);
    num_frames = size(frames, 2);

    % 初始化增强后的语音
    enhanced = zeros(size(noisy));

    % 子带划分
    band_width = wlen / num_bands;

    % 谱减法处理
    for i = 1:num_frames
        % FFT
        X = fft(frames(:, i));
        X_mag = abs(X);
        X_phase = angle(X);

        % 多带谱减法
        S_mag = zeros(size(X_mag));
        for j = 1:num_bands
            band_start = (j-1) * band_width + 1;
            band_end = j * band_width;
            band_noise_power = noise_power(band_start:band_end);
            S_mag(band_start:band_end) = max(X_mag(band_start:band_end) - band_noise_power, 0);
        end

        % 逆FFT
        S = S_mag .* exp(1j * X_phase);
        enhanced_frame = real(ifft(S));

        % 重叠相加
        enhanced((i-1)*inc+1:(i-1)*inc+wlen) = enhanced((i-1)*inc+1:(i-1)*inc+wlen) + enhanced_frame;
    end
end

使用示例

matlab 复制代码
% 读取带噪语音信号
[noisy, fs] = audioread('noisy_speech.wav');

% 参数设置
wlen = 256; % 帧长
inc = 128; % 帧移
NIS = 10; % 前导无话段帧数
a = 4; % 过减因子
b = 0.001; % 增益补偿因子
alpha = 4; % 增益函数过减因子
beta = 0.001; % 增益函数增益补偿因子
num_bands = 4; % 多带谱减法子带数量

% 传统谱减法
enhanced_traditional = traditional_spectral_subtraction(noisy, fs, wlen, inc, NIS, a, b);

% 增益函数谱减法
enhanced_gain_function = gain_function_spectral_subtraction(noisy, fs, wlen, inc, NIS, alpha, beta);

% 多带谱减法
enhanced_multiband = multiband_spectral_subtraction(noisy, fs, wlen, inc, NIS, num_bands);

% 保存增强后的语音
audiowrite('enhanced_traditional.wav', enhanced_traditional, fs);
audiowrite('enhanced_gain_function.wav', enhanced_gain_function, fs);
audiowrite('enhanced_multiband.wav', enhanced_multiband, fs);

说明

  • 传统谱减法:直接从带噪语音频谱中减去噪声功率谱,可能会导致"音乐噪声"问题。
  • 增益函数谱减法:通过引入增益函数来平滑频谱,减少"音乐噪声"。
  • 多带谱减法:将语音频谱划分为多个子带进行独立处理,减少"音乐噪声"的影响。

你可以根据实际需求调整参数,以获得更好的语音增强效果。

相关推荐
2601_963749101 小时前
越华环保集团数字化污水治理:端边云采集架构与平台对接实现
java·大数据·架构
xcLeigh1 小时前
Go入门:整数类型的溢出与安全边界
java·安全·golang
源码宝2 小时前
SpringBoot+Vue2 诊所门诊管理系统,完整前后端源码,可直接部署上线
java·源码·his系统·门诊系统·程序代码·诊所系统·门诊his
yychen_java2 小时前
九:Text-to-SQL 智能数据查询与 Human-in-the-Loop 人机协作
java·人工智能·架构
Brilliantwxx2 小时前
【Linux】 进程(10) 进程控制深度解析:创建、终止与等待
linux·运维·服务器·c语言·开发语言·网络
ai小陈2 小时前
FramePack图生视频云端部署实战:从单图输入到视频输出的完整流程
服务器·人工智能·安全·ai·音视频·gpu算力
欧米欧3 小时前
Linux基础指令上
linux·运维·服务器
lhldsg3 小时前
智慧场馆解决方案小程序开发实战:从架构设计到部署指南
java·小程序·uni-app
Freak嵌入式3 小时前
Pico UART 数据收发实战:硬件配置、MicroPython 编程
java·开发语言·单片机·嵌入式硬件·生活
ARM|X86+FPGA工业主板厂家4 小时前
基于嵌入式 GPU 的智能服务机器人
linux·运维·arm开发·fpga开发·机器人