プログラムの動作

本プログラムは、位相配列(Phased Array)アンテナにおけるビームフォーミングのシミュレーションを行い、波の伝播アニメーションと各波源の位相オフセット設定を視覚化するツールです。

主な機能として、直線状に配置された複数の波源から発生する波の干渉を計算し、指定した角度(操向角)へビームが形成される様子を2次元のコンター図としてアニメーション表示します。同時に、ビームを特定の方向へ向けるために各波源に与えられる初期位相オフセットのグラフ(連続的な位相と、 \(-\pi\) から \(\pi\) にラップされた位相)も下部にプロットします。

このプログラムにより、波源の数、波長、素子間隔、操向角などのパラメータがビームの形状やサイドローブに与える影響を直感的に理解するという課題を解決します。なお、ソースコード内のドキュメント文字列は「3重引用符」を用いて記述されています。

原理

位相配列アンテナでは、各波源(アンテナ素子)に与える信号の位相を個別に制御することで、波の干渉を利用して特定の方向に強い波(メインビーム)を形成します。

波長を \(\lambda\) としたとき、波数 \(k\) は以下の式で表されます。

\[k = \frac{2\pi}{\lambda}\]

アンテナの正面方向を \(0^\circ\) とし、任意の操向角 \(\theta\) にビームを向ける場合、位置 \(x_i\) にある波源 \(i\) に与えるべき初期位相オフセット \(\phi_i\) は以下の計算式で決定されます。

\[\phi_i = -k x_i \sin(\theta)\]

本シミュレーションでは、計算領域内の各点 \((x, y)\) における時刻 \(t\) の総波場 \(E(x, y, t)\) を、すべての波源からの波の重ね合わせとして計算します。各波源からの距離 \(r_i = \sqrt{(x - x_i)^2 + y^2}\) としたとき、波場は以下の式で合成されます。ここでは波の減衰を距離の平方根に反比例する形で近似しています(特異点を避けるため分母に \(0.5\) を加算)。

\[E(x, y, t) = \operatorname{Re} \left( \sum_{i=1}^{N} \frac{\exp(j(\omega t - k r_i + \phi_i))}{\sqrt{r_i + 0.5}} \right)\]

また、ハードウェアの実装上、位相は有限の範囲で制御されることが多いため、計算された位相オフセット \(\phi\) は以下のアルゴリズムを用いて \([-\pi, \pi)\) の範囲にラップ(折り返し)処理されます。

\[\phi_{\text{wrapped}} = (\phi + \pi) \pmod{2\pi} - \pi\]

必要な非標準ライブラリとインストール方法

本プログラムを実行するには、数値計算ライブラリである numpy と、描画およびアニメーション生成を行う matplotlib が必要です。 コマンドライン(ターミナルやコマンドプロンプト)で以下の pip コマンドを実行してインストールしてください。

pip install numpy matplotlib

必要な入力ファイル

本プログラムはすべてのシミュレーション条件をコマンドライン引数として受け取るため、外部の入力ファイルや特定のデータ構造を持つ事前定義ファイルは必要ありません。

生成される出力ファイル

本プログラムはシミュレーション結果を画面上のGUIウィンドウにアニメーションとしてリアルタイム描画するため、ファイルとして自動的に保存・生成される出力ファイルはありません。

コマンドラインでの使用例 (Usage)

プログラムはターミナルから以下の基本コマンドで実行します。

python aesa.py [オプション]

主なコマンドライン引数(オプション)は以下の通りです。

  • --n-sources : 波源の数(デフォルト: 16)

  • --wavelength : 波長(デフォルト: 1.0)

  • --spacing : 波源の間隔。省略時は --wavelength--spacing-multiple の積が使用されます。

  • --spacing-multiple : 波長の何倍の間隔にするか(デフォルト: 0.5、つまり半波長)

  • --steer-angle : ビームの操向角(度数法、デフォルト: 30.0)

  • --speed : シミュレーション単位における波の伝播速度(デフォルト: 1.0)

  • --xmin, --xmax : x軸方向の計算領域(デフォルト: -10.0 ~ 10.0)

  • --ymin, --ymax : y軸方向の計算領域(デフォルト: 0.0 ~ 15.0)

  • --nx, --ny : 計算メッシュの分割数(デフォルト: 各300)

  • --frames : アニメーションのフレーム数(デフォルト: 50)

  • --interval : アニメーションの更新間隔(ミリ秒、デフォルト: 50)

その他の引数(色スケールや画面サイズなど)は --help オプションで確認可能です。

コマンドラインでの具体的な使用例

例1:デフォルトパラメータでの実行

python aesa.py

引数を指定せずに実行すると、波源数16、半波長間隔、操向角 \(30^\circ\) の条件でシミュレーションが開始されます。上部のプロットエリアには右斜め上に進むビームの波面がアニメーション表示され、下部には各波源の位相オフセット(直線状のグラフとノコギリ波状にラップされたグラフ)が表示されます。

例2:操向角と波源数を変更した実行

python aesa.py --steer-angle -45 --n-sources 32

このコマンドでは、波源の数を32個に増やし、ビームの向きを左側(\(-45^\circ\))に設定しています。波源の数が増えることで、より鋭く指向性の高いメインビームが形成される様子がアニメーションで確認できます。

例3:素子間隔を広げてグレーティングローブを確認する実行

python aesa.py --steer-angle 20 --spacing-multiple 1.5

波源の間隔をデフォルトの半波長から1.5波長に広げます。素子間隔が広がることで、目的の \(20^\circ\) 方向のメインビームだけでなく、意図しない別の強いビーム(グレーティングローブ)が別方向に発生する現象を視覚的に観察することができます。