语音增强———字典学习介绍

article/2025/10/14 17:04:04

语音增强--------------字典学习

字典学习就是用较少的特征(原子)来表示信号,那么信号的多个特征组合就相当于多个原子组成的字典,那么信号就可以用字典中少量的原子进行表示。信号在字典下的表示系数越系数,那么重构信号的质量就越高。常见的字典学习分为:固定字典学习和自适应字典学习,前者没有利用信号的有用信息,所以实际中一般使用的是自适应字典学习

稀疏表示

对于信号 x ( x ∈ R m × 1 ) \mathbf{x}\left( \mathbf{x}\in {{\mathbb{R}}^{m\times 1}} \right) x(xRm×1)来说,其稀疏表示模型为
x = D c + e \mathbf{x=Dc+e} x=Dc+e
其中 D ∈ R m × n \mathbf{D}\in {{\mathbb{R}}^{m\times n}} DRm×n表示原子个数为 n n n,每个原子包含有 m m m个元素的字典,一般取冗余字典,即 n > m n>m n>m c ∈ R n × 1 \mathbf{c}\in {{\mathbb{R}}^{n\times 1}} cRn×1为稀疏表示系数, e ∈ R m × 1 \mathbf{e}\in {{\mathbb{R}}^{m\times 1}} eRm×1为稀疏表示误差,由于字典的冗余性,系数 c \mathbf{c} c不唯一,一般要求解的是最稀疏的 c \mathbf{c} c,求解的过程可以表示为
c ∗ = arg ⁡ min ⁡ c ∥ x − D c ∥ 2 s . t . f ( c ) ≤ q {{\mathbf{c}}^{*}}=\arg \underset{\mathbf{c}}{\mathop{\min }}\,{{\left\| \mathbf{x}-\mathbf{Dc} \right\|}_{2}}\ \ \ \ s.t.\ \ f\left( \mathbf{c} \right)\le q c=argcminxDc2    s.t.  f(c)q
或者
c ∗ = arg ⁡ min ⁡ c f ( c ) s . t . ∥ x − D c ∥ 2 ≤ ξ {{\mathbf{c}}^{*}}=\arg \underset{\mathbf{c}}{\mathop{\min }}\,f\left( \mathbf{c} \right)\ \ \ \ s.t.\ \ {{\left\| \mathbf{x}-\mathbf{Dc} \right\|}_{2}}\le \xi c=argcminf(c)    s.t.  xDc2ξ
其中, q q q是稀疏表示系数 c \mathbf{c} c的稀疏度约束, ξ \xi ξ是设置的稀疏表示误差阈值, f ( c ) f\left( \mathbf{c} \right) f(c)是对向量 c \mathbf{c} c的稀疏性度量函数,常用的有 l 0 {{l}_{0}} l0 l 1 {{l}_{1}} l1范数。当使用 l 0 {{l}_{0}} l0范数时,目标函数为非凸问题,相应的稀疏表示方法为MP算法和OMP算法。当使用 l 1 {{l}_{1}} l1范数时, 常用的稀疏表示方法有BP算法和LARS算法。

OMP算法

由于求解 l 0 {{l}_{0}} l0范数是NP-Hard的,所以经常采用贪婪追踪的方法来解决这类问题。OMP算法是在MP算法的基础上改进来的,由于MP算法在迭代的时候不能保证信号或者误差在已选择的原子上的投影是正交的,导致每步迭代并不是最优的,为了解决这个问题, OMP算法应运而生。在OMP算法过程中,每步迭代包括:原子选择和系数更新。具体过程为:

Input: x ∈ R m × 1 \mathbf{x}\in {{\mathbb{R}}^{m\times 1}} xRm×1 D ∈ R m × n \mathbf{D}\in {{\mathbb{R}}^{m\times n}} DRm×n, q q q or ξ \xi ξ

Output: c ∈ R n × 1 \mathbf{c}\in {{\mathbb{R}}^{n\times 1}} cRn×1

Initialization:

c ← 0 \mathbf{c}\leftarrow \mathbf{0} c0 e ← x \mathbf{e}\leftarrow \mathbf{x} ex ψ ← { } \psi \leftarrow \{\} ψ{}

