說在前面
陣列天線與載體的一體化仿真是一個十分普遍的工程問題,機載陣列天線、艦載陣列天線、彈載陣列天線以及汽車毫米波雷達天線在復雜環(huán)境下電磁仿真都屬于這一類問題。



這些問題不僅僅困擾著工程界,也同樣令學術(shù)界十分頭疼,多少研究工作者圍繞者這個話題前赴后繼的開展的研究。這類電磁計算問題的特點可以概括為三點:1)電大尺寸;2)多尺度;3)強耦合。
每個問題但拎出來都還好好解決,組合起來的話,問題就變得不簡單。目前三大主流的仿真軟件(CST、FEKO、HFSS)在處理這類問題時,均各有優(yōu)勢,但缺點也同樣十分明顯,這取決于三種軟件底層算法的優(yōu)缺點。

基于“場”方程的CST和HFSS計算時,需要對包含目標的整個空間進行剖分,“空氣盒子”的引入可以極大減小求解區(qū)域,但是對于電大尺寸的載體,空氣盒子的尺寸也會異常龐大,這一問題對于基于“頻域”方法的HFSS,簡直是災難,對于基于“時域”方法的CST,雖然影響會小一點,但是由于采用“正交網(wǎng)格”進行剖分,CST在處理含有復雜精細結(jié)構(gòu)的陣列天線時,計算精度又會有所欠缺。

基于“源”方程的FEKO,僅需要對目標區(qū)域進行剖分,網(wǎng)格數(shù)會大幅減少,這一優(yōu)點對于處理電大尺寸目標十分有利,但是對于求解含有大量復雜精細結(jié)構(gòu)的陣列天線時,就會因為“近區(qū)網(wǎng)格”數(shù)目較多,分區(qū)質(zhì)量差、耦合強,散射矩陣形態(tài)惡化等原因,導致MLFMA加速效果急劇下降,迭代求解的收斂性惡化甚至不收斂的問題。

綜上所述,針對“陣列天線+載體”的仿真仿真問題,想要做到“一招鮮,吃遍天”多少有點“妄想”,最好的方法就是,具體問題具體分析,針對問題的特征選擇合適的軟件和算法。
從陣列天線陣元規(guī)模和載體電尺寸大小的角度來看,可以大致做以下劃分:
陣元數(shù)目少(如數(shù)目<100),載體電尺寸較小,可以使用HFSS進行計算的,盡量使用HFS進行計算,計算精度高,同時由于天線通常是基于HFSS平臺進行設計,直接加載體就可進行計算,無需移植到其他平臺,操作方便;
陣元數(shù)目少,載體電尺寸較大,HFSS已經(jīng)無法進行計算,可以利用FEKO或CST,使用全波方法進行計算,計算精度高,計算速度和內(nèi)存消耗均可接受;
陣元數(shù)目少,載體電尺寸非常大(如電尺寸>100倍波長),HFSS和CST均算不動,建議采用FEKO的全波算法進行計算;
陣元數(shù)目較多(如數(shù)目介于100~500),載體電尺寸較大,F(xiàn)EKO計算出現(xiàn)收斂性較差、內(nèi)存消耗異常大,建議使用CST的全波算法進行計算,或利用FEKO單獨計算陣列天線,并提取近場與載體進行一體化計算;
陣元數(shù)目特別多(如數(shù)目>500),載體電尺寸也非常大,利用FEKO的近似算法獲得陣列的遠場,提取遠場與載體一體化計算。
上述分類,只是提供了一個大致的方向,實際工程中,還需具體問題具體分析。
除了計算方法的選擇需要關(guān)注,對于該問題,還有一個比較棘手的問題需要解決,那就是陣列天線的建模問題。大規(guī)模陣元的陣列天線單元數(shù)目多、波束掃描時,每個饋電單元的相位也要相應的改變,單純依靠手動建模,時間成本相當高,且人為操作,錯誤很難避免。因此,依托仿真軟件進行二次開發(fā),實現(xiàn)快速自動建模,十分必要。
綜上所述,圍繞“陣列+載體計算”的話題,按照建模和計算兩個方面做如下展開,本文重點針對基于FEKO平臺,進行二次開發(fā),進行任意形式相控陣列(單元形式、陣面形狀)的自動建模。

正文
圍繞著陣列天線的快速建模,往期文章多有提及:
1)一種是依托FEKO自帶的應用擴展功能,可以快速生成任意單元形式的陣列天線,不足就是相掃功能尚不具備;

