ULAにおけるRayleigh Distanceの計算

# 0. はじめに
本稿では、**Rayleigh Distance（電波伝搬モデル化における平面波近似が成立する最短距離）を計算するプログラムを紹介**します。
尚、アレーアンテナとしては、ULA (Uniform Linear Array)アンテナを対象にします。
UCAとは、複数のアンテナ素子を直線状に等間隔で並べたアレーアンテナです。

## 0.1 背景 
複数のアンテナ素子を並べて構成されるアンテナは、アレーアンテナと呼ばれます。アレーアンテナを利用した空間多重伝送方式はMIMO(Multiple Input and Multiple Output)と呼ばれます。5G/6Gでは、従来のMIMOと比べ、より多くのアンテナ素子を利用するMassive MIMOの利用が検討されています。
MIMOやMassive MIMOの信号処理では、Channel推定という電波伝搬の状態を推定する処理があります。Channel推定では、推定したChannelをフーリエ変換することで、電波の到来角情報に変換します。電波の到来角情報に変換することは、暗黙的に平面波近似を利用しています。なぜなら、電波を球面波として扱える領域（一般に近傍界）では、角度と距離の情報を抽出できますが、電波を平面波として扱える領域（一般に遠方界）では、距離の情報を得られず、角度の情報のみになるからです。このように、Channel推定では、暗黙的に平面波近似を利用しているため、平面波近似が成り立つかを予め確認する必要があります。そのため、電波伝搬モデル化における平面波近似が成立する最短距離である、Rayleigh Distanceを計算する必要があります。

# 1. Rayleigh Distanceの計算方法
## 1.1 パラメータ
パラメータは、電波の波長（λ）、アンテナ素子数（N）、アンテナ素子の間隔（d）です。
アンテナ素子の間隔は、波長の半分にする場合が多いため、ここでは波長の半分と固定します。

## 1.2 Array Aperture
ULAにおけるArray Aperture (D) は以下のように計算できます。
```math
D = N d
``` 

今回はd=λ/2としたため、

```math
D = Nλ/2
```
となります。

## 1.3 Rayleigh Distance
Rayleigh Distance（Z）は、Array Apertureを用いて以下のように計算できます。
```math
Z = 2D^2/λ
```
Array Apertureを展開すると、

```math
Z = N^2λ/2
```
と表せます。
これより、**Rayleigh Distance（Z）はアンテナ素子数（N）の2乗に比例する**と分かります。従って、アンテナ素子数の増加によって平面波近似が成り立たない領域が広がることを注意する必要があります。


# 2. プログラム
Rayleigh DistanceやArray Apertureを計算するpythonプログラムを以下に示す。
```main.py
#!/usr/bin/env python

import sys
import numpy as np


def main(Freq,minNant,maxNant,Flag):

        Lambda = 0.3/Freq
        AntSpace = 0.5 * Lambda
        Nant = [i for i in range(minNant,maxNant+1)]
        ArrayAperture = [ i * AntSpace for i in range(minNant,maxNant+1)]
        Rayleigh = [ 2.0/Lambda *( (i * AntSpace)**2 ) for i in range(minNant,maxNant+1)]

        if Flag == 0:
                print("ArrayAperture [m]")
                for i in range(0,maxNant+1-minNant):
                        print(Nant[i],":",round(ArrayAperture[i],2),"[m]")
        if Flag == 1:
                print("RayleighDistance [m]")
                for i in range(0,maxNant+1-minNant):
                        print(Nant[i],":",round(Rayleigh[i],2),"[m]")


if __name__ == '__main__':
        np.set_printoptions(suppress=True)
        args = sys.argv
        if len(args) == 5:
                Freq  = float(args[1])
                minNant = int(args[2])
                maxNant = int(args[3])
                Flag = int(args[4])
        else:
                print("Set  Arguments as int")
                print("#1 : Frequency [GHz]")
                print("#2 : minimum of the number of antennas in ULA array of BS")
                print("#3 : maximum of the number of antennas in ULA array of BS")
                print("#4 : Flag {0,1} = {ArrayAperture, RayleighDistance")
                print("example :  python3 main.py 150 240 256 1")
                sys.exit(0)

        main(Freq,minNant,maxNant,Flag)
```
# 3. プログラムの実行
上記のmain.pyを実行する際には、4つの引数を指定します。
引数の説明は以下です。最後のFlagを0,1で切り替えると、Array ApertureかRayleigh Distanceのどちらを表示するかを選べます。
```
#1 : Frequency [GHz]
#2 : minimum of the number of antennas in ULA array of BS
#3 : maximum of the number of antennas in ULA array of BS
#4 : Flag {0,1} = {ArrayAperture, RayleighDistance
```

## 3.1 実行例①　Rayleigh Distanceの計算結果
```
# python main.py  100 240 256 1
RayleighDistance [m]
240 : 86.4 [m]
241 : 87.12 [m]
242 : 87.85 [m]
243 : 88.57 [m]
244 : 89.3 [m]
245 : 90.04 [m]
246 : 90.77 [m]
247 : 91.51 [m]
248 : 92.26 [m]
249 : 93.0 [m]
250 : 93.75 [m]
251 : 94.5 [m]
252 : 95.26 [m]
253 : 96.01 [m]
254 : 96.77 [m]
255 : 97.54 [m]
256 : 98.3 [m]
```
## 3.2 実行例②　Array Apertureの計算結果
```
# python main.py  100 240 256 0
ArrayAperture [m]
240 : 0.36 [m]
241 : 0.36 [m]
242 : 0.36 [m]
243 : 0.36 [m]
244 : 0.37 [m]
245 : 0.37 [m]
246 : 0.37 [m]
247 : 0.37 [m]
248 : 0.37 [m]
249 : 0.37 [m]
250 : 0.38 [m]
251 : 0.38 [m]
252 : 0.38 [m]
253 : 0.38 [m]
254 : 0.38 [m]
255 : 0.38 [m]
256 : 0.38 [m]
```
# 4. まとめ
本稿では、ULAアンテナを対象としたRayleigh Distance（電波伝搬モデル化における平面波近似が成立する最短距離）を計算するプログラムを紹介しました。
Rayleigh Distance（Z）はアンテナ素子数（N）の2乗に比例するため、アンテナ素子数の増加によって平面波近似が成り立たなくなる領域が広がることを注意する必要があると分かりました。


# 参考文献
https://arxiv.org/abs/2108.07581