while ∥ c ∥ ≤ q \left\| \mathbf{c} \right\|\le q cq and ∥ e ∥ 2 ≥ ξ {{\left\| \mathbf{e} \right\|}_{2}}\ge \xi e2ξ

          μ = D T e \mu ={{\mathbf{D}}^{T}}\mathbf{e} μ=DTe

          j ∗ ← arg ⁡ max ⁡ j ∣ μ j ∣ , j ∈ ψ c {{j}^{*}}\leftarrow \arg \underset{j}{\mathop{\max }}\,\left| {{\mathbf{\mu }}_{j}} \right|,j\in {{\psi }^{c}} jargjmaxμj,jψc

          ψ ← ψ ∪ { j ∗ } \psi \leftarrow \psi \cup \left\{ {{j}^{*}} \right\} ψψ{j}

          c ψ = arg ⁡ max ⁡ c ∥ x − D ψ c ∥ 2 , c ψ ← ( D ψ T D ψ ) − 1 D ψ T x {{\mathbf{c}}_{\psi }}=\arg \underset{\mathbf{c}}{\mathop{\max }}\,{{\left\| \mathbf{x}-{{\mathbf{D}}_{\psi }}\mathbf{c} \right\|}_{2}},{{\mathbf{c}}_{\psi }}\leftarrow {{\left( \mathbf{D}_{\psi }^{T}{{\mathbf{D}}_{\psi }} \right)}^{-1}}\mathbf{D}_{\psi }^{T}\mathbf{x} cψ=argcmaxxDψc2,cψ(DψTDψ)1DψTx

          e ← x − D c \mathbf{e}\leftarrow \mathbf{x}-\mathbf{Dc} exDc

end

LARC算法

为了降低 l 0 {{l}_{0}} l0范数的求解难度,将 l 0 {{l}_{0}} l0范数松弛到 l 1 {{l}_{1}} l1范数。LARS算法是求解 l 1 {{l}_{1}} l1范数稀疏表示的有效方法。同样地,该算法也包括了原子选择和系数更新两个步骤。原子选择部分与OMP算法基本相同,在系数更新方面,与OMP算法不同的是,该算法是沿着已选择的字典原子的角平分线上寻找新的字典原子,使得该字典原子与残差的相关性等同于已挑选原子与残差的相关性,再更新相应的步长,直到选择了所有的字典原子或者满足稀疏度或表示误差的要求时终止算法。
后来,有人提出了一种改进的方法,即LARC算法。其主要改进为:定义了Gram矩阵,即 G = D T D \mathbf{G}={{\mathbf{D}}^{T}}\mathbf{D} G=DTD,并在每次迭代过程中采用Cholesky 分解更新该矩阵,避免了重复计算 D ψ T D ψ \mathbf{D}_{\psi }^{T}{{\mathbf{D}}_{\psi }} DψTDψ,从而降低了计算量;提出了采用误差相关阈值 μ \mu μ作为算法的终止条件,减少了不必要的迭代,避免了对观察信号幅值大小的依赖。具体过程为

Input: x ∈ R m × 1 \mathbf{x}\in {{\mathbb{R}}^{m\times 1}} xRm×1 D ∈ R m × n \mathbf{D}\in {{\mathbb{R}}^{m\times n}} DRm×n, G = D T D \mathbf{G}={{\mathbf{D}}^{T}}\mathbf{D} G=DTD, μ \mu μ

Output: c ∈ R n × 1 \mathbf{c}\in {{\mathbb{R}}^{n\times 1}} cRn×1

Initialization:

c ← 0 \mathbf{c}\leftarrow \mathbf{0} c0 y ← 0 \mathbf{y}\leftarrow \mathbf{0} y0 ψ ← { } \psi \leftarrow \{\} ψ{}

μ ( x ) ← D T x {{\mathbf{\mu }}^{\left( \mathbf{x} \right)}}\leftarrow {{\mathbf{D}}^{T}}\mathbf{x} μ(x)DTx μ ( y ) ← 0 {{\mathbf{\mu }}^{\left( \mathbf{y} \right)}}\leftarrow \mathbf{0} μ(y)0