2)往期二次開發(fā)的“相控陣列天線”自動建模模塊,可以實現(xiàn)相掃功能,主要不足在于單元形式、陣面形狀以及陣元饋電形式都比較單一。
自適應微帶相控陣天線建模模塊
基于MATLAB-FEKO-API技術(shù)的復雜結(jié)構(gòu)+相控陣天線的快速建模
作者針對著幾點不足進行了改進優(yōu)化,源代碼點擊文末“閱讀原文”,自行下載。
針對任意形式天線單元的優(yōu)化
往期文章中天線單元的建模通過“代碼”實現(xiàn),這種建模方式對于結(jié)構(gòu)比較復雜的天線單元十分不友好,也不利于天線單元形式的擴展。本文的建模邏輯有所調(diào)整,天線單元可以通過CADFEKO先進行建模,然后再利用“代碼”通過批量復制操作實現(xiàn)陣列建模。

%%模型導入 %形參定義(文件路徑,單元路徑,模型名稱) function ImportCFXmodel(fid,element_path,model_name) fprintf(fid,'properties = {} '); fprintf(fid,'properties.ImportGeometryEnabled = true '); fprintf(fid,'properties.ImportMeshEnabled = false '); fprintf(fid,'properties.ImportMeshRulesEnabled = true '); fprintf(fid,'properties.ImportOptimisationSearchesEnabled = false '); fprintf(fid,'properties.ImportSolutionEntitiesEnabled = false '); fprintf(fid,'properties.MergeIdenticalMediaEnabled = false '); fprintf(fid,'properties.MergeIdenticalVariablesEnabled = false '); fprintf(fid,'properties.Prefix = "" '); fprintf(fid,'CFXImporter = project.Importer.CFXModel.Settings '); fprintf(fid,'CFXImporter:SetProperties(properties) '); fprintf(fid,['project.Importer.CFXModel:Import([[',element_path,model_name,'.cfx]]) ']); end
針對任意形狀陣面的優(yōu)化
往期文章介紹的方法要求陣面的形狀為圓形,而實際工程中,天線陣面的形式則更加多樣,橢圓形、菱形、方形等等,本文以網(wǎng)格的形式提取陣面外輪廓,結(jié)合陣列參數(shù),對陣元進行布局,可以實現(xiàn)任意陣面外形的陣列天線的建模。


