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. Wideband processing is commonly used in microphone and acoustic applications.
Phased Array System Toolbox™ software provides conventional and adaptive wideband beamformers. They include:
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 perform wideband conventional time-delay beamforming with a microphone array of omnidirectional elements. 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 ground level.
c = 340; t = linspace(0,1,5e4)'; sig = chirp(t,0,1,1000);
Collect the acoustic chirp with a ten-element ULA. Use omnidirectional microphone elements spaced less than one-half the wavelength at the 50 kHz sampling frequency. The chirp is incident on the ULA with an angle of 45 degrees azimuth and 0 degrees elevation. Add random noise to the signal.
sMic = phased.OmnidirectionalMicrophoneElement(... 'FrequencyRange',[20 20e3]); sULA = phased.ULA('Element',sMic,'NumElements',10,... 'ElementSpacing',0.01); sColl = phased.WidebandCollector('Sensor',sULA,'SampleRate',5e4,... 'PropagationSpeed',c,'ModulatedInput',false); sigang = [60;0]; rsig = step(sColl,sig,sigang); rsig = rsig + 0.1*randn(size(rsig));
Apply a wideband conventional time-delay beamformer to improve the SNR of the received signal.
sTDF = phased.TimeDelayBeamformer('SensorArray',sULA,... 'SampleRate',5e4,'PropagationSpeed',c,'Direction',sigang); y = step(sTDF,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')
This example shows how to plot the response of an acoustic microphone element and an array of these elements to validate the performance of a beamformer. The array must maintain an acceptable array pattern throughout the bandwidth.
Create a uniform linear array (ULA) of cosine antenna elements. The
phased.CosineAntennaElement System object™ is general enough to be used as a microphone element as well because it creates or receives a scalar field. You need to change the response frequencies to the audible range. In addition make sure the
PropagationSpeed parameter in the array
pattern methods are set to the speed of sound.
c = 340; freq = [1000 2750]; fc = 2000; numels = 11; sCosMic = phased.CosineAntennaElement('FrequencyRange',freq); sULA = phased.ULA('NumElements',numels,... 'ElementSpacing',0.5*c/fc,'Element',sCosMic);
Plot the response pattern of the microphone element over a set of frequencies.
plotFreq = linspace(min(freq),max(freq),15); pattern(sCosMic,plotFreq,[-180:180],0,'CoordinateSystem','rectangular',... 'PlotStyle','waterfall','Type','powerdb')
This plot shows that the element pattern is constant over the entire bandwidth.
Plot the response pattern of an 11-element array over the same set of frequencies.
This plot shows that the element pattern mainlobe decreases with frequency.
Apply a subband phase shift beamformer to the array. The direction of interest is 30° azimuth and 0° elevation. There are 8 subbands.
direction = [30;0]; numbands = 8; sPSB = phased.SubbandPhaseShiftBeamformer('SensorArray',sULA,... 'Direction',direction,... 'OperatingFrequency',fc,'PropagationSpeed',c,... 'SampleRate',1e3,... 'WeightsOutputPort',true,'SubbandsOutputPort',true,... 'NumSubbands',numbands); rx = ones(numbands,numels); [y,w,centerfreqs] = step(sPSB,rx);
Plot the response pattern of the array using the weights and center frequencies from the beamformer.
The above plot shows the beamformed pattern at the center frequency of each subband.
Plot the response pattern at three frequencies in two-dimensions.
centerfreqs = fftshift(centerfreqs); w = fftshift(w,2); idx = [1,5,8]; pattern(sULA,centerfreqs(idx).',[-180:180],0,'Weights',w(:,idx),'CoordinateSystem','rectangular',... 'PlotStyle','overlay','Type','powerdb','PropagationSpeed',c) legend('Location','South')
This plot shows that the main beam direction remains constant while the beamwidth decreases with frequency.