噪声估计之MCRA

M C R A MCRA MCRA1,全称为最小值控制的递归平均,是cohen提出的一种常用的噪声估计方法,处理流程框图 2 如下
在这里插入图片描述
从命名上以及以上框图能看出来着个方法主要包含两个部分,噪声谱递归平均和最小值控制(跟踪),下面分别看看这两个部分

1. 噪声谱估计(递归平均)

还是老套路先定义信号表达式
Y ( k , ℓ ) = ∑ n = 0 N − 1 y ( n + ℓ M ) h ( n ) e − j 2 π N n k (1) Y(k, \ell)=\sum_{n=0}^{N-1} y(n+\ell M) h(n) e^{-j \frac{2 \pi}{N} n k}\tag1 Y(k,)=n=0N1y(n+M)h(n)ejN2πnk(1)

k k k:frequency bin index

ℓ \ell :time frame index

h h h:analysis window of size N

M M M:frame update step in time

定义两个假设,在第 ℓ \ell 帧第 k k k 个频率点上语音不存在和语音存在 H 0 ( k , ℓ ) , H 1 ( k , ℓ ) H_0(k,\ell),H_1(k,\ell) H0(k,),H1(k,)概率如下:
H 0 ( k , ℓ ) : Y ( k , ℓ ) = D ( k , ℓ ) H 1 ( k , ℓ ) : Y ( k , ℓ ) = X ( k , ℓ ) + D ( k , ℓ ) (2) \begin{aligned} &H_0(k,\ell):Y(k,\ell)=D(k,\ell)\\ &H_1(k,\ell):Y(k,\ell)=X(k,\ell)+D(k,\ell)\end{aligned}\tag2 H0(k,):Y(k,)=D(k,)H1(k,):Y(k,)=X(k,)+D(k,)(2)
其中 X ( k , ℓ ) 和 D ( k , ℓ ) X(k,\ell)和D(k,\ell) X(k,)D(k,)分别为纯净语音和噪声的 S T F T STFT STFT表示

定义 λ d ( k , ℓ ) = E [ ∣ D ( k , ℓ ) ∣ 2 ] \lambda_d(k,\ell)=E[\begin{vmatrix} D(k,\ell) \end{vmatrix}^2] λd(k,)=E[D(k,)2] k 帧 、 ℓ 子 带 k帧、\ell子带 k处噪声谱,那么就可以在无语音段用一个时间维度上的递归平滑来更新噪声,用公式表示如下
H 0 ′ ( k , ℓ ) : λ ^ d ( k , ℓ + 1 ) = α d λ ^ d ( k , ℓ ) + ( 1 − α d ) ∣ Y ( k , ℓ ) ∣ 2 H 1 ′ ( k , ℓ ) : λ ^ d ( k , ℓ + 1 ) = λ ^ d ( k , ℓ ) (3) \begin{array}{l}{H_{0}^{\prime}(k, \ell) : \hat{\lambda}_{d}(k, \ell+1)=\alpha_{d} \hat{\lambda}_{d}(k, \ell)+\left(1-\alpha_{d}\right)|Y(k, \ell)|^{2}} \\ {H_{1}^{\prime}(k, \ell) : \hat{\lambda}_{d}(k, \ell+1)=\hat{\lambda}_{d}(k, \ell)}\end{array}\tag3 H0(k,):λ^d(k,+1)=αdλ^d(k,)+(1αd)Y(k,)2H1(k,):λ^d(k,+1)=λ^d(k,)(3)
其中 α d ( 0 < α d < 1 ) \alpha_d(0<\alpha_d<1) αd(0<αd<1)为平滑因子

p ′ ≜ P ( H 1 ′ ∣ Y ( k , ℓ ) ) p^{\prime} \triangleq P(H^{\prime}_1|Y(k,\ell)) pP(H1Y(k,))表示语音存在的条件概率,则(3)式可以写成如下形式
λ ~ d ( k , ℓ + 1 ) = α ~ d ( k , ℓ ) λ ^ d ( k , ℓ ) + [ 1 − α ~ d ( k , ℓ ) ] ∣ Y ( k , ℓ ) ∣ 2 (4) \tilde\lambda_d(k,\ell+1)=\tilde{\alpha}_{d}(k, \ell) \hat{\lambda}_{d}(k, \ell)+\left[1-\tilde{\alpha}_{d}(k, \ell)\right]|Y(k, \ell)|^{2}\tag4 λ~d(k,+1)=α~d(k,)λ^d(k,)+[1α~d(k,)]Y(k,)2(4)
其中 α ~ d ( k , ℓ ) \tilde\alpha_d(k,\ell) α~d(k,)为时变的平滑参数
α ~ d ( k , ℓ ) ≜ α d + ( 1 − α d ) p ′ ( k , ℓ ) ​ (5) \tilde\alpha_d(k,\ell)\triangleq \alpha_d+(1-\alpha_d)p^{\prime}(k,\ell)​\tag5 α~d(k,)αd+(1αd)p(k,)(5)
上面的(4)、(5)两式就是递归平均更新噪声谱的核心内容,现在的问题就是要求出时变参数 α ~ d ( k , ℓ ) \tilde\alpha_d(k,\ell) α~d(k,),也就是要求出语音存在概率这个关键变量 p ′ ( k , ℓ ) p^{\prime}(k,\ell) p(k,)

2. 语音存在概率(最小值控制)

2.1. 最小值跟踪

​ 语音存在概率由带噪语音当前的能量和指定长度窗内谱最小值的比值来计算,先对带噪语音谱分别做时间、频率两个维度上的平滑

