OpenEMSでのダイポールアンテナのモデリング





前のパートでは、シミュレータを使用して電磁波の伝搬をシミュレートする方法を説明しました

openEMS 次に、有用な何かを計算する方法を検討します。 周波数が500 MHzのダイポール半波アンテナをモデル化します。 周波数領域でのモデリングとアンテナの放射パターンのモデリングが考慮されます。 このアンテナの図を図に示します。







ダイポールアンテナは2つのビームで構成され、各ビームの長さは共振周波数に対して1/4波に等しくなります。 アンテナは中央から給電されます。 アンテナは、約75オームの共振周波数で抵抗を持ち、トーラス形状の指向性パターンを持っています。 ダイポールアンテナの動作理論に関する詳細情報は、たとえば、アイゼンバーグまたはベロセルコフスキーの教科書に記載されています。 これらの結果は、モデリング後に取得する必要があります。



猫の下には、ラインごとの解析を行うダイポールアンテナのモデルを含むスクリプトがあります。 読者は、Matlab / Octaveの基本、電気工学、およびアンテナ理論に精通していることを前提としています(複素抵抗、Sパラメータ、およびSWRが何であるかを知っています)。



ここで何が起こっているのか知らない人のために、私の以前の記事へのリンク:





シミュレーションスクリプトは、まず、お気に入りのテストエディター(KWriteなど)を使用して、* .m拡張子を付けてテキストファイルに保存する必要があります。 次に、コマンドラインからOctaveを実行し、スクリプト名をパラメーターとして渡します。 スクリプトがdipole.mという名前の場合、シミュレーションは次のように開始するとします。



octave dipole.m
      
      





Octaveのグラフビューを対話モードで使用する場合は、最初にコマンドラインからOctaveを実行してから、sourceコマンドを使用する必要があります。 現在のディレクトリからdipole.mスクリプトをロードします。



 source dipole.m
      
      





モデリングの結果として、次のものを取得します。





スクリプトの行ごとの解析に進みましょう。 openEMSのドキュメントはスペースが不足しているため、自分で何かを考えなければなりませんでした。



そのため、スクリプトの冒頭ですべての変数をクリアします。



 close all; clear; clc;
      
      





ここで、シミュレーションタスクを含むXMLファイルの名前と、シミュレーション結果が保存される一時ディレクトリを宣言する必要があります。 計算結果のファイルは100 MBに達するため、ディスク容量に注意する必要があります。



 physical_constants SimPath = 'tmp'; SimCSX = 'tmp.xml';
      
      





ここで、パラメトリックアンテナモデルの説明を始めます。 つまり、パラメーター(たとえば、計算された共振周波数)を変更すると、Matlab / Octaveはすべてのアンテナサイズを自動的に再計算します。 グリッドピッチは、波長の1/50に等しく選択されます。



 f_max = 0.5e9; #    lambda = c0/f_max; #   step=lambda/50; #  
      
      





物理学から覚えているように、波長と周波数は光の速度に関係しています

c0



モデリングスペース(SimBox)を宣言します-エッジが等しいキューブ

二重波長(2 *ラムダ)。 空間をグリッドで埋める

メッシュ。



 CSX = InitCSX(); mesh.x = -lambda:step:lambda; mesh.y = -lambda:step:lambda; mesh.z = -lambda:step:lambda; SimBox = [2*lambda 2*lambda 2*lambda]; CSX = DefineRectGrid(CSX,1,mesh);
      
      





次に、励起のソースを設定します。 最後の部分では、固定周波数の正弦波ソースを使用しました。 openEMSは、最初に時間領域で計算を実行し、次に周波数領域で結果を再カウントします。 したがって、システムの周波数特性をシミュレートするには、拡張スペクトルを備えたソースが必要です。 ガウスインパルスは、openEMSのソースとして利用できます。



そのため、最初に、ガウスパルスのパラメーターを格納する変数を宣言します。 ガウスパルススペクトルの中心周波数とスペクトル幅の半分を設定する必要があります。 200 MHz〜600 MHzの周波数範囲でアンテナをシミュレートします。 したがって、中心周波数は400 MHzになり、スペクトル幅は中心周波数から-200 MHzになります。



 f0 = 400e6; fc = 0.5*f0; FDTD = InitFDTD('NrTS',30000); FDTD = SetGaussExcite(FDTD,f0,fc);
      
      





