基本谱减法去噪

      在语音去噪中最常用的方法是谱减法,谱减法是一种发展较早且应用较为成熟的语音去噪算法,该算法利用加性噪声与语音不相关的特点,在假设噪声是统计平稳的前提下,用无语音间隙测算到的噪声频谱估计值取代有语音期间噪声的频谱,与含噪语音频谱相减,从而获得语音频谱的估计值。谱减法具有算法简单、运算量小的特点,便于实现快速处理,往往能够获得较高的输出信噪比,所以被广泛采用。该算法经典形式的不足之处是处理后会产生具有一定节奏性起伏、听上去类似音乐的“音乐噪声”

转换到频域后,这些峰值听起来就像帧与帧之间频率随机变化的多频音,这种情况在清音段尤其明显,这种由于半波整流引起的“噪声”被称为“音乐噪声”。从根本上,通常导致音乐噪声的原因主要有:
(1)对谱减算法中的负数部分进行了非线性处理
(2)对噪声谱的估计不准
(3)抑制函数(增益函数)具有较大的可变性


       

       推荐几篇关于谱减法介绍好的博文:

       基于谱减法的声音去噪:http://blog.csdn.net/xiahouzuoxin/article/details/41124245

       谱减法语音降噪原理:http://blog.csdn.net/leixiaohua1020/article/details/47276353

       

       下面介绍一种经典谱减法:

      

       设语音信号的时间序列为x(n),加窗分帧处理后可以得到第i帧语音信号为Xi(m),帧长为N。任何一帧语音信号Xi(m)做DFT(谱减法就要变换到频域)后为


      接着,我们需要得到两个分量用于后续的计算一个是幅值,一个是相位角。其中幅值就是|Xi(k)|,相位角为


      在谱减中要把这两组数都保存。

      已知前导无话段(噪声段)时长为IS,对应的帧数为NIS,可以求出该噪声段的平均能量值为


       接下来就需要用原始语音减去这个噪声成分了,其计算过程如下:

 

       式中,a和b是两个常数,a为过减因子,b为增益补偿因子。

       此时我们已经得到了在频域干净了语音,只需要经过快速傅里叶逆变换就可以得到时域的语音序列。此时这里的相位角就可以发挥作用了,由于语音信号相位不灵敏的特征,可以直接将相位角信息用到谱减后的信号中。

       其流程如图所示:

   


     消噪后的语音有明显的“音乐噪声”,增强过减因子a数值,有时能减少“音乐噪声”,但是过大时也会使波形失​真,因此同时要选用一个折中的值。又由于在语音信号叠加随机噪声,每一次叠加上的随机噪声都是不相同的。

参考文献:1.《MATLAB在语音信号分析与合成中的应用》 宋知用  编著

                2.http://blog.csdn.net/tbl1234567/article/details/51841841
  • 13
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MATLAB实现谱减法去噪信噪比的步骤如下: 1. 获取输入信号的噪声能量:首先,通过计算输入信号的功率谱密度或能量谱密度来获取信号的噪声能量。 2. 获取估计信号的能量:使用谱减法算法对输入信号进行处理,得到估计信号。然后,计算估计信号的功率谱密度或能量谱密度,以获取估计信号的能量。 3. 计算信噪比:将估计信号的能量除以噪声能量,得到信噪比。 MATLAB中可以使用以下函数来实现以上步骤: - `pwelch`函数用于计算信号的功率谱密度或能量谱密度。 - `db2pow`函数用于将分贝单位的功率转换为线性单位的功率。 - `mag2db`函数用于将线性单位的功率转换为分贝单位的功率。 具体的MATLAB代码如下所示: ```matlab % 输入信号 input_signal = % 输入信号数据 % 噪声信号 noise_signal = % 噪声信号数据 % 采样率 fs = % 采样率 % 计算输入信号的功率谱密度 [P_input, ~] = pwelch(input_signal, [], [], [], fs); % 计算噪声信号的功率谱密度 [P_noise, ~] = pwelch(noise_signal, [], [], [], fs); % 计算输入信号的噪声能量 noise_energy = sum(P_noise); % 使用谱减法算法对输入信号进行处理,得到估计信号 % 估计信号的处理过程略 % 计算估计信号的功率谱密度 [P_estimate, ~] = pwelch(estimate_signal, [], [], [], fs); % 计算估计信号的能量 estimate_energy = sum(P_estimate); % 计算信噪比 SNR = estimate_energy / noise_energy; % 打印信噪比结果 fprintf('信噪比:%.2f dB\n', mag2db(SNR)); ``` 以上代码中的`input_signal`和`noise_signal`为输入信号和噪声信号的数据,`fs`为采样率。其中,`pwelch`函数的输入参数可根据具体情况进行设置,例如,窗长、重叠等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值