対流圏伝搬 — 屈折・散乱・減衰による電波の振る舞い

地上のテレビ塔から送信された電波が、送信アンテナから見通せないはずの丘の向こうまで届くことがあるのはなぜでしょうか。晴れた日には良好に受信できるのに、激しい雨の日には映像が乱れるのはなぜでしょうか。これらの現象は全て、電波が地表から高度約10〜15 kmまでの「対流圏」を通過する際に受ける影響で説明できます。

対流圏伝搬の理解は、地上マイクロ波回線の設計、衛星通信の回線品質見積もり、さらには気象レーダーの精度向上にまで直結します。5Gミリ波通信やKa帯衛星通信のように高い周波数帯が使われる現代の通信システムでは、降雨減衰や大気吸収の影響がますます大きくなっており、対流圏伝搬の定量的な評価が不可欠です。

本記事の内容

  • 対流圏の構造と屈折率プロファイルの理解
  • 大気屈折による電波経路の曲がり(標準大気とダクト伝搬)
  • フレネルゾーンと見通し距離の定量計算
  • 降雨減衰のITU-Rモデルによる定量評価
  • 大気吸収(酸素・水蒸気の吸収帯)の周波数特性
  • Pythonによる屈折率プロファイル計算、降雨減衰の周波数依存性プロット

対流圏の構造と電波への影響

対流圏とは何か

私たちが日常生活を送っている地表付近の大気層が対流圏です。高度が上がるにつれて気温が下がるという特徴を持ち、対流(空気の上下方向の運動)が活発に起こるため「対流圏」と呼ばれます。赤道付近では高度約16〜18 km、中緯度では約10〜12 km、極付近では約8 kmまで広がっています。

対流圏の上端(対流圏界面)では気温の低下が止まり、成層圏へと遷移します。電波伝搬の観点から重要なのは、この層の中で気温、気圧、水蒸気量が高度とともに変化し、それが大気の屈折率を変化させるという点です。

大気の屈折率

光が水中に入ると曲がるのと同じ原理で、電波も屈折率の異なる層を通過するとき経路が曲がります。大気の屈折率 $n$ は真空の値 1 よりわずかに大きく、その差は非常に小さいため、通常は屈折度(refractivity) $N$ を用いて表します。

$$ N = (n – 1) \times 10^6 $$

この $N$ は典型的に地表面で約 300〜400 程度の値を取ります。大気の屈折度は気象パラメータを用いて次の経験式で表されます。

$$ N = \frac{77.6}{T}\left(P + \frac{4810 \, e}{T}\right) $$

ここで、$T$ は気温(K)、$P$ は全気圧(hPa)、$e$ は水蒸気圧(hPa)です。右辺第1項 $77.6P/T$ は「乾燥項」、第2項 $77.6 \times 4810e/T^2$ は「湿潤項」と呼ばれます。乾燥項は気圧と気温で決まり比較的安定していますが、湿潤項は水蒸気量に敏感であるため、天候による変動が大きくなります。

修正屈折度

実際の電波経路を扱う際には、地球の曲率を考慮に入れると計算が煩雑になります。そこで、地球を平面と見なす代わりに屈折率の方を修正する手法が広く使われます。修正屈折度(modified refractivity) $M$ は次のように定義されます。

$$ M = N + \frac{h}{R_e} \times 10^6 \approx N + 157h $$

ここで $h$ は高度(km)、$R_e \approx 6371$ km は地球の平均半径です。$M$ を用いると、電波経路を平面大気中の曲がった経路として扱うことができ、直感的にも計算上も便利です。$M$ が高度に対して増加する区間では電波は通常通り上に曲がり、$M$ が減少する区間(逆転層)ではダクト伝搬が発生する可能性があります。

対流圏の屈折率構造が電波経路を曲げるメカニズムの基礎を理解したところで、次にこの屈折がどのような電波経路を生み出すかを詳しく見ていきましょう。

大気屈折と電波の経路

スネルの法則と大気中の屈折

大気を多数の薄い水平層に分割して考えると、隣接する層の境界でスネルの法則が成り立ちます。連続的に屈折率が変化する媒質中では、電波経路はスネルの法則を一般化した次の関係式に従います。

$$ n(h) \cos \theta(h) = n(h_0) \cos \theta(h_0) = \text{const.} $$

ここで $\theta(h)$ は高度 $h$ における電波の仰角です。屈折率 $n(h)$ が高度とともに減少する(通常の大気)場合、$\cos \theta(h)$ は増加する、つまり仰角が小さくなる方向に経路が曲がります。これは電波が地表に向かって緩やかに曲がることを意味します。

標準大気と等価地球半径

大気の屈折による電波経路の曲がりを簡便に扱う方法として、等価地球半径の概念があります。標準大気条件(地表面での屈折度勾配 $dN/dh = -39$ N-units/km)の下では、電波経路を直線として扱う代わりに地球の半径を実際より大きく見積もることで補正できます。

等価地球半径係数 $k$ は次のように定義されます。

$$ k = \frac{1}{1 + R_e \dfrac{dn}{dh}} $$

