# Implementing MVDR beamformer in the STFT domain

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?

In this context $$\Phi_y$$ often describes the (estimated) power spectral density matrix of $$y(f)$$, which is $$\Phi_y(f) = E\{y(f) y^H(f)\} = \begin{bmatrix} y_1 \cdot y_1^*(f),& y_1 \cdot y_2^*(f),& \dots \\ \vdots & \ddots & \\ y_M \cdot y_1^*(f),& & y_M \cdot y_M^*(f) \\ \end{bmatrix},$$ where $$M$$ is the number of channels, and each element of the matrix corresponds to the cross-power spectral density of two channels for this frequency. Consistent estimates of PSDs in blockwise STFT processing can be obtained, for example, using Welch's method (pwelch in MATLAB).

I am also unsure about your steering vectors and complex conjugate transposes (which I assume is the $$\cdot^H$$ in your notation). They need to make the steering vector compensate the delay for a specific direction.

From my memory, I think the formulas should be

$$h_\text{MVDR}(f) = \frac{\Phi_y^{-1}(f)d(f)}{d^H(f)\Phi_y^{-1}d(f)}$$

and

$$Z(f) = h_\text{MVDR}(f)^T y(f).$$

I think the orginal MVDR paper is this one by Capon. You might want to double-check notations since a complex conjugate does change the beamformer's output quite a bit.

Edit: Thanks to Stanley Pawlukiewicz for pointing out my error!

• May the downvoter care to explain the downvote, or offer another solution? Aug 13 '19 at 12:56
• It’s basically incorrect. MVDR uses a cross spectrum matrix. It’s the spatial cross correlation at a single frequency.
– user28715
Aug 13 '19 at 13:09
• Oh yeah, you're right! I'll change my answer. Aug 13 '19 at 13:10
• Updated my answer. Aug 13 '19 at 13:19
• What do you need to be clarified regarding the steering vector $d(f)$? It is, as you stated, compensating with respect to a specific vector and I have edited the hermitian operation. does it make it clearer? Aug 13 '19 at 13:25