Обычные и адаптивные формирователи луча

Этот пример иллюстрирует, как применить цифровой beamforming к узкополосному сигналу, полученному антенной решеткой. Проиллюстрированы три beamforming алгоритма: формирователь луча сдвига фазы (PhaseShift), формирователь луча минимального отклонения ответа без искажений (MVDR) и формирователь луча линейно ограниченного минимального отклонения (LCMV).

Симуляция полученного сигнала

Во-первых, мы задаем входящий сигнал. Основополосное представление сигнала является простым меандром, как задано ниже:

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
plot(t,s);
title('Pulse');xlabel('Time (s)');ylabel('Amplitude (V)');

В данном примере мы также принимаем, что несущая частота сигнала составляет 100 МГц.

carrierFreq = 100e6;
wavelength = physconst('LightSpeed')/carrierFreq;

Мы теперь задаем универсальную линейную матрицу (ULA), используемую, чтобы получить сигнал. Массив содержит 10 изотропных антенн. Интервал элемента является половиной длины волны входящей волны.

ula = phased.ULA('NumElements',10,'ElementSpacing',wavelength/2);
ula.Element.FrequencyRange = [90e5 110e6];

Затем мы используем collectPlaneWave метод объекта массивов моделировать полученный сигнал в массиве. Примите, что сигнал прибывает в массив от 45 градусов в области азимута и 0 градусов в области повышения, полученный сигнал может быть смоделирован как

inputAngle = [45; 0];
x = collectPlaneWave(ula,s,inputAngle,carrierFreq);

Полученный сигнал часто включает некоторые тепловые помехи. Шум может быть смоделирован как комплексные, Гауссовы распределенные случайные числа. В этом примере мы принимаем, что шумовая степень составляет 0,5 ватта, который соответствует отношению сигнал-шум (SNR) на 3 дБ в каждом элементе антенны.

% Create and reset a local random number generator so the result is the
% same every time.
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 + noise;

Совокупный доход имеет десять столбцов, где каждый столбец соответствует одному элементу антенны. График ниже показов график значения сигнала для первых двух каналов

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] = psbeamformer(rxSignal);
% Plot the output
clf;
plot(t,abs(yCbf)); axis tight;
title('Output of Phase Shift Beamformer');
xlabel('Time (s)');ylabel('Magnitude (V)');

От фигуры мы видим, что сигнал становится намного более сильным по сравнению с шумом. Вывод SNR приблизительно в 10 раз более силен, чем тот из полученного сигнала на одной антенне, потому что массив с 10 элементами производит усиление массивов 10.

Чтобы видеть диаграмму направленности формирователя луча, мы строим ответ массивов вдоль 0 повышений степеней с примененными весами. Поскольку массив является ULA с изотропными элементами, он имеет неоднозначность впереди и заднюю часть массива. Поэтому мы только строим между-90 и 90 градусами в области азимута.

% Plot array response with weighting
pattern(ula,carrierFreq,-180:180,0,'Weights',w,'Type','powerdb',...
    'PropagationSpeed',physconst('LightSpeed'),'Normalize',false,...
    'CoordinateSystem','rectangular');
axis([-90 90 -60 0]);

Вы видите, что основной луч формирователя луча указывает в желаемом направлении (45 градусов), как ожидалось.

Затем, мы используем формирователь луча, чтобы улучшить полученный сигнал при интерференционных условиях. В присутствии сильной интерференции целевой сигнал может быть замаскирован интерференционным сигналом. Например, интерференция от соседней радиомачты может ослепить антенную решетку в том направлении. Если радио-сигнал достаточно силен, он может ослепить радар в нескольких направлениях, особенно когда желаемый сигнал получен боковым лепестком. Такие сценарии очень сложны для формирователя луча сдвига фазы, и поэтому, адаптивные формирователи луча введены, чтобы решить эту проблему.

Моделирование интерференционных сигналов

Мы моделируем два интерференционных сигнала, прибывающие от 30 градусов и 50 градусов в области азимута. Интерференционные амплитуды намного выше, чем желаемый сигнал, показанный в предыдущем сценарии.

nSamp = length(t);
s1 = 10*randn(rs,nSamp,1);
s2 = 10*randn(rs,nSamp,1);
% interference at 30 degrees and 50 degrees
interference = collectPlaneWave(ula,[s1 s2],[30 50; 0 0],carrierFreq);