標準大気条件では $dn/dh \approx -39 \times 10^{-6}$ /km であるため、代入すると次のようになります。

$$ k = \frac{1}{1 + 6371 \times (-39 \times 10^{-6})} = \frac{1}{1 – 0.248} \approx \frac{4}{3} $$

この有名な「$4/3$ 地球半径モデル」では、等価地球半径 $R_e’ = kR_e \approx 8500$ km を用いて幾何学的な見通し距離を計算します。$k = 4/3$ は標準大気の代表値であり、あくまで平均的な条件での近似であることに注意が必要です。

ダクト伝搬

大気の屈折率勾配が標準値 $-39$ N-units/km より急激に減少する場合($dN/dh < -157$ N-units/km、すなわち $dM/dh < 0$)、電波が大気中の特定の層内に閉じ込められる現象が起こります。これがダクト伝搬(ducting)です。

イメージとしては、光ファイバーの中を光が全反射を繰り返しながら進むのと同じです。電波が大気の「導波管」の中に閉じ込められ、通常の見通し距離をはるかに超える遠方まで伝搬します。

ダクトの発生条件は、修正屈折度 $M$ が高度とともに減少する区間($dM/dh < 0$)の存在です。ダクトの種類は発生する高度に応じて分類されます。

  • 表面ダクト(surface duct): 地表面から始まるダクト。海面付近で暖かく乾燥した空気が冷たい海面上を流れる際に発生しやすい
  • 接地ダクト(ground-based duct): 放射冷却により地表面付近の温度が急激に低下する夜間に発生
  • 浮揚ダクト(elevated duct): 上空の温度逆転層に伴って形成。前線面や沈降逆転層で発生

ダクト内に閉じ込められた電波は、ダクトの厚さ $\Delta h$ とカットオフ波長の関係から、ある周波数以上でのみ伝搬します。ダクトの最低トラップ周波数は概ね次の式で見積もることができます。

$$ f_{\min} \approx \frac{c}{2\Delta h}\sqrt{\frac{2\Delta h \cdot |\Delta M| \times 10^{-6}}{1}} $$

ダクト伝搬は超遠距離のレーダー探知を可能にする一方、通常の通信回線では予期せぬ干渉の原因にもなります。

ここまで大気屈折が電波の経路にどのような影響を及ぼすかを見てきました。次に、マイクロ波回線の設計で重要となるフレネルゾーンと見通し距離について定量的に考えていきます。

フレネルゾーンと見通し距離

フレネルゾーンの概念

2つのアンテナ間で電波が伝搬するとき、電波は幾何学的な直線経路だけでなく、その周囲の空間を通っても伝搬します。ちょうど池に石を投げたときの波紋が広がるように、電波もある程度の幅を持って伝搬するのです。

送信点と受信点を結ぶ直線経路の周囲で、直接経路との経路差がちょうど波長の $n/2$ 倍になる点の集合が、第 $n$ フレネルゾーンの境界を形成します。第1フレネルゾーンが特に重要で、電波エネルギーの大部分はこのゾーン内を通過します。

送信点からの距離 $d_1$、受信点からの距離 $d_2$ の地点における第 $n$ フレネルゾーンの半径 $F_n$ は次の式で与えられます。

$$ F_n = \sqrt{\frac{n \lambda d_1 d_2}{d_1 + d_2}} $$

ここで $\lambda$ は波長、$d_1 + d_2 = d$ は送受信間の全距離です。第1フレネルゾーンの最大半径は経路の中点($d_1 = d_2 = d/2$)で得られ、次のようになります。

$$ F_1^{\max} = \frac{1}{2}\sqrt{\lambda d} $$

たとえば、周波数 6 GHz($\lambda = 0.05$ m)で距離 50 km の回線では、$F_1^{\max} = 0.5\sqrt{0.05 \times 50000} = 25$ m となります。

フレネルゾーンのクリアランス

マイクロ波回線の設計では、障害物が第1フレネルゾーンに侵入しないようにアンテナの高さを設計します。一般的な設計基準は、第1フレネルゾーンの60%以上が障害物でクリアされている(遮られていない)ことです。

経路上の障害物のクリアランス比 $C$ は次のように定義されます。

$$ C = \frac{h_c}{F_1} $$

ここで $h_c$ は直線経路から障害物頂部までの高さ(クリアランス)、$F_1$ はその点での第1フレネルゾーン半径です。$C \geq 0.6$ であれば、自由空間に近い伝搬が期待できます。$C < 0$ は障害物が直線経路を遮っている場合(回折領域)に対応します。

幾何学的見通し距離

地球の曲率を考慮した場合、送信アンテナ(高さ $h_t$)と受信アンテナ(高さ $h_r$)の間の幾何学的見通し距離 $d_{\text{LOS}}$ は次の式で表されます。

$$ d_{\text{LOS}} = \sqrt{2R_e’ h_t} + \sqrt{2R_e’ h_r} $$

ここで $R_e’ = kR_e$ は等価地球半径です。標準大気($k = 4/3$)では $R_e’ \approx 8500$ km なので、次のようになります。