FDTDスペースは、InitFDTD()関数を使用して初期化されます2番目のパラメーターは、時間領域のサンプル数を渡すことです。 サンプリングステップでパルス幅を超えるように選択する必要があります。 通常、30,000で十分です。 そうでない場合、計算間隔がガウスパルスの持続時間よりも短いというエラーメッセージが表示されます。



次に、境界条件を設定する必要があります。 自由空間でアンテナをモデリングするため、完全に吸収するMUR誘電体で四方を囲まれます。



 BC = {'MUR','MUR','MUR','MUR','MUR','MUR'}; FDTD = SetBoundaryCond(FDTD,BC);
      
      





次に、ジオメトリを宣言します。 たとえば、HFSSに精通している人のためにジオメトリを記述するプロセスは、異常であり、異常に見えます。



ダイポールは、励起源が接続された2つの導電性平行六面体で構成されます。 ダイポールの光線の厚さは、グリッドピッチよりも小さい場合があります。 理論によれば、ダイポールアンテナの厚さが大きいほど、その帯域幅は広くなります。 すべてのジオメトリはパラメータ化されており、パラメータが変更されると自動的に再カウントされます。 これは、Matlab / Octaveに組み込まれたシミュレータの利点です。



 t = step/4; #    (1/200  ) CSX = AddMetal(CSX,'right_beam'); #    start = [t -t -t]; #   stop = [lambda/4 tt]; #   CSX = AddBox(CSX,'right_beam',1,start,stop); #    
      
      





空間内の点の座標は、openEMSで[xyz]の順序で続く3つのコンポーネントの行列行として定義されます。



AddMetal()関数は、金属オブジェクトを追加します。 作成されたオブジェクトは、何らかの幾何学的オブジェクトに関連付けられている必要があります。 AddBox()関数はボックスを追加します。 最後から2番目のパラメータと最後のパラメータは、その頂点の座標です。 3番目のパラメーターは優先順位です。 彼の任命は私には不明のままです。 いつでも1に設定できます。2番目のパラメーターは、平行六面体のマテリアルオブジェクトの名前です。 前に作成したオブジェクト「right_beam」を使用する必要があります。



左の光線に対する同様のアクション:



 CSX = AddMetal(CSX,'left_beam'); start = [0 -t -t]; stop = [-lambda/4 tt]; CSX = AddBox(CSX,'left_beam',1,start,stop);
      
      





次に、アンテナに電力を供給する必要があります。 アンテナに電力を供給するために、集中ポートと呼ばれる特別なオブジェクトが使用されます。



分散ポートがまだあります。これは、EMWが伝播する空間の領域です。 分散ポートは、2番目の部分で使用されました。



通常のポートを使用する必要があります。 電圧源からアンテナに電力を供給する場合に対応します。 先に発表したガウスインパルスが電圧源です。 ポートは、仮想電圧源の端子が接続される空間内の2つのポイントを表します。 まず、これらの2つのポイントを宣言します。 それらは双極子光線の表面にあるはずです:



 start = [0 0 0 ]; #    stop = [step 0 0];
      
      





次に、ソースの出力インピーダンスを宣言します。



 R = 50;
      
      





また、ポート自体を追加できます。



 [CSX port] = AddLumpedPort(CSX,1,1,R,start,stop,[1 0 0],true);
      
      





AddLumpedPort()関数には8つのパラメーターがあります。 それらをより詳細に検討しましょう。





ここで、アンテナから放射されるフィールドが計算されるエリアを指定する必要があります。 openEMSは近距離フィールドのフィールドを計算し、NF2FFポストプロセッサを使用して、遠距離ゾーンのフィールドに再計算します。 アンテナの下部領域は、遠方ゾーンのフィールド上で計算されます。 フィールドが計算される領域は、モデリング領域と同じにする必要があります。境界からグリッドの数ステップだけ後退するようにしてください。



 SimBox = SimBox-step*4.0; #    [CSX nf2ff] = CreateNF2FFBox(CSX,'nf2ff',-SimBox/2,SimBox/2);
      
      