Чтобы проиллюстрировать эффект интерференции, мы будем уменьшать уровень шума до минимального уровня. Для остальной части примера давайте примем высокое значение ОСШ 50 дБ в каждой антенне. Мы будем видеть, что даже при том, что нет почти никакого шума, одна только интерференция может заставить фазу переключить сбой формирователя луча.

noisePwr = 0.00001;   % noise power, 50dB SNR 
noise = sqrt(noisePwr/2)*(randn(rs,size(x))+1i*randn(rs,size(x)));

rxInt = interference + noise;                 % total interference + noise
rxSignal = x + rxInt;                % total received Signal

Во-первых, мы попытаемся применяться, фаза переключают формирователь луча, чтобы получить сигнал вдоль входящего направления.

yCbf = psbeamformer(rxSignal);

plot(t,abs(yCbf)); axis tight;
title('Output of Phase Shift Beamformer With Presence of Interference');
xlabel('Time (s)');ylabel('Magnitude (V)');

От фигуры мы видим, что, потому что интерференционные сигналы намного более сильны, чем целевой сигнал, мы не можем извлечь содержимое сигнала.

Формирователь луча MVDR

Чтобы преодолеть интерференционную проблему, мы можем использовать формирователь луча MVDR, популярный адаптивный формирователь луча. Формирователь луча MVDR сохраняет сигнал, прибывающий вдоль желаемого направления при попытке подавить сигналы, прибывающие из других направлений. В этом случае желаемый сигнал является в направлении 45 градусами в области азимута.

% Define the MVDR beamformer
mvdrbeamformer = phased.MVDRBeamformer('SensorArray',ula,...
    'Direction',inputAngle,'OperatingFrequency',carrierFreq,...
    'WeightsOutputPort',true);

Когда у нас есть доступ к данным без целей, мы можем предоставить такую информацию формирователю луча MVDR путем установки свойства TrainingInputPort на истину.

mvdrbeamformer.TrainingInputPort = true;

Мы применяем формирователь луча MVDR к полученному сигналу. График показывает выходной сигнал формирователя луча MVDR. Вы видите, что целевой сигнал может теперь быть восстановлен.

[yMVDR, wMVDR] = mvdrbeamformer(rxSignal,rxInt);

plot(t,abs(yMVDR)); axis tight;
title('Output of MVDR Beamformer With Presence of Interference');
xlabel('Time (s)');ylabel('Magnitude (V)');

Смотря на шаблон ответа формирователя луча, мы видим два глубоких пустых указателя вдоль интерференционных направлений, (30 и 50 градусов). Формирователь луча также имеет усиление 0 дБ вдоль целевого направления 45 градусов. Таким образом формирователь луча MVDR сохраняет целевой сигнал и подавляет интерференционные сигналы.

pattern(ula,carrierFreq,-180:180,0,'Weights',wMVDR,'Type','powerdb',...
    'PropagationSpeed',physconst('LightSpeed'),'Normalize',false,...
    'CoordinateSystem','rectangular');
axis([-90 90 -80 20]);

hold on;   % compare to PhaseShift
pattern(ula,carrierFreq,-180:180,0,'Weights',w,...
    'PropagationSpeed',physconst('LightSpeed'),'Normalize',false,...
    'Type','powerdb','CoordinateSystem','rectangular');
hold off;
legend('MVDR','PhaseShift')

Также показанный в фигуре шаблон ответа от PhaseShift. Мы видим, что шаблон PhaseShift не аннулирует интерференцию вообще.

Сам аннулирующий проблему в MVDR

Во многих случаях мы не можем смочь разделить интерференцию от целевого сигнала, и поэтому, формирователь луча MVDR должен вычислить веса с помощью данных, которые включают целевой сигнал. В этом случае, если целевой сигнал получен вдоль направления, немного отличающегося от желаемого, формирователь луча MVDR подавляет его. Это происходит, потому что формирователь луча MVDR обрабатывает все сигналы, кроме того вдоль желаемого направления, как нежелательная интерференция. Этот эффект иногда упоминается как "сигнал сам обнуление".

Чтобы проиллюстрировать это сам обнуление эффекта, мы задаем формирователь луча MVDR и устанавливаем свойство TrainingInputPort на ложь.

mvdrbeamformer_selfnull = phased.MVDRBeamformer('SensorArray',ula,...
    'Direction',inputAngle,'OperatingFrequency',carrierFreq,...
    'WeightsOutputPort',true,'TrainingInputPort',false);

Мы затем создаем несоответствие направления между направлением входящего сигнала и желаемым направлением.

