Beamforming achieved by multiplying the sensor input by a complex exponential with the appropriate phase shift only applies for narrowband signals. In the case of wideband, or broadband, signals, the steering vector is not a function of a single frequency.
Phased Array System Toolbox™ software provides conventional and adaptive wideband beamformers. They include:
This example shows how to perform wideband conventional time-delay beamforming with a microphone array.
Create an acoustic (pressure wave) chirp signal. The chirp signal has a bandwidth of 1 kHz and propagates at a speed of 340 m/s at sea level.
c = 340; % speed of sound at sea level t = linspace(0,1,5e4)'; sig = chirp(t,0,1,1e3);
Collect the acoustic chirp with a ten-element ULA. Use omnidirectional microphone elements spaced less than one-half the wavelength of the 50 kHz sampling frequency. The chirp is incident on the ULA with an angle of 45 degrees azimuth and 0 degrees elevation.
hmic = phased.OmnidirectionalMicrophoneElement(... 'FrequencyRange',[20 20e3]); hula = phased.ULA('Element',hmic,'NumElements',10,... 'ElementSpacing',0.01); hcol = phased.WidebandCollector('Sensor',hula,'SampleRate',5e4,... 'PropagationSpeed',c,'ModulatedInput',false); sigang = [60; 0]; rsig = step(hcol,sig,sigang); rsig = rsig+0.3*randn(size(rsig));
Apply a wideband conventional time-delay beamformer to improve the SNR of the received signal.
htbf = phased.TimeDelayBeamformer('SensorArray',hula,... 'SampleRate',5e4,'PropagationSpeed',c,'Direction',sigang); y = step(htbf,rsig); subplot(2,1,1); plot(t(1:5e3),real(rsig(1:5e3,5))); title('Signal (real part) at the 5th element of the ULA'); subplot(2,1,2); plot(t(1:5e3),real(y(1:5e3))); title('Signal (real part) with time-delay beamforming'); xlabel('Seconds');
See Acoustic Beamforming Using a Microphone Array for an example of using wideband beamforming to extract speech signals in noise.
This example shows how to plot the response of an antenna element and an array, to help validate the performance of a beamformer. The array must maintain an acceptable array pattern throughout the bandwidth.
Create a uniform linear array of cosine antenna elements.
c = 340; freq = [1e3 2.75e3]; fc = 2e3; numels = 11; h = phased.CosineAntennaElement('FrequencyRange',freq); ha = phased.ULA('NumElements',numels,... 'ElementSpacing',0.5*c/fc,'Element',h);
Plot the response pattern of the antenna element over a series of frequencies.
plotFreq = linspace(min(freq),max(freq),15); figure; plotResponse(h,plotFreq,'OverlayFreq',false);
The plot shows that the element pattern is constant over the entire bandwidth.
Plot the response pattern of the 11-element array over the same series of frequencies.
Apply a subband phase shift beamformer to the array. The direction of interest is 30 degrees azimuth and 0 degrees elevation.
direction = [30;0]; numbands = 8; hbf = phased.SubbandPhaseShiftBeamformer('SensorArray',ha,... 'Direction',direction,... 'OperatingFrequency',fc,'PropagationSpeed',c,... 'SampleRate',1e3,... 'WeightsOutputPort',true,'SubbandsOutputPort',true,... 'NumSubbands',numbands); rx = ones(numbands,numels); [y,w,centerFreq] = step(hbf,rx);
Plot the response pattern of the array again, using the weights and center frequencies from the beamformer.
The plot shows the beamformed pattern at the center frequency of each subband.
Plot the response pattern at selected frequencies using a two-dimensional format.
centerFreq = fftshift(centerFreq); w = fftshift(w,2); idx = [1 5 8]; figure; plotResponse(ha,centerFreq(idx)',c,'Weights',w(:,idx)); legend('Location','South')
This plot shows that the main beam direction remains constant, but the beam width decreases with frequency.