$$ d_{\text{LOS}} \approx 4.12(\sqrt{h_t} + \sqrt{h_r}) \quad \text{[km]} $$

ここで $h_t, h_r$ の単位はメートルです。たとえば、送信アンテナ高さ 100 m、受信アンテナ高さ 10 m の場合、$d_{\text{LOS}} \approx 4.12(\sqrt{100} + \sqrt{10}) \approx 4.12 \times (10 + 3.16) \approx 54.2$ km となります。

フレネルゾーンと見通し距離は電波経路の幾何学的な条件を規定しますが、実際の回線品質は大気による減衰にも大きく左右されます。次に、特にマイクロ波帯以上で深刻な問題となる降雨減衰について詳しく見ていきましょう。

降雨減衰のITU-Rモデル

降雨による電波減衰のメカニズム

雨粒は数百マイクロメートルから数ミリメートルの大きさを持ちます。電波の波長がこの雨粒のサイズと同程度かそれ以下になると、電波は雨粒に吸収され、また散乱されて著しく減衰します。これが降雨減衰です。

具体的には、周波数が約10 GHz(波長3 cm)を超えるあたりから降雨減衰が顕著になり、周波数が高いほど減衰が大きくなります。Ku帯(12〜18 GHz)やKa帯(26.5〜40 GHz)を使う衛星放送や衛星通信では、強い雨の日に受信品質が著しく低下する「降雨フェード」が避けられない課題です。

ITU-R P.838 モデル

降雨減衰の定量評価には、ITU-R(国際電気通信連合 無線通信部門)の勧告が広く使われています。ITU-R P.838は、降雨強度 $R$(mm/h)から比減衰(specific attenuation)$\gamma_R$(dB/km)を計算するモデルです。

$$ \gamma_R = k R^\alpha $$

ここで、$k$ と $\alpha$ は周波数と偏波(水平・垂直)に依存する係数です。これらの係数は電磁波散乱理論(ミー散乱)と雨粒のサイズ分布モデルから導出され、ITU-R P.838で周波数ごとにテーブル化されています。

水平偏波の場合の係数 $k_H$ と $\alpha_H$、垂直偏波の場合の $k_V$ と $\alpha_V$ は、それぞれ対数スケールでの多項式近似で与えられます。任意の偏波角 $\tau$(水平偏波で $0°$、垂直偏波で $90°$、円偏波で $45°$)に対しては、次の式で補間します。

$$ k = \frac{k_H + k_V + (k_H – k_V)\cos^2\theta\cos 2\tau}{2} $$

$$ \alpha = \frac{k_H\alpha_H + k_V\alpha_V + (k_H\alpha_H – k_V\alpha_V)\cos^2\theta\cos 2\tau}{2k} $$

ここで $\theta$ は電波の仰角です。

降雨減衰の経路積分

経路全体での降雨減衰 $A$(dB)は、比減衰を経路に沿って積分して求めます。しかし、雨は経路全体に一様に降っているわけではないため、有効経路長(effective path length) $L_{\text{eff}}$ の概念が導入されます。

$$ A = \gamma_R \cdot L_{\text{eff}} = \gamma_R \cdot r \cdot d $$

ここで $d$ は実際の経路長、$r$ は距離低減係数(path length reduction factor)です。ITU-R P.530では、地上回線に対して次の経験式を与えています。

$$ r = \frac{1}{1 + d/d_0} $$

$d_0$ は降雨強度と周波数に依存する参照距離で、$d_0 = 35 e^{-0.015R_{0.01}}$($R_{0.01}$ は年間の0.01%の時間を超える降雨強度)などの形で与えられます。

降雨強度の統計

回線設計では「年間の何%の時間にわたって品質を保証するか」という稼働率(アベイラビリティ)の概念が重要です。たとえば、99.99%の稼働率を目標とする場合、年間0.01%の時間(約53分)を超えない降雨強度 $R_{0.01}$(mm/h)を用いて設計します。

ITU-R P.837では世界各地の $R_{0.01}$ の分布が提供されています。日本の場合、降雨気候ゾーンMに分類され、$R_{0.01} \approx 63$ mm/h(東京近辺)という値が使われます。この値は、年間のうち0.01%の時間を超える激しい降雨強度を表しています。

降雨減衰が主にマイクロ波帯以上で問題になるのに対し、大気を構成する気体分子自体も特定の周波数帯で電波を吸収します。次に、酸素と水蒸気による大気吸収について見ていきます。

大気吸収 — 酸素と水蒸気の吸収帯

分子吸収のメカニズム

大気中の気体分子は電磁波のエネルギーを吸収し、分子の回転や振動のエネルギーに変換します。電波帯域で特に重要なのは酸素分子 $\text{O}_2$水蒸気分子 $\text{H}_2\text{O}$ による吸収です。

酸素分子は磁気双極子モーメントを持ち、マイクロ波帯で回転遷移による吸収を示します。特に重要な吸収帯は以下の通りです。

  • 60 GHz帯(50〜70 GHz): 酸素分子の回転スペクトル群が密集し、非常に強い吸収帯を形成します。ピークでの比減衰は約15 dB/km にも達します
  • 118.75 GHz: 酸素の孤立吸収線