Вспомните, что сигнал посягает от 45 градусов в области азимута. Если с некоторой априорной информацией мы ожидаем сигнал прибыть от 43 градусов в области азимута, то мы используем 43 градуса в области азимута как желаемое направление в формирователе луча MVDR. Однако, поскольку действительный сигнал прибывает в 45 градусов в области азимута, в направлении сигнала существует небольшое несоответствие.

expDir = [43; 0];
mvdrbeamformer_selfnull.Direction = expDir;

Когда мы применяем формирователь луча MVDR к полученному сигналу, мы видим, что получатель не может дифференцировать целевой сигнал и интерференцию.

[ySn, wSn] = mvdrbeamformer_selfnull(rxSignal);

plot(t,abs(ySn)); axis tight;
title('Output of MVDR Beamformer With Signal Direction Mismatch');
xlabel('Time (s)');ylabel('Magnitude (V)');

Когда мы смотрим на шаблон ответа формирователя луча, мы видим, что формирователь луча MVDR пытается подавить сигнал, прибывающий вдоль 45 градусов, потому что это обработано как интерференционный сигнал. Формирователь луча MVDR очень чувствителен к регулирующему сигнал векторному несоответствию, особенно когда мы не можем предоставить интерференционную информацию.

pattern(ula,carrierFreq,-180:180,0,'Weights',wSn,'Type','powerdb',...
    'PropagationSpeed',physconst('LightSpeed'),'Normalize',false,...
    'CoordinateSystem','rectangular');
axis([-90 90 -40 25]);

Формирователь луча LCMV

Чтобы предотвратить самообнуление сигнала, мы можем использовать формирователь луча LCMV, который позволяет нам помещать несколько ограничений вдоль целевого направления (регулирующий вектор). Это уменьшает шанс, что целевой сигнал будет подавлен, когда это прибудет в немного отличающийся угол от желаемого направления. Сначала мы создаем формирователь луча LCMV:

lcmvbeamformer = phased.LCMVBeamformer('WeightsOutputPort',true);

Теперь мы должны создать несколько ограничений. Чтобы задать ограничение, мы помещаем соответствующие записи и в матрицу ограничений, Ограничение, и в желаемый вектор отклика, DesiredResponse. Каждый столбец в Ограничении является набором весов, мы можем обратиться к массиву, и соответствующая запись в DesiredResponse является желаемым ответом, которого мы хотим достигнуть, когда веса применяются. Например, чтобы избежать сам аннулирующий в этом примере, мы можем хотеть добавить следующие ограничения в формирователь луча:

  • Сохраните входящий сигнал от ожидаемого направления (43 градуса в области азимута).

  • Чтобы избежать сам обнуление, гарантируйте, что ответ формирователя луча не уменьшится в +/-2 градуса ожидаемого направления.

Для всех ограничений веса даны держащимися векторами, которые регулируют массив к тем направлениям:

steeringvec = phased.SteeringVector('SensorArray',ula);
stv = steeringvec(carrierFreq,[43 41 45]);

Желаемые ответы должны быть 1 для всех трех направлений. Матрицей ограничений и DesiredResponse дают:

lcmvbeamformer.Constraint = stv;
lcmvbeamformer.DesiredResponse = [1; 1; 1];

Затем мы применяем формирователь луча к полученному сигналу. График ниже показов, что целевой сигнал может быть обнаружен снова даже при том, что существует несоответствие между желаемым и истинным сигналом, прибывающим направление.

[yLCMV,wLCMV] = lcmvbeamformer(rxSignal);

plot(t,abs(yLCMV)); axis tight;
title('Output of LCMV Beamformer With Signal Direction Mismatch');
xlabel('Time (s)');ylabel('Magnitude (V)');

Шаблон ответа LCMV показывает, что формирователь луча помещает ограничения вдоль заданных направлений при обнулении интерференционных сигналов вдоль 30 и 50 градусов. Здесь мы только показываем шаблон между 0 и 90 градусами в области азимута так, чтобы мы видели поведение шаблона ответа в и интерференционных направлениях сигнала лучше.

pattern(ula,carrierFreq,-180:180,0,'Weights',wLCMV,'Type','powerdb',...
    'PropagationSpeed',physconst('LightSpeed'),'Normalize',false,...
    'CoordinateSystem','rectangular');
axis([0 90 -40 35]);

hold on;  % compare to MVDR
pattern(ula,carrierFreq,-180:180,0,'Weights',wSn,...
    'PropagationSpeed',physconst('LightSpeed'),'Normalize',false,...
    'Type','powerdb','CoordinateSystem','rectangular');