それだけです! ジオメトリが設定されます。 openEMSのジョブファイルを記録し、AppCSXCADインタラクティブビューアーで結果を確認できます。



 mkdir('tmp'); SimPath = 'tmp/tmp.xml' WriteOpenEMS(SimPath,FDTD,CSX); CSXGeomPlot(SimPath);
      
      





すべてが正しく行われた場合、次の図が表示されます(ポートはダイポールギャップに表示されます)。







次に、openEMSを実行します。

 RunOpenEMS('tmp','tmp.xml');
      
      





計算はかなり前から続いています。 計算後、構造に対して以下が作成されます。





ポート構造からアンテナ入力インピーダンスと反射係数S11に関する情報を抽出する必要があります。 これを行うには、次の構造フィールドを使用します

ポート:





次に、無線工学コースで知られている式を使用して、入力抵抗Zinと入力S11での反射係数を計算します(これは、

定在波係数-SWR)。 標準のMatlab / Octaveツールを使用して、Zin(アクティブおよびリアクティブパーツ)、SWR、およびS11のグラフをカットできるようになりました。



 freq = linspace(f0-fc,f0+fc,501); #   port = calcPort(port,'tmp',freq); #   Zin = port.uf.tot ./ port.if.tot; S11 = port.uf.ref ./ port.uf.inc; subplot(3,1,1); plot(freq/1e6,real(Zin),freq/1e6,imag(Zin)); #   R  X legend('Re(Zin)','Im(Zin)'); subplot(3,1,2); plot(freq/1e6,S11); #   S11 swr = (1+abs(S11))./(1-abs(S11)); #     [swr_min idx] = min(swr); [Xmin idx1] = min(abs(imag(Zin))); #    fr = freq(idx); fr1 = freq(idx1); Zr = Zin(idx); Zr1 = Zin(idx1); disp("Minimum SWR frequency:"); #    disp(fr); disp("Resonant frequency (jX=0)"); disp(fr1); disp("Impedance at minimum SWR"); disp(Zr); disp("Impedance at resonant frequency"); disp(Zr1); disp("Minimum SWR:"); disp(swr_min); subplot(3,1,3); semilogy(freq/1e6,swr);
      
      





次のアンテナパラメータを取得します。 共振周波数が計算されたものから低下していることがわかります。 71.2オームの共振でのアンテナ抵抗は、教科書とほぼ同じで、偏差はダイポールの厚さによって生じます。



 Minimum SWR frequency: 427200000 Resonant frequency (jX=0) 431200000 Impedance at minimum SWR 68.7692 - 6.5511i Impedance at resonant frequency 71.18555 - 0.45064i Minimum SWR: 1.4013
      
      











次に、極座標でDNを計算します。 CalcNF2FF()関数の最後の2つのパラメーターは、DNが考慮される角度の範囲です。 3番目のパラメーターである彼女は、日が計算される頻度を渡す必要があります。

次のグラフが表示されます。



 nf2ff = CalcNF2FF(nf2ff,'tmp',fr,[-180:2:180]*pi/180,[0 90]*pi/180); figure polarFF(nf2ff,'xaxis','theta','param',[1 2],'normalize',1);
      
      











デカルト座標のMD:



 figure plotFFdB(nf2ff,'xaxis','theta','param',[1 2]);
      
      











 thetaRange = (0:2:180); phiRange=(0:2:360)-180; nf2ff = CalcNF2FF(nf2ff,'tmp',fr,thetaRange*pi/180,phiRange*pi/180,'Verbose',1,'Outfile' ,'3D_Pattern.h5'); figure plotFF3D(nf2ff,'logscale',-20);
      
      











アンテナDNのように、空間DNはトーラスの形をしています。 係数

アンテナゲイン2.1 dB。



* .vtkファイルを作成して、後でParaviewで表示できるようにすることもできます。



 E_far_normalized = nf2ff.E_norm{1} / max(nf2ff.E_norm{1}(:)) * nf2ff.Dmax; DumpFF2VTK(['tmp/3D_Pattern.vtk'],E_far_normalized,thetaRange,phiRange,'scale', 1e-3);
      
      





これは、DNがParaviewでどのように見えるかです(3D_Pattern.vtkファイルを開く必要があります)。







