基于MCRA的语音噪音估计

Minima Controlled Recursive Averaging 噪音估计(MCRA)

MCRA是由Israel Cohen在论文中提出的最小值追踪递归平均法,本文根据此论文总结如何来评估带噪语音中噪音部分,从而可以来做噪音消除任务。

输入信号的时域表示

带噪输入信号公式
y ( n ) = x ( n ) + d ( n ) y(n) = x(n) + d(n) y(n)=x(n)+d(n)
x(n):语音
d(n):噪音
y(n):语音+噪音

输入信号频域表示STFT

k:频域的频率index
l:时域信号的帧index
M:时域信号的帧移
h(n): 窗函数,窗长为N
Y ( k , l ) = ∑ n = 0 N − 1 y ( n + l M ) h ( n ) e − j ( 2 π / N ) n k [ 1 ] Y(k,l) = \sum\limits_{n = 0}^{N - 1} {y(n + lM)h(n){e^{ - j(2\pi /N)nk}}} \left[ 1 \right] Y(k,l)=n=0N1y(n+lM)h(n)ej(2π/N)nk[1]

频域假设

现在假设H0(k,l) 表示语音不存在,H1(k,l) 表示语音存在,那么这两种情况下可以如下表示 (X(k,l)频域语音,D(k,l)频域噪音)
H 0 ( k , l ) : Y ( k , l ) = D ( k , l ) {H_0}(k,l):Y(k,l) = D(k,l) H0(k,l):Y(k,l)=D(k,l)
H 1 ( k , l ) : Y ( k , l ) = X ( k , l ) + D ( k , l ) [ 2 ] {H_1}(k,l):Y(k,l) = X(k,l) + D(k,l)\left[ 2 \right] H1(k,l):Y(k,l)=X(k,l)+D(k,l)[2]

