espnet2.enh.layers.beamformer.get_mvdr_vector
Less than 1 minute
espnet2.enh.layers.beamformer.get_mvdr_vector
espnet2.enh.layers.beamformer.get_mvdr_vector(psd_s, psd_n, reference_vector: Tensor, diagonal_loading: bool = True, diag_eps: float = 1e-07, eps: float = 1e-08)
Return the MVDR (Minimum Variance Distortionless Response) vector.
The MVDR vector is computed using the formula: : h = (Npsd^-1 @ Spsd) / (Tr(Npsd^-1 @ Spsd)) @ u
Reference: : On optimal frequency-domain multichannel linear filtering for noise reduction; M. Souden et al., 2010; https://ieeexplore.ieee.org/document/5089420
- Parameters:
- psd_s (torch.complex64/ComplexTensor) – Speech covariance matrix (…, F, C, C)
- psd_n (torch.complex64/ComplexTensor) – Observation/noise covariance matrix (…, F, C, C)
- reference_vector (torch.Tensor) – Reference vector of shape (…, C)
- diagonal_loading (bool) – Whether to add a tiny term to the diagonal of psd_n
- diag_eps (float) – Regularization term added to the diagonal
- eps (float) – Small constant to avoid division by zero
- Returns: MVDR beamforming vector of shape (…, F, C)
- Return type: beamform_vector (torch.complex64/ComplexTensor)
Examples
>>> psd_s = torch.rand(10, 8, 4, 4, dtype=torch.complex64)
>>> psd_n = torch.rand(10, 8, 4, 4, dtype=torch.complex64)
>>> ref_vec = torch.rand(10, 4)
>>> mvdr_vector = get_mvdr_vector(psd_s, psd_n, ref_vec)
>>> print(mvdr_vector.shape)
torch.Size([10, 8, 4])