when ∣ ψ ∣ < D \left| \psi \right|<D ψ<D

          μ ← μ ( x ) − μ ( y ) \mathbf{\mu }\leftarrow {{\mathbf{\mu }}^{\left( \mathbf{x} \right)}}-{{\mathbf{\mu }}^{\left( \mathbf{y} \right)}} μμ(x)μ(y)

          j ∗ ← arg ⁡ max ⁡ j ∣ μ j ∣ , j ∈ ψ c {{j}^{*}}\leftarrow \arg \underset{j}{\mathop{\max }}\,\left| {{\mathbf{\mu }}_{j}} \right|,j\in {{\psi }^{c}} jargjmaxμj,jψc

          ψ ← ψ ∪ { j ∗ } \psi \leftarrow \psi \cup \left\{ {{j}^{*}} \right\} ψψ{j}

         if ∣ μ j ∗ ∣ / ∥ x − y ∥ 2 < μ {\left| {{\mathbf{\mu }}_{{{j}^{*}}}} \right|}/{{{\left\| \mathbf{x}-\mathbf{y} \right\|}_{2}}<\mu }\; μj/xy2<μ

                       break

         end

          s ← s i g n ( μ ψ ) \mathbf{s}\leftarrow sign\left( {{\mathbf{\mu }}_{\psi }} \right) ssign(μψ)

          g ← G ( ψ , ψ ) − 1 s \mathbf{g}\leftarrow \mathbf{G}_{\left( \psi ,\psi \right)}^{-1}\mathbf{s} gG(ψ,ψ)1s

          b ← ( g T s ) − 1 2 b\leftarrow {{\left( {{\mathbf{g}}^{T}}\mathbf{s} \right)}^{-\frac{1}{2}}} b(gTs)21

          w ← b g \mathbf{w}\leftarrow b\mathbf{g} wbg

          u ← D ( : , ψ ) w \mathbf{u}\leftarrow {{\mathbf{D}}_{\left( :,\psi \right)}}\mathbf{w} uD(:,ψ)w

          a ← G ( : , ψ ) w \mathbf{a}\leftarrow {{\mathbf{G}}_{\left( :,\psi \right)}}\mathbf{w} aG(:,ψ)w

          γ ← min ⁡ k ∈ ψ c + [ ( ∣ μ j ∗ ∣ − ∣ μ k ∣ ) / ( b − a k ) , ( ∣ μ j ∗ ∣ + ∣ μ k ∣ ) / ( b + a k ) ] \gamma \leftarrow \min _{k\in {{\psi }^{c}}}^{+}\left[ \begin{matrix} {\left( \left| {{\mathbf{\mu }}_{{{j}^{*}}}} \right|-\left| {{\mathbf{\mu }}_{k}} \right| \right)}/{\left( b-{{a}_{k}} \right),}\; & {\left( \left| {{\mathbf{\mu }}_{{{j}^{*}}}} \right|+\left| {{\mathbf{\mu }}_{k}} \right| \right)}/{\left( b+{{a}_{k}} \right)}\; \\\end{matrix} \right] γminkψc+[(μjμk)/(bak),(μj+μk)/(b+ak)]

          y ← y + γ u \mathbf{y}\leftarrow \mathbf{y}+\gamma \mathbf{u} yy+γu

          c ψ ← c ψ + γ w {{\mathbf{c}}_{\psi }}\leftarrow {{\mathbf{c}}_{\psi }}+\gamma \mathbf{w} cψcψ+γw

          μ ( y ) ← μ ( y ) + γ a {{\mathbf{\mu }}^{\left( \mathbf{y} \right)}}\leftarrow {{\mathbf{\mu }}^{\left( \mathbf{y} \right)}}+\gamma \mathbf{a} μ(y)μ(y)+γa

end

自适应字典学习

字典学习的方法主要分两类:一类是通过预先设置的数学变换来构造字典的固定字典解析方法,包括离散余弦变换、小波变换等,但是该类方法没有利用到信号的特有信息,原子形态比较单一;一类是通过自适应的方式来获取字典,这样字典原子与信号之间有很好的相干性,使得其更加灵活。下面简单地介绍几种自适应字典学习的方法。

K-SVD算法