λ d {\lambda _d} λd定义, a d {a_d} ad是一个平滑因子, 范围在(0,1)之间取值,表示l+1帧的噪音数据和上一帧数据的相关程度;使用 λ d = E [ ( D ( k , l ) 2 ] {\lambda _d} = E\left[ {{{\left( {D(k,l} \right)}^2}} \right] λd=E[(D(k,l)2] 来表示噪音能量值,那么公式2就可以变化成公式3
H 0 ( k , l ) : λ d ( k , l + 1 ) = a d λ d ( k , l ) + ( 1 − a d ) [ Y ( k , l ] 2 {H_0}(k,l):{\lambda _d}(k,l + 1) = {a_d}{\lambda _d}(k,l) + (1 - {a_d}){\left[ {Y(k,l} \right]^2} H0(k,l):λd(k,l+1)=adλd(k,l)+(1ad)[Y(k,l]2
H 1 ( k , l ) : λ d ( k , l + 1 ) = λ d ( k , l ) [ 3 ] {H_1}(k,l):{\lambda _d}(k,l + 1) = {\lambda _d}(k,l)\left[ 3 \right] H1(k,l):λd(k,l+1)=λd(k,l)[3]

语音存在概率假设 P ( k , l ) P(k,l) P(k,l)

语音存在 P ( k , l ) P(k,l) P(k,l) λ d ( k , l + 1 ) = λ d ( k , l ) P ( k , l ) {\lambda _d}(k,l + 1) = {\lambda _d}(k,l)P(k,l) λd(k,l+1)=λd(k,l)P(k,l)
语音不存在 1 − P ( k , l ) 1 - P(k,l) 1P(k,l) λ d ( k , l + 1 ) = [ a d λ d ( k , l ) + ( 1 − a d ) [ Y ( k , l ] 2 ] ( 1 − P ( k , l ) ) {\lambda _d}(k,l + 1) = \left[ {{a_d}{\lambda _d}(k,l) + (1 - {a_d}){{\left[ {Y(k,l} \right]}^2}} \right](1 - P(k,l)) λd(k,l+1)=[adλd(k,l)+(1ad)[Y(k,l]2](1P(k,l))
两者相加得到: λ d ( k , l + 1 ) = [ a d λ d ( k , l ) + ( 1 − a d ) [ Y ( k , l ] 2 ] ( 1 − P ( k , l ) ) + λ d ( k , l ) P ( k , l ) [ 4 ] {\lambda _d}(k,l + 1) = \left[ {{a_d}{\lambda _d}(k,l) + (1 - {a_d}){{\left[ {Y(k,l} \right]}^2}} \right](1 - P(k,l)) + {\lambda _d}(k,l)P(k,l)\left[ 4\right] λd(k,l+1)=[adλd(k,l)+(1ad)[Y(k,l]2](1P(k,l))+λd(k,l)P(k,l)[4]

λ d ( k , l + 1 ) = [ a d λ d ( k , l ) + ( 1 − a d ) [ Y ( k , l ] 2 ] ( 1 − P ( k , l ) ) + λ d ( k , l ) P ( k , l ) = a ′ d ( k , l ) λ d ( k , l ) + ( 1 − a ′ d ( k , l ) ) [ Y ( k , l ] 2 {\lambda _d}(k,l + 1) = \left[ {{a_d}{\lambda _d}(k,l) + (1 - {a_d}){{\left[ {Y(k,l} \right]}^2}} \right](1 - P(k,l)) + {\lambda _d}(k,l)P(k,l) = {{a'}_d}(k,l){\lambda _d}(k,l) + (1 - {{a'}_d}(k,l)){\left[ {Y(k,l} \right]^2} λd(k,l+1)=[adλd(k,l)+(1ad)[Y(k,l]2](1P(k,l))+λd(k,l)P(k,l)=ad(k,l)λd(k,l)+(1ad(k,l))[Y(k,l]2

a ′ d ( k , l ) = a d + ( 1 − a d ) P ( k , l ) [ 5 ] {{a'}_d}(k,l) = {a_d} + (1 - {a_d})P(k,l)\left[ 5 \right] ad(k,l)=ad+(1ad)P(k,l)[5]

能量计算

当前帧的频域能量等于 上一帧能量乘以权重 a s {a_s} as + 当前帧能量* ( 1 − a s ) (1 - {a_s}) (1as)
S ( k , l ) = a s S ( k , l − 1 ) + ( 1 − a s ) S ( k , l ) [ 6 ] S(k,l ) = {a_s}S(k,l-1) + (1 - {a_s})S(k,l )\left[ 6\right] S(k,l)=asS(k,l1)+(1as)S(k,l)[6]

局部最小值追踪

现在需要找到每L帧中的最小能量,公式如下

在这里插入图片描述

如何判断语音是否存在

根据当前帧的能量和上一步搜索到的最小能量的比值,这个比值的门限是 δ \delta δ,参考论文取值为5.0
S ( k , l ) S min ⁡ ( k , l ) > δ [ 12 ] \frac{{S(k,l)}}{{{S_{\min }}(k,l)}} > \delta\left[ 12\right] Smin(k,l)S(k,l)>δ[12]

计算 P ( k , l ) P(k,l) P(k,l)

这里又加入了一个平滑因子,来计算 P ( k , l ) P(k,l) P(k,l),也就是说当前帧的语音存在概率和上一帧语音存在的概率是有一个权重 a p {a_p} ap
P ( k , l ) = a p P ( k , l − 1 ) + ( 1 − a p ) I ( k , l ) [ 13 ] P(k,l ) = {a_p}P(k,l-1) + (1 - {a_p})I(k,l )\left[ 13\right] P(k,l)=apP(k,l1)+(1ap)I(k,l)[13]

计算流程总结

参数列表

参数意义
N频域点数512
M时域每帧大小128
L最小值追踪窗125
a d {a_d} ad噪音频谱平滑因子0.95
a s {a_s} as频谱能量平滑因子0.8
a p {a_p} ap语音存在概率平滑因子0.2
δ \delta δ比值门限值,用来确定语音是否存在5.0

计算流程图
在这里插入图片描述

参考文献

Noise Estimation by Minima Controlled Recursive Averaging for Robust Speech Enhancement 【Israel Cohen, Member, IEEE, and Baruch Berdugo】

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MCRA算法是一种基于循环滤波器的噪声估计算法,主要用于语音信号处理领域。以下是一个简单的Verilog代码实现: ```verilog module mcra_noise_estimation( input signed [15:0] audio_in, input clk, input rst, output reg signed [15:0] noise_out ); parameter L = 128; // 块长度 parameter N = 4; // 循环滤波器阶数 parameter alpha = 0.98; // 短时平均能量加权系数 parameter beta = 0.9995; // 长时平均能量加权系数 reg signed [15:0] audio_buf [L-1:0]; reg signed [15:0] short_energy; reg signed [15:0] long_energy; reg signed [15:0] noise_energy; reg signed [15:0] x [N-1:0]; reg signed [15:0] y [N-1:0]; reg signed [15:0] b [N-1:0]; reg signed [15:0] a [N-1:0]; integer i, j; always @(posedge clk) begin if (rst) begin for (i = 0; i < L; i = i + 1) begin audio_buf[i] <= 0; end short_energy <= 0; long_energy <= 0; noise_energy <= 0; for (i = 0; i < N; i = i + 1) begin x[i] <= 0; y[i] <= 0; b[i] <= 0; a[i] <= 0; end end else begin // 更新循环滤波器系数 for (i = 0; i < N; i = i + 1) begin b[i] <= (i == 0) ? 1 : (alpha**i - alpha**(i-1)); a[i] <= (i == 0) ? 1 : (2*alpha*cos(2*PI*i/N) - alpha**2); end // 更新短时平均能量 short_energy <= (short_energy * alpha + (1 - alpha) * audio_in ** 2); // 更新长时平均能量 long_energy <= (long_energy * beta + (1 - beta) * audio_in ** 2); // 计算噪声能量估计值 noise_energy <= (short_energy - long_energy > 0) ? (short_energy - long_energy) : 0; // 更新循环滤波器延时线 for (i = N-2; i >= 0; i = i - 1) begin x[i+1] <= x[i]; y[i+1] <= y[i]; end x[0] <= audio_in; for (i = 0; i < N; i = i + 1) begin y[0] <= y[0] + b[i] * x[i] - a[i] * y[i]; end // 更新噪声能量估计值 noise_out <= y[0] ** 2 - noise_energy; // 更新音频数据缓存 for (i = L-2; i >= 0; i = i - 1) begin audio_buf[i+1] <= audio_buf[i]; end audio_buf[0] <= audio_in; end end endmodule ``` 该Verilog代码实现了MCRA算法中的核心部分,具体实现原理请参考相关文献。在使用时,需要将音频信号作为`audio_in`输入,时钟信号作为`clk`输入,复位信号作为`rst`输入,噪声能量估计结果作为`noise_out`输出。该代码中的块长度、循环滤波器阶数、加权系数等参数可以根据具体应用场景进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值