语音增强算法之非参数方法——谱减法相关知识以及用Matlab对音频仿真实现增强语音波形等

非参数方法

非参数方法不需要从带噪信号中估计模型参数,因此这种方法的应用范围较广。但由于没有利用可能的语言统计信息,故结果一般不是最优化的。这类方法包括自适应噪声抵消法、谱减法等。

这里就先介绍普减法,下次有时间再说自适应噪声抵消法

普减法概述

谱减法是利用噪声的统计平稳性以及加性噪声与语音不相关的特点而提出的一种语音增强方法。

这种方法没有使用参考噪声源,但它假设噪声是统计平稳的,即有语音期间噪声幅度谱的期望值与无语音间隙噪声的幅度谱的期望值相等。(如果两个随机变量的分布相同,则它们的期望值也相同。)

用无语音间隙测量计算得到的噪声频谱的估计值取代有语音期间噪声的频谱,与含噪语音频谱相减,得到语音频谱的估计值。

当上述差值得到负的幅度值时,将其置零。由于人耳对语音的感知主要是通过语音信号中各频谱分量幅度获得的,对各分量的相位不敏感。因此,此类语音增强方法将估计的对象放在短时谱幅度上。

普减法原理

假设带噪信号为在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
基于语音短时谱估计的原理框图如下:
在这里插入图片描述
谱减法的基本原理如上图所示。y(n)经F F T变换后,有Yk=Sk+Nk,由此可得
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
谱减法在频域将带噪语音的功率谱减去噪声的功率谱得到纯净语音功率谱估计,开方后就得到语音幅度谱估计,用带噪语音的相位来近似纯净语音的相位,再采用反傅里叶变换恢复时域信号。

它的优点是比较简单,只需要进行正反傅里叶变换,而且实时实现较容易。但谱减法适用的信噪比范围较窄,在信噪比较低时对语音的可懂度损伤较大,这是因为信噪比主要代表了由浊音决定的大信号能量,而语音可懂度主要取决于元音和相对较小的代表辅音的信号。所以实际应用时除了要降低噪声外,还要兼顾语音的可懂度和自然度。

另外,由于频谱直接相减会使增强后的语音产生“音乐噪声”,它具有一定的节奏性,听上去类似音乐声,由此而得名。

简单的普减法原理

谱减法顾名思义,就是用带噪信号的频谱减去噪声信号的频谱(幅度谱和功率谱均可)。谱减法基于一个简单的假设:假设语音中的噪声只有加性噪声,只要将带噪语音谱减去噪声谱,就可以得到纯净语音,这么做的前提是噪声信号是平稳的或者缓慢变化的。提出这个假设就是基于短时谱(25ms),就是频谱在短时间内是平稳不变的。假设带噪信号y由纯净信号x和加性噪声d组成,那么纯净信号的功率谱可以通过下式获得:
在这里插入图片描述
谱减法的实现的关键在于对噪声谱的估计,一般认为语音信号的前几帧没有语音活动,因此前几帧为纯净的噪声信号,因此使用语音信号的前几帧对噪声谱进行估计。

简单的谱减法实现包含以下步骤:

在这里插入图片描述

Berouti谱减法的实现

减小音乐噪声的方法是对噪声谱使用过减技术,同时对谱减后的负值设置一个下限,而不是将它们设为0,可以将其表示为:
在这里插入图片描述
其中alpha(大于等于1)为过减因子,它主要影响语音谱的失真程度。Beta(大于0小于1)是谱下限参数,可以控制残留噪声的多少以及音乐噪声的大小。在谱减法过程中,beta为一个固定值,而alpha根据当前帧的信噪比进行计算。Berouti谱减法包含以下步骤:
在这里插入图片描述

效果演示

原始语音信号波形
在这里插入图片描述
原始谱减法处理后信号波形
在这里插入图片描述
Berouti谱减法处理后信号波形
在这里插入图片描述
本文章部分知识材料源于网络

