FFT based adaptive MVDR beamforming

Hello,
I have a small question on FFT based adaptive beamforming based on Spectral Matrix Inversion technique.
I have estimated the Spectral Matrix (Sxx) from my data by dividing it into blocks and averaging them for each bin, to get sufficient rank on the matrix.
Now my question is :
To produce the MVDR weighting vector (8x1 vector in my case since I have 8 microphones) for each bin, I multiply the inverse of Sxx for each bin (say bin#1) with the steering vector 'a' given by exp(i*2*pi*D*omega), where D is the set of time delays(8x1 vector) pointing towards look direction(say +10°). Here what should be 'omega'? Isit equal to the first frequency bin of data from first channel and so on for all the bins? please clarify.

댓글 수: 1

Gu
Gu 2012년 11월 22일
I want to know how do you generate your signal? narrowband or wide.

댓글을 달려면 로그인하십시오.

답변 (3개)

Honglei Chen
Honglei Chen 2012년 9월 24일

0 개 추천

Looks like you are doing subband MVDR. It should be the frequency for each corresponding band.

댓글 수: 11

u mean its complex number(bin) coming from the FFT of each segment? or isit just the frequency vector number given by:
omega=fs*[0:N/2 -N/2+1:-1]/N;
where fs=sampling frequency
N=total number of bins in each segment(example 1024 in which 511 are positive and 511 are negative frequencies, 1 DC and 1 Nyquist frequency) please clarify
Honglei Chen
Honglei Chen 2012년 9월 25일
I mean the frequency vector. Note that in general Fs is in the order of bandwidth, so you may need to add center frequency to it.
zozo
zozo 2012년 9월 25일
I did not get your last sentence. Can u explain it with a short example?
Honglei Chen
Honglei Chen 2012년 9월 25일
If you are sampling at, say 100MHz, and your carrier is 1GHz, your band should be between 950MHz and 1050MHz, not -50 MHz and 50 MHz.
zozo
zozo 2012년 9월 25일
okay, but Iam not dealing with radio frequencies. Infact Iam dealing with very low frequencies (of the order 2Hz to 200Hz). And my microphones are so placed that it gives a 'nice' beampattern only after 500Hz to 1.2KHz. If i use signals with low frequencies, then my beampattern is somehow broadened(due to large wavelength). Can u suggest some method so that I can improve the array performance for low frequencies without having to alter the array elements?
Honglei Chen
Honglei Chen 2012년 9월 25일
Can you rearrange the array? If your desired signal is less than 200Hz, then you should construct your array that way too. Seems that your array is designed for 500Hz to 1.2kHz?
zozo
zozo 2012년 9월 25일
Yes sir. After some simulations, I found that its performance is best between 500Hz and 1.2KHz. If its less that 500Hz, then the beampattern gets broadened and imprecise(unable to localise source correctly). If its greater than 1.2Khz, then energy in the sidelobes get stronger and surpass mainlobe energy resulting in mainlobe suppression. Can you suggest some ideas?
Honglei Chen
Honglei Chen 2012년 9월 25일
That's why I ask whether you can rearrange the array. In general, the spacing within the array is determined by the highest frequency to avoid aliasing
zozo
zozo 2012년 9월 25일
편집: zozo 2012년 9월 25일
okay..is there a math formula to compute the spacing between the microphones? 1-200Hz is my frequency band of interest. (Note: my array is asymmetric with 8 mics placed at different heights relative to one another)
Honglei Chen
Honglei Chen 2012년 9월 26일
For an arbitrary shaped array (sounds like your situation), I don't think there are a lot of theoretical results. It's a design problem you need to solve.
zozo
zozo 2012년 9월 27일
편집: zozo 2012년 9월 28일
okay. And once more, I have tried estimating the spectral matrix from the data and adaptively place notches, but somehow it does not work. :-( I know that with increasing the data length and therefore the length of averaging, the estimated spectral matrix should converge to the true spectral matrix and so should the corresponding beampatterns. However, with true spectral matrix, i get perfect suppression and undistorted signal of interest. Just to sum up the main points of matrix estimation:
1) consider a data matrix 8x102400 [8 channels and 102400 samples(signal of duration 10seconds) with fs=10240].
2) divide the signal into 100 non-overlapping blocks each of size 8x1024.
3) consider the 1st block, take FFT of each channel to get 8x1024 matrix of complex numbers resulting due to FFT, in which 2:512 are positive freqs and 514:1024 are negative frequencies(complex conjugates of positive freqs) 1DC component and 1 Nyquist freq component at fs/2
4) Repeat the FFT for all 100 blocks(channel-wise).
5) Take the first column vector(8x1) from first block, first column(8x1) from second block and so on.. first column from 100th block to form an 8x100 matrix (say Sxx(1)).
6) Compute 1/100*(Sxx(1)*Sxx(1)') to get the spectral matrix for first bin.
7) multiply the resulting 8x8 spectral matrix with the steering vector 'a' (8x1) computed by exp(i*2*pi*D*omega(1)), to get the 8x1 weighting vector for first bin.
8) repeat the steps 5-7 for all 1024 bins to get 8x1024 steering vectors.
9) Finally, take FFT of data block again and apply the above computed steering vectors to the block of 1024 data length, take IFFT to get the beamformed signals in time domain.
10) Repeat the above steps for all look directions
Am I missing a trick?

댓글을 달려면 로그인하십시오.

zohar
zohar 2012년 10월 9일

0 개 추천

Hi zozo,
You allready posted a question
Combining the two questions ,evrything looks OK!
1) What is the shape of the array ? In the previous question you mentiond that it's spherical shape.
2) It's seems that in step 9 you want to go back to time domain, I do not understand what you doing ! can you supply the relevant matlab code ?
3) Insted of steps 7-9 calc P - the narrowband power spectrum, where P is:
P = zeros(Nbins,Nbeam)
for k = 1:Nbins
% for each bin
% calc A - sterring matrix.
% calc IRf - Inverse spatial covariance matrix.
P(k,:) = real(Nbeam./sum(A'*IRf*A));
end
Now calc
Plog = 20*log10(P);
mesh(Plog);
And let me know what the result is...

댓글 수: 3

zozo
zozo 2012년 10월 14일
1) the shape is close to spherical/cylindrical. Actually its an arbitrary array with mics placed at arbitrary locations and heights.
2) Iam carrying out the beamforming using in freq domain. Therefore, Iam computing spectral matrix(as opposed to covariance matrix of TD), then the steering vector and multiplying it with the fft of signal recorded and then ifft to get back the beamformed signals in TD.
3) What is Nbeam in your code?
zohar
zohar 2012년 10월 24일
Nbeam is number of beams acorrding to sterring matrix. Let me help you do step (3) and supply matlab code I think yor are missing something befor ifft .
Have fun
zozo
zozo 2012년 10월 25일
편집: zozo 2012년 10월 25일
thank you for offering help. I have mailed you the function I have written to estimate the covariance(spectral) matrix. Please have a look and correct me if I am wrong somewhere.

댓글을 달려면 로그인하십시오.

Gu
Gu 2012년 11월 22일

0 개 추천

How to generate wideband signal for wideband time domain beamforming.

댓글 수: 1

zozo
zozo 2012년 11월 22일
use randn() to produce a gaussian distributed random sequence. and band pass filter it to have your desired band of frequencies. u can check it using magnitude plot of fft()

댓글을 달려면 로그인하십시오.

질문:

2012년 9월 22일

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by