主要内容

阵列方向图合成第三部分:深度学习

这个例子展示了如何设计和训练卷积神经网络(CNN)来计算产生所需模式的元素权重。

介绍

方向图合成是阵列处理中的一个重要课题。阵列权重有助于塑造传感器阵列的波束方向图以匹配所需的方向图。由于空间信号处理与频域信号处理的相似性,传统的方向图合成算法往往借鉴滤波器设计技术。在我们的阵列方向图合成第一部分示例中涵盖了许多这样的算法。不幸的是,这些算法通常不太灵活,无法适应不同类型的约束。因此,作为一种更通用的解决方案,使用各种优化技术来生成所需的模式。在阵列方向图综合第二部分的例子中介绍了一些常用的优化求解方法。尽管基于优化的算法非常灵活,但对于大型数组,收敛到最优解需要一段时间。这个缺陷使得很难实时形成给定的光束模式。

深度学习技术在计算机视觉和自然语言处理方面取得了许多成功。尽管深度学习网络需要离线训练;经过训练后,生成的网络可以用于实现实时性能。因此,深度学习网络可能能够提供实时模式合成的解决方案,正如[1]中所建议的那样。

数组的定义

考虑一个半径为3米的圆形平面阵列。单元位于矩形网格上,单元间距为0.5米。

R = 3;δ = 0.5;Lambda = 1;[pos,N] = getCircularPlanarArrayPositions(r,delta,lambda);

阵列孔径如下图所示。该阵列位于y-z平面,其侧面与x轴对齐。

