分位数噪声估计
将最近
L
L
L帧的语音能量进行排序,
∣
Y
(
k
,
t
0
)
∣
≤
∣
Y
(
k
,
t
1
)
∣
≤
.
.
.
≤
∣
Y
(
k
,
t
L
−
1
)
∣
|Y(k,t_0)| \leq |Y(k,t_1)| \leq ... \leq |Y(k,t_{L-1})|
∣Y(k,t0)∣≤∣Y(k,t1)∣≤...≤∣Y(k,tL−1)∣,q-分位的噪声估计为
N
(
w
,
l
)
=
∣
Y
(
w
,
t
⌊
q
L
⌋
)
∣
N(w,l) = |Y(w,t_{\left \lfloor qL \right \rfloor})|
N(w,l)=∣Y(w,t⌊qL⌋)∣
分位数噪声估计鲁棒性比较好,但需要对 L L L帧的数据进行排序,内存和计算量比较大,为此有人研究了自适应分位数噪声估计[1-3]。
webrtc自适应分位数噪声估计
自适应分位数噪声估计使用的是通用形式如下,
N
^
(
w
,
l
)
=
{
N
^
(
w
,
l
−
1
)
+
λ
δ
+
(
w
,
l
)
,
∣
Y
(
w
,
l
)
∣
≥
N
^
(
w
,
l
−
1
)
N
^
(
w
,
l
−
1
)
−
(
1
−
λ
)
δ
−
(
w
,
l
)
,
∣
Y
(
w
,
l
)
∣
<
N
^
(
w
,
l
−
1
)
\hat{N}(w,l) = \begin{cases} \hat{N}(w,l-1) + \lambda \delta_+(w,l), |Y(w,l)| \geq \hat{N}(w,l-1) \\ \hat{N}(w,l-1) - (1-\lambda) \delta_-(w,l), |Y(w,l)| < \hat{N}(w,l-1) \end{cases}
N^(w,l)={N^(w,l−1)+λδ+(w,l),∣Y(w,l)∣≥N^(w,l−1)N^(w,l−1)−(1−λ)δ−(w,l),∣Y(w,l)∣<N^(w,l−1)
基本思想就是如果当前能量比估计的噪声能量高则增加噪声能量,否则就减少噪声能量,那接下来的重点就是如何设计增加和减少的步长,参考文章[2-3]介绍一些估计的方法,具体可以看文章,这里主要说一下自己对webrtc的自适应分位数噪声估计方法的理解,不一定正确,欢迎指正。
1)对数域平滑
采用对数分位数噪声估计,在对数域进行平滑更新噪声能量,即,
l
o
g
(
N
^
(
w
,
l
)
)
=
{
l
o
g
(
N
^
(
w
,
l
−
1
)
)
+
λ
δ
+
(
w
,
l
)
,
l
o
g
(
∣
Y
(
w
,
l
)
∣
)
≥
l
o
g
(
N
^
(
w
,
l
−
1
)
)
l
o
g
(
N
^
(
w
,
l
−
1
)
)
−
(
1
−
λ
)
δ
−
(
w
,
l
)
,
l
o
g
(
∣
Y
(
w
,
l
)
∣
)
<
l
o
g
(
N
^
(
w
,
l
−
1
)
)
log(\hat{N}(w,l)) = \begin{cases} log(\hat{N}(w,l-1)) + \lambda \delta_+(w,l), log(|Y(w,l)|) \geq log(\hat{N}(w,l-1)) \\ log(\hat{N}(w,l-1)) - (1-\lambda) \delta_-(w,l), log(|Y(w,l)|) < log(\hat{N}(w,l-1)) \end{cases}
log(N^(w,l))={log(N^(w,l−1))+λδ+(w,l),log(∣Y(w,l)∣)≥log(N^(w,l−1))log(N^(w,l−1))−(1−λ)δ−(w,l),log(∣Y(w,l)∣)<log(N^(w,l−1))
2)变步长
d
e
n
s
i
t
y
(
w
,
l
)
=
{
c
o
u
n
t
∗
d
e
n
s
i
t
y
(
w
,
l
)
+
1
/
(
2
d
)
c
o
u
n
t
+
1
,
∣
l
o
g
(
N
^
(
w
,
l
−
1
)
)
−
l
o
g
(
∣
Y
(
w
,
l
)
∣
)
∣
<
d
d
e
n
s
i
t
y
(
w
,
l
−
1
)
,
o
t
h
e
r
s
density(w,l)=\begin{cases} \frac{count*density(w,l) + 1/(2d)}{count + 1} , |log(\hat{N}(w,l-1)) - log(|Y(w,l)|)| < d \\ density(w,l-1),others \end{cases}
density(w,l)={count+1count∗density(w,l)+1/(2d),∣log(N^(w,l−1))−log(∣Y(w,l)∣)∣<ddensity(w,l−1),others
概率密度
d
e
n
s
i
t
y
(
w
,
l
)
density(w,l)
density(w,l)的更新公式如上式,其中阈值
d
=
0.01
d=0.01
d=0.01,如果当前帧的对数能量和噪声对数能量比较接近,绝对差距小于阈值
d
d
d,则将当前的密度与
1
/
(
2
d
)
=
50
1/(2d)=50
1/(2d)=50 进行加权平均(增加当前的概率密度函数的数值),否则不更新。
δ
−
(
w
,
l
)
=
δ
+
(
w
,
l
)
=
{
40
c
o
u
n
t
,
d
e
n
s
i
t
y
(
w
,
l
)
<
1
40
c
o
u
n
t
∗
d
e
n
s
i
t
y
(
w
,
l
)
,
o
t
h
e
r
s
\delta_-(w,l) = \delta_+(w,l)=\begin{cases} \frac{40}{count} , density(w,l)< 1 \\ \frac{40}{count*density(w,l)} ,others \end{cases}
δ−(w,l)=δ+(w,l)={count40,density(w,l)<1count∗density(w,l)40,others
步长的更新公式如上式,当概率密度达到阈值1后则减少步长,我的理解是在密度达到阈值后,表示在目标值附近,进行精细化搜索。
其中
c
o
u
n
t
count
count是从1到200循环计数的,当计数到200则更新噪声估计的值,否则不更新。200是个超参数,至于为什么从小计数到大,我的理解是当
c
o
u
n
t
count
count数值小时,步长大,当
c
o
u
n
t
count
count数值大时,步长小,类似于算法收敛一样,先进行大范围搜索,当快达到目标时减少收敛速度,搜索更准确。
同时webrtc设置了三个conut的初始值,同时更新,谁先达到200使用谁的结果,增加更新速度,相当于每200/3次更新一次结果。
参考
【1】Stahl V, Fischer A, Bippus R. Quantile based noise estimation for spectral subtraction and Wiener filtering[C]//2000 IEEE International Conference on Acoustics, Speech, and Signal Processing. Proceedings (Cat. No. 00CH37100). IEEE, 2000, 3: 1875-1878.
【2】Tiwari N, Pandey P C. Speech Enhancement Using Noise Estimation With Dynamic Quantile Tracking[J]. IEEE/ACM Transactions on Audio, Speech, and Language Processing, 2019, 27(12): 2301-2312.
【3】Hammer H L, Yazidi A, Rue H. A new quantile tracking algorithm using a generalized exponentially weighted average of observations[J]. Applied Intelligence, 2019, 49(4): 1406-1420.