Этот пример иллюстрирует, как применять цифровое формирование луча к узкополосному сигналу, принятому антенной решеткой. Иллюстрируются три алгоритма формирования луча: формирователь луча фазового сдвига (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)');

На рисунке видно, что сигнал становится намного сильнее по сравнению с шумом. Выходное ОСШ приблизительно в 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);Чтобы проиллюстрировать эффект помех, мы уменьшим уровень шума до минимального уровня. В остальном примере допустим высокое значение SNR 50dB на каждой антенне. Мы увидим, что хотя шума почти нет, помехи сами по себе могут привести к отказу формирователя луча фазового сдвига.
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 сохраняет сигнал, поступающий в нужном направлении, пытаясь подавить сигналы, поступающие из других направлений. В этом случае требуемый сигнал находится в направлении 45 градусов по азимуту.
% Define the MVDR beamformer mvdrbeamformer = phased.MVDRBeamformer('SensorArray',ula,... 'Direction',inputAngle,'OperatingFrequency',carrierFreq,... 'WeightsOutputPort',true);
Если у нас есть доступ к целевым данным, мы можем предоставить такую информацию в формирователь луча MVDR, установив для свойства TrainingInputPort значение true.
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 и задайте свойству TrainingInputPort значение false.
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:
lcmvbeamformer = phased.LCMVBeamformer('WeightsOutputPort',true);Теперь нам нужно создать несколько ограничений. Чтобы задать ограничение, поместим соответствующие записи как в матрицу ограничения, так и в требуемый вектор ответа DesiredResponse. Каждый столбец в Constraint является набором весов, которые мы можем применить к массиву, и соответствующая запись в 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 создает нулевое значение.
В этом разделе иллюстрируется использование формирователя луча с однородным прямоугольным массивом (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 является предпочтительным, поскольку он предотвращает самовыделение сигнала.