蚂蚁=分阶段的。ConformalArray (“ElementPosition”、pos);viewArray(蚂蚁,“标题”“圆形平面阵列孔径”


               

优化模式综合

正如在阵列方向图合成第二部分示例中所解释的那样,可以使用优化技术来派生方向图合成权重。假设我们希望有一个图案,其主瓣沿方位角和仰角0度。该模式还应满足以下约束:

  • 最大化指向性

  • 抑制主瓣以下30db的干扰

  • 保持副瓣电平在-20和20度的方位角或高度低于主瓣17分贝

定义主瓣方向Ang_d = [0;0];定义干涉方向和相应的期望响应Ang_i = [12 10;13 10];R_i = [-30 -30];定义副瓣电平低于期望电平的区域ang_c_az_grid = [20:0.5: -10 10:0.5:20] + ang_d (1);ang_c_el_grid = [20:0.5: -10 10:0.5:20] + ang_d (2);[ang_c_az,ang_c_el] = meshgrid(ang_c_az_grid,ang_c_el_grid);Ang_c = [ang_c_az(:).';ang_c_el(:).'];Ang_c = setdiff(Ang_c .',ang_i.',“行”)”。;R_c_th = -17;R_c = r_c_th*ones(1,size(ang_c,2));

在定义了所有约束条件后,我们可以使用优化求解器派生出可以提供所需模式的数组权重。有关优化求解器的详细信息,请参考阵列方向图合成第二部分示例。

%使用优化求解器计算权重抽搐;[w_op, Rn] = helperPatternSynthesis (pos、ang_d [], [], [ang_i ang_c], [r_i r_c]);
找到最优解。
T = toc;

生成的模式如下所示

Az_plot = -90:0.25:90;El_plot = -90:0.25:90;w = w_op(1:N)+1 *w_op(N+1:2*N);pat_opt = computePattern(pos,az_plot,el_plot,w);plotPattern (az_plot el_plot pat_opt,“优化”);

我们可以通过测量生成的模式是否与需求匹配来度量该模式的质量。

[d,intdb,sllpct] = measurePattern(pat_opt,ang_d,ang_i,ang_c,az_plot,el_plot,r_c_th,Rn,w);d_max = pow2db(4*pi*N^2/abs(sum(Rn,“所有”)));指标= [“方向性(dBi)”;干扰抑制(dB);“旁瓣超过要求百分比”];测量= {d;intdb;sllpct};{d_max;r_i;0};metrictab =表(度量,测量,需求)
metrictab =3×3表指标测量的要求  ______________________________________ _____________________ ___________ " 方向性(dBi)”{[22.2814]}{[22.1824]} "干扰抑制(dB)"{[-29.3295 -30.6141]}{[-30 -30]}“旁瓣超过要求百分比”{[0]}{[0]}

               

我们可以看到最终的指标非常好。然而,计算权重确实需要一些时间。

流('权重计算时间:%f秒。\n't);
权重计算时间:14.607490秒。

深度学习网络

为了使用深度学习进行模式合成,我们创建了一个卷积神经网络(CNN),如b[1]所述。波束模式在方位角和仰角范围内定义。因此,可以将图案表示为图像,我们的输入层将图像作为输入。输出是产生这种模式的权重。

图层= [imageInputLayer([721 721 1],“归一化”“zerocenter”) convolution2dLayer([1,64],1) batchNormalizationLayer reluLayer convolution2dLayer([64,128],1) batchNormalizationLayer reluLayer convolution2dLayer([128,128],1) batchNormalizationLayer reluLayer convolution2dLayer([128,128],1) batchNormalizationLayer reluLayer convolution2dLayer([128,128],1) batchNormalizationLayer reluLayer fulllyconnectedlayer (2000) batchNormalizationLayer reluLayer fulllyconnectedlayer (2000) batchNormalizationLayer reluLayer fulllyconnectedlayer (224) regressionLayer();analyzeNetwork(层);

helperPatternSynthesisDLAnalysis.PNG

培训和测试数据综合

为了训练和测试网络,我们可以生成带有随机主瓣和干扰位置的模式。我们将通过优化求解器导出最优权值,然后将导出的模式作为输入通过网络计算权值,并希望得到的权值与最优权值相匹配。

dataURL =“https://ssd.mathworks.com/supportfiles/phased/data/ArraySynthesisDLData.zip”;saveFolder = tempdir;dataDir =“datasetSmallE”;zipFile = fullfile(保存文件夹,“ArraySynthesisDLData.zip”);如果~存在(zipFile“文件”) websave (zipFile dataURL);%解压缩数据解压缩(zipFile tempdir)结束signalDs = signalDatastore (fullfile (saveFolder dataDir),“ReadFcn”, @readTrainAndValFile);signalDs = shuffle (signalDs);

将数据集拆分为训练集和验证集

[trainInd,valInd,testInd] = dividerand(1:num (signalDs.Files),0.8,0.1,0.1);trainDs =子集(signalDs,trainInd);validDs =子集(signalDs,valInd);testDs =子集(signalDs,testInd);testDs。ReadFcn = @readTestFile;%用于培训、验证和测试的文件数流(“培训、验证和测试数据的数量分别为%d、%d和%d。”元素个数(trainDs.Files),元素个数(validDs.Files),元素个数(testDs.Files));
训练、验证和测试数据的数量分别为778、97和97。

列车网络的

现在我们可以训练网络了

trainnetworkknow = false;如果trainnetworkknow options = trainingOptions(“亚当”“MaxEpochs”30岁的“GradientDecayFactor”, 0.9,“SquaredGradientDecayFactor”, 0.999,“InitialLearnRate”1 e - 3,“详细”假的,“阴谋”“训练进步”“LearnRateSchedule”“没有”“ValidationData”validDs,“ValidationFrequency”3);% #好< UNRCH >net = trainNetwork(trainDs,layers,options);其他的负载(fullfile (saveFolder“helperPatternSynthesisDL.mat”),“净”);结束

测试训练网络

使用前面部分导出的模式,让我们看看训练后的网络是否能提供令人满意的模式

抽搐;W_dl = double(predict(net), cast(pat_opt);“int8”)));T_dl = toc;w_dl(1:N)+1i*w_dl(N+1:2*N);/norm(arrayfactor(pos,ang_d, W));pat_dl = computePattern(pos,az_plot,el_plot,w);plotPattern (az_plot el_plot pat_dl,“深度学习”);