200〜600 MHzの周波数範囲でダイポールアンテナをモデル化しました。 ご覧のとおり、シミュレーションにより理論に近い結果が得られ、ダイポールパラメーターの理想からの偏差の影響を考慮することができます。 手にHFSSを持っている人は結果を確認できます。



結論として、スクリプト全体を紹介します。



非表示のテキスト
 close all; clear; clc; physical_constants #unit = 1e-3; # Units in mm SimPath = 'tmp'; SimCSX = 'tmp.xml'; f_max = 0.5e9; lambda = c0/f_max; dipole_L = lambda/2; step=lambda/50; CSX = InitCSX(); mesh.x = -lambda:step:lambda; mesh.y = -lambda:step:lambda; mesh.z = -lambda:step:lambda; SimBox = [2*lambda 2*lambda 2*lambda]; CSX = DefineRectGrid(CSX,1,mesh); #f0 = f_max; f0 = 400e6; fc = 0.5*f0; FDTD = InitFDTD('NrTS',30000); FDTD = SetGaussExcite(FDTD,f0,fc); BC = {'MUR','MUR','MUR','MUR','MUR','MUR'}; FDTD = SetBoundaryCond(FDTD,BC); t = step/4; CSX = AddMetal(CSX,'right_beam'); start = [t -t -t]; stop = [lambda/4 tt]; CSX = AddBox(CSX,'right_beam',1,start,stop); CSX = AddMetal(CSX,'left_beam'); start = [0 -t -t]; stop = [-lambda/4 tt]; CSX = AddBox(CSX,'left_beam',1,start,stop); start = [0 0 0 ]; stop = [step 0 0]; R = 50; [CSX port] = AddLumpedPort(CSX,1,1,R,start,stop,[1 0 0],true); SimBox = SimBox-step*4.0; [CSX nf2ff] = CreateNF2FFBox(CSX,'nf2ff',-SimBox/2,SimBox/2); mkdir('tmp'); SimPath = 'tmp/tmp.xml' WriteOpenEMS(SimPath,FDTD,CSX); CSXGeomPlot(SimPath); RunOpenEMS('tmp','tmp.xml'); freq = linspace(f0-fc,f0+fc,501); port = calcPort(port,'tmp',freq); Zin = port.uf.tot ./ port.if.tot; S11 = port.uf.ref ./ port.uf.inc; subplot(3,1,1); plot(freq/1e6,real(Zin),freq/1e6,imag(Zin)); legend('Re(Zin)','Im(Zin)'); subplot(3,1,2); plot(freq/1e6,S11); legend('S11'); swr = (1+abs(S11))./(1-abs(S11)); [swr_min idx] = min(swr); [Xmin idx1] = min(abs(imag(Zin))); fr = freq(idx); fr1 = freq(idx1); Zr = Zin(idx); Zr1 = Zin(idx1); disp("Minimum SWR frequency:"); disp(fr); disp("Resonant frequency (jX=0)"); disp(fr1); disp("Impedance at minimum SWR"); disp(Zr); disp("Impedance at resonant frequency"); disp(Zr1); disp("Minimum SWR:"); disp(swr_min); subplot(3,1,3); semilogy(freq/1e6,swr); legend('SWR'); nf2ff = CalcNF2FF(nf2ff,'tmp',fr,[-180:2:180]*pi/180,[0 90]*pi/180); figure polarFF(nf2ff,'xaxis','theta','param',[1 2],'normalize',1); figure plotFFdB(nf2ff,'xaxis','theta','param',[1 2]); thetaRange = (0:2:180); phiRange=(0:2:360)-180; nf2ff = CalcNF2FF(nf2ff,'tmp',fr,thetaRange*pi/180,phiRange*pi/180,'Verbose',1,'Outfile' ,'3D_Pattern.h5'); figure plotFF3D(nf2ff,'logscale',-20); E_far_normalized = nf2ff.E_norm{1} / max(nf2ff.E_norm{1}(:)) * nf2ff.Dmax; DumpFF2VTK(['tmp/3D_Pattern.vtk'],E_far_normalized,thetaRange,phiRange,'scale', 1e-3); pause;
      
      









おそらく継続される...



All Articles