频率平滑:
S f ( k , ℓ ) = ∑ i = − w w b ( i ) ∣ Y ( k − i , ℓ ) ∣ 2 (5) S_{f}(k, \ell)=\sum_{i=-w}^{w} b(i)|Y(k-i, \ell)|^{2}\tag5 Sf(k,)=i=wwb(i)Y(ki,)2(5)
时间平滑:
S ( k , ℓ ) = α s ( k , ℓ ) S ( k , ℓ − 1 ) + S f ( k , ℓ ) (6) S(k, \ell)=\alpha_s(k,\ell)S(k,\ell-1)+S_f(k,\ell)\tag6 S(k,)=αs(k,)S(k,1)+Sf(k,)(6)
其中 α s ( 0 < α s < 1 ) \alpha_s(0<\alpha_s<1) αs(0<αs<1)为平滑常数

谱最小值 S m i n ( k , ℓ ) S_{min}(k,\ell) Smin(k,)搜索过程如下:

初始化:

S m i n ( k , ℓ ) = S ( k , 0 ) S_{min}(k,\ell)=S(k,0) Smin(k,)=S(k,0)

S t m p ( k , ℓ ) = S ( k , 0 ) S_{tmp}(k,\ell)=S(k,0) Stmp(k,)=S(k,0)

然后按样本点(频谱)比较
S m i n ( k , ℓ ) = m i n { S m i n ( k , ℓ − 1 ) , S ( k , ℓ ) } S t m p ( k , ℓ ) = m i n { S t m p ( k , ℓ − 1 ) , S ( k , ℓ ) } (7) S_{min}(k,\ell)=min\begin{Bmatrix}S_{min}(k,\ell-1),S(k,\ell)\end{Bmatrix}\\S_{tmp}(k,\ell)=min\begin{Bmatrix}S_{tmp}(k,\ell-1),S(k,\ell)\end{Bmatrix}\tag7 Smin(k,)=min{Smin(k,1),S(k,)}Stmp(k,)=min{Stmp(k,1),S(k,)}(7)
这个时候 S m i n 和 S t m p S_{min}和S_{tmp} SminStmp都还是相等的,当比较了L帧(mod( ℓ \ell ,L)=0)后
S m i n ( k , ℓ ) = m i n { S t m p ( k , ℓ − 1 ) , S ( k , ℓ ) } S t m p ( k , ℓ ) = S ( k , ℓ ) (8) \begin{aligned}&S_{min}(k,\ell)=min\begin{Bmatrix}S_{tmp}(k,\ell-1),S(k,\ell)\end{Bmatrix}\\&S_{tmp}(k,\ell)=S(k,\ell)\end{aligned}\tag8 Smin(k,)=min{Stmp(k,1),S(k,)}Stmp(k,)=S(k,)(8)
重复(7)、(8)过程得到最小值谱,其中,搜索窗的长度L会影响到噪声的跟踪速度,一般按照经验选0.5s~1.5s左右。

2.2. 语音存在概率计算

​ 定义带噪语音能量与局部最小能量与比 S r ( k , ℓ ) S_r(k,\ell) Sr(k,)如下
S r ( k , ℓ ) ≜ S ( k , l ) S m i n ( k , ℓ ) (9) S_r(k,\ell)\triangleq\frac{S(k,l)}{S_{min}(k,\ell)}\tag9 Sr(k,)Smin(k,)S(k,l)(9)
定义二值 I ( k , ℓ ) I(k,\ell) I(k,)如下
I ( k , ℓ ) = { 1 , S r ( k , ℓ ) > δ 0 , o t h e r w i s e (10) I(k,\ell)=\left\{\begin{matrix}\begin{aligned}&1,S_r(k,\ell)>\delta\\&0,otherwise\end{aligned}\end{matrix}\right.\tag{10} I(k,)={1,Sr(k,)>δ0,otherwise(10)
最后,语音存在概率更新如下:
p ′ ^ ( k , ℓ ) = α p p ′ ^ ( k , ℓ − 1 ) + ( 1 − α p ) I ( k , ℓ ) (11) \hat{p^{\prime}}(k, \ell)=\alpha_{p} \hat{p^{\prime}}(k, \ell-1)+\left(1-\alpha_{p}\right) I(k, \ell)\tag{11} p^(k,)=αpp^(k,1)+(1αp)I(k,)(11)
其中 δ 为 预 先 设 定 的 门 限 , α p ( 0 < α p < 1 ) \delta为预先设定的门限,\alpha_p(0<\alpha_p<1) δαp(0<αp<1)为平滑常数

3.code & result

整个过程比较简单,参照上述过程编写程序估计噪音,结合谱减法降噪效果如下
在这里插入图片描述
在这里插入图片描述
对比处理前后可以看到背景噪声有了明显的消除,当然因为谱减法的原因引入了较多的音乐噪声,这个时候还可以尝试其它的谱修改方法如维纳滤波或者OMLSA
References:


  1. Cohen, I., & Berdugo, B. (2002). Noise estimation by minima controlled recursive averaging for robust speech enhancement. IEEE Signal Processing Letters, 9(1), 12–15 ↩︎

  2. Cohen, I., & Berdugo, B. (2001). Speech enhancement for non-stationary noise environments. Signal Processing, 81(11), 2403–2418 ↩︎

  • 4
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
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`输出。该代码中的块长度、循环滤波器阶数、加权系数等参数可以根据具体应用场景进行调整。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值