[d,intdb,sllpct] = measurePattern(pat_dl,ang_d,ang_i,ang_c,az_plot,el_plot,r_c_th,Rn,w);d_max = pow2db(4*pi*N^2/abs(sum(Rn,“所有”)));指标= [“方向性(dBi)”;干扰抑制(dB);“旁瓣超过要求百分比”];测量= {d;intdb;sllpct};{d_max;r_i;0};metrictab =表(度量,测量,需求)
metrictab =3×3表指标测量的要求  ______________________________________ _____________________ ___________ " 方向性(dBi)”{[22.1074]}{[22.1824]} "干扰抑制(dB)"{[-20.5114 -20.8268]}{[-30 -30]}“旁瓣超过要求百分比”{[0]}{[0]}
流('权重计算时间:%f秒。\n', t_dl);
权重计算时间:5.339215秒。

我们可以看到,预测模式在指向性和副瓣抑制方面取得了良好的效果。它不如达到干扰抑制的效果。我们也许可以用更多的训练数据来改进这一点。

结论

这个例子展示了如何创建和训练CNN来为给定数组执行模式合成。虽然深度学习网络可以更快地生成模式综合权重,但它也有自己的缺点。例如,网络需要大量的数据进行训练。此外,网络是特定于特定的阵列几何形状的。因此,如果阵列编队发生变化,则需要对网络进行重新训练。

参考文献

Bianco, Simone, Maurizio Feo, Paolo Napoletano, Giovanni Petraglia, Alberto Raimondi和Pietro Vinetti。“使用深度学习的AESA自适应波束形成。”2020年IEEE雷达会议论文集, 2020年。

支持文件

定义数组

函数[pos,N] = getCircularPlanarArrayPositions(radius,delta,lambda) N = round(radius/delta*2);Htemp =阶段性的。(n,三角洲,“格子”“矩形”);pos = getElementPosition(htemp)/lambda;elemToRemove = sum(pos.^2)>半径^2;pos(:,elemToRemove) = [];N = size(pos,2);结束

计算模式

函数pat = computePattern(pos,az_plot,el_plot,w) pat = zero (numel(el_plot),numel(az_plot));m = 1:元素个数(el_plot)帕特(m:) = mag2db (abs (arrayfactor (pos, [az_plot; el_plot (m) *的(大小(az_plot))], w)));结束结束

情节模式

函数plotPattern (az_plot el_plot,帕特,algstr)冲浪(az_plot el_plot,帕特,“EdgeColor”“没有”);colorbar;视图(0,90);包含(的方位(度));ylabel (的海拔(度));标题(sprintf (“通过%s的波束模式”algstr));轴结束

度量模式度量

函数[d,intdb,sllpct] = measurePattern(pat,ang_d,ang_i,ang_c,az_plot,el_plot,sllbar,Rn,w);El_step = mean(diff(el_plot));d =帕特(sub2ind(大小(pat), (ang_d (1) -az_plot (1)) / az_step + 1, (ang_d (2) -el_plot (1)) / el_step + 1)) +pow2db(4 *π)-pow2db (abs (w * Rn * w));intdb =帕特(sub2ind(大小(pat), (ang_i (: 1) -az_plot (1)) / az_step + 1, (ang_i (2:) -el_plot (1)) / el_step + 1)) -麦克斯(pat, [],“所有”);slldb =帕特(sub2ind(大小(pat), (ang_c (: 1) -az_plot (1)) / az_step + 1, (ang_c (2:) -el_plot (1)) / el_step + 1)) -麦克斯(pat, [],“所有”);SLLPCT = sum(slldb>sllbar)/num (slldb);结束

读取数据文件

函数dataOut = readTrainAndValFile(filename) data = struct2cell(load(filename));数据=数据{1};datout{1} =数据{1};datout{2} = normalize(数据{2})';结束函数dataOut = readTestFile(filename) data = struct2cell(load(filename));数据=数据{1};dataOut =数据;结束
Baidu
map