說在前面
陣列天線與載體的一體化仿真是一個十分普遍的工程問題,機載陣列天線、艦載陣列天線、彈載陣列天線以及汽車毫米波雷達天線在復雜環境下電磁仿真都屬于這一類問題。
這些問題不僅僅困擾著工程界,也同樣令學術界十分頭疼,多少研究工作者圍繞者這個話題前赴后繼的開展的研究。這類電磁計算問題的特點可以概括為三點:1)電大尺寸;2)多尺度;3)強耦合。
每個問題但拎出來都還好好解決,組合起來的話,問題就變得不簡單。目前三大主流的仿真軟件(CST、FEKO、HFSS)在處理這類問題時,均各有優勢,但缺點也同樣十分明顯,這取決于三種軟件底層算法的優缺點。
基于“場”方程的CST和HFSS計算時,需要對包含目標的整個空間進行剖分,“空氣盒子”的引入可以極大減小求解區域,但是對于電大尺寸的載體,空氣盒子的尺寸也會異常龐大,這一問題對于基于“頻域”方法的HFSS,簡直是災難,對于基于“時域”方法的CST,雖然影響會小一點,但是由于采用“正交網格”進行剖分,CST在處理含有復雜精細結構的陣列天線時,計算精度又會有所欠缺。
基于“源”方程的FEKO,僅需要對目標區域進行剖分,網格數會大幅減少,這一優點對于處理電大尺寸目標十分有利,但是對于求解含有大量復雜精細結構的陣列天線時,就會因為“近區網格”數目較多,分區質量差、耦合強,散射矩陣形態惡化等原因,導致MLFMA加速效果急劇下降,迭代求解的收斂性惡化甚至不收斂的問題。
綜上所述,針對“陣列天線+載體”的仿真仿真問題,想要做到“一招鮮,吃遍天”多少有點“妄想”,最好的方法就是,具體問題具體分析,針對問題的特征選擇合適的軟件和算法。
從陣列天線陣元規模和載體電尺寸大小的角度來看,可以大致做以下劃分:
陣元數目少(如數目<100),載體電尺寸較小,可以使用HFSS進行計算的,盡量使用HFS進行計算,計算精度高,同時由于天線通常是基于HFSS平臺進行設計,直接加載體就可進行計算,無需移植到其他平臺,操作方便;
陣元數目少,載體電尺寸較大,HFSS已經無法進行計算,可以利用FEKO或CST,使用全波方法進行計算,計算精度高,計算速度和內存消耗均可接受;
陣元數目少,載體電尺寸非常大(如電尺寸>100倍波長),HFSS和CST均算不動,建議采用FEKO的全波算法進行計算;
陣元數目較多(如數目介于100~500),載體電尺寸較大,FEKO計算出現收斂性較差、內存消耗異常大,建議使用CST的全波算法進行計算,或利用FEKO單獨計算陣列天線,并提取近場與載體進行一體化計算;
陣元數目特別多(如數目>500),載體電尺寸也非常大,利用FEKO的近似算法獲得陣列的遠場,提取遠場與載體一體化計算。
上述分類,只是提供了一個大致的方向,實際工程中,還需具體問題具體分析。
除了計算方法的選擇需要關注,對于該問題,還有一個比較棘手的問題需要解決,那就是陣列天線的建模問題。大規模陣元的陣列天線單元數目多、波束掃描時,每個饋電單元的相位也要相應的改變,單純依靠手動建模,時間成本相當高,且人為操作,錯誤很難避免。因此,依托仿真軟件進行二次開發,實現快速自動建模,十分必要。
綜上所述,圍繞“陣列+載體計算”的話題,按照建模和計算兩個方面做如下展開,本文重點針對基于FEKO平臺,進行二次開發,進行任意形式相控陣列(單元形式、陣面形狀)的自動建模。
正文
圍繞著陣列天線的快速建模,往期文章多有提及:
1)一種是依托FEKO自帶的應用擴展功能,可以快速生成任意單元形式的陣列天線,不足就是相掃功能尚不具備;
2)往期二次開發的“相控陣列天線”自動建模模塊,可以實現相掃功能,主要不足在于單元形式、陣面形狀以及陣元饋電形式都比較單一。
自適應微帶相控陣天線建模模塊
基于MATLAB-FEKO-API技術的復雜結構+相控陣天線的快速建模
作者針對著幾點不足進行了改進優化,源代碼點擊文末“閱讀原文”,自行下載。
針對任意形式天線單元的優化
往期文章中天線單元的建模通過“代碼”實現,這種建模方式對于結構比較復雜的天線單元十分不友好,也不利于天線單元形式的擴展。本文的建模邏輯有所調整,天線單元可以通過CADFEKO先進行建模,然后再利用“代碼”通過批量復制操作實現陣列建模。
%%模型導入 %形參定義(文件路徑,單元路徑,模型名稱) 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
針對任意形狀陣面的優化
往期文章介紹的方法要求陣面的形狀為圓形,而實際工程中,天線陣面的形式則更加多樣,橢圓形、菱形、方形等等,本文以網格的形式提取陣面外輪廓,結合陣列參數,對陣元進行布局,可以實現任意陣面外形的陣列天線的建模。
clc;clear all; %% 導入陣面輪廓曲線網格以及天線尺寸參數 filepath='C:Usersem.liuDesktoplbmodel';%網格文件位置 filename='elips.nas';%網格文件名稱 R=400;%天線口徑,尺寸需大于陣面尺寸,覆蓋實際陣面 p=[100,80];%單元周期[x方向周期,y方向周期] %% 創建單元中心的點陣面和單元邊緣點陣面 r=(sqrt(p(1)^2+p(2)^2))/2;%單元半徑 MM=floor(R/p(1));%x方向單元數(單邊) NN=floor(R/p(2));%y方向單元數(單邊) 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軸夾角(統一到第一象限) 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+'); %% 讀取陣面輪廓曲線網格數據 unit_Length=1e-3;%網格單位統一 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); % 線段個數 ntri = fgetl(fid); % 三角形個數 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);%判斷點陣是否在輪廓曲線內 % 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
針對饋電形式拓展的優化
往期文章僅支持wire_port的批量建模和饋電,饋電形式單一,本文進行了改進,基于導入模型上的線結構或面結構,進行饋電端口設置,擴展了波端口形式,改進的建模方式降低了代碼塊之間的耦合,用戶進行饋電形式的擴展將更加方便,從而可以根據需要,參考以下程序自行擴展諸如edge_port,FEM line Port等饋電形式。
%%添加波導端口 %形參定義(文件路徑,端口名稱,模型名稱,端口所在面名稱,端口激勵方向,極化轉角) 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
%%批量設置波端口 %形參定義(文件路徑,陣元分布表,模型名稱,端口所在平面名稱,端口激勵方向,極化轉角) 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:輸入陣列結構參數、端口信息、近場源/遠場源尺寸、波束性能參數及掃描范圍;
step4:運行生成.lua文件,并將內容拷貝至腳本編輯器script,并運行,自動完成相控陣的建模;
step5:刪除導入的初始單元、初始求解項以及無效端口,并按照需要設置頻率、選擇算法等即可。
clear; clc; close all; %% 文件路徑 addpath('C:Usersem.liuDesktoplbFEKO_matlab_API');%接口函數路徑 filepath='C:Usersem.liuDesktoplb';%腳本文件路徑 element_path='C:/Users/em.liu/Desktop/lb/model/';%單元文件(.CFX)的路徑 model_name='Horn1';%天線單元名稱(PS:單元文件名與文件中的模型名稱須一致) %% **************************參數錄入******************************** %% 天線單元尺寸 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';%端口電場極化轉角 %線端口 % wire_name='Wire29';%端口所在線名稱 %% 近場源參數設置 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的任意數;取值范圍[0,180] fy_th=[0,20,20];%俯仰面角度范圍[起始角度對應列,列間隔,終止角度對應列],PS:如果起始角與終止角一致,列間隔取非0的任意數;取值范圍[0,360] simulation_flag=1;%選擇計算類型,1代表和波束,2代表方位差(沿x方向差),3代表俯仰差(沿y方向差) %******************************************************************************************************* %% %天線結構參數化 isunitflg=importdata('isunitflg.csv'); [Ny,Nx]=size(isunitflg);%貼片建模需在口徑以內 (Ny:陣列行數,沿y方向;Nx:陣列列數,沿x方向) array=ant4_Array(Nx,Ny,isunitflg,p);%利用微帶天線結構體存儲天線結構參數 %% %幅相計算 sweep=auto_sweep(isunitflg,p,fw_th,fy_th,lambda,nbar,SLL);%不同波位下的幅相位計算,信息以結構體形式進行保存 %% 設置波束類型 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'); %建模單位統一為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); %每個求解項的饋源設置不同 %依據求解標識,饋電的幅/相設置都不相同 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);
總結
針對目前feko軟件尚不能針對相掃陣列進行自動建模的問題,在原本陣列天線自動建模基礎進行了改進,可以實現任意單元形式、任意陣面外形、不同饋電形式相控陣天線的自動建模,可以方便讀者快速進行相掃陣列天線的建模以及陣列天線+載體的仿真建模。
審核編輯:劉清
-
hfss
+關注
關注
32文章
167瀏覽量
50335 -
電磁仿真
+關注
關注
2文章
76瀏覽量
19824 -
毫米波雷達
+關注
關注
107文章
1050瀏覽量
64429 -
相控陣天線
+關注
關注
0文章
44瀏覽量
9042 -
CST
+關注
關注
7文章
63瀏覽量
17747
原文標題:相控陣天線建模工具升級(附源代碼)
文章出處:【微信號:CloudBrain-TT,微信公眾號:云腦智庫】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論