基于谱减法的音频信号噪声抑制的Matlab和C语言分别实现并对比

本文介绍了谱减法在音频信号噪声抑制中的应用,包括Matlab和C语言的实现,并对比了效果。谱减法通过减去噪声的短时谱以增强语音信号,但可能导致音乐噪声。文章还探讨了非线性谱减、多带谱减、MMSE谱减等改进算法,以减少噪声和提高语音质量。
摘要由CSDN通过智能技术生成

一、语音和噪声

1、冲激噪声

冲激噪声的时域波形是类似于冲激函数那样的窄脉冲,常见的消除冲激噪声的方式有两种:

(1)对带噪语音信号的幅值求均值,将该均值作为判断的标准,超过该标准的视作噪声,在时域将其滤除

(2)当噪声不太密集的时候,可以通过某些点内插的方法避开或者平滑掉冲激点,从而从语音信号中去掉冲击噪声。

2、周期噪声

常见的噪声是50Hz的交流电产生的周期噪声。在频谱图上展现为离散的窄谱。可以采用陷波器将其去除掉

3、宽带噪声

说话时同时伴随着呼吸引起的噪声、随机噪声源产生的噪声以及量化噪声等都可视为宽带噪声。宽带噪声的特点是噪声频谱遍布于整个语音信号频谱中,一般采用非线性方法滤除。

4、语音干扰

干扰语音和待传语音信号同时在一个信道中传输所造成的语音干扰。区别有用语音和干扰语音的基本方法是利用其基音差别。一般情况下两种语音的基音不同,也不成整数倍,因此可以用梳妆滤波器提取基音和各谐波。

二、谱减法

处理宽带噪声的最通用技术是谱减法。它利用语音信号的短时平稳特性,从带噪语音的短时谱值中减去噪声的短时谱,从而得到纯净语音的频谱,达到语音增强得目的。

谱减法包括幅度谱减法和功率谱减法: 幅度谱减法就是在频域中从带噪语音的幅度谱上减去噪声的幅度谱作为语音信号的幅度谱;功率谱减法则是从带噪语音的功率谱中减去噪声的功率谱, 得到纯净语音的功率谱估计, 通过开方运算得到幅度谱。由于人耳对语音频谱分量的相位感知不敏感, 因此这些算法都是在幅度上进行的修正, 相位部分则保持不变, 仍然使用带噪语音的相
位。

谱减法通过从带噪语音的短时谱估值中减去噪声的短时谱来达到语音增强得目的, 算法简单且容易实现。但在减去噪声谱后, 还会有些较大功率谱分量的剩余部分, 在频谱上呈现出随机出现的尖峰,在听觉上形成残留噪声。这种噪声具有一定的节奏性起伏感,被称之为“音乐噪声”。

三、Matlab实现谱减法

使用Matlab对语音信号进行分析,首先对原始语音信号进行加噪处理(高斯随机噪声),然后使用谱减法去噪。

% 选择.wav音频文件
[fname,pname]=uigetfile(...
    {'*.wav';'*.*'},...
    'Input wav File');
[x,fs] = audioread(fullfile(pname,fname));
x = x(1:8912,1);     % 如果是双声道,取单通道
N = length(x);       % 帧长
max_x = max(x);
noise_add = random('norm', 0, 0.1*max_x, [N,1]);
 
% 添加高斯噪声
y = x + noise_add;
noise_estimated = random('norm', 0, 0.1*max_x, [N,1]);
fft_y = fft(y);
fft_n = fft(noise_estimated);
E_noise = sum(abs(fft_n)) / N;
mag_y = abs(fft_y);
phase_y = angle(fft_y);   % 保留相位信息
mag_s = mag_y - E_noise;
mag_s(mag_s<0)=0;
 
% 恢复
fft_s = mag_s .* exp(1i.*phase_y);
s = ifft(fft_s);
 
subplot(311);plot(x);ylim([-1.5,1.5]);title('原始干净信号');
subplot(312);plot(y);ylim([-1.5,1.5]);title('加噪信
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值