捋一捋相关性运算,以及DTD和NLP中的应用
捋一捋相关性运算,以及DTD和NLP中的应用
- 相关性和相干性,有木有傻傻分不清
- 相关性
- 数字信号的相关运算
- 同维度信号的相关理解
- 相关--互相关--相干
- 回声消除过程如何套用这些知识
- 相关性/相干性检测在DT中的应用
- 参考
相关性和相干性,有木有傻傻分不清
这是容易混淆的两个概念,对应于英语分别是 correlation 和 coherence,原来英语也这么相似。翻阅了很多资料,给出的定义和描述也大同小异,但真的想一针见血的区分出来这两个概念,以至于看papers的时候不要脑子混浆浆的,那还要从频域的角度思考,相关性-correlation 应该理解为一种更为广泛的信号相似度评价指标,而相干性-coherence更加注重在某一个频率上两个信号相位的关系,即恒定相位差的两个同频信号(分量)具备相关(相干)性,所指的范围更加狭义了一些。也不知道这么理解靠谱不,严不严谨。具体到数字信号处理领域的话,我们评价时域信号的相似程度,往往用相关性来指示,有正相关,负相关或者不相关的说法,到了时域谱分析的时候,通常用相干性来评价某个子带频率是否相干。
相关性
Correlation in Psychology: Meaning, Types, Examples & coefficient这篇文章讲述了何为相关性,以及正相关、负相关和不相关的二维理解,引用它的图如下:
那具体到数字信号处理怎么来理解呢?你可以从x轴和y轴分别抽取一些点,这些点随着另外一些点有共性的正向或者反向生长。那么分别从两个值域中提取这些信号如果排列成一个队列,能否发现一些相关性的规律呢?这就提出了相关性检测的问题。
数字信号的相关运算
数字信号的相关性比较是一种计算两个序列相似性的数学方法。这里引申出来自相关和互相关,那么定义x和y两个(复数)序列的相关运算如下:
r
x
y
(
L
)
=
∑
n
=
−
∞
∞
x
(
n
)
×
y
∗
(
n
+
L
)
r_{xy}(L)=\sum_{n=-\infty}^\infty x(n)\times y^*(n+L)
rxy(L)=n=−∞∑∞x(n)×y∗(n+L)自相关
r
x
x
(
L
)
=
∑
n
=
−
∞
∞
x
(
n
)
×
x
∗
(
n
+
L
)
r_{xx}(L)=\sum_{n=-\infty}^\infty x(n)\times x^*(n+L)
rxx(L)=n=−∞∑∞x(n)×x∗(n+L)
自相关函数比较明显的看出当L=0时,会出现相关峰,而对于有限长序列这更加确认无疑,互相关的一种解释:两个(序列)函数如果具有相同周期分量的时候,它的极大值能体现这种周期性的分量(数(3)相关运算和卷积运算)。
同维度信号的相关理解
同维度信号可以理解为两组向量,在学习高维向量的相似度判定-距离产生了,美还在吗以及正交性,从內积开始到施密特正交化的时候我们可以用向量的办法来理解这种相关性计算,即这种相关是多维向量的内积,或者说一个向量到另一个向量的投影,如果内积为零,说明两个向量正交,即一点也不相关,如果内积越大说明两个向量有着千丝万缕的联系。这种联系就是高维空间的embedding,一般用夹角来表征:
s
i
m
i
l
a
r
i
t
y
c
o
s
=
c
o
s
θ
=
a
⋅
b
∣
∣
a
∣
∣
⋅
∣
∣
b
∣
∣
=
∑
i
=
1
n
(
x
i
∗
y
i
)
∑
i
=
1
n
(
x
i
)
2
∗
∑
i
=
1
n
(
y
i
)
2
similarity_{cos}= cos\theta =\frac{a \cdot b}{||a|| \cdot ||b||}=\frac{\sum_{i=1}^n(x_i*y_i)}{\sqrt{\sum_{i=1}^n(x_i)^2}*\sqrt{\sum_{i=1}^n(y_i)^2}}
similaritycos=cosθ=∣∣a∣∣⋅∣∣b∣∣a⋅b=∑i=1n(xi)2∗∑i=1n(yi)2∑i=1n(xi∗yi)这种归一化的相关性使得结果有了清晰的值域,+1为PositiveCorrelation,-1为NegativeCorrelation,0为NoCorrelation(待考证)。相关性运算结果能给出一个比较清晰的映射了。
相关–互相关–相干
实际应用中,自相关是理想主义者,用不到。互相关才是实用主义者,任何两片雪花都不会一模一样,任何一个源信息,经过传播后都会发生变化,令人无法再看出他们是不是兄弟姐妹,或者谁先谁后。相关性的判断能最大可能的告诉你这组序列的前世今生有何关联。而互相关从理论上很难得出相似度为1的结果,一个不大不小的值往往很令人迷惑,这时候就可以跑到频域去看看相干性的一些特性,进而对参与比较的信号有更深的认识。直观的理解可以先看下一个网站4.3.9 Coherence and Correlation,引用上面的定义
Coherence measures the degree of linear dependency of two signals by testing for similar frequency components. If two signals correspond to each other perfectly at a given frequency, the magnitude of coherence is 1. If they are totally unrelated coherence will be 0.
Correlation is another measure of the relationship between two signals. A correlation coefficient is used to evaluate similarity. If two signals have a high degree of similarity, the magnitude of the computed correlation coefficient is large. If there is little or no linear relationship between two signals, the magnitude of the coefficient is small.
我觉得说的比较清晰。相关性计算可以理解为一种内积或者归一化的cos相似度判断,相干性的数学表达又是什么呢?我们跟随18. Cross-Spectra and Coherence的推导尝试了解 一下。一般通用的线性系统表达为: y m = ∑ − ∞ ∞ h k x m − k + n m y_m=\sum_{-\infty}^{\infty}h_k x_{m-k}+n_m ym=−∞∑∞hkxm−k+nm简化处理,我们只用傅里叶变换的方式把时域搬到频域来看看(卷积变相乘的性质), y ( ω ) = h ( ω ) x ( ω ) + n ( ω ) y(\omega)=h(\omega)x(\omega)+n(\omega) y(ω)=h(ω)x(ω)+n(ω)等式两测同时乘以 x ∗ ( ω ) x^*(\omega) x∗(ω),则有 y ( ω ) x ∗ ( ω ) = h ( ω ) x ( ω ) x ∗ ( ω ) + n ( ω ) x ∗ ( ω ) y(\omega)x^*(\omega)=h(\omega)x(\omega)x^*(\omega)+n(\omega)x^*(\omega) y(ω)x∗(ω)=h(ω)x(ω)x∗(ω)+n(ω)x∗(ω),定义 Φ y x ( ω ) = y ( ω ) x ∗ ( ω ) \Phi_{yx}(\omega)=y(\omega)x^*(\omega) Φyx(ω)=y(ω)x∗(ω), Φ x x ( ω ) = x ( ω ) x ∗ ( ω ) \Phi_{xx}(\omega)=x(\omega)x^*(\omega) Φxx(ω)=x(ω)x∗(ω),另外大胆假设噪声和输入信号的正交性,则可以忽略最后一项,则有: Φ y x ( ω ) = h ( ω ) Φ x x ( ω ) \Phi_{yx}(\omega)=h(\omega)\Phi_{xx}(\omega) Φyx(ω)=h(ω)Φxx(ω)这样我们得到频域响应函数的另外一种表达: h ( ω ) = Φ y x ( ω ) Φ x x ( ω ) h(\omega)=\frac{\Phi_{yx}(\omega)}{\Phi_{xx}(\omega)} h(ω)=Φxx(ω)Φyx(ω)如果此时定义 C y x ( ω ) = Φ y x ( ω ) Φ y y ( ω ) Φ x x ( ω ) C_{yx}(\omega)=\frac{\Phi_{yx}(\omega)}{\sqrt{\Phi_{yy}(\omega)\Phi_{xx}(\omega)}} Cyx(ω)=Φyy(ω)Φxx(ω)Φyx(ω)那么可以得到频响的另一种表达: h ( ω ) = C y x ( ω ) Φ y y ( ω ) Φ x x ( ω ) h(\omega)=C_{yx}(\omega)\sqrt{\frac{\Phi_{yy}(\omega)}{\Phi_{xx}(\omega)}} h(ω)=Cyx(ω)Φxx(ω)Φyy(ω)这个等式的开根号自功率谱是实数,所以频响的相位特征有 C y x C_{yx} Cyx所表达,我们定义这个 C y x C_{yx} Cyx为相干性指标。我们观察一下它的特性,令 y ( ω ) = h ( ω ) x ( ω ) + n ( ω ) y(\omega)=h(\omega)x(\omega)+n(\omega) y(ω)=h(ω)x(ω)+n(ω)等式两测同时乘以 y ∗ ( ω ) y^*(\omega) y∗(ω),可以推导出下面的式子: Φ y y ( ω ) = ∣ h ( ω ) ∣ 2 Φ x x ( ω ) + Φ n n ( ω ) \Phi_{yy}(\omega)=|h(\omega)|^2\Phi_{xx}(\omega)+\Phi_{nn}(\omega) Φyy(ω)=∣h(ω)∣2Φxx(ω)+Φnn(ω)替换 C y x C_{yx} Cyx,则有 Φ y y ( ω ) = ∣ C y x ( ω ) Φ y y ( ω ) Φ x x ( ω ) ∣ 2 Φ x x ( ω ) + Φ n n ( ω ) = ∣ C y x ∣ 2 Φ y y ( ω ) + Φ n n ( ω ) \Phi_{yy}(\omega)=|C_{yx}(\omega)\sqrt{\frac{\Phi_{yy}(\omega)}{\Phi_{xx}(\omega)}}|^2\Phi_{xx}(\omega)+\Phi_{nn}(\omega)=|C_{yx}|^2\Phi_{yy}(\omega)+\Phi_{nn}(\omega) Φyy(ω)=∣Cyx(ω)Φxx(ω)Φyy(ω)∣2Φxx(ω)+Φnn(ω)=∣Cyx∣2Φyy(ω)+Φnn(ω)换个写法: Φ y y ( ω ) ( 1 − ∣ C y x ∣ 2 ) = Φ n n ( ω ) \Phi_{yy}(\omega)(1-|C_{yx}|^2)=\Phi_{nn}(\omega) Φyy(ω)(1−∣Cyx∣2)=Φnn(ω), ( 1 − ∣ C y x ∣ 2 ) (1-|C_{yx}|^2) (1−∣Cyx∣2)定义为不相关功率,即如果 ∣ C y x ∣ = 1 |C_{yx}|=1 ∣Cyx∣=1, y n y_n yn可以有 x n x_n xn完美计算出来。即: Φ y y ( ω ) ( ∣ C y x ∣ 2 ) = ∣ h ( ω ) ∣ 2 Φ x x ( ω ) \Phi_{yy}(\omega)(|C_{yx}|^2)=|h(\omega)|^2\Phi_{xx}(\omega) Φyy(ω)(∣Cyx∣2)=∣h(ω)∣2Φxx(ω)以上是关于相干性的数学推导,需要提到的是这些参数大部分只是理想的计算,真正的系统都是测试观察获得的,所以带入到这些公式里,我们只能称作估计"estimation"。
回声消除过程如何套用这些知识
下图是一张典型的回声消除框架图
我们把它复制一份,通过DFT(STFT)过程变换到频域,那么左侧的内积,卷积,相关运算都可以理解为寻找相关性。右侧频域的谱估计过程可以理解为寻找相干性。不失一般性的胡说,且认为相关性是相干性的时域体验,相干性是相关性的频域分解吧。
相关性/相干性检测在DT中的应用
先回顾一下DoubleTalk算法,我找了一下百度通信中的自适应回波抵消以及相关技术及应用,觉得这段话写的很言简意赅,但这个网站有些…,只能截图发一下:
各种自适应滤波器总结 这个篇博客除了上述的两种方法,又总结了一种,即所谓的矢量夹角法,其实就是计算cos相似度, 这类有些频域相干性检测的意思了,可以对比着看看。国内的网文都比较经典(老旧),这段再找几个外部的文献看一看有什么花样能耍出来。由简入繁,先看一个比较简单的 A New Double-Talk Detection Algorithm Based on the Orthogonality Theorem,我看很多论文引用了它,而它的新奇思路是建立在滤波器收敛情况下,误差信号
e
(
n
)
e(n)
e(n)和输入序列
X
⃗
(
n
)
\vec{X}(n)
X(n),即
E
[
e
(
n
)
X
⃗
(
n
)
]
=
0
E[e(n)\vec{X}(n)]=0
E[e(n)X(n)]=0同样双讲时,近端信号,包括噪声信号,同样应该和远端输入信号正交,则有:
E
[
(
e
′
(
n
)
+
v
(
n
)
+
u
(
n
)
)
X
⃗
(
n
)
]
=
0
E[(e^{'}(n)+v(n)+u(n))\vec{X}(n)]=0
E[(e′(n)+v(n)+u(n))X(n)]=0这里
e
′
(
n
)
=
y
(
n
)
−
y
′
(
n
)
e^{'}(n)=y(n)-y^{'}(n)
e′(n)=y(n)−y′(n)基于这一系列假设,作者认为可以建立一种互相关运算,这种运算由于正交性的存在,不会对双讲敏感,而只对于回声路径的变化(有可能是双讲引入的?)敏感,所以这种检测不仅仅限于双讲检查,更加广义的涵盖了回声路径变化的鉴别,所以定义了这样一个相关检查过程:
P
e
2
(
n
)
=
λ
P
e
2
(
n
−
1
)
+
(
1
−
λ
)
e
2
(
n
)
P
i
2
(
n
)
=
λ
P
i
2
(
n
−
1
)
+
(
1
−
λ
)
x
2
(
n
−
i
)
P
e
,
i
(
n
)
=
λ
P
e
,
i
(
n
−
1
)
+
(
1
−
λ
)
e
(
n
)
x
(
n
−
i
)
C
i
(
n
)
=
P
e
,
i
(
n
)
P
e
(
n
)
P
i
(
n
)
\begin{aligned} P_e^2(n)&=\lambda P_e^2(n-1)+(1-\lambda)e^2(n) \\ P_i^2(n)&=\lambda P_i^2(n-1)+(1-\lambda)x^2(n-i) \\ P_{e,i}(n)&=\lambda P_{e,i}(n-1)+(1-\lambda)e(n)x(n-i) \\ C_i(n) &= \frac{P_{e,i}(n)}{P_e(n)P_i(n)} \end{aligned}
Pe2(n)Pi2(n)Pe,i(n)Ci(n)=λPe2(n−1)+(1−λ)e2(n)=λPi2(n−1)+(1−λ)x2(n−i)=λPe,i(n−1)+(1−λ)e(n)x(n−i)=Pe(n)Pi(n)Pe,i(n)
这最后一行的式子看着眼熟吧,有一个类似cos相似度的算法,不过它先平滑再计算确实有些不一样(虽然觉得怪)。上述四行是针对于一个采样点的,对一个block再取一个平均如下:
A
C
C
(
n
)
=
[
∑
i
=
0
N
−
1
∣
C
i
(
n
)
∣
]
N
ACC(n)=\frac{\bigg [ \sum_{i=0}^{N-1}|C_i(n)|\bigg ]}{N}
ACC(n)=N[∑i=0N−1∣Ci(n)∣]剩下的就是评估这个
A
C
C
ACC
ACC和设定门限和双讲来寻找规律了。这个是假设了时域的正交性来做的一个双讲判决,还有些新意。
再看一篇利用频域相干性的A Double-Talk Detector Based on Coherence,这篇在铺垫了一些预制条件后,提出了一种维纳滤波器的表达形式:
F
(
f
)
=
S
y
x
1
(
f
)
S
y
y
(
f
)
=
S
x
x
(
f
)
∣
H
(
f
)
∣
2
S
y
y
(
f
)
F(f)=\frac{S_{yx_1}(f)}{S_{yy}(f)}=\frac{S_{xx}(f)|H(f)|^2}{S_{yy}(f)}
F(f)=Syy(f)Syx1(f)=Syy(f)Sxx(f)∣H(f)∣2这里
S
y
x
(
f
)
=
y
(
f
)
x
∗
(
f
)
S_{yx}(f)=y(f)x^*(f)
Syx(f)=y(f)x∗(f),
S
x
x
(
f
)
=
x
(
f
)
x
∗
(
f
)
S_{xx}(f)=x(f)x^*(f)
Sxx(f)=x(f)x∗(f),用于估计近端没有加入本地声音的远端传递函数
X
1
(
f
)
=
X
(
f
)
H
(
f
)
X_1(f)=X(f)H(f)
X1(f)=X(f)H(f),而
y
(
n
)
=
x
1
(
n
)
+
v
(
n
)
y(n)=x_1(n)+v(n)
y(n)=x1(n)+v(n),当没有近端声音的时候,可以根据前面的推导认为
S
y
y
(
f
)
=
S
x
x
(
f
)
∣
H
(
f
)
∣
2
S_{yy}(f)=S_{xx}(f)|H(f)|^2
Syy(f)=Sxx(f)∣H(f)∣2,那么前式等于1了,意思没有双讲。接下来的推导有点懵,直接让
F
(
f
)
=
∣
S
y
x
(
f
)
∣
2
S
x
x
(
f
)
S
y
y
(
f
)
=
γ
y
x
(
f
)
F(f)=\frac{|S_{yx}(f)|^2}{S_{xx}(f)S_{yy}(f)}=\gamma_{yx}(f)
F(f)=Sxx(f)Syy(f)∣Syx(f)∣2=γyx(f)但结果我看懂了,这就是相干性的表达吗,然后设定一个
ξ
\xi
ξ作为判别式:
ξ
=
1
I
+
1
∑
i
=
0
I
γ
y
x
(
f
i
)
\xi=\frac{1}{I+1}\sum_{i=0}^I\gamma_{yx}(f_i)
ξ=I+11i=0∑Iγyx(fi)剩下的就是寻找一个门限
T
T
T,大于门限认为是单讲,小于门限认为是双讲(或者信道变化),为了提高频率频谱平滑度,还定义了所谓的多窗估计,升华了
S
^
y
x
(
f
)
=
1
K
∑
k
=
0
K
−
1
c
k
y
k
(
f
)
x
k
∗
(
f
)
\hat{S}_{yx}(f)=\frac{1}{K}\sum_{k=0}^{K-1}c_ky_k(f)x_k^*(f)
S^yx(f)=K1k=0∑K−1ckyk(f)xk∗(f)
S
^
x
x
(
f
)
=
1
K
∑
k
=
0
K
−
1
c
k
∣
x
k
(
f
)
∣
2
\hat{S}_{xx}(f)=\frac{1}{K}\sum_{k=0}^{K-1}c_k|x_k(f)|^2
S^xx(f)=K1k=0∑K−1ck∣xk(f)∣2可得出多窗版本的估计:
ξ
^
=
1
I
+
1
∑
i
=
0
I
γ
^
y
x
(
f
i
)
=
1
I
+
1
∑
i
=
0
I
∣
S
^
y
x
(
f
)
∣
2
S
^
x
x
(
f
)
S
^
y
y
(
f
)
\hat{\xi}=\frac{1}{I+1}\sum_{i=0}^I\hat\gamma_{yx}(f_i)=\frac{1}{I+1}\sum_{i=0}^I\frac{|\hat{S}_{yx}(f)|^2}{\hat{S}_{xx}(f)\hat{S}_{yy}(f)}
ξ^=I+11i=0∑Iγ^yx(fi)=I+11i=0∑IS^xx(f)S^yy(f)∣S^yx(f)∣2后面还有分布统计和复杂的推导,没太看懂,从这个式子其实可以看出就是基于相干性的平滑估计,最终远端和近端在没有双讲的相干性能够明辨于双讲时刻的相干性,那么这个算法就算成功了。
参考
Intuitive explanation of coherence
18. Cross-Spectra and Coherence
Introduction to Time Series Analysis. Lecture 23.