Этот пример иллюстрирует применение цифрового формирования луча к узкополосному сигналу, принимаемому антенной решеткой. Проиллюстрированы три алгоритма формирования луча: Фаза смещение луча (PhaseShift), минимальное отклонение искажение отклика (MVDR) beamformer и линейно ограниченное минимальное отклонение (LCMV) beamformer.
Во-первых, зададим входящий сигнал. Представление полосы частот сигнала является простым прямоугольным импульсом, как задано ниже:
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 Вт, что соответствует отношению сигнал/шум (ОСШ) 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)');
Beamformer может рассматриваться как пространственный фильтр, который подавляет сигнал со всех направлений, кроме требуемых таковых. Обычный формирователь луча просто задерживает принятый сигнал в каждой антенне, так что сигналы выравниваются так, как если бы они поступали ко всем антеннам одновременно. В узкополосном случае это эквивалентно умножению сигнала, принятого в каждой антенне, на фазовый коэффициент. Чтобы задать светоформер сдвига фазы, указывающий на входное направление сигнала, мы используем
psbeamformer = phased.PhaseShiftBeamformer('SensorArray',ula,... 'OperatingFrequency',carrierFreq,'Direction',inputAngle,... 'WeightsOutputPort', true);
Теперь мы можем получить выходной сигнал и весовые коэффициенты от beamformer.
[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);
Чтобы проиллюстрировать эффект интерференции, мы снизим уровень шума до минимального уровня. Для остальной части примера давайте примем высокое значение ОСШ 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
Сначала мы попытаемся применить фазу shift beamformer, чтобы извлечь сигнал вдоль входящего направления.
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 beamformer, популярный адаптивный beamformer. Блок формирования луча MVDR сохраняет сигнал, поступающий в требуемом направлении, пытаясь подавить сигналы, поступающие из других направлений. В этом случае требуемый сигнал находится в направлении 45 степеней по азимуту.
% Define the MVDR beamformer mvdrbeamformer = phased.MVDRBeamformer('SensorArray',ula,... 'Direction',inputAngle,'OperatingFrequency',carrierFreq,... 'WeightsOutputPort',true);
Когда у нас есть доступ к данным без целевого устройства, мы можем предоставить такую информацию beamformer MVDR, задав для свойства TrainingInportPort значение 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 beamformer рассматривает все сигналы, за исключением того, который находится в желаемом направлении, как нежелательные помехи. Этот эффект иногда упоминается как «self nulling» сигнала.
Чтобы проиллюстрировать этот эффект обнуления, зададим beamformer MVDR и зададим свойство TrainingInportPort равным false.
mvdrbeamformer_selfnull = phased.MVDRBeamformer('SensorArray',ula,... 'Direction',inputAngle,'OperatingFrequency',carrierFreq,... 'WeightsOutputPort',true,'TrainingInputPort',false);
Затем создадим несоответствие направления между направлением входящего сигнала и желаемым направлением.
Напомним, что сигнал падает от 45 степеней по азимуту. Если с некоторой априорной информацией мы ожидаем, что сигнал придет от 43 степеней по азимуту, то мы используем 43 степени по азимуту в качестве желаемого направления в MVDR beamformer. Однако, поскольку действительный сигнал достигает 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);
Теперь нам нужно создать несколько ограничений. Чтобы задать ограничение, мы поместим соответствующие записи как в матрицу ограничений, Constraint, так и в желаемый вектор отклика DesiredResponse. Каждый столбец в Ограничении является набором весов, которые мы можем применить к массиву, и соответствующая запись в DesiredResponse является желаемым ответом, которого мы хотим достичь, когда веса применяются. Например, чтобы избежать собственного обнуления в этом примере, мы можем захотеть добавить следующие ограничения к beamformer:
Сохраните входящий сигнал с ожидаемого направления (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 создает ядро.
В этом разделе мы иллюстрируем использование beamformer с равномерным прямоугольным массивом (URA). Beamformer может быть применен к 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)');
Чтобы ясно видеть, что beamformer помещает nulls вдоль направлений интерференции, мы построим диаграмму направленности beamformer массива на -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-формирователь луча является предпочтительным, потому что он препятствует самосужению сигнала.