携帯電話の基地局を新しく設置するとき、半径何キロメートルの範囲をカバーできるでしょうか。この問いに答えるには、「送信電力がどれだけの損失を受けて受信点に届くか」を定量的に予測する必要があります。しかし、都市の中にはビルや街路樹があり、郊外には丘や森があり、電波はこれらに反射・回折・散乱されながら伝搬します。こうした複雑な伝搬環境を何らかのモデルで記述し、受信電力を予測するのが「電波伝搬モデル」の役割です。
電波伝搬モデルは、セルラー通信の基地局配置計画、Wi-Fiアクセスポイントの設置最適化、さらにはIoTデバイスの通信範囲見積もりに至るまで、無線通信システム設計の根幹を成します。5Gのミリ波帯やSub-6帯の展開計画でも、適切な伝搬モデルの選択がサービスエリアの精度を左右します。
本記事の内容
- フリスの伝達公式による自由空間伝搬損失の導出と物理的意味
- 対数距離パスロスモデルの構造と環境パラメータ
- 奥村-秦モデル(都市部の経験的モデル)の詳細
- COST 231拡張モデルとHata-COST 231の適用範囲
- シャドウイング(対数正規分布)の統計的扱い
- レイトレーシングの基本概念
- Pythonによる各モデルの比較プロットとパスロスマップの2D可視化
前提知識
この記事を読む前に、以下の概念に馴染みがあると理解がスムーズです。
- 電磁波の基本(波長・周波数・電力の関係)
- デシベル(dB)とdBmの定義と使い方
- 対数(log)の基本的な性質
自由空間伝搬損失 — フリスの伝達公式
電波が減衰する最も基本的な理由
太陽から出た光は地球に届くまでに約1.5億kmを旅しますが、その途中で何かに「吸収」されているのではなく、単に球面状に広がることでエネルギー密度が薄まっています。電波も全く同じです。等方的(全方向均等)に放射された電波のエネルギーは、距離 $d$ の地点で半径 $d$ の球面上に一様に分布するため、単位面積あたりのエネルギー密度(電力密度)は球面の面積 $4\pi d^2$ に反比例して減少します。
この幾何学的な拡散による減衰が自由空間伝搬損失(Free Space Path Loss, FSPL)です。「損失」と呼びますが、エネルギーが失われているのではなく、受信アンテナの開口面積で捕捉できるエネルギーの割合が距離とともに減少しているのです。
フリスの伝達公式の導出
送信アンテナから放射される電波について、段階的に受信電力を導出していきましょう。
送信電力を $P_t$、送信アンテナの利得を $G_t$ とすると、距離 $d$ における電力密度 $S$ は次のようになります。
$$ S = \frac{P_t G_t}{4\pi d^2} \quad \text{[W/m}^2\text{]} $$
$G_t$ は等方性アンテナに対する利得で、アンテナが特定の方向にエネルギーを集中させる度合いを表しています。
受信アンテナはこの電力密度を「捕まえる」ための実効面積(effective aperture)$A_e$ を持ちます。受信アンテナの利得 $G_r$ と実効面積の関係は、アンテナ理論の基本定理から次のように与えられます。
$$ A_e = \frac{G_r \lambda^2}{4\pi} $$
この式は波長 $\lambda$ が長い(周波数が低い)ほど実効面積が大きくなることを示しています。これは、低い周波数の電波を効率的に受信するには物理的に大きなアンテナが必要であるという直感と整合します。
受信電力 $P_r$ は電力密度と実効面積の積として得られます。
$$ P_r = S \cdot A_e = \frac{P_t G_t}{4\pi d^2} \cdot \frac{G_r \lambda^2}{4\pi} $$
これを整理すると、フリスの伝達公式(Friis Transmission Equation)が得られます。
$$ P_r = P_t G_t G_r \left(\frac{\lambda}{4\pi d}\right)^2 $$
右辺の $(\lambda / 4\pi d)^2$ の部分が自由空間の伝搬特性を表しており、この逆数が自由空間伝搬損失です。
自由空間伝搬損失(FSPL)
自由空間伝搬損失をデシベルで表すと次のようになります。
$$ \text{FSPL [dB]} = 10\log_{10}\left(\frac{4\pi d}{\lambda}\right)^2 = 20\log_{10}\left(\frac{4\pi d}{\lambda}\right) $$
周波数 $f$(Hz)と距離 $d$(m)で表すと、$\lambda = c/f$ を代入して次の実用的な形が得られます。
$$ \text{FSPL [dB]} = 20\log_{10}(d) + 20\log_{10}(f) + 20\log_{10}\left(\frac{4\pi}{c}\right) $$
定数項を計算すると、$20\log_{10}(4\pi / 3 \times 10^8) \approx -147.56$ dBなので、距離をkm、周波数をMHzで表すと次の簡便な式が得られます。
$$ \text{FSPL [dB]} = 32.44 + 20\log_{10}(d_{\text{km}}) + 20\log_{10}(f_{\text{MHz}}) $$
たとえば、距離1 km、周波数900 MHz(携帯電話帯域)では $\text{FSPL} = 32.44 + 0 + 59.08 = 91.5$ dBとなります。これは送信電力が約10億分の1に減衰することを意味しますが、携帯電話の受信機は$-100$ dBm程度まで検出可能なので、送信電力1 W(30 dBm)であれば自由空間では十分に通信可能です。
自由空間伝搬損失は全ての伝搬モデルの基盤ですが、実際の環境では建物や地形による追加の損失が加わります。これを体系的に扱う最も基本的なフレームワークが対数距離パスロスモデルです。
対数距離パスロスモデル
モデルの構造
実測データを分析すると、受信電力のデシベル値は距離の対数に対してほぼ線形に減少することが知られています。この経験的な事実を数式化したのが対数距離パスロスモデル(Log-Distance Path Loss Model)です。
$$ PL(d) = PL(d_0) + 10n\log_{10}\left(\frac{d}{d_0}\right) \quad \text{[dB]} $$
ここで、$PL(d)$ は距離 $d$ でのパスロス(dB)、$PL(d_0)$ は参照距離 $d_0$ でのパスロス(dB)、$n$ はパスロス指数(path loss exponent)です。
パスロス指数 $n$ は環境の種類を特徴づけるパラメータで、以下のような値を取ります。
| 環境 | パスロス指数 $n$ |
|---|---|
| 自由空間 | 2.0 |
| 郊外 | 2.5〜3.5 |
| 都市部(見通し内) | 2.7〜3.5 |
| 都市部(見通し外) | 3.0〜5.0 |
| 屋内(見通し内) | 1.6〜1.8 |
| 屋内(見通し外) | 4.0〜6.0 |
| 工場内 | 2.0〜3.0 |
$n = 2$ が自由空間に対応し、$n > 2$ では自由空間よりも急速に減衰することを意味します。興味深いことに、屋内の見通し内(廊下など)では $n < 2$ となることがあります。これは廊下が導波管のように振る舞い、電波をある程度閉じ込める効果によるものです。
参照距離のパスロス
参照距離 $d_0$ は通常、近傍界の影響を避けるために十分な距離を選びます。屋外環境では $d_0 = 1$ km、屋内環境では $d_0 = 1$ m が一般的です。$PL(d_0)$ は自由空間伝搬損失で近似する場合が多いですが、実測値を使えばより正確になります。
シャドウイング(影のゆらぎ)
対数距離モデルはあくまで距離に対する平均的な減衰を記述するものです。同じ距離でも、建物の影にいるか見通しがあるかで受信電力は大きく異なります。この場所ごとのばらつきをシャドウイング(shadowing)またはスローフェージング(slow fading)と呼びます。
測定データの統計分析から、シャドウイングによるパスロスの変動は対数正規分布に従うことが知られています。つまり、実際のパスロスは次のように表されます。
$$ PL(d) = PL(d_0) + 10n\log_{10}\left(\frac{d}{d_0}\right) + X_\sigma \quad \text{[dB]} $$
ここで $X_\sigma$ は平均0、標準偏差 $\sigma$ dBの正規分布に従うランダム変数です。$\sigma$ の典型的な値は4〜12 dBで、環境が複雑なほど大きくなります。
シャドウイングの標準偏差 $\sigma$ は回線設計において重要な意味を持ちます。セルラー通信では、「セルの端にいるユーザーの95%が一定の受信品質を満たす」といった確率的な保証が求められます。このとき、平均パスロスに加えて $\sigma$ の1.65倍(片側95%点)のマージンを追加する必要があります。
対数距離モデルは環境パラメータ($n$, $\sigma$)を適切に設定すれば幅広い環境に適用できる汎用的なモデルですが、パラメータの決定には実測データが必要です。測定なしに予測を行うためには、環境の具体的な特徴(地形、建物の高さと密度、周波数帯など)を入力とする経験的モデルが有用です。次に、代表的な経験的モデルである奥村-秦モデルを詳しく見ていきます。
奥村-秦モデル
奥村曲線と秦モデルの歴史
1968年、NTTの奥村善久らは、東京都心部での大規模な電波伝搬測定を行い、周波数150〜1920 MHz、距離1〜100 km、アンテナ高さ30〜200 mの範囲にわたる膨大な測定データから伝搬損失の曲線群を作成しました。これが「奥村曲線」です。
奥村曲線は非常に正確ですが、グラフ読み取りの形でしか使えない不便がありました。1980年に秦正義がこの曲線群を数式に近似したのが秦モデル(Hata model)です。秦モデルは計算機で容易に計算できるため、セルラー通信の設計ツールとして世界的に標準的に使われるようになりました。
秦モデルの数式
秦モデルは、大都市における中央値パスロス $PL_{\text{urban}}$(dB)を次の式で与えます。
$$ PL_{\text{urban}} = 69.55 + 26.16\log_{10}(f) – 13.82\log_{10}(h_b) – a(h_m) + (44.9 – 6.55\log_{10}(h_b))\log_{10}(d) $$
ここで、各パラメータは以下の通りです。
- $f$: 周波数(MHz)— 適用範囲: 150〜1500 MHz
- $h_b$: 基地局アンテナ高さ(m)— 適用範囲: 30〜200 m
- $h_m$: 移動局アンテナ高さ(m)— 適用範囲: 1〜10 m
- $d$: 距離(km)— 適用範囲: 1〜20 km
- $a(h_m)$: 移動局アンテナ高さ補正係数
この式の各項の物理的意味を見てみましょう。
- $69.55 + 26.16\log_{10}(f)$: 自由空間損失に対応する項(周波数依存)
- $-13.82\log_{10}(h_b)$: 基地局アンテナの高さ利得(高いほど損失が小さい)
- $-a(h_m)$: 移動局アンテナの高さ利得
- $(44.9 – 6.55\log_{10}(h_b))\log_{10}(d)$: 距離による減衰。パスロス指数が $h_b$ に依存する
パスロス指数に対応する部分を取り出すと、$(44.9 – 6.55\log_{10}(h_b))/10$ となります。基地局高さ $h_b = 30$ m では約 $(44.9 – 9.67)/10 = 3.52$、$h_b = 100$ m では $(44.9 – 13.10)/10 = 3.18$ です。いずれも自由空間($n = 2$)より大きく、都市環境での追加減衰を反映しています。
移動局アンテナ高さ補正係数
移動局アンテナの高さ補正係数 $a(h_m)$ は、都市の規模によって異なる式が使われます。
中小都市: $$ a(h_m) = (1.1\log_{10}(f) – 0.7)h_m – (1.56\log_{10}(f) – 0.8) \quad \text{[dB]} $$
大都市($f \leq 200$ MHz): $$ a(h_m) = 8.29(\log_{10}(1.54h_m))^2 – 1.1 \quad \text{[dB]} $$
大都市($f \geq 400$ MHz): $$ a(h_m) = 3.2(\log_{10}(11.75h_m))^2 – 4.97 \quad \text{[dB]} $$
$h_m = 1.5$ m(典型的な歩行者の携帯電話)のとき、$f = 900$ MHz の中小都市では $a(1.5) \approx 0$ dB で、補正はほとんどありません。
環境補正
秦モデルは基本的に「大都市」の条件で導出されているため、他の環境には補正が必要です。
郊外(suburban): $$ PL_{\text{sub}} = PL_{\text{urban}} – 2\left[\log_{10}\left(\frac{f}{28}\right)\right]^2 – 5.4 \quad \text{[dB]} $$
開放地(open area): $$ PL_{\text{open}} = PL_{\text{urban}} – 4.78(\log_{10}(f))^2 + 18.33\log_{10}(f) – 40.94 \quad \text{[dB]} $$
郊外では都市部より約5〜10 dB小さく、開放地ではさらに約10〜25 dB小さくなります。
秦モデルの適用範囲は1500 MHzまでですが、2Gや3Gの基地局設計ではこれで十分でした。しかし、1800 MHz帯(DCS/GSM1800)や2100 MHz帯(UMTS/3G)への拡張が必要になり、COST 231による拡張が行われました。
COST 231-Hata モデル
秦モデルの高周波数拡張
欧州の研究プロジェクト COST 231 は、秦モデルを1500〜2000 MHzの周波数帯に拡張しました。COST 231-Hata モデルの式は次のようになります。
$$ PL = 46.3 + 33.9\log_{10}(f) – 13.82\log_{10}(h_b) – a(h_m) + (44.9 – 6.55\log_{10}(h_b))\log_{10}(d) + C_m $$
元の秦モデルとの違いは、定数項($69.55 \to 46.3$)と周波数係数($26.16 \to 33.9$)が変わっていること、そして環境補正定数 $C_m$ が追加されていることです。
$C_m$ は以下の値を取ります。 – 中小都市・郊外: $C_m = 0$ dB – 大都市中心部: $C_m = 3$ dB
この3 dBの差は、大都市の高層ビル群による追加的な回折・散乱損失を表しています。
適用範囲
COST 231-Hata モデルの適用範囲は以下の通りです。
- 周波数: 1500〜2000 MHz
- 基地局高さ: 30〜200 m
- 移動局高さ: 1〜10 m
- 距離: 1〜20 km
注意すべき点として、このモデルは距離1 km未満のマイクロセル設計には適用できません。マイクロセル(セル半径数百m以下)では、建物1棟1棟の影響が支配的になるため、より詳細なモデル(COST 231 Walfisch-Ikegamiモデルなど)が必要です。
経験的モデルは統計的な平均値を与えるため計算コストが低いですが、個々の建物や地形の影響を再現することはできません。より高い精度が求められる場合には、電波の伝搬経路を幾何学的に追跡するレイトレーシングが用いられます。
レイトレーシングの概念
決定論的モデルの必要性
奥村-秦モデルやCOST 231モデルは大規模な測定データに基づく経験的モデルであり、広い範囲の平均的なパスロスを効率よく予測できます。しかし、5Gのミリ波帯やSmall Cell設計のように空間分解能の高い予測が求められる場合、建物の3Dモデルに基づくレイトレーシング(ray tracing)が必要になります。
レイトレーシングの基本的な考え方は、光学のレイトレーシング(3DCGでおなじみの手法)と同じです。送信アンテナから放射された電波を「光線(ray)」として扱い、建物の壁面での反射、建物の角での回折、建物を透過する際の減衰を幾何光学的に計算します。
レイトレーシングの構成要素
レイトレーシングで考慮される主な電波の振る舞いは以下の通りです。
- 直接波(LOS: Line of Sight): 送受信間に障害物がない場合の直接的な伝搬
- 反射(Reflection): 建物壁面や地表面でのフレネル反射。1次反射、2次反射、…と多重反射を追跡
- 回折(Diffraction): 建物の角やエッジでの回折。UTD(一様回折理論)やGTD(幾何回折理論)で計算
- 散乱(Scattering): 建物表面の凹凸やランダムな構造物による散乱
- 透過(Transmission): 建物壁面を貫通する際の減衰。材質と周波数に依存
レイトレーシングは高い精度が得られますが、計算コストが大きく、建物の3Dデータベースが必要です。近年では、GPU を活用した高速レイトレーシングや、機械学習を組み合わせたハイブリッド手法が研究されています。
ここまで複数の伝搬モデルの理論を学んできましたが、次にこれらをPythonで実装し、モデル間の違いと各パラメータの影響を視覚的に確認してみましょう。
Pythonで学ぶ電波伝搬モデル
各モデルの実装と比較
まず、自由空間損失、対数距離モデル、秦モデル、COST 231モデルを実装し、同じ条件で比較します。
import numpy as np
import matplotlib.pyplot as plt
def fspl(d_km, f_mhz):
"""自由空間伝搬損失 [dB]"""
return 32.44 + 20 * np.log10(d_km) + 20 * np.log10(f_mhz)
def log_distance(d_km, f_mhz, n, sigma=0, d0_km=1.0):
"""対数距離パスロスモデル [dB]"""
PL_d0 = fspl(d0_km, f_mhz)
PL = PL_d0 + 10 * n * np.log10(d_km / d0_km)
return PL
def hata_urban(d_km, f_mhz, hb, hm, city='medium'):
"""
秦モデル(都市部)[dB]
city: 'medium' or 'large'
"""
f = f_mhz
# 移動局アンテナ高さ補正
if city == 'large' and f >= 400:
a_hm = 3.2 * (np.log10(11.75 * hm))**2 - 4.97
elif city == 'large' and f < 400:
a_hm = 8.29 * (np.log10(1.54 * hm))**2 - 1.1
else: # medium/small city
a_hm = (1.1 * np.log10(f) - 0.7) * hm - (1.56 * np.log10(f) - 0.8)
PL = (69.55 + 26.16 * np.log10(f) - 13.82 * np.log10(hb)
- a_hm + (44.9 - 6.55 * np.log10(hb)) * np.log10(d_km))
return PL
def hata_suburban(d_km, f_mhz, hb, hm):
"""秦モデル(郊外)[dB]"""
PL_urban = hata_urban(d_km, f_mhz, hb, hm, city='medium')
PL = PL_urban - 2 * (np.log10(f_mhz / 28))**2 - 5.4
return PL
def hata_open(d_km, f_mhz, hb, hm):
"""秦モデル(開放地)[dB]"""
PL_urban = hata_urban(d_km, f_mhz, hb, hm, city='medium')
PL = (PL_urban - 4.78 * (np.log10(f_mhz))**2
+ 18.33 * np.log10(f_mhz) - 40.94)
return PL
def cost231_hata(d_km, f_mhz, hb, hm, city='medium'):
"""COST 231-Hata モデル [dB]"""
f = f_mhz
# 移動局アンテナ高さ補正(秦モデルと同じ式)
a_hm = (1.1 * np.log10(f) - 0.7) * hm - (1.56 * np.log10(f) - 0.8)
Cm = 3 if city == 'large' else 0
PL = (46.3 + 33.9 * np.log10(f) - 13.82 * np.log10(hb)
- a_hm + (44.9 - 6.55 * np.log10(hb)) * np.log10(d_km) + Cm)
return PL
# パラメータ
d = np.linspace(1, 20, 200) # 1〜20 km
f = 900 # MHz
hb = 50 # 基地局高さ [m]
hm = 1.5 # 移動局高さ [m]
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# モデル比較(900 MHz)
axes[0].plot(d, fspl(d, f), 'k--', linewidth=2, label='Free Space')
axes[0].plot(d, log_distance(d, f, n=3.5), 'g-', linewidth=2,
label='Log-Distance (n=3.5)')
axes[0].plot(d, hata_urban(d, f, hb, hm, 'medium'), 'r-', linewidth=2,
label='Hata (Urban, medium)')
axes[0].plot(d, hata_urban(d, f, hb, hm, 'large'), 'r--', linewidth=2,
label='Hata (Urban, large)')
axes[0].plot(d, hata_suburban(d, f, hb, hm), 'b-', linewidth=2,
label='Hata (Suburban)')
axes[0].plot(d, hata_open(d, f, hb, hm), 'm-', linewidth=2,
label='Hata (Open)')
axes[0].set_xlabel('Distance [km]', fontsize=12)
axes[0].set_ylabel('Path Loss [dB]', fontsize=12)
axes[0].set_title(f'Propagation Models Comparison\n'
f'(f={f} MHz, $h_b$={hb} m, $h_m$={hm} m)', fontsize=13)
axes[0].legend(fontsize=9)
axes[0].grid(True, alpha=0.3)
axes[0].invert_yaxis()
axes[0].set_ylim([180, 90])
# 周波数依存性(秦モデル、d=5 km)
d_fixed = 5 # km
freqs = np.linspace(150, 1500, 200)
PL_urban = hata_urban(d_fixed, freqs, hb, hm, 'medium')
PL_sub = hata_suburban(d_fixed, freqs, hb, hm)
PL_open = hata_open(d_fixed, freqs, hb, hm)
PL_fs = fspl(d_fixed, freqs)
axes[1].plot(freqs, PL_fs, 'k--', linewidth=2, label='Free Space')
axes[1].plot(freqs, PL_urban, 'r-', linewidth=2, label='Urban')
axes[1].plot(freqs, PL_sub, 'b-', linewidth=2, label='Suburban')
axes[1].plot(freqs, PL_open, 'm-', linewidth=2, label='Open')
# COST 231 拡張域
freqs_cost = np.linspace(1500, 2000, 50)
PL_cost = cost231_hata(d_fixed, freqs_cost, hb, hm, 'medium')
PL_cost_large = cost231_hata(d_fixed, freqs_cost, hb, hm, 'large')
axes[1].plot(freqs_cost, PL_cost, 'r-', linewidth=2, alpha=0.6)
axes[1].plot(freqs_cost, PL_cost_large, 'r--', linewidth=2, alpha=0.6,
label='COST231 (large)')
axes[1].axvline(x=1500, color='gray', linestyle=':', alpha=0.5)
axes[1].text(1250, 100, 'Hata', fontsize=10, ha='center', color='gray')
axes[1].text(1750, 100, 'COST231', fontsize=10, ha='center', color='gray')
axes[1].set_xlabel('Frequency [MHz]', fontsize=12)
axes[1].set_ylabel('Path Loss [dB]', fontsize=12)
axes[1].set_title(f'Frequency Dependence\n'
f'(d={d_fixed} km, $h_b$={hb} m, $h_m$={hm} m)', fontsize=13)
axes[1].legend(fontsize=9)
axes[1].grid(True, alpha=0.3)
axes[1].invert_yaxis()
axes[1].set_ylim([180, 90])
plt.tight_layout()
plt.savefig('propagation_models_comparison.png', dpi=150, bbox_inches='tight')
plt.show()
上の比較プロットから、各伝搬モデルの特性が明確に読み取れます。
-
環境による損失の差は20〜30 dB(左図): 距離10 kmで比較すると、自由空間損失は約111 dBですが、都市部(秦モデル)では約145 dBに達します。この差の約34 dBは建物や地形による追加損失です。郊外は都市部より約10 dB良好で、開放地はさらに約10 dB良好です。
-
周波数が高いほどパスロスは増大(右図): 自由空間損失は周波数に対して20 dB/decade(周波数が10倍になると20 dB増加)ですが、秦モデルの都市部では約26 dB/decadeと、さらに急峻です。これは、高い周波数の電波が建物による回折・散乱をより多く受けるためです。
-
COST 231拡張との連続性: 1500 MHzの境界で秦モデルからCOST 231モデルに切り替わりますが、ほぼ連続的につながっています。大都市のCOST 231モデル(破線)は中小都市より約3 dB大きい損失を示します。
シャドウイングの可視化
次に、シャドウイング(対数正規分布)の影響を確認します。
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
# シャドウイングの影響を可視化
d = np.linspace(1, 15, 300)
f = 900 # MHz
hb, hm = 50, 1.5
# 平均パスロス(秦モデル・都市部)
PL_mean = hata_urban(d, f, hb, hm, 'medium')
# シャドウイングの標準偏差
sigma_values = [4, 8, 12]
colors = ['#2196F3', '#FF9800', '#F44336']
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# シャドウイングの帯域表示
for sigma, color in zip(sigma_values, colors):
# 1-sigma と 2-sigma の帯域
axes[0].fill_between(d, PL_mean - 2*sigma, PL_mean + 2*sigma,
alpha=0.15, color=color)
axes[0].fill_between(d, PL_mean - sigma, PL_mean + sigma,
alpha=0.25, color=color,
label=f'$\\sigma$ = {sigma} dB')
axes[0].plot(d, PL_mean, 'k-', linewidth=2, label='Mean (Hata)')
axes[0].set_xlabel('Distance [km]', fontsize=12)
axes[0].set_ylabel('Path Loss [dB]', fontsize=12)
axes[0].set_title('Shadowing Effect on Path Loss\n'
'(shaded: $\\pm 1\\sigma$ and $\\pm 2\\sigma$)', fontsize=13)
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)
axes[0].invert_yaxis()
# シミュレーション: 空間的な受信電力分布
n_samples = 500
d_sample = np.random.uniform(1, 15, n_samples)
sigma = 8 # dB
PL_sample = hata_urban(d_sample, f, hb, hm, 'medium')
shadowing = np.random.normal(0, sigma, n_samples)
PL_actual = PL_sample + shadowing
# 送信電力 43 dBm (20W) でEIRP = 43 + 15 = 58 dBm
Pt_dBm = 43
Gt_dBi = 15
EIRP = Pt_dBm + Gt_dBi
Pr = EIRP - PL_actual # 受信電力 [dBm]
scatter = axes[1].scatter(d_sample, Pr, c=Pr, cmap='RdYlGn',
s=15, alpha=0.7, vmin=-120, vmax=-60)
plt.colorbar(scatter, ax=axes[1], label='Received Power [dBm]')
# 平均受信電力
d_plot = np.linspace(1, 15, 200)
Pr_mean = EIRP - hata_urban(d_plot, f, hb, hm, 'medium')
axes[1].plot(d_plot, Pr_mean, 'k-', linewidth=2, label='Mean')
# 受信感度の目安
axes[1].axhline(y=-100, color='red', linestyle='--', linewidth=1.5,
label='Sensitivity (-100 dBm)')
axes[1].set_xlabel('Distance [km]', fontsize=12)
axes[1].set_ylabel('Received Power [dBm]', fontsize=12)
axes[1].set_title(f'Received Power with Shadowing\n'
f'(EIRP={EIRP} dBm, $\\sigma$={sigma} dB)', fontsize=13)
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('shadowing_effect.png', dpi=150, bbox_inches='tight')
plt.show()
# カバレッジ確率の計算
from scipy.stats import norm
d_edge = 10 # セルの端 [km]
PL_edge = hata_urban(d_edge, f, hb, hm, 'medium')
Pr_edge_mean = EIRP - PL_edge
threshold = -100 # dBm
margin = Pr_edge_mean - threshold
coverage_prob = norm.cdf(margin / sigma)
print(f"--- カバレッジ解析(d = {d_edge} km)---")
print(f" 平均パスロス: {PL_edge:.1f} dB")
print(f" 平均受信電力: {Pr_edge_mean:.1f} dBm")
print(f" 受信感度: {threshold} dBm")
print(f" マージン: {margin:.1f} dB")
print(f" カバレッジ確率: {coverage_prob*100:.1f}%")
シャドウイングのプロットから、無線回線設計の実際が見えてきます。
-
シャドウイングの標準偏差がカバレッジを大きく左右する(左図): $\sigma = 4$ dBの環境(開放地に近い)では平均値からの変動が小さく、安定した通信が期待できます。しかし $\sigma = 12$ dB(密集した都市部)では2$\sigma$の範囲で24 dBもの変動があり、同じ距離でも受信品質が大きくばらつきます。
-
セルの端での通信断の確率(右図): 散布図では、距離10 km付近で受信感度($-100$ dBm)を下回るポイント(赤色の点)が多数見られます。これがセルの端でのカバレッジホール(圏外)に対応します。平均的には通信可能でも、シャドウイングにより一定の割合で通信断が生じるため、設計マージンが不可欠です。
パスロスマップの2D可視化
最後に、秦モデルにシャドウイングを加えた2Dパスロスマップを生成し、セルのカバレッジを視覚化します。
import numpy as np
import matplotlib.pyplot as plt
from scipy.ndimage import gaussian_filter
np.random.seed(42)
# 2Dパスロスマップ
# 基地局位置
bs_x, bs_y = 0, 0 # km
# グリッド
x = np.linspace(-10, 10, 200)
y = np.linspace(-10, 10, 200)
X, Y = np.meshgrid(x, y)
# 基地局からの距離
D = np.sqrt((X - bs_x)**2 + (Y - bs_y)**2)
D = np.maximum(D, 0.1) # 0除算回避
# パスロス計算(秦モデル)
f = 900 # MHz
hb, hm = 50, 1.5
PL = hata_urban(D, f, hb, hm, 'medium')
# シャドウイングの追加(空間相関あり)
sigma = 8 # dB
# 空間相関のある正規乱数を生成(ガウシアンフィルタで平滑化)
raw_noise = np.random.normal(0, 1, X.shape)
# 相関距離 ~ 50m(ピクセルに換算)
corr_pixels = 50 / (20000 / 200) # 50m / (grid spacing in m)
shadowing = gaussian_filter(raw_noise, sigma=corr_pixels) * sigma
# 標準偏差を正規化
shadowing = shadowing / np.std(shadowing) * sigma
PL_total = PL + shadowing
# 受信電力
EIRP = 58 # dBm
Pr = EIRP - PL_total
fig, axes = plt.subplots(1, 2, figsize=(14, 6))
# パスロスマップ
im1 = axes[0].pcolormesh(X, Y, PL_total, cmap='YlOrRd',
vmin=100, vmax=170, shading='auto')
axes[0].plot(bs_x, bs_y, 'k^', markersize=12, label='Base Station')
plt.colorbar(im1, ax=axes[0], label='Path Loss [dB]')
axes[0].set_xlabel('x [km]', fontsize=12)
axes[0].set_ylabel('y [km]', fontsize=12)
axes[0].set_title(f'Path Loss Map (Hata + Shadowing)\n'
f'f={f} MHz, $\\sigma$={sigma} dB', fontsize=13)
axes[0].set_aspect('equal')
axes[0].legend(fontsize=10)
# カバレッジマップ(受信電力が感度以上の領域)
threshold = -100 # dBm
coverage = Pr >= threshold
im2 = axes[1].pcolormesh(X, Y, Pr, cmap='RdYlGn',
vmin=-120, vmax=-60, shading='auto')
axes[1].contour(X, Y, coverage.astype(float), levels=[0.5],
colors='black', linewidths=2)
axes[1].plot(bs_x, bs_y, 'k^', markersize=12, label='Base Station')
plt.colorbar(im2, ax=axes[1], label='Received Power [dBm]')
axes[1].set_xlabel('x [km]', fontsize=12)
axes[1].set_ylabel('y [km]', fontsize=12)
axes[1].set_title(f'Coverage Map (threshold = {threshold} dBm)\n'
f'EIRP = {EIRP} dBm', fontsize=13)
axes[1].set_aspect('equal')
axes[1].legend(fontsize=10)
plt.tight_layout()
plt.savefig('path_loss_map_2d.png', dpi=150, bbox_inches='tight')
plt.show()
# カバレッジ統計
coverage_ratio = np.sum(coverage) / coverage.size * 100
print(f"カバレッジ率(全グリッド点に対する割合): {coverage_ratio:.1f}%")
2Dパスロスマップとカバレッジマップから、セルラー通信のカバレッジ設計の本質が視覚的に理解できます。
-
パスロスは同心円状だが、シャドウイングでゆらぐ(左図): 基本的にはパスロスは距離に依存するため同心円状ですが、シャドウイング(空間相関のある変動)により等パスロス線が不規則に歪んでいます。これが実際のセルの形が理想的な円にならない理由です。
-
カバレッジの境界は不規則な形状(右図): 黒い等高線がカバレッジの境界(受信電力 = 受信感度)を示しています。境界は円形ではなく、シャドウイングにより凸凹しています。特にセルの端付近では、わずかな距離の違いで圏内と圏外が入り混じるため、隣接セルとのハンドオーバー設計が重要になります。
-
実際の設計への示唆: カバレッジマップ上で緑色(良好な受信)の領域が十分に広いことを確認し、赤色(受信困難)の領域が許容範囲内であることを検証するのが、基地局設計の基本的なプロセスです。
まとめ
本記事では、電波伝搬モデルを自由空間損失の物理的な導出から統計的モデルまで体系的に解説しました。
- フリスの伝達公式: 受信電力は送信電力、アンテナ利得、波長、距離で決まる。FSPLは全モデルの基盤であり、$\text{FSPL} = 32.44 + 20\log_{10}(d_{\text{km}}) + 20\log_{10}(f_{\text{MHz}})$ で計算される
- 対数距離パスロスモデル: パスロス指数 $n$ で環境を特徴づける汎用モデル。自由空間の $n=2$ に対し、都市部では $n = 3\text{–}5$ 程度
- 秦モデル: 奥村の大規模測定データを数式化した経験的モデル。150〜1500 MHz、1〜20 kmの範囲で都市・郊外・開放地に適用可能
- COST 231-Hata: 秦モデルの1500〜2000 MHz拡張。GSM1800やUMTSの基地局設計に使用
- シャドウイング: 対数正規分布に従う場所ごとのばらつき。標準偏差 $\sigma$ はカバレッジ確率に直結し、設計マージンの根拠となる
- レイトレーシング: 建物の3Dモデルに基づく決定論的予測。5Gミリ波帯やSmall Cell設計で重要性が増している
これらのモデルは衛星通信の回線設計にも関連しており、衛星-地上間のパスロスを理解する上でも基盤的な知識となります。
次のステップとして、以下の記事も参考にしてください。