clc;clear all; %% 導入陣面輪廓曲線網(wǎng)格以及天線尺寸參數(shù) filepath='C:Usersem.liuDesktoplbmodel';%網(wǎng)格文件位置 filename='elips.nas';%網(wǎng)格文件名稱 R=400;%天線口徑,尺寸需大于陣面尺寸,覆蓋實際陣面 p=[100,80];%單元周期[x方向周期,y方向周期] %% 創(chuàng)建單元中心的點陣面和單元邊緣點陣面 r=(sqrt(p(1)^2+p(2)^2))/2;%單元半徑 MM=floor(R/p(1));%x方向單元數(shù)(單邊) NN=floor(R/p(2));%y方向單元數(shù)(單邊) mm=12*MM; nn=12*NN; len = length(mm)*length(nn); %[x0,y0]為陣元中心坐標,原點位于陣面集合中心 x0=(-MM+mm-0.5)*p(1); %[x0,y0]為陣元中心坐標,原點位于陣面幾何中心 y0=(NN-nn+0.5)*p(2); xq = repmat(x0,length(y0),1);%形成點的面分布 yq = repmat(y0.',1,length(x0)); th1=abs(asin(yq./sqrt(xq.^2+yq.^2))); %計算點-原點與x軸夾角(統(tǒng)一到第一象限) xqo=xq+r*(xq./abs(xq)).*cos(th1);%計算單元邊緣的坐標 yqo=yq+r*(yq./abs(yq)).*sin(th1); plot(xqo,yqo,'bo'); hold on; plot(xq,yq,'r+'); %% 讀取陣面輪廓曲線網(wǎng)格數(shù)據(jù) unit_Length=1e-3;%網(wǎng)格單位統(tǒng)一 fid=fopen([filepath,filename]); nNode=0; while ~feof(fid) txtline=fgetl(fid); if contains(txtline,'GRID*') nNode=nNode+1; end end fclose(fid); fid=fopen([filepath,filename]); vision= fgetl(fid); % 版本消息 null = fgetl(fid); % null = fgetl(fid); % 文件名 null = fgetl(fid); % 日期 null = fgetl(fid); % null = fgetl(fid); % 線段個數(shù) ntri = fgetl(fid); % 三角形個數(shù) ntri = str2double(ntri(isstrprop(ntri,'digit'))); ncube = fgetl(fid); ntetr = fgetl(fid); Nodes = zeros(nNode,3); Triangles = zeros(ntri,3); for ii=1:nNode s1=fgetl(fid); Nodes(str2double(s1(20:24)),1:2)=[str2double(s1(40:56)),str2double(s1(57:72))]; s2=fgetl(fid); Nodes(str2double(s1(20:24)),3)=str2double(s2(9:end)); end Nodes=Nodes.'*unit_Length; fclose(fid); %% 判斷點的位置 p=Nodes'; xv=1000.*p(:,1);%按實際尺寸大小進行坐標縮放 yv=1000.*p(:,2); [in,on] = inpolygon(xqo,yqo,xv,yv);%判斷點陣是否在輪廓曲線內(nèi) % isunit_flg=reshape(in,2*MM,2*NN); isunit_flg=in; csvwrite('isunitflg.csv',isunit_flg); %% 繪圖 figure plot(xv,yv) % polygon axis equal hold on plot(xq(in),yq(in),'r+') % points inside plot(xq(~in),yq(~in),'bo') % points outside holdoff
針對饋電形式拓展的優(yōu)化
往期文章僅支持wire_port的批量建模和饋電,饋電形式單一,本文進行了改進,基于導入模型上的線結(jié)構(gòu)或面結(jié)構(gòu),進行饋電端口設置,擴展了波端口形式,改進的建模方式降低了代碼塊之間的耦合,用戶進行饋電形式的擴展將更加方便,從而可以根據(jù)需要,參考以下程序自行擴展諸如edge_port,F(xiàn)EM line Port等饋電形式。
%%添加波導端口 %形參定義(文件路徑,端口名稱,模型名稱,端口所在面名稱,端口激勵方向,極化轉(zhuǎn)角) function AddWaveguidePort(fid,Port_name,model_name,face_name,direction,rot_angel) fprintf(fid,'-- Created port "Port1" '); fprintf(fid,'properties = cf.WaveguidePort.GetDefaultProperties() '); fprintf(fid,['properties.DirectionReversed =',direction,' ']); fprintf(fid,[model_name,'= project.Geometry["',model_name,'"] ']); fprintf(fid,[face_name,'= ',model_name,'.Faces["',face_name,'"] ']); fprintf(fid,['properties.Face =',face_name,' ']); fprintf(fid,['properties.Label = "',Port_name,'" ']); fprintf(fid,['properties.ReferenceDirectionRotation = cf.Enums.WaveguidePortReferenceDirectionRotationEnum.Rotate',rot_angel,' ']); fprintf(fid,[Port_name,'= project.Ports:AddWaveguidePort(properties) ']); end
%%批量設置波端口
%形參定義(文件路徑,陣元分布表,模型名稱,端口所在平面名稱,端口激勵方向,極化轉(zhuǎn)角)
function WaveguidePort_array(fid,isunitflg,model_name,face_name,direction,rot_angle)
[Ny,Nx]=size(isunitflg);
kk=0;
for ii=1:Ny
for jj=1:Nx
if isunitflg(ii,jj)~=0
kk=kk+1;
%建立waveguidePort
AddWaveguidePort(fid,['port_',num2str(ii),'_',num2str(jj)],...
[model_name,'_',num2str(kk)],face_name,direction,rot_angle);
end
end
end
end
詳細操作步驟
step1:建立單元模型,設置材料屬性(如果有需要,也可提前設置好局部剖分尺寸),并保存為.CFX格式;

step2:在主程序中輸入API文件夾、建模腳本.lua、陣元.CFX文件的路徑以及陣元名稱;

step3:輸入陣列結(jié)構(gòu)參數(shù)、端口信息、近場源/遠場源尺寸、波束性能參數(shù)及掃描范圍;
step4:運行生成.lua文件,并將內(nèi)容拷貝至腳本編輯器script,并運行,自動完成相控陣的建模;

step5:刪除導入的初始單元、初始求解項以及無效端口,并按照需要設置頻率、選擇算法等即可。

clear; clc; close all;
%% 文件路徑
addpath('C:Usersem.liuDesktoplbFEKO_matlab_API');%接口函數(shù)路徑
filepath='C:Usersem.liuDesktoplb';%腳本文件路徑
element_path='C:/Users/em.liu/Desktop/lb/model/';%單元文件(.CFX)的路徑
model_name='Horn1';%天線單元名稱(PS:單元文件名與文件中的模型名稱須一致)
%% **************************參數(shù)錄入********************************
%% 天線單元尺寸
p=[100,80]; %單元周期(單位:mm)
L=[91,71]; %單元尺寸[X向尺寸,Y向尺寸](單位:mm)
freq=10; %工作頻率(單位:GHz)
R=400; %天線半徑(單位:mm)
lambda=300/freq; %工作波長(單位:mm)
%% 端口信息
%波端口
face_name='Face13';%端口所在平面名稱
direction='ture';%端口激勵方向,勾選則為ture,否則為false
rot_angle='90';%端口電場極化轉(zhuǎn)角
%線端口
% wire_name='Wire29';%端口所在線名稱
%% 近場源參數(shù)設置
nearfield_R=[300,1,300]; %R方向尺寸[起始半徑,間隔,終點半徑],按照近場半球的尺寸設置
nearfield_theta= [0,1,90]; %thteta方向尺寸[起始theta,間隔,終點theta],按默認設置
nearfield_phi=[0,4,360]; %phi方向尺寸[起始phi,間隔,終點phi],按默認設置
%% 設置波束信息
nbar=4; %有nbar個等副瓣
SLL=-25; %副瓣電平
fw_th=[0,10,0];%方位面角度范圍[起始角度對應列,列間隔,終止角度對應列],PS:如果起始角與終止角一致,列間隔取非0的任意數(shù);取值范圍[0,180]
fy_th=[0,20,20];%俯仰面角度范圍[起始角度對應列,列間隔,終止角度對應列],PS:如果起始角與終止角一致,列間隔取非0的任意數(shù);取值范圍[0,360]
simulation_flag=1;%選擇計算類型,1代表和波束,2代表方位差(沿x方向差),3代表俯仰差(沿y方向差)
%*******************************************************************************************************
%%
%天線結(jié)構(gòu)參數(shù)化
isunitflg=importdata('isunitflg.csv');
[Ny,Nx]=size(isunitflg);%貼片建模需在口徑以內(nèi) (Ny:陣列行數(shù),沿y方向;Nx:陣列列數(shù),沿x方向)
array=ant4_Array(Nx,Ny,isunitflg,p);%利用微帶天線結(jié)構(gòu)體存儲天線結(jié)構(gòu)參數(shù)
%%
%幅相計算
sweep=auto_sweep(isunitflg,p,fw_th,fy_th,lambda,nbar,SLL);%不同波位下的幅相位計算,信息以結(jié)構(gòu)體形式進行保存
%% 設置波束類型
if simulation_flag==1
fid=fopen('ant_fw_sum.lua','wt'); %和方向圖(PS:和方向圖不分方位和與俯仰和,可以通過設置fw_th控制掃描平面)
elseif simulation_flag==2
fid=fopen('ant_fw_diff.lua','wt'); %方位差方向圖(沿x軸方向)
else
fid=fopen('ant_fy_diff.lua','wt'); %俯仰差方向圖(沿y軸方向)
end
GetApplication(fid);
Setunit(fid,'Millimetres'); %建模單位統(tǒng)一為mm
%% 組陣
ImportCFXmodel(fid,element_path,model_name);%導入單元模型
element_array(fid,isunitflg,array,model_name);%通過單元復制進行組陣
WaveguidePort_array(fid,isunitflg,model_name,face_name,direction,rot_angle);%批量設置波導饋電端口
% WirePort_array(fid,isunitflg,model_name,wire_name);%批量設置線端口
%% 波束掃描(給不同波位進行幅相饋電)
SetSourcesPerConfiguration(fid); %每個求解項的饋源設置不同
%依據(jù)求解標識,饋電的幅/相設置都不相同
if simulation_flag==1 %和波束
for th_fw=fw_th(1):fw_th(2):fw_th(3)
for th_fy=fy_th(1):fy_th(2):fy_th(3)
%每一個掃描角,添加一個求解項
Addstandardconfiguration(fid,['sum_direction',num2str(th_fw),...
'_',num2str(th_fy)]);
%設置近場
AddNearfield(fid,['sum_direction',num2str(th_fw),'_',num2str(th_fy)],nearfield_R,nearfield_theta,...
nearfield_phi,['sum_direction',num2str(th_fw),'_',num2str(th_fy)]);
%設置遠場
FarField2(fid,'farfield1',[-2,0.001,2],[0,90,90],[th_fy,th_fw],...
['sum_direction',num2str(th_fw),'_',num2str(th_fy)]);
FarField2(fid,'farfield2',[-180,0.2,180],[0,90,90],[th_fy,th_fw],...
['sum_direction',num2str(th_fw),'_',num2str(th_fy)]);
%給陣列饋電
% array_Wiresource(fid,isunitflg,sweep,th_fw,th_fy,simulation_flag);%給線端口饋電
array_Waveguidesource(fid,isunitflg,sweep,th_fw,th_fy,simulation_flag);%給波端口饋電
end
end
elseif simulation_flag==2 %方位差波束
for th_fw=fw_th(1):fw_th(2):fw_th(3)
for th_fy=fy_th(1):fy_th(2):fy_th(3)
%每一個掃描角,添加一個求解項
Addstandardconfiguration(fid,['diff_fw_direction',num2str(th_fw),'_',num2str(th_fy)]);
%設置近場
AddNearfield(fid,['diff_fw_direction',num2str(th_fw),'_',num2str(th_fy)],nearfield_R,nearfield_theta,...
nearfield_phi,['diff_fw_direction',num2str(th_fw),'_',num2str(th_fy)]);
%設置遠場
FarField2(fid,'farfield1',[-2,0.001,2],[0,90,90],[th_fy,th_fw],['diff_fw_direction',num2str(th_fw),'_',num2str(th_fy)]);
FarField2(fid,'farfield2',[-180,0.2,180],[0,90,90],[th_fy,th_fw],['diff_fw_direction',num2str(th_fw),'_',num2str(th_fy)]);
%給陣列饋電
% array_Wiresource(fid,isunitflg,sweep,th_fw,th_fy,simulation_flag);%給線端口饋電
array_Waveguidesource(fid,isunitflg,sweep,th_fw,th_fy,simulation_flag);%給波端口饋電
end
end
else %俯仰差波束
for th_fw=fw_th(1):fw_th(2):fw_th(3)
for th_fy=fy_th(1):fy_th(2):fy_th(3)
%每一個掃描角,添加一個求解項
Addstandardconfiguration(fid,['diff_fy_direction',num2str(th_fw),'_',num2str(th_fy)]);
%設置近場
AddNearfield(fid,['diff_fy_direction',num2str(th_fw),'_',num2str(th_fy)],nearfield_R,nearfield_theta,...
nearfield_phi,['diff_fy_direction',num2str(th_fw),'_',num2str(th_fy)]);
%設置遠場
FarField2(fid,'farfield1',[-2,0.001,2],[0,90,90],[th_fy,th_fw],['diff_fy_direction',num2str(th_fw),'_',num2str(th_fy)]);
FarField2(fid,'farfield2',[-180,0.2,180],[0,90,90],[th_fy,th_fw],['diff_fy_direction',num2str(th_fw),'_',num2str(th_fy)]);
%給陣列饋電
% array_Wiresource(fid,isunitflg,sweep,th_fw,th_fy,simulation_flag);%給線端口饋電
array_Waveguidesource(fid,isunitflg,sweep,th_fw,th_fy,simulation_flag);%給波端口饋電
end
end
end
fclose(fid);
總結(jié)
針對目前feko軟件尚不能針對相掃陣列進行自動建模的問題,在原本陣列天線自動建?;A(chǔ)進行了改進,可以實現(xiàn)任意單元形式、任意陣面外形、不同饋電形式相控陣天線的自動建模,可以方便讀者快速進行相掃陣列天線的建模以及陣列天線+載體的仿真建模。
審核編輯:劉清
-
hfss
+關(guān)注
關(guān)注
32文章
167瀏覽量
51426 -
電磁仿真
+關(guān)注
關(guān)注
2文章
79瀏覽量
20423 -
毫米波雷達
+關(guān)注
關(guān)注
107文章
1132瀏覽量
65936 -
相控陣天線
+關(guān)注
關(guān)注
2文章
45瀏覽量
9423 -
CST
+關(guān)注
關(guān)注
7文章
74瀏覽量
18549
原文標題:相控陣天線建模工具升級(附源代碼)
文章出處:【微信號:CloudBrain-TT,微信公眾號:云腦智庫】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
光控相控陣天線的發(fā)展歷程及工作原理
IC集成推動實現(xiàn)平板相控陣天線設計
相控陣天線波束控制的基本原理和波控系統(tǒng)的任務
相控陣天線系統(tǒng)散射分析
相控陣天線實驗系統(tǒng)設計
相控陣天線原理_相控陣天線設計
多波束相控陣天線的應用優(yōu)勢
一文解析相控陣天線的仿真應用
什么是相控陣天線有源駐波測試?
相控陣天線為什么做成面陣 頻控陣與相控陣的區(qū)別
什么是相控陣天線 相控陣天線波束形成原理
相控陣天線智能在線檢測項目成果顯現(xiàn)
相控陣天線類型及應用

相控陣天線建模工具升級
評論