水蒸気分子は電気双極子モーメントを持ち、以下の周波数で強い吸収を示します。

  • 22.235 GHz: 水蒸気の最も低い回転遷移周波数。比較的弱い吸収(約0.2 dB/km)ですが、Ku帯〜Ka帯の通信で無視できない影響を持ちます
  • 183.31 GHz: 非常に強い吸収線。気象衛星の水蒸気観測に利用されます
  • 325 GHz: ミリ波帯の吸収線

ITU-R P.676 モデル

大気吸収による比減衰は ITU-R P.676 で標準化されています。酸素と水蒸気の各吸収線のパラメータ(中心周波数、線強度、線幅)がテーブル化されており、気温・気圧・水蒸気密度から任意の周波数での比減衰を計算できます。

簡易的な近似として、地表面付近の条件(気温15°C、気圧1013 hPa、水蒸気密度7.5 g/m³)での酸素と水蒸気それぞれの比減衰 $\gamma_o$(dB/km)と $\gamma_w$(dB/km)を周波数の関数として与える式も提供されています。全体の大気吸収比減衰は両者の和です。

$$ \gamma_a = \gamma_o + \gamma_w $$

大気の窓(atmospheric windows)

電波通信にとって重要なのは、大気吸収が比較的小さい「大気の窓」と呼ばれる周波数帯です。主な窓は以下の通りです。

  • 35 GHz 付近: Ka帯。降雨減衰はあるが大気吸収は小さい
  • 94 GHz 付近: W帯。酸素の60 GHz吸収帯と118 GHz吸収線の間の谷間
  • 130〜160 GHz: 水蒸気の183 GHz吸収線より低い周波数側の窓
  • 200〜300 GHz: テラヘルツ帯に向かう窓。次世代通信(6G)で研究対象

逆に、60 GHz帯の強い酸素吸収は短所だけではありません。到達距離が短いことを逆手に取り、短距離通信の周波数再利用やセキュリティ確保(盗聴防止)に活用されます。IEEE 802.11ad/ay(WiGig)はこの帯域を利用する規格です。

ここまでで対流圏伝搬の主要なメカニズムを理論的に学びました。次に、これらの理論をPythonで実装し、数値的に確認してみましょう。

Pythonで学ぶ対流圏伝搬

屈折率プロファイルの計算

まず、標準大気の条件における屈折度 $N$ と修正屈折度 $M$ のプロファイルを計算してみましょう。標準大気では、気温が高度1 kmあたり約6.5°C低下し、気圧は指数関数的に減少します。水蒸気量は地表付近に集中し、高度とともに急速に減少します。

import numpy as np
import matplotlib.pyplot as plt

# 標準大気パラメータ
T0 = 288.15      # 地表面気温 [K] (15°C)
P0 = 1013.25     # 地表面気圧 [hPa]
e0 = 10.0        # 地表面水蒸気圧 [hPa]
lapse_rate = 6.5  # 気温減率 [K/km]
Re = 6371.0       # 地球半径 [km]
H_scale = 8.5     # 気圧のスケールハイト [km]
H_vapor = 2.0     # 水蒸気のスケールハイト [km]

# 高度配列
h = np.linspace(0, 15, 500)  # 0〜15 km

# 気象パラメータの高度依存性
T = T0 - lapse_rate * h              # 気温 [K]
P = P0 * np.exp(-h / H_scale)        # 気圧 [hPa]
e = e0 * np.exp(-h / H_vapor)        # 水蒸気圧 [hPa]

# 屈折度 N
N = 77.6 / T * (P + 4810 * e / T)

# 修正屈折度 M
M = N + 157 * h

# プロット
fig, axes = plt.subplots(1, 3, figsize=(14, 6))

axes[0].plot(N, h, 'b-', linewidth=2)
axes[0].set_xlabel('Refractivity N [N-units]', fontsize=12)
axes[0].set_ylabel('Altitude [km]', fontsize=12)
axes[0].set_title('Refractivity Profile', fontsize=13)
axes[0].grid(True, alpha=0.3)

axes[1].plot(M, h, 'r-', linewidth=2)
axes[1].set_xlabel('Modified Refractivity M [M-units]', fontsize=12)
axes[1].set_ylabel('Altitude [km]', fontsize=12)
axes[1].set_title('Modified Refractivity Profile', fontsize=13)
axes[1].grid(True, alpha=0.3)

# dN/dhの計算(数値微分)
dNdh = np.gradient(N, h)
axes[2].plot(dNdh, h, 'g-', linewidth=2)
axes[2].axvline(x=-39, color='k', linestyle='--', label='Standard: -39 N/km')
axes[2].axvline(x=-157, color='r', linestyle='--', label='Ducting: -157 N/km')
axes[2].set_xlabel('dN/dh [N-units/km]', fontsize=12)
axes[2].set_ylabel('Altitude [km]', fontsize=12)
axes[2].set_title('Refractivity Gradient', fontsize=13)
axes[2].legend(fontsize=10)
axes[2].grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('refractivity_profile.png', dpi=150, bbox_inches='tight')
plt.show()

