В этом примере показано, как использовать Phased Array System Toolbox™, чтобы решить некоторые задачи синтеза массивов.
В поэтапных приложениях проекта массивов часто необходимо найти способ заостриться ответы элемента так, чтобы шаблон полученного массива удовлетворил определенным критериям производительности. Типичные критерии производительности включают mainlobe местоположение, пустое местоположение (местоположения) и уровни бокового лепестка.
Общее требование, когда синтезирование диаграмм направленности указывает пустой указатель к данному направлению прибытия. Это помогает подавить интерференцию от того направления и улучшает отношение сигнала к интерференции. Интерференция является не всегда злонамеренной - радиолокационная система аэропорта, возможно, должна подавить интерференцию от соседней радиостанции. В этом случае позиция радиостанции известна, и алгоритм отмены бокового лепестка может использоваться, чтобы удалить интерференцию.
Отмена бокового лепестка полезна для подавления интерференции, которая входит через боковые лепестки массива. В этом случае, потому что интерференционное направление известно, алгоритм прост. Сформируйте луч, который указывает на интерференционное направление, затем масштабируйте веса луча и вычтите масштабируемые веса из весов для диаграмм направленности, которые указывают на любое другое направление взгляда. Этот процесс всегда помещает сильный пустой указатель в интерференционное направление.
Следующий пример показывает, как спроектировать веса радара так, чтобы это отсканировало между-30 и 30 градусами, все же всегда сохраняет пустой указатель в 40 градусах. Примите, что радар использует ULA с 10 элементами, который параллелен земле и что известная радио-интерференция прибывает от 40 азимутов степеней.
c = 3e8; % signal propagation speed fc = 1e9; % signal carrier frequency lambda = c/fc; % wavelength thetaad = -30:5:30; % look directions thetaan = 40; % interference direction ula = phased.ULA(10,lambda/2); ula.Element.BackBaffled = true; % Calculate the steering vector for null directions wn = steervec(getElementPosition(ula)/lambda,thetaan); % Calculate the steering vectors for lookout directions wd = steervec(getElementPosition(ula)/lambda,thetaad); % Compute the response of desired steering at null direction rn = wn'*wd/(wn'*wn); % Sidelobe canceler - remove the response at null direction w = wd-wn*rn; % Plot the pattern pattern(ula,fc,-180:180,0,'PropagationSpeed',c,'Type','powerdb',... 'CoordinateSystem','rectangular','Weights',w); hold on; legend off; plot([40 40],[-100 0],'r--','LineWidth',2) text(40.5,-5,'\leftarrow Interference Direction','Interpreter','tex',... 'Color','r','FontSize',10)
Фигура выше показов получившиеся диаграммы направленности для направлений взгляда от-30 азимутов степеней до 30 азимутов степеней, с 5 шагом степеней. Ясно от масштабируемой фигуры ниже того, неважно, где направление взгляда, радарная диаграмма направленности имеет сильный пустой указатель в интерференционном направлении.
% Zoom xlim([30 50]) legend(arrayfun(@(k)sprintf('%d degrees',k),thetaad,... 'UniformOutput',false),'Location','SouthEast');
Другая частая проблема при разработке поэтапного массива совпадает с желаемой диаграммой направленности к спецификации, которая вручена вам. Часто, требования выражаются в терминах уровня бокового лепестка и ширины луча.
Процесс рассмотрения такой проблемы часто включает эти шаги:
Наблюдайте желаемый шаблон и решите геометрию массивов;
Выберите размер массивов на основе желаемой ширины луча;
Спроектируйте заострения на основе желаемого уровня бокового лепестка;
Выполните итерации при корректировке полученного шага 2 и 3 параметра, чтобы получить лучшее соответствие.
Следующий пример иллюстрирует эти четыре шага. Во-первых, наблюдайте желаемый шаблон, показанный в следующем рисунке.
load desiredSynthesizedAntenna; clf; pattern(mysteryAntenna,fc,'CoordinateSystem','polar','Type','powerdb'); view(50,20); ax = gca; ax.Position = [-0.15 0.1 0.9 0.8]; camva(4.5); campos([520 -250 200]);
3D диаграммы направленности показывают некоторые симметрии и в азимуте и в сокращениях вертикального изменения. Поэтому шаблон может быть лучше всего получен с помощью универсального прямоугольного массива (URA). Также ясно из графика, что нет никакой энергии, излученной к задней части массива.
Затем определите размер массива. Чтобы избежать скрипучих лепестков, интервал элемента установлен в половину длины волны. Для URA размеры вдоль азимута и направлений вертикального изменения могут быть выведены из необходимой ширины луча вдоль азимута и направлений вертикального изменения, соответственно. В случае половины интервала длины волны число элементов вдоль определенного направления может быть аппроксимировано
где ширина луча вдоль того направления. Следовательно, апертурный размер URA может быть вычислен как
[azpat,elpat,az,el] = helperExtractSynthesisPattern(mysteryAntenna,fc,c); % Azimuth direction idx = find(azpat>pow2db(1/2)); azco = [az(idx(1)) az(idx(end))]; % azimuth cutoff N_col = round(2/sind(diff(azco))) % Elevation direction idx = find(elpat>pow2db(1/2)); elco = [el(idx(1)) el(idx(end))]; % elevation cutoff N_row = round(2/sind(diff(elco)))
N_col = 19 N_row = 14
Оценка предлагает запуститься с 14x19 URA.
% form the URA
ura = phased.URA([N_row N_col],[lambda/2 lambda/2]);
ura.Element.BackBaffled = true;
helperArraySynthesisComparison(ura,mysteryAntenna,fc,c)
Рисунок показывает, что синтезируемый массив превышает требование ширины луча желаемого шаблона. Однако боковые лепестки намного больше, чем желаемый шаблон. Можно уменьшать боковые лепестки путем применения операции работы с окнами к массиву. Поскольку URA может считаться комбинацией двух отделимых универсальных линейных матриц (ULA), окно может быть спроектировано независимо и вдоль азимута и вдоль направлений вертикального изменения с помощью знакомых методов создания фильтра.
Код ниже показов, как получить окна для направлений вертикального изменения и азимута.
AzSidelobe = 20; Ap = 0.1; % Passband ripples AzWeights = designfilt('lowpassfir','FilterOrder',N_col-1,... 'CutoffFrequency',azco(2)/90,'PassbandRipple',0.1,... 'StopBandAttenuation',AzSidelobe); azw = AzWeights.Coefficients; ElSidelobe = 30; ElWeights = designfilt('lowpassfir','FilterOrder',N_row-1,... 'CutoffFrequency',elco(2)/90,'PassbandRipple',0.1,... 'StopBandAttenuation',ElSidelobe); elw = ElWeights.Coefficients; % Assign the weights to the array ura.Taper = elw(:)*azw(:).'; % Compare the pattern helperArraySynthesisComparison(ura,mysteryAntenna,fc,c)
Рисунок показывает, что получившийся уровень бокового лепестка ниже по сравнению с предыдущим проектом, но все еще не удовлетворяет требованию. Некоторыми испытаниями и ошибками, следующие параметры используются, чтобы создать итоговый проект:
N_row = N_row+2; % trial and error N_col = N_col-3; % trial and error AzSidelobe = 26; ElSidelobe = 35; AzWeights = designfilt('lowpassfir','FilterOrder',N_col-1,... 'CutoffFrequency',azco(2)/90,'PassbandRipple',0.1,... 'StopBandAttenuation',AzSidelobe); azw = AzWeights.Coefficients; ElWeights = designfilt('lowpassfir','FilterOrder',N_row-1,... 'CutoffFrequency',elco(2)/90,'PassbandRipple',0.1,... 'StopBandAttenuation',ElSidelobe); elw = ElWeights.Coefficients; ura = phased.URA([N_row N_col],[lambda/2 lambda/2]); ura.Element.BackBaffled = true; ura.Taper = elw(:)*azw(:).'; helperArraySynthesisComparison(ura,mysteryAntenna,fc,c)
Рисунок показывает, что ширина луча и уровни бокового лепестка синтезируемого шаблона совпадают с желаемыми спецификациями. Следующие рисунки показывают желаемый 3D шаблон, синтезируемый 3D шаблон, геометрию полученного массива и заострение.
helperArraySynthesisComparison(ura,mysteryAntenna,fc,c,'3d')
Много проблем синтеза массивов могут быть обработаны как задачи оптимизации, специально для массивов с большими апертурами или сложными геометриями. В тех ситуациях часто не существует закрытое решение для формы, и пробел решения является очень большим. Например, для большого массива, часто необходимо разбавить массив, чтобы управлять уровнями бокового лепестка, чтобы не тратить впустую степень, поставленную каждому элементу антенны. В этом случае элемент может быть включен или выключен. Если бы необходимо было попробовать все возможные решения в массиве с 400 элементами, необходимо было бы попробовать комбинации, который нереалистичен, и массив с 400 элементами не считается большой апертурой вообще. Методы оптимизации часто принимаются в этой ситуации.
Часто используемый метод оптимизации является генетическим алгоритмом. Генетический алгоритм достигает оптимального решения путем симуляции процесса естественного отбора. Это запускается со случайным образом выбранных кандидатов как первое поколение. В каждом цикле эволюции алгоритм сортирует генерацию согласно предопределенному критерию качества работы (в разбавленном примере массивов, критерием качества работы было бы отношение уровня пика к боковому лепестку), и затем отбрасывает тех с более низкими баллами производительности. Алгоритм затем видоизменяет остающихся кандидатов, чтобы сгенерировать более новую генерацию и повторяет процесс, пока это не достигает условия остановки, такого как максимальное количество поколений.
Следующий пример показывает, как использовать генетический алгоритм, чтобы утончиться 40x40 URA. Цель состоит в том, чтобы достигнуть максимального подавления бокового лепестка и в азимуте и в сокращении вертикального изменения. Диаграмму направленности полного массива показывают сначала.
Nside = 40; geneticArray = phased.URA(Nside,lambda/2); geneticArray.Element.BackBaffled = true; clf; wplot = helperThinnedArrayComparison(geneticArray,fc,c);
Уровень бокового лепестка может быть вычислен как
% Compute beam pattern [azpat,elpat,az,el] = helperExtractSynthesisPattern(geneticArray,fc,c); % Compute relative sidelobe level pks_az = findpeaks(azpat,'NPeaks',2,'SortStr','descend'); pks_el = findpeaks(elpat,'NPeaks',2,'SortStr','descend'); % find the smaller sidelobe level between two cuts sllopt = min(pks_az(1)-pks_az(2),pks_el(1)-pks_el(2))
sllopt = 13.2981
Как ожидалось уровень бокового лепестка составляет приблизительно 13 дБ.
Теперь примените генетический алгоритм. Заметьте, что URA имеет симметрию в обеих строках и столбцах, таким образом можно использовать в своих интересах эту симметрию так, чтобы каждый содействующий кандидат утончения обратился к только четверти массива. Это уменьшает пространство поиска алгоритма.
% Set random seed prvS = rng(2013); % Initial generation with 200 candidates. Initially, the elements toward % the center are active and the dummy elements are toward the edge w0 = double(rand(Nside/2,Nside/2,200)>0.5); w0(1:14,1:14,:) = 1; % Pick one candidate, plot the beam pattern, and compute the sidelobe % level wtemp = w0(:,:,100); wo = [fliplr(wtemp) wtemp;rot90(wtemp,2) flipud(wtemp)]; wplot = helperThinnedArrayComparison(geneticArray,fc,c,[wplot wo(:)],... {'Full','Initial'});
Рисунок показывает, что диаграмма направленности следовала из одного типичного кандидата в первом поколении. Уровень бокового лепестка ниже в направлении азимута, но выше в направлении вертикального изменения по сравнению с полным массивом. Точный уровень бокового лепестка и уровень заливки массива могут быть вычислены как
[azpat,elpat] = helperExtractSynthesisPattern(geneticArray,fc,c,wo(:)); % Compute relative sidelobe level pks_az = findpeaks(azpat,'NPeaks',2,'SortStr','descend'); pks_el = findpeaks(elpat,'NPeaks',2,'SortStr','descend'); sllopt = min(pks_az(1)-pks_az(2),pks_el(1)-pks_el(2)) fillrate = sum(wo(:))/Nside^2*100
sllopt = 8.7013 fillrate = 71.7500
Это означает, что 71,75% элементов массива (1148 из них) активен, и уровень бокового лепестка составляет приблизительно 9 дБ. Это должно быть подавлено далее. Код ниже применяет генетический алгоритм с 30 поколениями.
% Max number of generations Niter = 30; % Number of candidates in each generation numGene = size(w0,3); w = w0; pos = getElementPosition(geneticArray)/lambda; angspan = -90:90; for m = 1:Niter % Compute the beam pattern for the entire generation [azpat,elpat] = helperArraySynthesisBeamPattern(pos,angspan,w); % Compute the sidelobe level for each candidate sll = helperArraySynthesisRelativeSidelobeLevel(azpat,elpat); % Sort the resulting sidelobe level [~,idx] = sort(sll,2,'descend'); % Discard half of the generation that gets the lower score w = w(:,:,[idx(1:numGene/2) idx(1:numGene/2)]); % Mutate rows and columns in the newly generated candidates mutIdx_row = randi(Nside/2,1,1); mutIdx_col = randi(Nside/2,1,1); w(mutIdx_row:end,:,numGene/2+1:numGene) = flipud(... w(mutIdx_row:end,:,numGene/2+1:numGene)); w(mutIdx_col:end,:,numGene/2+1:numGene) = fliplr(... w(mutIdx_col:end,:,numGene/2+1:numGene)); end wopt = w(:,:,1); rng(prvS); wo = [fliplr(wopt) wopt;rot90(wopt,2) flipud(wopt)]; wplot = helperThinnedArrayComparison(geneticArray,fc,c,[wplot wo(:)],... {'Full','Initial','Synthesized'});
sllopt = sll(idx(1)) fillrate = sum(wo(:))/Nside^2*100
sllopt = 17.5380 fillrate = 76.5000
Рисунок показывает получившуюся диаграмму направленности. Это видно, что уровень бокового лепестка был далее улучшен приблизительно до 17,5 дБ с уровнем заливки 76,5% (1 224 активных элемента). По сравнению с кандидатом в первом поколении это использует 5% на более активные элементы при достижении дополнительного подавления бокового лепестка на 9 дБ. По сравнению с полным массивом получившийся разбавленный массив может сохранить стоимость реализации переключателей T/R позади фиктивных элементов, который в свою очередь приводит примерно к 25%, экономящим на потребленной энергии. Также обратите внимание, что даже при том, что разбавленный массив использует меньше элементов, ширина луча близко к тому, что могло быть достигнуто с полным массивом.
Финал утончился, массив показывают ниже с черными кругами, представляет фиктивные элементы.
clf;
geneticArray.Taper = wo;
viewArray(geneticArray,'ShowTaper',true);
Стоит отметить, что генетический алгоритм не всегда приземляется на то же решение в каждом испытании. Однако в целом получившиеся диаграммы направленности совместно используют подобный уровень бокового лепестка.
Скрипт выше показов очень простой генетический алгоритм применился к проблеме синтеза массивов. В действительных приложениях генетический алгоритм, вероятно, будет более комплексным. Существуют также другие алгоритмы оптимизации, используемые в синтезе массивов, такие как симулированный алгоритм отжига. Заинтересованные читатели могут найти и генетический алгоритм и симулированные решатели алгоритма отжига в Global Optimization Toolbox™.
Этот пример показывает несколько подходов, чтобы выполнить синтез массивов на поэтапном массиве. На практике нужно выбрать соответствующий метод синтеза согласно определенному ограничению приложения, такого как размер апертуры массивов, форма геометрии массивов, и т.д.
[1] Рэнди Л. Хопт, разбавленные массивы Используя генетические алгоритмы, транзакции IEEE на антеннах и распространении, Vol 42, № 7, 1994
[2] Рэнди Л. Хопт, Введение в Генетические алгоритмы для Электромагнетизма, антенн IEEE и Журнала Распространения, Vol 37, № 2, 1995
[3] Деревья Гарри Л. Вана, оптимальная обработка матриц, Wiley-межнаука, 2002