hold off;
legend('LCMV','MVDR');

Эффект ограничений может быть лучше замечен при сравнении шаблона ответа формирователя луча LCMV с шаблоном ответа формирователя луча MVDR. Заметьте, как формирователь луча LCMV может поддержать плоскую область ответа вокруг этих 45 градусов в области азимута, в то время как формирователь луча MVDR создает пустой указатель.

2D массив Beamforming

В этом разделе мы иллюстрируем использование формирователя луча с универсальным прямоугольным массивом (URA). Формирователь луча может быть применен к URA таким же образом относительно ULA. Мы только иллюстрируем формирователь луча MVDR для URA в этом примере. Использования других алгоритмов подобны.

Во-первых, мы задаем URA. URA состоит из 10 строк и 5 столбцов изотропных элементов антенны. Интервал между строками и столбцами является 0,4 и 0,5 длинами волны, соответственно.

colSp = 0.5*wavelength;
rowSp = 0.4*wavelength;
ura = phased.URA('Size',[10 5],'ElementSpacing',[rowSp colSp]);
ura.Element.FrequencyRange = [90e5 110e6];

Рассмотрите тот же исходный сигнал, как использовался в предыдущих разделах. Исходный сигнал прибывает в URA от 45 градусов в области азимута и 0 градусов в области повышения. Полученный сигнал, включая шум в массиве, может быть смоделирован как

x = collectPlaneWave(ura,s,inputAngle,carrierFreq);
noise = sqrt(noisePwr/2)*(randn(rs,size(x))+1i*randn(rs,size(x)));

В отличие от ULA, который может только дифференцировать углы в направлении азимута, URA может также дифференцировать углы в направлении повышения. Поэтому мы задаем два интерференционных сигнала, прибывающие вдоль направлений [30; 10] и [50;-5] степени, соответственно.

s1 = 10*randn(rs,nSamp,1);
s2 = 10*randn(rs,nSamp,1);

%interference at [30; 10] and at [50; -5]
interference = collectPlaneWave(ura,[s1 s2],[30 50; 10 -5],carrierFreq);
rxInt = interference + noise;                 % total interference + noise
rxSignal = x + rxInt;                % total received signal

Мы теперь создаем формирователь луча MVDR, указывающий на целевое направление сигнала.

mvdrbeamformer = phased.MVDRBeamformer('SensorArray',ura,...
    'Direction',inputAngle,'OperatingFrequency',carrierFreq,...
    'TrainingInputPort',true,'WeightsOutputPort',true);

Наконец, мы применяем формирователь луча MVDR к полученному сигналу и строим его вывод.

[yURA,w]= mvdrbeamformer(rxSignal,rxInt);

plot(t,abs(yURA)); axis tight;
title('Output of MVDR Beamformer for URA');
xlabel('Time (s)');ylabel('Magnitude (V)');

Чтобы видеть ясно, что формирователь луча помещает пустые указатели вдоль интерференционных направлений, мы построим шаблон ответа формирователя луча массива вдоль-5 градусов и 10 градусов в области повышения, соответственно. Данные показывают, что формирователь луча подавляет интерференционные сигналы вперед [30 10] и [50 - 5] направления.

subplot(2,1,1);
pattern(ura,carrierFreq,-180:180,-5,'Weights',w,'Type','powerdb',...
    'PropagationSpeed',physconst('LightSpeed'),'Normalize',false,...
    'CoordinateSystem','rectangular');
title('Response Pattern at -5 Degrees Elevation');
axis([-90 90 -60 -5]);
subplot(2,1,2);
pattern(ura,carrierFreq,-180:180,10,'Weights',w,'Type','powerdb',...
    'PropagationSpeed',physconst('LightSpeed'),'Normalize',false,...
    'CoordinateSystem','rectangular');
title('Response Pattern at 10 Degrees Elevation');
axis([-90 90 -60 -5]);

Сводные данные

В этом примере мы проиллюстрировали, как использовать формирователь луча, чтобы получить сигнал из конкретного направления с помощью ULA или URA. Выбор формирователя луча зависит от операционной среды. Адаптивные формирователи луча обеспечивают превосходящее интерференционное отклонение по сравнению с предлагаемым обычными формирователями луча. Когда знание о целевом направлении не точно, формирователь луча LCMV предпочтителен, потому что это предотвращает самообнуление сигнала.