print(f"地表面の屈折度 N(0) = {N[0]:.1f} N-units")
print(f"地表面の修正屈折度 M(0) = {M[0]:.1f} M-units")
print(f"地表面付近の dN/dh = {dNdh[0]:.1f} N-units/km")

上のグラフから、3つの重要な特徴が読み取れます。

  1. 屈折度 $N$ は高度とともに単調に減少する — 地表面で約330 N-unitsの値を取り、高度15 kmではほぼ50 N-units程度まで減少します。これは気圧と水蒸気量の減少に対応しており、特に低高度での減少が急激なのは水蒸気の寄与が大きいためです。

  2. 修正屈折度 $M$ は高度とともに増加する — 標準大気では $dM/dh > 0$ が維持されており、ダクトが形成される条件($dM/dh < 0$)には至っていません。$M$ が単調増加していることは、電波が正常に上方へ曲がることを意味します。

  3. 屈折度勾配 $dN/dh$ は地表付近で約 $-45$ N-units/km — 標準値 $-39$ に近いですが、水蒸気の影響で若干急な勾配を示しています。高度が上がるにつれて勾配は緩やかになり、対流圏上部では $-20$ 程度に落ち着きます。ダクト発生の閾値 $-157$ N-units/km には遠く、標準大気ではダクト伝搬は発生しないことが確認できます。

等価地球半径と見通し距離

次に、等価地球半径係数 $k$ とフレネルゾーン半径の関係を視覚化してみましょう。

import numpy as np
import matplotlib.pyplot as plt

# 等価地球半径係数と見通し距離
Re = 6371  # km
ht_values = [10, 30, 50, 100, 200]  # 送信アンテナ高さ [m]
hr = 10  # 受信アンテナ高さ [m]

k_values = np.linspace(0.5, 3.0, 200)

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# 見通し距離 vs k
for ht in ht_values:
    d_los = np.sqrt(2 * k_values * Re * 1000 * ht) / 1000 + \
            np.sqrt(2 * k_values * Re * 1000 * hr) / 1000
    axes[0].plot(k_values, d_los, linewidth=2, label=f'$h_t$ = {ht} m')

axes[0].axvline(x=4/3, color='k', linestyle='--', alpha=0.7, label='k = 4/3')
axes[0].set_xlabel('Earth Radius Factor k', fontsize=12)
axes[0].set_ylabel('Line-of-Sight Distance [km]', fontsize=12)
axes[0].set_title('LOS Distance vs k Factor', fontsize=13)
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3)

# フレネルゾーン半径
d = 30  # 回線距離 30 km
freqs = [1, 3, 6, 12, 18]  # GHz
d1 = np.linspace(0.1, d - 0.1, 300)
d2 = d - d1

for f in freqs:
    lam = 0.3 / f  # 波長 [m]
    F1 = np.sqrt(lam * d1 * 1000 * d2 * 1000 / (d * 1000))
    axes[1].plot(d1, F1, linewidth=2, label=f'{f} GHz')

axes[1].set_xlabel('Distance from Transmitter [km]', fontsize=12)
axes[1].set_ylabel('First Fresnel Zone Radius [m]', fontsize=12)
axes[1].set_title(f'Fresnel Zone Radius (d = {d} km)', fontsize=13)
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('los_fresnel.png', dpi=150, bbox_inches='tight')
plt.show()

上の2つのグラフから以下のことが読み取れます。

  1. 等価地球半径係数 $k$ と見通し距離(左図): $k$ が大きいほど見通し距離が伸びます。$k = 4/3$(標準大気)のとき、アンテナ高さ100 mで約54 km の見通し距離が得られます。$k$ が極端に小さくなる($k < 1$、超屈折)と見通し距離は急激に短くなり、逆に $k \to \infty$(ダクト条件に近い)では見通し距離が非常に大きくなります。

  2. フレネルゾーン半径(右図): 周波数が低いほどフレネルゾーン半径が大きくなります。1 GHz では経路中央で約47 m のクリアランスが必要ですが、18 GHzでは約11 m で済みます。これは低い周波数の回線ほど障害物の影響を受けやすく、アンテナをより高くする必要があることを意味しています。

降雨減衰の周波数依存性

ITU-R P.838の係数を用いて、降雨減衰の周波数依存性を計算します。

import numpy as np
import matplotlib.pyplot as plt

# ITU-R P.838 に基づく簡易的な k, alpha 係数
# 実際の勧告では対数スケールの多項式フィッティングで与えられる
# ここでは代表的な周波数での値をスプラインで補間
freq_table = np.array([1, 2, 4, 6, 8, 10, 12, 15, 20, 25, 30,
                        35, 40, 50, 60, 80, 100])  # GHz

# 水平偏波の係数(ITU-R P.838-3 から抜粋・近似)
kH_table = np.array([0.0000387, 0.000154, 0.000650, 0.00175,
                      0.00454, 0.0101, 0.0188, 0.0367, 0.0751,
                      0.124, 0.187, 0.263, 0.350, 0.536, 0.707,
                      0.975, 1.12])