字典学习的目的就是为了将信号 X ∈ R m × r \mathbf{X}\in {{\mathbb{R}}^{m\times r}} XRm×r近似地分解为字典 D ∈ R m × n \mathbf{D}\in {{\mathbb{R}}^{m\times n}} DRm×n和稀疏表示系数矩阵 C ∈ R n × r \mathbf{C}\in {{\mathbb{R}}^{n\times r}} CRn×r,相应的目标函数为
arg ⁡ min ⁡ D , C ∥ X − D ⋅ C ∥ F 2 \arg \underset{\mathbf{D},\mathbf{C}}{\mathop{\min }}\,\left\| \mathbf{X}-\mathbf{D}\cdot \mathbf{C} \right\|_{F}^{2} argD,CminXDCF2
从上面可以看出,该优化目标中存在两个未知数,对于该非凸问题,有研究学者提出了交替更新 D \mathbf{D} D C \mathbf{C} C直至算法收敛到局部最优解。固定字典 D \mathbf{D} D,求解稀疏表示系数 C \mathbf{C} C的过程称为稀疏编码或者稀疏表示;固定稀疏表示系数 C \mathbf{C} C,求解字典 D \mathbf{D} D的过程称为字典学习。在K-SVD字典学习中,稀疏表示的方法使用的是OMP算法,字典更新的模型可以表示为
D ← arg ⁡ min ⁡ D ∥ X − D ⋅ C ∥ F 2 s . t . ∥ d ( : , l ) ∥ 2 = 1 ∀ l = 1 , . . . , n \begin{aligned} & \mathbf{D}\leftarrow \arg \underset{D}{\mathop{\min }}\,\left\| \mathbf{X}-\mathbf{D}\cdot \mathbf{C} \right\|_{F}^{2} \\ & s.t.{{\left\| {{\mathbf{d}}_{\left( :,l \right)}} \right\|}_{2}}=1\forall l=1,...,n \\ \end{aligned} DargDminXDCF2s.t.d(:,l)2=1l=1,...,n
K-SVD在更新字典时,对原子进行逐个更新,同时也有稀疏表示系数的更新。在更新原子时,
∥ X − D ⋅ C ∥ F 2 = ∥ X − ∑ i = 1 n d ( : , i ) c ( i , : ) ∥ F 2 = ∥ ( X − ∑ i ≠ l d ( : , i ) c ( i , : ) ) − d ( : , l ) c ( l , : ) ∥ F 2 = ∥ R ( l ) − d ( : , l ) c ( l , : ) ∥ F 2 \begin{aligned} & \left\| \mathbf{X}-\mathbf{D}\cdot \mathbf{C} \right\|_{F}^{2}\text{=}\left\| \mathbf{X}-\sum\limits_{i=1}^{n}{{{\mathbf{d}}_{\left( :,i \right)}}{{\mathbf{c}}_{\left( i,: \right)}}} \right\|_{F}^{2} \\ & =\left\| \left( \mathbf{X}-\sum\limits_{i\ne l}^{{}}{{{\mathbf{d}}_{\left( :,i \right)}}{{\mathbf{c}}_{\left( i,: \right)}}} \right)-{{\mathbf{d}}_{\left( :,l \right)}}{{\mathbf{c}}_{\left( l,: \right)}} \right\|_{F}^{2} \\ & =\left\| {{\mathbf{R}}^{\left( l \right)}}-{{\mathbf{d}}_{\left( :,l \right)}}{{\mathbf{c}}_{\left( l,: \right)}} \right\|_{F}^{2} \\ \end{aligned} XDCF2=Xi=1nd(:,i)c(i,:)F2=Xi=ld(:,i)c(i,:)d(:,l)c(l,:)F2=R(l)d(:,l)c(l,:)F2
它的主要思想就是将 D ⋅ C \mathbf{D}\cdot \mathbf{C} DC分解成 n n n个秩一的矩阵,使得该稀疏表示误差项最小。在更新第 l l l列的原子 d ( : , l ) {{\mathbf{d}}_{\left( :,l \right)}} d(:,l)时,可以假设第 l l l个原子未知,固定其他 n − 1 n-1 n1列原子,通过最小化上述表达式使得 d ( : , l ) c ( l , υ ) {{\mathbf{d}}_{\left( :,l \right)}}{{\mathbf{c}}_{\left( l,\upsilon \right)}} d(:,l)c(l,υ)不断逼近 R ( : , υ ) ( l ) \mathbf{R}_{\left( :,\upsilon \right)}^{\left( l \right)} R(:,υ)(l)来更新 d ( : , l ) {{\mathbf{d}}_{\left( :,l \right)}} d(:,l),其中 υ = { j ∣ C l , j ≠ 0 , 1 ≤ j ≤ n } \upsilon =\left\{ j|{{C}_{l,j}}\ne 0,1\le j\le n \right\} υ={jCl,j=0,1jn}。具体是对 R ( l ) {{\mathbf{R}}^{\left( l \right)}} R(l)进行SVD分解,将最大奇异值对应的左奇异列向量来更新 d ( : , l ) {{\mathbf{d}}_{\left( :,l \right)}} d(:,l),将其对应的右奇异矩阵的列向量来更新 c ( l , : ) {{\mathbf{c}}_{\left( l,: \right)}} c(l,:)。由于SVD不能保证 c ( l , : ) {{\mathbf{c}}_{\left( l,: \right)}} c(l,:)是稀疏的,但是在SVD过程中仅在非零元空间 υ \upsilon υ内进行,即得到的系数 c ( l , υ ) {{\mathbf{c}}_{\left( l,\upsilon \right)}} c(l,υ)仅仅会更新 c ( l , : ) {{\mathbf{c}}_{\left( l,: \right)}} c(l,:)中对应位置的非零元,最终仍能保证稀疏表示系数的稀疏性。
具体过程为:

Input: X ∈ R m × r \mathbf{X}\in {{\mathbb{R}}^{m\times r}} XRm×r D 0 ∈ R m × n {{\mathbf{D}}_{0}}\in {{\mathbb{R}}^{m\times n}} D0Rm×n q q q or ξ \xi ξ J J J

Output: D \mathbf{D} D C \mathbf{C} C

while j s < J {{j}_{s}}<J js<J:

         Sparse Coding: OMP Algorithm

         Dictionary Updating:

         for l ← 1 l\leftarrow 1 l1 to n n n:

                   d ( : , l ) ← 0 {{\mathbf{d}}_{\left( :,l \right)}}\leftarrow \mathbf{0} d(:,l)0

                   υ = { j ∣ C l , j ≠ 0 , 1 ≤ j ≤ n } \upsilon =\left\{ j|{{C}_{l,j}}\ne 0,1\le j\le n \right\} υ={jCl,j=0,1jn}

                   R ( l ) ← X − ∑ i ≠ l d ( : , i ) c ( i , : ) {{\mathbf{R}}^{\left( l \right)}}\leftarrow \mathbf{X}-\sum\limits_{i\ne l}^{{}}{{{\mathbf{d}}_{\left( :,i \right)}}{{\mathbf{c}}_{\left( i,: \right)}}} R(l)Xi=ld(:,i)c(i,:)

                   R ( : , υ ) ( l ) = U ∑ V T \mathbf{R}_{\left( :,\upsilon \right)}^{\left( l \right)}=\mathbf{U}\sum {{\mathbf{V}}^{T}} R(:,υ)(l)=UVT

                   d ( : , l ) ← U ( : , 1 ) {{\mathbf{d}}_{\left( :,l \right)}}\leftarrow {{\mathbf{U}}_{\left( :,1 \right)}} d(:,l)U(:,1)

                   c ( l , υ ) ← ∑ ( 1 , 1 ) V ( : , 1 ) {{\mathbf{c}}_{\left( l,\upsilon \right)}}\leftarrow \sum \left( 1,1 \right){{\mathbf{V}}_{\left( :,1 \right)}} c(l,υ)(1,1)V(:,1)

         end

