Этот пример иллюстрирует, как применить цифровой 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 сохраняет сигнал, прибывающий вдоль желаемого направления при попытке подавить сигналы, прибывающие из других направлений. В этом случае желаемый сигнал является в направлении 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 на ложь.
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. Каждый столбец в Ограничении является набором весов, мы можем обратиться к массиву, и соответствующая запись в 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 предпочтителен, потому что это предотвращает самообнуление сигнала.