alphaH_table = np.array([0.912, 0.963, 1.121, 1.308, 1.327,
                          1.276, 1.217, 1.154, 1.099, 1.061,
                          1.021, 0.979, 0.939, 0.873, 0.826,
                          0.753, 0.703])

# 周波数を細かく補間
from scipy.interpolate import interp1d

freq_fine = np.logspace(np.log10(1), np.log10(100), 500)
kH_interp = interp1d(np.log10(freq_table), np.log10(kH_table),
                       kind='cubic', fill_value='extrapolate')
alphaH_interp = interp1d(np.log10(freq_table), alphaH_table,
                           kind='cubic', fill_value='extrapolate')

kH = 10**kH_interp(np.log10(freq_fine))
alphaH = alphaH_interp(np.log10(freq_fine))

# 降雨強度ごとの比減衰
rain_rates = [5, 10, 25, 50, 100]  # mm/h
colors = ['#2196F3', '#4CAF50', '#FF9800', '#F44336', '#9C27B0']

fig, axes = plt.subplots(1, 2, figsize=(14, 6))

# 比減衰 vs 周波数
for R, color in zip(rain_rates, colors):
    gamma = kH * R**alphaH
    axes[0].loglog(freq_fine, gamma, linewidth=2, color=color,
                    label=f'R = {R} mm/h')

axes[0].set_xlabel('Frequency [GHz]', fontsize=12)
axes[0].set_ylabel('Specific Attenuation [dB/km]', fontsize=12)
axes[0].set_title('Rain Attenuation vs Frequency (H-pol)', fontsize=13)
axes[0].legend(fontsize=10)
axes[0].grid(True, alpha=0.3, which='both')
axes[0].set_xlim([1, 100])
axes[0].set_ylim([1e-4, 100])

# 特定の周波数帯を強調
freq_bands = {'L (1.5)': 1.5, 'S (3)': 3, 'C (6)': 6,
               'Ku (14)': 14, 'Ka (30)': 30, 'V (60)': 60}

# 経路長10 kmでの合計減衰
d_path = 10  # km
R_values = np.linspace(0, 100, 200)
freq_selected = [6, 14, 30, 50, 80]  # GHz

for f in freq_selected:
    idx = np.argmin(np.abs(freq_fine - f))
    k_val = kH[idx]
    alpha_val = alphaH[idx]
    gamma_path = k_val * R_values**alpha_val * d_path
    axes[1].plot(R_values, gamma_path, linewidth=2,
                  label=f'{f} GHz')

axes[1].set_xlabel('Rain Rate [mm/h]', fontsize=12)
axes[1].set_ylabel('Total Attenuation [dB] (10 km path)', fontsize=12)
axes[1].set_title('Rain Attenuation for 10 km Path', fontsize=13)
axes[1].legend(fontsize=10)
axes[1].grid(True, alpha=0.3)
axes[1].set_xlim([0, 100])
axes[1].set_ylim([0, 80])

plt.tight_layout()
plt.savefig('rain_attenuation.png', dpi=150, bbox_inches='tight')
plt.show()

# 日本での設計例
R001_japan = 63  # mm/h(東京、0.01%超過)
print("--- 日本(東京)での降雨減衰(R_0.01 = 63 mm/h)---")
for f in [12, 14, 18, 20, 30]:
    idx = np.argmin(np.abs(freq_fine - f))
    gamma = kH[idx] * R001_japan**alphaH[idx]
    print(f"  {f:3d} GHz: {gamma:.2f} dB/km")

このプロットからいくつかの重要な設計指針が得られます。

  1. 降雨減衰は周波数の増加とともに急激に増大する(左図): 6 GHz以下では降雨強度100 mm/hでも比減衰は1 dB/km未満ですが、30 GHzでは10 dB/km以上に達します。これがC帯以下の周波数帯がマイクロ波回線で好まれる理由の一つです。

  2. 降雨強度への依存は非線形(右図): $\gamma_R = kR^\alpha$ のべき乗関係により、弱い雨から強い雨への増加に伴う減衰の増大は周波数が高いほど顕著です。80 GHzでは降雨強度50 mm/hで10 km経路あたり約60 dBもの減衰が生じ、事実上の通信断となります。

  3. 衛星通信の周波数選択への影響: Ku帯(14 GHz)では豪雨時でも数dB/km程度で回線設計で対処可能ですが、Ka帯(30 GHz)以上では降雨マージンを大きく取る必要があり、適応変調やサイトダイバーシティなどの対策が不可欠です。

大気吸収の全体像

最後に、酸素と水蒸気による大気吸収を含めた全体像を示します。

import numpy as np
import matplotlib.pyplot as plt

# ITU-R P.676 に基づく大気吸収の簡易モデル
# 標準大気条件: T=15°C, P=1013.25 hPa, rho_w=7.5 g/m^3

