nara wpe去混响学习笔记

nara wpe git地址
博客中demo代码下载
参考论文

NARA - WPE: A Python Package for Weighted Prediction Error Dereverberation in Numpy and Tensorflow for Online and Offline ProcessingNAR

记录一下nara wpe去混响的流程,将nara库的主要代码抽出进行分析。首先分析离线去混响的方法,离线去混响是在已经得到全部数据的情况下对整体音频进行去混响。之后分析了在线去混响的流程,其中单独复习了一下卡尔曼滤波的基本流程,在线去混响摒弃了离线去混响的一些复杂计算,使用卡尔曼滤波预测去混响的滤波器,同时在迭代计算滤波器的中间过程中完成了去混响操作。
另外文中代码对nara流程做了一些简化,直接使用了scipy中提供的stft代替了nara中的stft,离线方法整理音频特征的方式也做了一些简化,争取以比较简洁的代码说明问题,文章开头附有代码链接。代码只有一个python文件,使用方法见python文件开头的注释。

1.WPE方法去混响的基本流程

1.1.基本流程

估计混响信号的尾部。当前信号减去混响尾部,获得“早期”语音,也就是我们需要的去混响后的语音。

x ^ t , f , d ( e a r l y ) = y t , f , d − ∑ τ = Δ Δ + K − 1 ∑ d ′ g τ , f , d , d ′ ∗ y t − τ , f , d ′ \hat{x}^{(early)}_{t,f,d} = y_{t,f,d} - \sum_{\tau = \Delta}^{\Delta + K - 1} \sum_{d'} g^*_{\tau,f,d,d'} y_{t-\tau,f,d'} x^t,f,d(early)=yt,f,dτ=ΔΔ+K1dgτ,f,d,dytτ,f,d

这里是时域的表示,主要用于理解需要处理的数据,但是公式中包含了频率f,需要使用不同频率的特征。实际操作时使用stft先变换,这样同时包含时间和频率信息,处理完毕后通过istft反变换到时域。

下面是各个符号的含义:

t时刻,频率为f,通道d上的早期反射信号x,也就是我们最终希望得到的干净的时域信号。

x ^ t , f , d ( e a r l y ) \hat{x}^{(early)}_{t,f,d} x^t,f,d(early)

t时刻,频率为f,通道d上的带混响的时域信号y。

y t , f , d \mathbf{y}_{\mathrm{t},f,d} yt,f,d

t-τ时刻,频率为f,通道间d’上的带混响的时域信号y。实际操作中,我们会使用多个τ的数据点来估计混响信号的尾部。d’代表了所有通道的影响。这里需要的维度是(时间, 频率, 通道)。后续代码处理是将y通过stft变换后经过延迟,变为为y_tiled后,组成一个tensor( 频率, Kx通道数, 通道上每个时间的系数),我的理解是 Kx通道数 这个维度包含了不同延迟时间内通道间的关系d’,另外两个维度则体现了频率f和时间。

y t − τ , f , d ′ \mathbf{y}_{\mathrm{t} - \tau,f,d'} ytτ,f,d

下面是对两边的两段时域信号做stft运算,得到当前带混响的信号和估计的混响信号的频域表示。这样两者相减,就可以得到早期反射信号X。最后再通过istft反变换到时域。

x ^ t , f ( early ) = y t , f − G f H y ~ t − Δ , f \hat{\mathbf{x}}_{t,f}^{(\text{early})} = \mathbf{y}_{t,f} - \mathbf{G}_f^{\mathcal{H}} \tilde{\mathbf{y}}_{t-\Delta,f} x^t,f(early)=yt,fGfHy~tΔ,f

首先要看一下如何构造这个y_tiled(y波浪)。y_tiled的基本组成上面已经交代,其中包含了频率信息、不同tap(延迟)内通道间信息(K个不同时间)、每个通道的系数。

下面要做的是求Gf中的系数,这个系数没有办法直接球出来。Gf将当前y_tilde转换为估计的混响尾部信号,Gf的形状为(频点数, D*tap, D)。这个Gf目前没有办法直接求解,只能在单通道直达信号是零均值复高斯分布的假设下,使模型似然最大化。

单通道分布:

p ( x t , f , d ( early ) ; λ t , f ) = N ( x t , f , d ( early ) ; 0 , λ t , f ) p(x_{t,f,d}^{(\text{early})};\lambda_{t,f}) = \mathcal{N}(x_{t,f,d}^{(\text{early})};0,\lambda_{t,f}) p(xt,f,d(early);λt,f)=N(xt,f,d(early);0,λt,f)

等式右边代表0均值,方差λt,f的复高斯分布概率密度函数,左边代表似然函数在给定方差λt,f的情况下观测到早期语言估计x的概率。注意,这里是信号频率的系数均值假设是0,到这里处理的全部一段音频是stft后的结果。也就是是说可以直接求同一频率下同一时间,多个通道的频点上所有系数的平均能量,就是这里所讲的方差λt,f了。

多通道分布:

p ( x t , f ( early ) ; λ t , f ) = N ( x t , f ( early ) ; 0 , λ t , f I ) p(\mathbf{x}_{t,f}^{(\text{early})};\lambda_{t,f}) = \mathcal{N}(\mathbf{x}_{t,f}^{(\text{early})};0,\lambda_{t,f}\mathbf{I}) p(xt,f(early);λt,f)=N(xt,f(early);0,λt,fI)

到这里知道了方差的求法,根据方差来估计早期语音出现的概率。下面就需要看看具体如何求解Gf,求出Gf就知道了混响尾部与tap次观测值之间的关系了,通过观测信号和Gf,得到混响尾部的估计。当前带混响的信号减去这个估计得到干净信号。

2.离线迭代方法

求方差的方法上一小节已经给出,实际就是求同一频率下同一时间,多个通道的频点系数的平均能量值。下面给出公式:

λ t , f = 1 ( δ + 1 + δ ) D ∑ τ = t − δ t + δ ∑ d ∣ x ^ τ , f , d ( early ) ∣ 2 \lambda_{t,f} = \frac{1}{(\delta + 1 + \delta)D} \sum_{\tau = t - \delta}^{t + \delta} \sum_{d} |\hat{x}_{\tau,f,d}^{(\text{early})}|^2 λt,f=(δ+1+δ)D1τ=tδt+δdx^τ,f,d(early)2

下面就是求Gf的关键部分。

R f = ∑ t y ~ t − Δ , f y ~ t − Δ , f H λ t , f ∈ C D K × D K \mathbf{R}_f = \sum_{t} \frac{\tilde{\mathbf{y}}_{t - \Delta,f} \tilde{\mathbf{y}}_{t - \Delta,f}^{\mathrm{H}}}{\lambda_{t,f}} \quad\in\mathbb{C}^{DK \times DK} Rf=t

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值