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?

1 Answer 1


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)}$$


$$ 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!

  • 1
    $\begingroup$ May the downvoter care to explain the downvote, or offer another solution? $\endgroup$
    – havakok
    Aug 13, 2019 at 12:56
  • 2
    $\begingroup$ It’s basically incorrect. MVDR uses a cross spectrum matrix. It’s the spatial cross correlation at a single frequency. $\endgroup$
    – user28715
    Aug 13, 2019 at 13:09
  • 1
    $\begingroup$ Oh yeah, you're right! I'll change my answer. $\endgroup$ Aug 13, 2019 at 13:10
  • 1
    $\begingroup$ Updated my answer. $\endgroup$ Aug 13, 2019 at 13:19
  • $\begingroup$ 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? $\endgroup$
    – havakok
    Aug 13, 2019 at 13:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.