def atmospheric_attenuation(f_ghz):
    """
    酸素と水蒸気による大気吸収比減衰の簡易計算
    f_ghz: 周波数 [GHz]
    返り値: (gamma_oxygen, gamma_water) [dB/km]
    """
    f = f_ghz

    # 酸素吸収(簡易モデル)
    # 60 GHz帯の吸収複合体 + 118.75 GHz 孤立線
    gamma_o = (7.19e-3 / (f**2 + 0.227) +
               6.09 / ((f - 57)**2 + 1.50) * (f / 57)**2 +
               4.81 / ((f - 63)**2 + 1.00) * (f / 63)**2)

    # 60 GHz帯のピーク補正
    if hasattr(f, '__len__'):
        mask_60 = (f > 50) & (f < 70)
        gamma_o[mask_60] = np.clip(gamma_o[mask_60], 0, 15)

    # 118 GHz線の追加
    gamma_o += 0.14 / ((f - 118.75)**2 + 0.3)

    gamma_o = np.clip(gamma_o, 0.001, 20)

    # 水蒸気吸収(簡易モデル)
    rho_w = 7.5  # g/m^3
    gamma_w = (0.050 + 0.0021 * rho_w) / ((f - 22.235)**2 + 2.56) * f**2 * rho_w * 1e-4
    gamma_w += 0.227 / ((f - 183.31)**2 + 3.0) * f**2 * rho_w * 1e-4
    gamma_w += 0.070 / ((f - 325.15)**2 + 5.0) * f**2 * rho_w * 1e-4
    gamma_w = np.clip(gamma_w, 1e-5, 50)

    return gamma_o, gamma_w

# 周波数範囲
freq = np.logspace(0, np.log10(350), 2000)  # 1-350 GHz

gamma_o, gamma_w = atmospheric_attenuation(freq)
gamma_total = gamma_o + gamma_w

fig, ax = plt.subplots(figsize=(12, 7))

ax.loglog(freq, gamma_o, 'b-', linewidth=2, label='$O_2$ absorption', alpha=0.8)
ax.loglog(freq, gamma_w, 'r-', linewidth=2, label='$H_2O$ absorption', alpha=0.8)
ax.loglog(freq, gamma_total, 'k-', linewidth=2.5, label='Total')

# 主要な吸収帯をアノテーション
annotations = [
    (22.235, 'H$_2$O\n22.2 GHz', 'red'),
    (60, 'O$_2$ complex\n60 GHz', 'blue'),
    (118.75, 'O$_2$\n118.75 GHz', 'blue'),
    (183.31, 'H$_2$O\n183.3 GHz', 'red'),
]

for freq_ann, text, color in annotations:
    idx = np.argmin(np.abs(freq - freq_ann))
    ax.annotate(text, xy=(freq_ann, gamma_total[idx]),
                xytext=(0, 40), textcoords='offset points',
                fontsize=10, color=color, ha='center',
                arrowprops=dict(arrowstyle='->', color=color))

# 大気の窓をハイライト
windows = [(30, 40, 'Ka band'), (75, 110, 'W band'), (125, 160, 'D band')]
for f_low, f_high, name in windows:
    ax.axvspan(f_low, f_high, alpha=0.1, color='green')
    ax.text(np.sqrt(f_low * f_high), 1e-3, name,
            fontsize=9, ha='center', color='green', fontweight='bold')

ax.set_xlabel('Frequency [GHz]', fontsize=13)
ax.set_ylabel('Specific Attenuation [dB/km]', fontsize=13)
ax.set_title('Atmospheric Absorption at Sea Level\n'
             '(T=15°C, P=1013 hPa, $\\rho_w$=7.5 g/m³)',
             fontsize=14)
ax.legend(fontsize=11, loc='upper left')
ax.grid(True, alpha=0.3, which='both')
ax.set_xlim([1, 350])
ax.set_ylim([1e-3, 30])

plt.tight_layout()
plt.savefig('atmospheric_absorption.png', dpi=150, bbox_inches='tight')
plt.show()

このグラフは対流圏伝搬を考える上で極めて重要な全体像を示しています。

  1. 60 GHz帯の酸素吸収が圧倒的に大きい: 約15 dB/km というピーク値は、1 km進むだけで電力が30分の1以下に減衰することを意味します。この帯域は長距離通信には使えませんが、短距離通信(WiGig等)のセル間干渉抑制に逆利用されています。

  2. 22 GHz付近の水蒸気吸収は比較的穏やか: 約0.2 dB/km 程度であり、Ku帯やKa帯の衛星通信設計では考慮が必要ですが、回線設計のマージンで吸収できるレベルです。

  3. 大気の窓(緑色の帯域): Ka帯(30〜40 GHz)、W帯(75〜110 GHz)、D帯(125〜160 GHz)が大気吸収の谷間に位置しています。特にW帯の94 GHz付近は、降雨減衰は大きいものの大気吸収が小さく、高分解能レーダーや近距離大容量通信に適しています。

降雨減衰と大気吸収の統合的な比較

最後に、晴天時の大気吸収と降雨減衰をまとめて1枚のグラフで比較し、各周波数帯での支配的な減衰要因を明確にしましょう。

import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d

# 既出の降雨減衰モデル(再掲)
freq_table = np.array([1, 2, 4, 6, 8, 10, 12, 15, 20, 25, 30,
                        35, 40, 50, 60, 80, 100])
