I am trying to implement an MVDR beamformer for the first time. I was reading a couple of papers and books with many different notations and I am a bit confused.
In my case, without loss of generality, I have a spherical microphone array. Given that I produce the steering vector $d(f)$ with respect to a given 3D direction $\Omega_i=(\theta_i,\varphi_i)$, (azimuth and elevation). Let $y(f)=[Y_1(f), Y_2(f),\ldots,Y_M(f)]^T$ be the frequency representation of a single STFT frame. If I understood correctly my MVDR filter should be:
$$h_\text{MVDR}(f)=\frac{\Phi_y^{-1}d(f)}{\bar{d}(f)\Phi_y^{-1}d(f)}$$ Where, $\bar{(\cdot)}$ is the complex conjugate.
Now, my enhanced signal may be computed as: $$Z(f)=h_\text{MVDR}^H(f)y(f)$$
I do this for each time frame, concatenate the result and follow to inverse STFT.
- Is this a correct implementation?
- If not, where was I wrong?
- How do I estimate $\Phi_y^{-1}$ from my signal? Is that simply
autocorr(y)
in MATLAB? - Is there a nice python package with references or even one with an implementation for such a filter?