普减法仿真实现流程

在这里插入图片描述

我的代码示例

speechenhancespecsub.m

%-----读入语音文件-----%
%[speech, fs, nbits] = wavread('100-1100-00.wav');
[speech, fs] = audioread('wu.wav');
ainfo = audioinfo('wu.wav');
nbits = ainfo.BitsPerSample;
p = audioplayer(speech, fs, nbits);
%-----读入数据---------%
winsize = 256;      %窗长
n=0.04;            %噪声水平
size = length(speech);      %语音长度
numofwin = floor(size / winsize);   %帧数
ham = hamming(winsize)';         %产生汉明窗
hamwin = zeros(1, size);        %定义汉明窗长度
enhanced = zeros(1, size);      %定义增强语音长度
x = speech' + n * randn(1, size);    %产生带噪信号
noisy = n * randn(1, winsize);      %噪声估计
N = fft(noisy);                 %对噪声进行傅里叶变换
nmag = abs(N);                  %噪声功率谱
%---------------------分帧------------------%
for q = 1:2 * numofwin - 1
    %对带噪语音帧间重叠一半取值
    frame = x(1+(q - 1)*winsize / 2:winsize + (q - 1)*winsize / 2);
    %加窗
    hamwin(1 + (q - 1) * winsize / 2:winsize + (q - 1) * winsize / 2) = ...
        hamwin(1 + (q - 1) * winsize / 2:winsize + (q - 1) * winsize / 2) + ham;
    %对带噪语音傅里叶变换
    y = fft(frame.*ham);
    
    %带噪语音功率谱
    mag = abs(y);
    %带噪语音相位
    phase = angle(y);
    %-------------幅度谱减-----------------%
    for i = 1:winsize
        if mag(i) - nmag(i) > 0
            clean(i) = mag(i) - nmag(i);
        else
            clean(i) = 0;
        end
    end
    %------------在频域中重新合成语音---------------%
    spectral = clean.* exp(j * phase);
    %------------反傅里叶变换并重叠相加-----------%
    enhanced(1 + (q - 1)*winsize / 2:winsize + (q - 1) * winsize / 2) = ...
        enhanced(1 + (q - 1) *winsize / 2:winsize + (q - 1) * winsize / 2) + real(ifft(spectral));
end
%-----------------除去汉明窗引起的增益------------------%
for i = 1:size
    if hamwin(i) == 0
        enhanced(i) = 0;
    else
        enhanced(i) = enhanced(i) / hamwin(i);
    end
end
%---------------计算增强前后的信噪比-----------------%
SNR1 = 10 * log10(var(speech') / var(noisy));
SNR2 = 10 * log10(var(speech') / var(enhanced - speech'));  %增强语音信噪比
%输出带噪信号
filename = 'noisy.wav';
audiowrite(filename, x, fs);
%输出增强语音
filename2 = 'enhanced.wav';
audiowrite(filename2, enhanced, fs);
%------------------画波形-----------------%
figure(1);
subplot(3, 1, 1);
plot(speech');
title('原始语音波形');
xlabel('样点数');
ylabel('幅度');
axis([0 2.5*10^3 -0.1 0.1]);
subplot(3, 1, 2);
plot(x);
title('加噪语音波形');
xlabel('样点数');
ylabel('幅度');
axis([0 2.5*10^3 -0.1 0.1]);
subplot(3, 1, 3);
plot(enhanced);
title('增强语音波形');
xlabel('样点数');
ylabel('幅度');
axis([0 2.5*10^3 -0.1 0.1]);
 

我有两个音频文件,一个是wu.wav另一个是100-1100-00.wav

运行结果分别如下:
在这里插入图片描述
在这里插入图片描述

之后我会持续更新,如果喜欢我的文章,请记得一键三连哦,点赞关注收藏,你的每一个赞每一份关注每一次收藏都将是我前进路上的无限动力 !!!↖(▔▽▔)↗感谢支持!

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值