j s ← j s + 1 {{j}_{s}}\leftarrow {{j}_{s}}+1 jsjs+1

end

近似K-SVD

由于每次迭代都需要进行SVD,增加了计算的复杂度,为了进一步降低K-SVD算法的复杂度,有学者提出了采用批量正交匹配追踪方法替代SVD 分解来近似完成K-SVD 算法,即
d ( : , l ) ← X c ( l , : ) T − ( ∑ i ≠ l d ( : , i ) c ( i , : ) ) c ( l , : ) T {{\mathbf{d}}_{\left( :,l \right)}}\leftarrow \mathbf{Xc}_{_{\left( l,: \right)}}^{T}-\left( \sum\limits_{i\ne l}^{{}}{{{\mathbf{d}}_{\left( :,i \right)}}{{\mathbf{c}}_{\left( i,: \right)}}} \right)\mathbf{c}_{_{\left( l,: \right)}}^{T} d(:,l)Xc(l,:)Ti=ld(:,i)c(i,:)c(l,:)T
d ( : , l ) ← d ( : , l ) / ∥ d ( : , l ) ∥ 2 {{\mathbf{d}}_{\left( :,l \right)}}\leftarrow {{{{{\mathbf{d}}_{\left( :,l \right)}}}/{\left\| {{\mathbf{d}}_{\left( :,l \right)}} \right\|}\;}_{2}} d(:,l)d(:,l)/d(:,l)2
c ( l , : ) ← X T d ( : , l ) − ( ∑ i ≠ l d ( : , i ) c ( i , : ) ) T d ( : , l ) {{\mathbf{c}}_{\left( l,: \right)}}\leftarrow {{\mathbf{X}}^{T}}{{\mathbf{d}}_{\left( :,l \right)}}-{{\left( \sum\limits_{i\ne l}^{{}}{{{\mathbf{d}}_{\left( :,i \right)}}{{\mathbf{c}}_{\left( i,: \right)}}} \right)}^{T}}{{\mathbf{d}}_{\left( :,l \right)}} c(l,:)XTd(:,l)i=ld(:,i)c(i,:)Td(:,l)
从上面可以看出迭代的过程不需要计算 R ( l ) {{\mathbf{R}}^{\left( l \right)}} R(l),将原有的矩阵运算变成了向量的操作,并且不需要进行SVD。具体过程为:

Input: X ∈ R m × r \mathbf{X}\in {{\mathbb{R}}^{m\times r}} XRm×r D 0 ∈ R m × n {{\mathbf{D}}_{0}}\in {{\mathbb{R}}^{m\times n}} D0Rm×n q q q or ξ \xi ξ J J J

Output: D \mathbf{D} D C \mathbf{C} C

while j s < J {{j}_{s}}<J js<J:

         Sparse Coding: OMP Algorithm

         Dictionary Updating:

         for l ← 1 l\leftarrow 1 l1 to n n n:

                   d ( : , l ) ← 0 {{\mathbf{d}}_{\left( :,l \right)}}\leftarrow \mathbf{0} d(:,l)0

                   υ = { j ∣ C l , j ≠ 0 , 1 ≤ j ≤ n } \upsilon =\left\{ j|{{C}_{l,j}}\ne 0,1\le j\le n \right\} υ={jCl,j=0,1jn}

                   d ( : , l ) ← X c ( l , : ) T − ( ∑ i ≠ l d ( : , i ) c ( i , : ) ) c ( l , : ) T {{\mathbf{d}}_{\left( :,l \right)}}\leftarrow \mathbf{Xc}_{_{\left( l,: \right)}}^{T}-\left( \sum\limits_{i\ne l}^{{}}{{{\mathbf{d}}_{\left( :,i \right)}}{{\mathbf{c}}_{\left( i,: \right)}}} \right)\mathbf{c}_{_{\left( l,: \right)}}^{T} d(:,l)Xc(l,:)T(i=ld(:,i)c(i,:))c(l,:)T

                   d ( : , l ) ← d ( : , l ) / ∥ d ( : , l ) ∥ 2 {{\mathbf{d}}_{\left( :,l \right)}}\leftarrow {{{{{\mathbf{d}}_{\left( :,l \right)}}}/{\left\| {{\mathbf{d}}_{\left( :,l \right)}} \right\|}\;}_{2}} d(:,l)d(:,l)/d(:,l)2

                   c ( l , : ) ← X T d ( : , l ) − ( ∑ i ≠ l d ( : , i ) c ( i , : ) ) T d ( : , l ) {{\mathbf{c}}_{\left( l,: \right)}}\leftarrow {{\mathbf{X}}^{T}}{{\mathbf{d}}_{\left( :,l \right)}}-{{\left( \sum\limits_{i\ne l}^{{}}{{{\mathbf{d}}_{\left( :,i \right)}}{{\mathbf{c}}_{\left( i,: \right)}}} \right)}^{T}}{{\mathbf{d}}_{\left( :,l \right)}} c(l,:)XTd(:,l)(i=ld(:,i)c(i,:))Td(:,l)

         end

