# How to separate signals from different directions

17 views (last 30 days)
Rachael Hardman on 13 Dec 2016
Commented: Honglei Chen on 20 Dec 2016
I'm attempting to beamform some data which has signals coming from all directions in a 180 degree range.
I found the example of using the phased array toolbox to beamform in https://uk.mathworks.com/help/phased/examples/conventional-and-adaptive-beamformers.html however, when I added a second signal from a different direction, the results aren't what I would expect.
If the two signals are coming from directions which are symmetrical about 90 degrees, i.e. 30 and 150 or 70 and 110, the beam forming algorithm cannot separate them. Is there a way of suppressing the signal coming from the other direction?
The code below is an example of what I mean where two signals are incoming from 30 and 150 degrees and then the beamforming algorithm is trying to isolate the signal from 30 degrees.
clear;
clc;
close;
t = 0:0.001:0.3; % Time, sampling frequency is 1kHz
s = zeros(size(t));
s = s(:); % Signal in column vector
s(201:205) = s(201:205) + 1; % Define the pulse
s_2 = zeros(size(t));
s_2 = s_2(:); % Signal in column vector
s_2(41:47) = s_2(41:47) + 1; % Define the pulse
figure(1)
plot(t,s, t, s_2);
title('Pulse');xlabel('Time (s)');ylabel('Amplitude (V)');
carrierFreq = 30e6;
wavelength = physconst('LightSpeed')/carrierFreq;
ula = phased.ULA('NumElements',10,'ElementSpacing',wavelength/2);
ula.Element.FrequencyRange = [90e5 110e6];
inputAngle = [30; 0];
x = collectPlaneWave(ula,s,inputAngle,carrierFreq);
inputAngle2 = [150; 0];
x2 = collectPlaneWave(ula,s_2,inputAngle2,carrierFreq);
rs = RandStream.create('mt19937ar','Seed',2008);
noisePwr = .5; % noise power
noise = sqrt(noisePwr/2)*(randn(rs,size(x))+1i*randn(rs,size(x)));
rxSignal = x + x2 + noise;
figure()
subplot(211);
plot(t,abs(rxSignal(:,1)));axis tight;
title('Pulse at Antenna 1');xlabel('Time (s)');ylabel('Magnitude (V)');
subplot(212);
plot(t,abs(rxSignal(:,2)));axis tight;
title('Pulse at Antenna 2');xlabel('Time (s)');ylabel('Magnitude (V)');
psbeamformer = phased.PhaseShiftBeamformer('SensorArray',ula,...
'OperatingFrequency',carrierFreq,'Direction',inputAngle,...
'WeightsOutputPort', true);
[yCbf,w] = step(psbeamformer, rxSignal);
figure()
plot(t,abs(yCbf)); axis tight;
title('Output of Phase Shift Beamformer');
xlabel('Time (s)');ylabel('Magnitude (V)');

Honglei Chen on 19 Dec 2016
The result you see is due to the symmetry of the array. You can think the array as a spatial filter. For a ULA, it can distinguish two directions if these two directions make different angles with the array axis. Therefore, in a 3D space, you can think of that the iso-angle surfaces for a ULA make up cones around the array axis. In your example, like you have observed, because 30 degrees and 150 degrees both are 60 degrees from the array axis, from the array perspective, they are the same. Just like a frequency domain filter that cannot separate two signals in the same frequency, the spatial filter fails to separate two signals that appear to be at the identical angle from the array.
There are ways to get around it. One possible way is to use a element pattern that is not isotropic. For example, if you use an array with cosine element, like
ula = phased.ULA('NumElements',10,'ElementSpacing',wavelength/2,...
'Element',phased.CosineAntennaElement);
Then the array only looks toward the forward direction and only the signal from 30 degrees will be received. Another way is to explore the time/frequency domain characteristics of the signals. If the two signals are orthogonal in time domain, then even though they cannot be separated in space, they can be separated via some time domain processing.
HTH

Rachael Hardman on 19 Dec 2016
Many thanks, Rachael
Honglei Chen on 20 Dec 2016
CosineAntennaElement simply simulates a pattern with Cosine shape. It is like a pencil beam and there is no backlobe. It is an idealized pattern but could come handy when you want to test things out.
HTH