kH_table = np.array([0.0000387, 0.000154, 0.000650, 0.00175,
                      0.00454, 0.0101, 0.0188, 0.0367, 0.0751,
                      0.124, 0.187, 0.263, 0.350, 0.536, 0.707,
                      0.975, 1.12])
alphaH_table = np.array([0.912, 0.963, 1.121, 1.308, 1.327,
                          1.276, 1.217, 1.154, 1.099, 1.061,
                          1.021, 0.979, 0.939, 0.873, 0.826,
                          0.753, 0.703])

freq_fine = np.logspace(0, 2, 500)
kH_interp = interp1d(np.log10(freq_table), np.log10(kH_table),
                       kind='cubic', fill_value='extrapolate')
alphaH_interp = interp1d(np.log10(freq_table), alphaH_table,
                           kind='cubic', fill_value='extrapolate')

kH = 10**kH_interp(np.log10(freq_fine))
alphaH = alphaH_interp(np.log10(freq_fine))

# 大気吸収
gamma_o, gamma_w = atmospheric_attenuation(freq_fine)
gamma_atm = gamma_o + gamma_w

# 降雨減衰(R = 25 mm/h)
gamma_rain_25 = kH * 25**alphaH

fig, ax = plt.subplots(figsize=(12, 6))

ax.loglog(freq_fine, gamma_atm, 'b-', linewidth=2.5,
           label='Atmospheric absorption (clear sky)')
ax.loglog(freq_fine, gamma_rain_25, 'r--', linewidth=2.5,
           label='Rain attenuation (R=25 mm/h)')
ax.loglog(freq_fine, gamma_atm + gamma_rain_25, 'k-', linewidth=2,
           alpha=0.6, label='Total (rain + atmosphere)')

# 主要な通信帯域をマーク
bands = {'C': 6, 'Ku': 14, 'Ka': 30, 'V': 60, 'W': 94}
for name, fc in bands.items():
    idx = np.argmin(np.abs(freq_fine - fc))
    total = gamma_atm[idx] + gamma_rain_25[idx]
    ax.plot(fc, total, 'ko', markersize=8)
    ax.annotate(f'{name} band', xy=(fc, total),
                xytext=(0, 20), textcoords='offset points',
                fontsize=10, ha='center', fontweight='bold')

ax.set_xlabel('Frequency [GHz]', fontsize=13)
ax.set_ylabel('Specific Attenuation [dB/km]', fontsize=13)
ax.set_title('Comparison: Atmospheric Absorption vs Rain Attenuation', fontsize=14)
ax.legend(fontsize=11)
ax.grid(True, alpha=0.3, which='both')
ax.set_xlim([1, 100])
ax.set_ylim([1e-3, 30])

plt.tight_layout()
plt.savefig('total_attenuation_comparison.png', dpi=150, bbox_inches='tight')
plt.show()

この統合プロットから、周波数帯ごとの設計戦略が明確になります。

  1. C帯(6 GHz): 大気吸収も降雨減衰もごくわずかで、最も安定した伝搬が得られます。長距離のマイクロ波中継回線や衛星通信の主力帯域として使われてきた理由が数値的に裏付けられます。

  2. Ku帯(14 GHz): 降雨減衰が大気吸収を大きく上回り、雨が回線品質の主要な制約要因になります。衛星放送(BS/CS)の降雨フェードはこの帯域の特性から避けられません。

  3. Ka帯(30 GHz)以上: 降雨減衰がさらに大きくなり、V帯(60 GHz)では酸素吸収が支配的になります。W帯(94 GHz)は酸素吸収の谷間に位置しますが、降雨がある場合は大きな減衰を受けます。

まとめ

本記事では、対流圏における電波伝搬のメカニズムを体系的に解説しました。

  • 大気の屈折率プロファイル: 屈折度 $N$ は気温・気圧・水蒸気量で決まり、高度とともに減少することで電波経路を地表側に曲げる。等価地球半径係数 $k \approx 4/3$ はこの効果を簡便に扱うための近似である
  • ダクト伝搬: 修正屈折度 $M$ が高度に対して減少する区間($dM/dh < 0$)で電波が閉じ込められ、超長距離伝搬が生じる。表面ダクト・接地ダクト・浮揚ダクトの3種類がある
  • フレネルゾーン: 第1フレネルゾーンの60%以上をクリアすることが見通し回線の設計基準。低い周波数ほどフレネルゾーン半径が大きく、高い鉄塔が必要
  • 降雨減衰: ITU-R P.838の $\gamma_R = kR^\alpha$ モデルで定量評価。10 GHz以上で顕著になり、Ka帯以上では回線設計の支配的な制約要因
  • 大気吸収: 60 GHz帯の酸素吸収と22/183 GHz の水蒸気吸収が主要。大気の窓(Ka帯、W帯、D帯)の存在が通信システムの周波数選択を決定づける

これらの知識は、次に学ぶ電波伝搬モデルや衛星回線設計の基盤となります。地表波伝搬や電離圏伝搬と合わせて理解することで、電波伝搬の全体像が把握できます。

次のステップとして、以下の記事も参考にしてください。