j s ← j s + 1 {{j}_{s}}\leftarrow {{j}_{s}}+1 jsjs+1

end

NMF算法

NMF是在所有矩阵元素非负的约束下的分解方式,在语音信号中对应其幅度谱或者功率谱,如
X = D C \mathbf{X=DC} X=DC
X ∈ R + n × m \mathbf{X}\in \mathbb{R}_{+}^{n\times m} XR+n×m为待分解矩阵, D ∈ R + n × r \mathbf{D}\in \mathbb{R}_{+}^{n\times r} DR+n×r(基矩阵)和 C ∈ R + r × m \mathbf{C}\in \mathbb{R}_{+}^{r\times m} CR+r×m(系数矩阵)为分解后的两个矩阵。一般用距离来衡量两者的相似程度,可以进一步将优化目标写作为
min ⁡ D , C D α ( X ∣ D C ) \underset{\mathbf{D},\mathbf{C}}{\mathop{\min }}\,{{D}_{\alpha }}\left( \mathbf{X}|\mathbf{DC} \right) D,CminDα(XDC)
其中 D α ( ⋅ ) {{D}_{\alpha }}\left( \centerdot \right) Dα()表示 X \mathbf{X} X D C \mathbf{DC} DC之间的距离
D α ( x ∣ y ) = { 1 α ( α − 1 ) ( x α − y α − α x y α − 1 ( x − y ) ) , α ∈ R \ { 0 , 1 } x ( log ⁡ x − log ⁡ y ) + ( y − x ) , α = 1 x y − log ⁡ x y − 1 , α = 0 {{D}_{\alpha }}\left( x|y \right)\text{=}\left\{ \begin{aligned} & \frac{1}{\alpha }\left( \alpha -1 \right)\left( {{x}^{\alpha }}-{{y}^{\alpha }}-\alpha x{{y}^{\alpha -1}}\left( x-y \right) \right),\ \ \ \ \ \ \ \alpha \in \mathbb{R}\backslash \left\{ 0,1 \right\} \\ & x\left( \log x-\log y \right)+\left( y-x \right),\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \alpha =1 \\ & \frac{x}{y}-\log \frac{x}{y}-1,\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \alpha =0 \\ \end{aligned} \right. Dα(xy)=α1(α1)(xαyααxyα1(xy)),       αR\{0,1}x(logxlogy)+(yx),                      α=1yxlogyx1,                                       α=0
α = 0 \alpha =0 α=0时,对应的是Itakura-Saito距离;当 α = 1 \alpha =1 α=1时,对应的是广义KL散度;当 α = 2 \alpha =2 α=2时,对应的是欧氏距离。一般来说,后两者较为常见。
对于NMF算法的基矩阵和系数矩阵,利用梯度下降可以得到相应的更新过程
C ← C ⊗ D [ ( D C ) α − 2 ⊗ X ] D T ( D C ) α − 1 \mathbf{C}\leftarrow \mathbf{C}\otimes \frac{\mathbf{D}\left[ {{\left( \mathbf{DC} \right)}^{\alpha -2}}\otimes \mathbf{X} \right]}{{{\mathbf{D}}^{T}}{{\left( \mathbf{DC} \right)}^{\alpha -1}}} CCDT(DC)α1D[(DC)α2X]
D ← D ⊗ [ ( D C ) α − 2 ⊗ X ] C T ( D C ) α − 1 C T \mathbf{D}\leftarrow \mathbf{D}\otimes \frac{\left[ {{\left( \mathbf{DC} \right)}^{\alpha -2}}\otimes \mathbf{X} \right]{{\mathbf{C}}^{T}}}{{{\left( \mathbf{DC} \right)}^{\alpha -1}}{{\mathbf{C}}^{T}}} DD(DC)α1CT[(DC)α2X]CT
上式中的所有运算均为元素之间的运算。
同样地,上式更新过程并没有对系数矩阵进行稀疏度的约束,如果增加稀疏度约束,那么相应的目标函数变为
min ⁡ D , C D α ( X ∣ D C ) + μ ∥ C ∥ 1 \underset{\mathbf{D},\mathbf{C}}{\mathop{\min }}\,{{D}_{\alpha }}\left( \mathbf{X}|\mathbf{DC} \right)\text{+}\mu {{\left\| \mathbf{C} \right\|}_{1}} D,CminDα(XDC)+μC1
相应地,对于系数矩阵的更新则变为
C ← C ⊗ D [ ( D C ) α − 2 ⊗ X ] D T ( D C ) α − 1 + μ \mathbf{C}\leftarrow \mathbf{C}\otimes \frac{\mathbf{D}\left[ {{\left( \mathbf{DC} \right)}^{\alpha -2}}\otimes \mathbf{X} \right]}{{{\mathbf{D}}^{T}}{{\left( \mathbf{DC} \right)}^{\alpha -1}}\text{+}\mu } CCDT(DC)α1+μD[(DC)α2X]
对于单通道语音增强来说,NMF算法是比较简单有效的,但是也存在着一些缺点,比如线性假设,乘法更新的复杂度等等。
选用NMF算法进行语音增强,仿真参数设置如下。

仿真参数设置

参数名称参数值
信噪比10dB
采样率8KHz
SFFT点数512
字典原子个数100

实验结果如下:
在这里插入图片描述
可以看出经过NMF算法处理后的带噪语音有了明显的改善效果,这也说明了该方法的有效性。

关于语音及噪声文件,具体请参考:语音信号处理常用语料库下载地址

参考文献:
[1]罗友. 基于联合字典学习和稀疏表示的语音降噪算法研究[D].中国科学技术大学,2016.
[2]朱媛媛. 基于稀疏表示和深度学习的有监督语音增强算法研究[D].中国科学技术大学,2020.


http://chatgpt.dhexx.cn/article/iKrfiYlM.shtml

相关文章

字典学习(Dictionary Learning)

字典学习——Dictionary Learning 我主要从一下几个方面分享一下。 什么是字典学习字典学习的理论依据及公式字典学习的应用 1、什么是字典学习&#xff1f; 在人类发展的近几千年历史中&#xff0c;文字对人类文明的推动起着举足轻重的作用。人类用文字记述了千年的历史&a…

为什么我们需要机器学习,机器学习主要应用在哪几方面?

一、为什么需要机器学习&#xff1f; 有些任务直接编码较为复杂&#xff0c;我们不能处理所有的细微之处和简单编码&#xff0c;因此&#xff0c;机器学习很有必要。相反&#xff0c;我们向机器学习算法提供大量数据&#xff0c;让算法不断探索数据并构建模型来解决问题。比如…

什么是机器学习,目前机器学习的应用有哪些?

机器学习 机器学习就是让机器具备人一样学习的能力&#xff0c;专门研究计算机怎样模拟或实现人类的学习行为&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能&#xff0c;它是人工智能的核心。 机器学习已经有了十分广泛的应用&a…

【机器学习】浅析机器学习各大算法的适用场景

最近在参加一个分类算法竞赛&#xff0c;也正好整理各个分类机器学习算法的简单介绍&#xff0c;应用场景和优缺点。资源来自网上和自己个人理解。 一、逻辑回归模型 1、理解逻辑回归模型&#xff08;LR&#xff09; 逻辑回归是一种分类算法&#xff0c;其原理是将线性回归预测…

什么是机器学习?有哪些应用?终于有人讲明白了

作者&#xff1a;星环科技人工智能平台团队 来源&#xff1a;大数据DT&#xff08;ID&#xff1a;hzdashuju&#xff09; 导读&#xff1a;人工智能的快速发展&#xff0c;带动了相关技术的繁荣。近些年&#xff0c;国内外的科技公司对机器学习人才都有大量需求。怎样入行机器学…

各种机器学习的应用场景分别是什么?

[转] https://www.leiphone.com/news/201712/RqsxWpjPOPFy6Qm4.html 关于这个问题我今天正好看到了这个文章&#xff0c;讲的正是各个算法的优劣分析&#xff0c;很中肯。 正好14年的时候有人做过一个实验[1]&#xff0c;比较在不同数据集上&#xff08;121个&#xff09;&…

【机器学习】机器学习在社会科学中的应用

机器学习在社会科学中的应用 在科学研究中&#xff0c;从方法论上来讲&#xff0c;都应先见森林&#xff0c;再见树木。当前&#xff0c;人工智能科技迅猛发展&#xff0c;万木争荣&#xff0c;更应系统梳理脉络。为此&#xff0c;我们特别精选国内外优秀的综述论文&#xff0c…

机器学习应用

监督学习和非监督学习 监督学习&#xff1a; 有标签的&#xff0c;回归和分类&#xff0c;场景&#xff1a;用户流失预测 非监督学习&#xff1a;无标签&#xff0c;聚类和降维&#xff0c;场景&#xff1a;用户细分 数据不平衡 类别不平衡。数据在某些维度上多&#xff0c;…

【机器学习】为什么机器学习难于应用

摘要&#xff1a; 本文主要讲述了如何管理机器学习应用方面的棘手问题 应用机器学习是有挑战性的。 在机器学习领域&#xff0c;你必须要在没有正确答案的问题上做出很多决定&#xff01;例如&#xff1a; 用什么框架&#xff1f; 用什么数据作为输入&#xff0c;要输出什么数…

机器学习在社会科学中的应用

本文把目前机器学习技术在社会科学研究中的应用分成三类&#xff1a;第一&#xff0c;数据生成&#xff08;Data Generating Process&#xff09;&#xff1a;机器学习可以帮助学者获得以前很难或无法获得的数据&#xff1b;第二&#xff0c;预测&#xff08;Prediction&#x…

【Machine Learning】20.应用机器学习的一些建议

20.应用机器学习的一些建议 1.导入包2. 评估学习算法&#xff08;以线性回归为例&#xff09;2.1 分离数据集可视化数据集 2.2 误差计算2.3 比较模型在训练集和测试集上的表现 3.Bias and Variance3.1 可视化数据集3.2 找到optimal degree最佳次数3.3 Tuning Regularization调整…

机器学习之应用举例

#Photo OCR Photo Optical Character Recognition&#xff08;照片光学字符识别&#xff09;&#xff0c;注重的问题是如何让计算机读出图片中的文字信息。 1、给定某种图片&#xff0c;它将图像扫描一遍&#xff0c;然后找出照片中的文字信息&#xff1b; 2、重点关注这些文…

机器学习的应用–大数据

说完机器学习的方法&#xff0c;下面要谈一谈机器学习的应用了。无疑&#xff0c;在2010年以前&#xff0c;机器学习的应用在某些特定领域发挥了巨大的作用&#xff0c;如车牌识别&#xff0c;网络攻击防范&#xff0c;手写字符识别等等。但是&#xff0c;从2010年以后&#xf…

什么是机器学习?有哪些算法和分类?又有哪些应用?看完你就懂了

导读&#xff1a;本文从大数据的概念讲起&#xff0c;主要介绍机器学习的基础概念&#xff0c;以及机器学习的发展过程&#xff0c;用一个形象的例子讲解大数据生态中的机器学习&#xff0c;并按照传统机器学习&#xff08;包括分类、聚类、回归、关联规则、协同过滤、数据降维…

1.2 机器学习的应用

机器学习无处不在。 问&#xff1a;为什么机器学习已经成为人工智能的一个子领域&#xff1f; 答&#xff1a;通过编程能够让机器做一些事情&#xff0c;比如&#xff1a;如何找到从A到B的最短距离&#xff0c;现实生活对应着GPS导航。但是&#xff0c;有时候编程也存在难点&…

什么是机器学习?应用场景以及未来趋势

机器学习 (ML) 被定义为人工智能 (AI) 的一门学科&#xff0c;它使机器能够自动从数据和过去的经验中学习&#xff0c;以识别模式并在最少的人工干预下做出预测。本文介绍了机器学习的基础知识、其类型以及最重要的五个应用程序。它还分享了 2022 年机器学习的十大趋势。 目录…

学机器学习有什么用?机器学习可以应用哪些领域?

机器学习的目前在各个领域都非常实用&#xff0c;可以带来很多好处&#xff0c;包括以下几点&#xff1a; 学机器学习有什么用&#xff1f; 自动化&#xff1a;机器学习可以帮助自动处理大量数据和任务&#xff0c;减少人工处理的工作量。 预测性能&#xff1a;机器学习模型可…

机器学习有哪些应用场景?机器学习有什么用?

机器学习是一种广泛应用于各个领域的技术&#xff0c;以下列举几个机器学习的应用场景&#xff1a; 机器学习有哪些应用场景&#xff1f;机器学习有什么用&#xff1f; 金融领域&#xff1a;机器学习可以应用于信用评估、风险管理、欺诈检测等方面&#xff0c;帮助银行和保险公…

机器学习实战 | Python机器学习算法应用实践

作者&#xff1a;韩信子ShowMeAI 教程地址&#xff1a;https://www.showmeai.tech/tutorials/41 本文地址&#xff1a;https://www.showmeai.tech/article-detail/201 声明&#xff1a;版权所有&#xff0c;转载请联系平台与作者并注明出处 收藏ShowMeAI查看更多精彩内容 引言 …

机器学习的应用方面,主要有哪些?

1、图像处理\识别&#xff08;人脸识别、图片分类&#xff09; 2、自然语言处理 3、网络安全&#xff08;垃圾邮件检测、恶意程序\流量检测&#xff09; 4、自动驾驶 5、机器人 6、医疗拟合预测 7、神经网络 8、金融高频交易 9、互联网数据挖掘/关联推荐 人工智能、大…