MVDR¶
- class torchaudio.transforms.MVDR(ref_channel: int = 0, solution: str = 'ref_channel', multi_mask: bool = False, diag_loading: bool = True, diag_eps: float = 1e-07, online: bool = False)[source]¶
最小方差无畸变响应 (MVDR) 模块,使用时频掩码执行 MVDR 波束形成。
基于 https://github.com/espnet/espnet/blob/master/espnet2/enh/layers/beamformer.py
我们提供了三种 MVDR 波束形成的解决方案。一种基于参考通道选择 [Souden 等人,2009] (
solution=ref_channel
)。\[\textbf{w}_{\text{MVDR}}(f) = \frac{{{\bf{\Phi}_{\textbf{NN}}^{-1}}(f){\bf{\Phi}_{\textbf{SS}}}}(f)} {\text{Trace}({{{\bf{\Phi}_{\textbf{NN}}^{-1}}(f) \bf{\Phi}_{\textbf{SS}}}(f))}}\bm{u} \]其中 \(\bf{\Phi}_{\textbf{SS}}\) 和 \(\bf{\Phi}_{\textbf{NN}}\) 分别是语音和噪声的协方差矩阵。 \(\bf{u}\) 是一个独热向量,用于确定参考通道。
另外两种解决方案基于转向向量 (
solution=stv_evd
或solution=stv_power
)。\[\textbf{w}_{\text{MVDR}}(f) = \frac{{{\bf{\Phi}_{\textbf{NN}}^{-1}}(f){\bm{v}}(f)}} {{\bm{v}^{\mathsf{H}}}(f){\bf{\Phi}_{\textbf{NN}}^{-1}}(f){\bm{v}}(f)} \]其中 \(\bm{v}\) 是声学传递函数或转向向量。 \(.^{\mathsf{H}}\) 表示厄米共轭运算。
我们应用特征值分解 [Higuchi 等人,2016] 或幂法 [Mises 和 Pollaczek-Geiringer,1929] 从语音的 PSD 矩阵中获得转向向量。
估计波束形成权重后,增强的短时傅里叶变换 (STFT) 由以下公式获得
\[\hat{\bf{S}} = {\bf{w}^\mathsf{H}}{\bf{Y}}, {\bf{w}} \in \mathbb{C}^{M \times F} \]其中 \(\bf{Y}\) 和 \(\hat{\bf{S}}\) 分别是多通道噪声语音的 STFT 和单通道增强语音的 STFT。
对于在线流式音频,我们提供了一种递归方法 [Higuchi 等人,2017] 来分别更新语音和噪声的 PSD 矩阵。
- 参数:
ref_channel (int, 可选) – 波束形成的参考通道。(默认值:
0
)solution (str, 可选) – 计算 MVDR 波束形成权重的解决方案。选项:[
ref_channel
,stv_evd
,stv_power
]。(默认值:ref_channel
)multi_mask (bool, 可选) – 如果为
True
,则仅接受多通道时频掩码。(默认值:False
)diagonal_loading (bool, 可选) – 如果为
True
,则启用对噪声协方差矩阵应用对角加载。(默认值:True
)diag_eps (float, 可选) – 乘以单位矩阵的对角加载系数。仅当
diagonal_loading
设置为True
时有效。(默认值:1e-7
)online (bool, 可选) – 如果为
True
,则根据先前的协方差矩阵更新 MVDR 波束形成权重。(默认值:False
)
注意
为了提高数值稳定性,输入的频谱图将在内部计算中转换为双精度(
torch.complex128
或torch.cdouble
) 数据类型。输出的频谱图将转换为输入频谱图的数据类型,以与其他模块兼容。注意
如果您使用
stv_evd
解决方案,如果 PSD 矩阵的特征值不唯一(即一些特征值接近或相同),则相同输入的梯度可能不相同。- forward(specgram: Tensor, mask_s: Tensor, mask_n: Optional[Tensor] = None) Tensor [source]¶
执行 MVDR 波束形成。
- 参数:
specgram (torch.Tensor) – 多通道复值频谱。张量维度为 (…, channel, freq, time)
mask_s (torch.Tensor) – 目标语音的时频掩码。如果 multi_mask 为
False
,则张量维度为 (…, freq, time);如果 multi_mask 为True
,则张量维度为 (…, channel, freq, time)。mask_n (torch.Tensor 或 None, 可选) – 噪声的时频掩码。如果 multi_mask 为
False
,则张量维度为 (…, freq, time);如果 multi_mask 为True
,则张量维度为 (…, channel, freq, time)。(默认值:None)
- 返回值:
维度为 (…, freq, time) 的单通道复值增强频谱。
- 返回类型: