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)[原始碼]¶
最小方差無失真響應 (MVDR) 模組,執行帶有時頻掩碼的MVDR波束形成。
基於 https://github.com/espnet/espnet/blob/master/espnet2/enh/layers/beamformer.py
我們提供三種MVDR波束形成方案。一種基於參考通道選擇 [Souden et al., 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}\) 是一個one-hot向量,用於確定參考通道。
另外兩種方案基於導向向量(
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 et al., 2016] 或冪法 [Mises and 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。
對於線上音訊流,我們提供一種遞迴方法 [Higuchi et al., 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) – 多通道複數值譜。維度為(…, 通道, 頻率, 時間) 的張量。
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)。
- 返回型別: