- 发布日期:2024-11-04 08:08 点击次数:179 1 稀疏平面阵列
从前文《相控阵天线波束宽度分析》我们知道相控阵天线的波束宽度是与口径和扫描角度相关的函数。如果我们要达到很高的分辨率,就需要波束宽度很窄,此时天线的口径就需要很大。相控阵天线的间距一般为半波长,此时需要的天线数量以及后端的TR组件数量会增加很多,极大地增加了天线的生产成本。解决相控阵天线成本居高不下的方法之一就是采用稀疏阵列。
稀疏阵列是从均匀间隔满阵中稀疏掉部分阵元,这样就形成了阵元间距约束为某个基本量(通常为半倍波长)的整数倍的非均匀阵列;稀疏阵列在不改变阵列孔径的条件下,即保持阵列高分辨率的前提下,减少阵元数量并优化各阵元的物理布局,产生满足期望性能的波束方向图,大幅度降低了成本。由于这样设计的稀疏阵列的大部分阵元间距大于半波长,因此硬件布局布线的冗余度更高,简化了天线结构和馈电网络,降低了散热难度,同时其阵元间的互耦效应与均匀阵列相比更弱,在实际环境中具备更好的性能。
对于一个均匀平面阵列,如果我们用fmn表示其每个单元的工作状态,那么我们就可以得到三种状态,fmn全为1,此时为满阵,也就是均匀平面阵;fmn全为0,此时没有一个单元工作;fmn部分为0,部分为1,此时便为稀疏阵列。因此我们引入加权因子fmn,给均匀平面阵列的阵因子进行加权,即可得到稀疏平面阵列。加权阵因子如下表示:
图片
因阵元间距是离散分布且大于等于半波长,稀疏阵列所综合出来的扫描波束方向图中可能存在与主瓣齐平的栅瓣、或较高电平的副瓣,导致方向图中在无回波的方位出现虚假目标。实际工程应用对天线的分辨力要求很高,因而主瓣宽度要尽量窄,同时尽可能降低峰值旁瓣电平。所以我们采用最大旁瓣电平作为适应度函数,当最大旁瓣电平MSLL最小时优化结束。
2 算法流程遗传算法是一种全局性的概率搜索算法,该算法直接对问题进行操作,不需要复杂的计算公式,在搜索过程中可不断积累经验和知识,不需要借助于外界信息,只需要依靠自身产生的搜索空间的知识,便可找到最优解。标准的遗传算法是依据适应度对种群进行选择、交叉及变异操作,直到达到最大的进化代数。所以我们可以以下流程来进行操作:
第一步,确定适应度,并编制适应度函数。本例以最大旁瓣电平为适应度函数。
第二步,确定进化代数,进化代数一般选择100-1000,并生成一定的种群,种群数量一般选择10-200。本例中使用randn()函数生成符合正态分布的。令其中NL(稀疏完剩余的单元个数)个单元为1,其余单元为0。
第三步,对种群中的每个个体计算适应度,并保留最优的适应度个体。
第四步,进行选择操作,也可称为复制操作,即将满足适应度累积概率的个体原封不动的复制到下一代中,采用轮盘赌的选择操作,利用各个个体适应度所占比例的大小来决定其子代保留的可能性。若某个个体i的适应度为fiti,种群大小为Np,则它被选取的概率表示为:
图片
个体适应度越大,则其被选择的机会也越大;反之亦然。为了选择交叉的个体,需要进行多轮选择。每一轮产生一个(0,1)内的均匀随机数,将该随机数作为选择指针来确定被选个体。本例中生成一个种群数量大小的介于(0,1)之间的随机数,不含0和1。与归一化适应度的累积概率进行对比,选出累积概率大的个体。
第五步,进行交叉操作,交叉概率一般选择0.25-1。将选中的偶数个体和与奇数个体进行以交叉概率进行交叉,形成新的个体。
第六步,进行变异操作,变异概率一般选择0.001-0.1。将符合变异概率的基因值取反,即被选中的基因值为1,则其值变为0;若被选中的基因值为0,则其值变为1。
第七步,确保稀疏率不变,即稀疏后的实际单元个数不变。若实际单元个数变小,从0状态单元中随机选择,强制其为1状态;若实际单元个数变多,则从1状态的单元中随机选择,强制其为0状态。
第八步,将得到的最优个体加权到阵因子上,得到稀疏后的阵因子。
3 MATLAB代码
优化代码如下:
%%%%%%%%%%%%%遗传算法稀疏平面阵%%%%%%%%%%%%%%%%%%%%%%%%%%初始化参数%%%%%%%%%%%%%%%clear; %清变量close all; %清图clc; %清屏NP = 50; %种群数量Pc = 0.8; %交叉率Pm = 0.01; %变异率d = 0.5; %满阵阵元间距,半倍波长lamda = 1; %波长G = 200; %最大遗传代数Ny = 20; %方位满阵阵元个数Nz = 10; %俯仰满阵阵元个数L = Ny*Nz; %满阵阵元个数NL = 100; %实际阵元个数theta0 = 0*pi/180; %俯仰指向phi0 = 0*pi/180; %方位指向NA = 360; %空间方位角采样数NE = 360; %空间俯仰角采样数%%%%%%%%%%%%%生成初始种群%%%%%%%%%%%%%%%%%%%%%%%%%0为没有阵元,1为有阵元%%%%%%f = randn(L,NP);[sortff,Index] = sort(f);f = zeros(L,NP);for i = 1:NP f(Index(end-NL+1:end,i),i) = 1;end%%%%%%%%%%遗传算法循环%%%%%%%%%%%%%%for k = 1:G k %%%%计算适应度,即峰值旁瓣%%%%% for i = 1:NP Fit(i) = func_plane(lamda,Ny,Nz,d,theta0,phi0,NA,NE,f(:,i)); end maxFit = max(Fit); %最大值 minFit = min(Fit); %最小值 rr = find(Fit==maxFit); %找出最大值 fBest = f(:,rr(1,1)); %历代最优个体 Fit = (Fit-minFit)/(maxFit-minFit); %归一化适应度值 %%%%%%%基于轮盘赌的复制操作%%%%%%%% sum_Fit = sum(Fit); fitvalue = Fit./sum_Fit; fitvalue = cumsum(fitvalue); ms = sort(rand(NP,1)); fiti = 1; newi = 1; while newi<=NP if (ms(newi))<fitvalue(fiti) nf(:,newi) = f(:,fiti); newi = newi+1; else fiti = fiti+1; end end %%%%%%%%%基于概率的交叉操作%%%%%%%%%% for i = 1:2:NP p = rand(1,1); if p<Pc q = randi([0,1],1,L); for j = 1:L if q(j)==1 temp = nf(j,i+1); nf(j,i+1) = nf(j,i); nf(j,i) = temp; end end end end %%%%%%%基于概率的变异操作%%%%%%%%% for m = 1:NP for n = 1:L r = rand(1,1); if r < Pm nf(n,m) = ~nf(n,m); end end end %%%%使交叉变异后的 实际阵元个数不变%%%%% for i = 1:NP n_ones = sum(nf(:,i)); while n_ones>(NL) nn1 = find(nf(:,i)==1); MUT1 = randi([1,n_ones],1,n_ones-NL); for m = 1:(n_ones-NL) nf(nn1(MUT1(m)),i) = 0; end n_ones = sum(nf(:,i)); end while n_ones<(NL) nn2 = find(nf(:,i)==0); MUT2 = randi([1,L-n_ones],1,NL-n_ones); for m = 1:(NL-n_ones) nf(nn2(MUT2(m)),i) = 1; end n_ones = sum(nf(:,i)); end end f = nf; f(:,1) = fBest; %保留最优个体在新种群中 trace(k) = maxFit; %历代最优适应度endfigureplot(trace)xlabel('迭代次数')ylabel('目标函数值')title('适应度进化曲线')grid onsave fBest.mat fBest %存储优化结果适应度函数代码如下:
%%%%%%%%%%%%%%%%计算最大旁瓣%%%%%%%%%%%%%%%function MSLL=func_plane(lamda,Ny,Nz,d,theta0,phi0,NA,NE,f0)eps = 0.0001;bottom = -50;f = reshape(f0,Ny,Nz); phi = linspace(-pi/2,pi/2,NA); theta = linspace(-pi/2,pi/2,NE); aa = [0:d:(Ny-1)*d];DD1 = repmat(aa',1,Nz);bb = [0:d:(Nz-1)*d];DD2 = repmat(bb,Ny,1);DD = DD1+sqrt(-1).*DD2;for ii = 1:length(theta);%%%%%%%%%%%%%%%%计算最大旁瓣%%%%%%%%%%%%%%%function MSLL=func_plane(lamda,Ny,Nz,d,theta0,phi0,NA,NE,f0)eps = 0.0001;bottom = -50;f = reshape(f0,Ny,Nz); phi = linspace(-pi/2,pi/2,NA); theta = linspace(-pi/2,pi/2,NE); aa = [0:d:(Ny-1)*d];DD1 = repmat(aa',1,Nz);bb = [0:d:(Nz-1)*d];DD2 = repmat(bb,Ny,1);DD = DD1+sqrt(-1).*DD2;for ii = 1:length(theta); pattern(ii) = sum(sum((exp(sqrt(-1)*2*pi/lamda*(sin(phi0)... * cos(theta(ii))*real(DD)+sin(theta(ii))*imag(DD)... -sin(phi0)*cos(theta0)*real(DD)-sin(theta0)*imag(DD)))).*f));endmax_p = max(abs(pattern));FdB1 = 20*log10(abs(pattern)/max_p+eps);mm = ceil(find(FdB1==max(FdB1)));tu_up = 0; while (FdB1(mm+tu_up)>=FdB1(mm+tu_up+1)) tu_up = tu_up+1;endtu_down = 0;while (FdB1(mm-tu_down)>=FdB1(mm-tu_down-1)) tu_down = tu_down+1;endFdB1(mm-tu_down:mm+tu_up) = bottom;sll_1 = max(FdB1);for jj = 1:length(phi); pattern(jj) = sum(sum((exp(sqrt(-1)*2*pi/lamda*(sin(phi(jj))... * cos(theta0)*real(DD)+sin(theta0)*imag(DD)... -sin(phi0)*cos(theta0)*real(DD)-sin(theta0)*imag(DD)))).*f));endmax_p = max(abs(pattern));FdB2 = 20*log10(abs(pattern)/max_p+eps);nn = find(FdB2==max(FdB2));tv_up = 0; while (FdB2(nn+tv_up)>=FdB2(nn+tv_up+1)) tv_up = tv_up+1;endtv_down = 0;while (FdB2(nn-tv_down)>=FdB2(nn-tv_down-1)) tv_down = tv_down+1;endFdB2(nn-tv_down:nn+tv_up) = bottom;sll_2 = max(FdB2);MSLL = abs(sll_1)+abs(sll_2);end pattern(ii) = sum(sum((exp(sqrt(-1)*2*pi/lamda*(sin(phi0)... * cos(theta(ii))*real(DD)+sin(theta(ii))*imag(DD)... -sin(phi0)*cos(theta0)*real(DD)-sin(theta0)*imag(DD)))).*f));endmax_p = max(abs(pattern));FdB1 = 20*log10(abs(pattern)/max_p+eps);mm = ceil(find(FdB1==max(FdB1)));tu_up = 0; while (FdB1(mm+tu_up)>=FdB1(mm+tu_up+1)) tu_up = tu_up+1;endtu_down = 0;while (FdB1(mm-tu_down)>=FdB1(mm-tu_down-1)) tu_down = tu_down+1;endFdB1(mm-tu_down:mm+tu_up) = bottom;sll_1 = max(FdB1);for jj = 1:length(phi); pattern(jj) = sum(sum((exp(sqrt(-1)*2*pi/lamda*(sin(phi(jj))... * cos(theta0)*real(DD)+sin(theta0)*imag(DD)... -sin(phi0)*cos(theta0)*real(DD)-sin(theta0)*imag(DD)))).*f));endmax_p = max(abs(pattern));FdB2 = 20*log10(abs(pattern)/max_p+eps);nn = find(FdB2==max(FdB2));tv_up = 0; while (FdB2(nn+tv_up)>=FdB2(nn+tv_up+1)) tv_up = tv_up+1;endtv_down = 0;while (FdB2(nn-tv_down)>=FdB2(nn-tv_down-1)) tv_down = tv_down+1;endFdB2(nn-tv_down:nn+tv_up) = bottom;sll_2 = max(FdB2);MSLL = abs(sll_1)+abs(sll_2);end
优化后方向图代码如下:
%%%%%%%%%%%%优化后方向图%%%%%%%%%%%%%clc;close all;clear allload('fBest.mat')d = 0.5;lamda = 1;Ny = 20;Nz = 10;theta0 = 0*pi/180;phi0 = 0*pi/180;NA = 360;NE = 360;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%phi = linspace(-pi/2,pi/2,NA); theta = linspace(-pi/2,pi/2,NE); aa = [0:d:(Ny-1)*d];DD1 = repmat(aa',1,Nz);bb = [0:d:(Nz-1)*d];DD2 = repmat(bb,Ny,1);DD = DD1+sqrt(-1).*DD2;f = reshape(fBest,Ny,Nz);for jj = 1:length(phi); for ii = 1:length(theta); pattern(jj,ii) = sum(sum(exp(sqrt(-1)*2*pi/lamda*(sin(phi(jj))... * cos(theta(ii))*real(DD)+sin(theta(ii))*imag(DD)... -sin(phi0)*cos(theta0)*real(DD)-sin(theta0)*imag(DD))).*f)); endendmax_p = max(max(abs(pattern)));pattern_dbw = 20*log10(abs(pattern)/max_p+eps);figure;mesh(theta*180/pi,phi*180/pi,pattern_dbw);xlabel('俯仰角');ylabel('方位角')figure %方位向切面图temp1 = pattern_dbw(:,round(NE*((pi/2+theta0)/pi)));plot(phi*180/pi,temp1)gridxlabel('\phi方位角(度)')ylabel('阵列增益(dB)')figure %俯仰向切面图temp2 = pattern_dbw(round(NA*((pi/2+phi0)/pi)),:);plot(theta*180/pi,temp2)gridxlabel('\theta俯仰角(度)')ylabel('阵列增益(dB)')figurefor ii = 1:Nzplot(f(:,ii)*ii,'o'),hold onendxlabel('方位向')ylabel('俯仰向')axis([1,Ny,1,Nz])运行代码后得到优化后三维方向图如下:
图片
方位面方向图如下:
图片
俯仰面方向图如下:
图片
参考文献:佘美丽,低成本相控阵雷达高分辨率方法研究。 包子阳,基于matlab的遗传算法及其在稀布阵列天线中的应用。 本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。