自由空間損失とフリスの伝達公式を導出する

無線通信において、送信アンテナから放射された電磁波は距離が離れるほど減衰します。障害物がなく大気の吸収もない理想的な空間(自由空間)でも、電磁波は球面状に広がるため電力密度が距離の2乗に反比例して低下します。これが 自由空間損失(FSPL: Free Space Path Loss) です。

フリスの伝達公式(Friis transmission formula) は、自由空間での送受信間の電力関係を定量的に与える基本公式であり、無線通信のリンクバジェット設計の出発点です。衛星通信、Wi-Fi、携帯電話、レーダーなど、あらゆる無線システムの設計にこの公式が使われます。

本記事の内容

  • 等方性アンテナの放射とポインティングベクトル
  • 実効開口面積の定義
  • フリスの伝達公式の導出
  • 自由空間損失の物理的意味
  • dB表現への変換
  • リンクバジェットの基礎
  • 数値例(衛星通信・Wi-Fi・携帯基地局)
  • Pythonでの可視化とリンクバジェット計算

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

等方性アンテナの放射

等方性アンテナとは

等方性アンテナ(isotropic antenna)とは、全方向に均等に電力を放射する仮想的なアンテナです。現実には存在しませんが、他のアンテナの利得を定義する基準として使われます。

送信電力 $P_t$ [W] で等方性アンテナから放射した場合、距離 $d$ [m] における球面の表面積は $4\pi d^2$ なので、電力密度(ポインティングベクトルの大きさ)は、

$$ \begin{equation} S_{\text{iso}} = \frac{P_t}{4\pi d^2} \quad \text{[W/m}^2\text{]} \end{equation} $$

これは逆2乗則に従い、距離が2倍になると電力密度は $1/4$ になります。

指向性アンテナの利得

実際のアンテナは特定の方向に電力を集中させます。等方性アンテナと比較した電力集中の度合いが アンテナ利得 $G_t$ です。

送信アンテナの利得 $G_t$ を考慮すると、最大放射方向での電力密度は、

$$ \begin{equation} S = \frac{P_t G_t}{4\pi d^2} \quad \text{[W/m}^2\text{]} \end{equation} $$

$P_t G_t$ は 等価等方放射電力(EIRP: Equivalent Isotropically Radiated Power) と呼ばれます。

$$ \text{EIRP} = P_t G_t $$

実効開口面積

受信アンテナの電力取り込み

受信アンテナが入射電力密度 $S$ から電力を取り込む能力を 実効開口面積(effective aperture) $A_e$ [m$^2$] で表します。

$$ \begin{equation} P_r = S \cdot A_e \end{equation} $$

実効開口面積と利得の関係

実効開口面積とアンテナ利得の間には、以下の普遍的な関係があります。

$$ \begin{equation} A_e = \frac{G \lambda^2}{4\pi} \end{equation} $$

ここで $\lambda$ は波長です。この関係はアンテナの形状によらず成り立ちます。

導出の概略

等方性アンテナ($G = 1$)の実効開口面積は $A_{\text{iso}} = \lambda^2/(4\pi)$ です。これはアンテナ理論(相反定理)から厳密に導かれます。

直感的には、等方性アンテナが「感知できる」空間の広がりが波長スケールの面積 $\lambda^2$ 程度であり、全立体角 $4\pi$ で割ることで1方向あたりの有効面積が得られると理解できます。

利得 $G$ のアンテナは等方性アンテナの $G$ 倍の指向性を持つので、

$$ A_e = G \cdot A_{\text{iso}} = \frac{G\lambda^2}{4\pi} $$

フリスの伝達公式の導出

導出

送信電力 $P_t$、送信アンテナ利得 $G_t$、受信アンテナ利得 $G_r$、距離 $d$、波長 $\lambda$ として、受信電力を求めます。

ステップ1: 距離 $d$ における電力密度

$$ S = \frac{P_t G_t}{4\pi d^2} $$

ステップ2: 受信アンテナの実効開口面積

$$ A_e = \frac{G_r \lambda^2}{4\pi} $$

ステップ3: 受信電力

$$ P_r = S \cdot A_e = \frac{P_t G_t}{4\pi d^2} \cdot \frac{G_r \lambda^2}{4\pi} $$

$$ \begin{equation} \boxed{P_r = P_t G_t G_r \left(\frac{\lambda}{4\pi d}\right)^2} \end{equation} $$

これが フリスの伝達公式 です。

伝達損失の分離

フリスの公式を変形して、送受信の利得と伝搬損失を分離します。

$$ \frac{P_r}{P_t} = G_t G_r \left(\frac{\lambda}{4\pi d}\right)^2 $$

ここで $\left(\frac{\lambda}{4\pi d}\right)^2$ の部分が自由空間での伝搬による損失(受信/送信の電力比の減少因子)です。

自由空間損失(FSPL)

定義

自由空間損失は、等方性アンテナ($G_t = G_r = 1$)の場合の送受信電力比の逆数として定義されます。

$$ \begin{equation} \text{FSPL} = \left(\frac{4\pi d}{\lambda}\right)^2 \end{equation} $$

これは常に1以上(0 dB以上)の値をとり、距離と周波数が大きいほど損失が大きくなります。

物理的意味

自由空間損失は「真空中で電磁波が球面状に広がることによるエネルギーの希釈」を表します。重要な点として、これは電磁波が空間に吸収されるのではなく、幾何学的に広がることによる損失です。

$d$ が2倍になると FSPL は4倍($+6$ dB)、$f$ が2倍になると FSPL は4倍($+6$ dB)です。

周波数依存性の本質

FSPL の式に波長(周波数)が入っている理由は、実効開口面積が $A_e \propto \lambda^2$ であることに起因します。高周波ほど等方性アンテナの実効開口面積が小さくなるため、同じ物理的広がりの電磁波をキャッチする能力が下がります。

物理的な空間での電力密度の減衰(逆2乗則)自体は周波数に依存しません。周波数依存性はアンテナの実効開口面積を通じて生じます。

dB表現

対数への変換

無線通信では電力やその比を対数(dB)で扱うのが標準です。これは値のダイナミックレンジが非常に大きい($10^{-15}$ W から $10^6$ W まで)ためです。

フリスの公式をdB表現にすると、

$$ P_{r,\text{dBW}} = P_{t,\text{dBW}} + G_{t,\text{dBi}} + G_{r,\text{dBi}} – L_{\text{fs,dB}} $$

ここで、

$$ L_{\text{fs,dB}} = 10\log_{10}\left(\frac{4\pi d}{\lambda}\right)^2 = 20\log_{10}\left(\frac{4\pi d}{\lambda}\right) $$

$\lambda = c/f$ を代入すると、

$$ \begin{align} L_{\text{fs,dB}} &= 20\log_{10}\left(\frac{4\pi d f}{c}\right) \\ &= 20\log_{10}(d) + 20\log_{10}(f) + 20\log_{10}\left(\frac{4\pi}{c}\right) \end{align} $$

$d$ をkm、$f$ をMHzで表すと、

$$ \begin{align} L_{\text{fs,dB}} &= 20\log_{10}(d \times 10^3) + 20\log_{10}(f \times 10^6) + 20\log_{10}\left(\frac{4\pi}{3 \times 10^8}\right) \\ &= 20\log_{10}(d) + 60 + 20\log_{10}(f) + 120 + 20\log_{10}\left(\frac{4\pi}{3 \times 10^8}\right) \\ &= 20\log_{10}(d) + 20\log_{10}(f) + 180 + 20\log_{10}(4\pi) – 20\log_{10}(3 \times 10^8) \end{align} $$

$20\log_{10}(4\pi) = 21.98$ dB、$20\log_{10}(3 \times 10^8) = 169.54$ dB なので、

$$ \begin{equation} L_{\text{fs,dB}} = 20\log_{10}(d_{\text{km}}) + 20\log_{10}(f_{\text{MHz}}) + 32.44 \text{ [dB]} \end{equation} $$

この便利な公式は多くの通信工学の教科書に記載されています。

$f$ をGHzで表す場合は、

$$ L_{\text{fs,dB}} = 20\log_{10}(d_{\text{km}}) + 20\log_{10}(f_{\text{GHz}}) + 92.45 \text{ [dB]} $$

リンクバジェット

リンクバジェットとは

リンクバジェットは、無線リンクの各要素の利得と損失を積み上げて、受信信号の品質を計算する手法です。dBでの加減算で計算できるため、非常に見通しがよくなります。

基本的なリンクバジェット方程式

$$ \begin{equation} \frac{C}{N_0} = \text{EIRP} – L_{\text{fs}} – L_{\text{other}} + \frac{G_r}{T_s} – k_B \end{equation} $$

ここで、

記号 意味 単位
$C/N_0$ 搬送波対雑音電力密度比 dBHz
EIRP 等価等方放射電力 $P_t G_t$ dBW
$L_{\text{fs}}$ 自由空間損失 dB
$L_{\text{other}}$ その他の損失(大気、降雨、指向誤差等) dB
$G_r/T_s$ 受信系のメリットファクター dB/K
$k_B$ ボルツマン定数($-228.6$ dBW/K/Hz) dBW/K/Hz

数値例

例1:静止衛星通信(Kuバンド)

$$ d = 36{,}000 \text{ km}, \quad f = 12 \text{ GHz} $$

$$ L_{\text{fs}} = 20\log_{10}(36000) + 20\log_{10}(12000) + 32.44 $$

$$ = 91.13 + 81.58 + 32.44 = 205.15 \text{ dB} $$

例2:Wi-Fi(5 GHz、10 m)

$$ d = 0.01 \text{ km}, \quad f = 5000 \text{ MHz} $$

$$ L_{\text{fs}} = 20\log_{10}(0.01) + 20\log_{10}(5000) + 32.44 $$

$$ = -40 + 73.98 + 32.44 = 66.42 \text{ dB} $$

例3:携帯基地局(2 GHz、1 km)

$$ d = 1 \text{ km}, \quad f = 2000 \text{ MHz} $$

$$ L_{\text{fs}} = 20\log_{10}(1) + 20\log_{10}(2000) + 32.44 $$

$$ = 0 + 66.02 + 32.44 = 98.46 \text{ dB} $$

比較表

シナリオ 距離 周波数 FSPL [dB]
Wi-Fi(室内) 10 m 5 GHz 66.4
携帯基地局 1 km 2 GHz 98.5
航空機通信 400 km 1.5 GHz 162.0
静止衛星 36,000 km 12 GHz 205.2
月面通信 384,400 km 2.3 GHz 210.3
深宇宙(火星) 2.25 AU 8.4 GHz 275.7

距離と周波数が大きくなるほど、FSPL が増大することがわかります。

Pythonでの実装

距離と周波数によるFSPLの3Dプロット

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# --- 自由空間損失の計算関数 ---
def fspl_db(d_km, f_mhz):
    """
    自由空間損失 [dB]

    Parameters
    ----------
    d_km : float or array
        距離 [km]
    f_mhz : float or array
        周波数 [MHz]

    Returns
    -------
    loss_db : float or array
        自由空間損失 [dB]
    """
    return 20 * np.log10(d_km) + 20 * np.log10(f_mhz) + 32.44

# --- 3Dプロット ---
d_km = np.logspace(-2, 5, 200)     # 10 m ~ 100,000 km
f_mhz = np.logspace(1, 5, 200)     # 10 MHz ~ 100 GHz

D, F = np.meshgrid(d_km, f_mhz)
L = fspl_db(D, F)

fig = plt.figure(figsize=(14, 6))

# 3Dサーフェス
ax1 = fig.add_subplot(121, projection='3d')
surf = ax1.plot_surface(np.log10(D), np.log10(F), L,
                        cmap='viridis', alpha=0.85, edgecolor='none')

ax1.set_xlabel('log$_{10}$(d [km])', fontsize=11)
ax1.set_ylabel('log$_{10}$(f [MHz])', fontsize=11)
ax1.set_zlabel('FSPL [dB]', fontsize=11)
ax1.set_title('Free Space Path Loss', fontsize=13)
fig.colorbar(surf, ax=ax1, shrink=0.5, aspect=10, label='FSPL [dB]')
ax1.view_init(elev=25, azim=-130)

# 2D等高線
ax2 = fig.add_subplot(122)
levels = np.arange(20, 300, 20)
cs = ax2.contourf(np.log10(D), np.log10(F), L,
                  levels=levels, cmap='viridis')
ax2.contour(np.log10(D), np.log10(F), L,
            levels=levels, colors='white', linewidths=0.5, alpha=0.5)
fig.colorbar(cs, ax=ax2, label='FSPL [dB]')

# 代表的なシナリオをプロット
scenarios = {
    'Wi-Fi': (-2, np.log10(5000)),
    'Cellular': (0, np.log10(2000)),
    'GEO Sat': (np.log10(36000), np.log10(12000)),
}
for name, (logd, logf) in scenarios.items():
    loss = fspl_db(10**logd, 10**logf)
    ax2.plot(logd, logf, 'r*', markersize=15)
    ax2.annotate(f'{name}\n{loss:.0f} dB', xy=(logd, logf),
                 xytext=(logd + 0.3, logf + 0.2),
                 fontsize=9, color='red',
                 arrowprops=dict(arrowstyle='->', color='red'))

ax2.set_xlabel('log$_{10}$(d [km])', fontsize=11)
ax2.set_ylabel('log$_{10}$(f [MHz])', fontsize=11)
ax2.set_title('FSPL Contour Map', fontsize=13)

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

距離に対するFSPLの比較

import numpy as np
import matplotlib.pyplot as plt

def fspl_db(d_km, f_mhz):
    """自由空間損失 [dB]"""
    return 20 * np.log10(d_km) + 20 * np.log10(f_mhz) + 32.44

# --- 周波数ごとの距離-損失カーブ ---
d_km = np.logspace(-3, 6, 500)  # 1 m ~ 1,000,000 km

frequencies = {
    '900 MHz (LTE)': 900,
    '2.4 GHz (Wi-Fi)': 2400,
    '5 GHz (Wi-Fi)': 5000,
    '12 GHz (Ku-band)': 12000,
    '28 GHz (5G mmWave)': 28000,
    '60 GHz (WiGig)': 60000,
}

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

colors = plt.cm.tab10(np.linspace(0, 1, len(frequencies)))
for (name, f_mhz), color in zip(frequencies.items(), colors):
    L = fspl_db(d_km, f_mhz)
    ax.plot(d_km, L, color=color, linewidth=2, label=name)

# 距離マーカー
distances = {
    '10 m': 0.01,
    '100 m': 0.1,
    '1 km': 1,
    '100 km': 100,
    'GEO': 36000,
    'Moon': 384400,
}
for name, d in distances.items():
    ax.axvline(x=d, color='gray', linestyle=':', linewidth=0.8, alpha=0.5)
    ax.text(d, 30, name, rotation=90, fontsize=8, color='gray',
            ha='right', va='bottom')

ax.set_xlabel('Distance [km]', fontsize=12)
ax.set_ylabel('FSPL [dB]', fontsize=12)
ax.set_title('Free Space Path Loss vs Distance', fontsize=14)
ax.set_xscale('log')
ax.legend(fontsize=9, loc='lower right')
ax.grid(True, alpha=0.3, which='both')
ax.set_ylim([20, 300])
ax.set_xlim([1e-3, 1e6])

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

リンクバジェット計算ツール

import numpy as np

# --- リンクバジェット計算 ---

def link_budget(P_t_dBW, G_t_dBi, G_r_dBi, d_km, f_mhz,
                L_other_dB=0, T_sys_K=290, bandwidth_hz=1e6):
    """
    リンクバジェット計算

    Parameters
    ----------
    P_t_dBW : float
        送信電力 [dBW]
    G_t_dBi : float
        送信アンテナ利得 [dBi]
    G_r_dBi : float
        受信アンテナ利得 [dBi]
    d_km : float
        距離 [km]
    f_mhz : float
        周波数 [MHz]
    L_other_dB : float
        その他の損失 [dB]
    T_sys_K : float
        システム雑音温度 [K]
    bandwidth_hz : float
        帯域幅 [Hz]

    Returns
    -------
    results : dict
        計算結果の辞書
    """
    # 自由空間損失
    L_fs_dB = 20 * np.log10(d_km) + 20 * np.log10(f_mhz) + 32.44

    # EIRP
    EIRP_dBW = P_t_dBW + G_t_dBi

    # 受信電力
    P_r_dBW = EIRP_dBW + G_r_dBi - L_fs_dB - L_other_dB

    # 雑音電力
    k_B = 1.38e-23  # ボルツマン定数 [J/K]
    k_B_dBW = 10 * np.log10(k_B)  # -228.6 dBW/K/Hz
    N_dBW = k_B_dBW + 10 * np.log10(T_sys_K) + 10 * np.log10(bandwidth_hz)

    # C/N
    CN_dB = P_r_dBW - N_dBW

    # C/N0
    CN0_dBHz = P_r_dBW - k_B_dBW - 10 * np.log10(T_sys_K)

    return {
        'EIRP [dBW]': EIRP_dBW,
        'FSPL [dB]': L_fs_dB,
        'Other Loss [dB]': L_other_dB,
        'Rx Power [dBW]': P_r_dBW,
        'Rx Power [dBm]': P_r_dBW + 30,
        'Noise Power [dBW]': N_dBW,
        'C/N [dB]': CN_dB,
        'C/N0 [dBHz]': CN0_dBHz,
    }


# === シナリオ1: 静止衛星ダウンリンク ===
print("=" * 55)
print("シナリオ1: 静止衛星ダウンリンク (Ku-band)")
print("=" * 55)
result1 = link_budget(
    P_t_dBW=10 * np.log10(100),   # 100 W = 20 dBW
    G_t_dBi=35,                    # 衛星アンテナ利得
    G_r_dBi=40,                    # 地上パラボラアンテナ(直径1.2m)
    d_km=36000,                    # 静止軌道
    f_mhz=12000,                   # 12 GHz
    L_other_dB=2,                  # 大気損失・指向誤差等
    T_sys_K=150,                   # 受信システム雑音温度
    bandwidth_hz=36e6              # 36 MHz帯域
)
for key, val in result1.items():
    print(f"  {key:>20s} = {val:>10.2f}")

# === シナリオ2: Wi-Fi (5 GHz) ===
print("\n" + "=" * 55)
print("シナリオ2: Wi-Fi (5 GHz, 屋内10m)")
print("=" * 55)
result2 = link_budget(
    P_t_dBW=10 * np.log10(0.1),   # 100 mW = -10 dBW
    G_t_dBi=3,                     # Wi-Fiアンテナ
    G_r_dBi=3,                     # 端末アンテナ
    d_km=0.01,                     # 10 m
    f_mhz=5000,                    # 5 GHz
    L_other_dB=5,                  # 壁・家具等の損失
    T_sys_K=600,                   # 室内雑音環境
    bandwidth_hz=80e6              # 80 MHz帯域
)
for key, val in result2.items():
    print(f"  {key:>20s} = {val:>10.2f}")

# === シナリオ3: 携帯基地局 ===
print("\n" + "=" * 55)
print("シナリオ3: 携帯基地局 (2 GHz, 1 km)")
print("=" * 55)
result3 = link_budget(
    P_t_dBW=10 * np.log10(20),    # 20 W = 13 dBW
    G_t_dBi=18,                    # セクタアンテナ
    G_r_dBi=0,                     # スマートフォン
    d_km=1,                        # 1 km
    f_mhz=2000,                    # 2 GHz
    L_other_dB=10,                 # 建物遮蔽・フェージング余裕
    T_sys_K=290,                   # 室温
    bandwidth_hz=10e6              # 10 MHz帯域
)
for key, val in result3.items():
    print(f"  {key:>20s} = {val:>10.2f}")

リンクバジェットの視覚的な内訳

import numpy as np
import matplotlib.pyplot as plt

# --- リンクバジェットのウォーターフォールチャート ---

# 静止衛星ダウンリンクのリンクバジェット
items = [
    ('Tx Power\n(100W)', 20.0, 'gain'),
    ('Tx Antenna\nGain', 35.0, 'gain'),
    ('FSPL\n(36000km, 12GHz)', -205.15, 'loss'),
    ('Atm. Loss', -2.0, 'loss'),
    ('Rx Antenna\nGain', 40.0, 'gain'),
]

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

cumulative = 0
x_positions = []
heights = []
bottoms = []
colors_bar = []

for i, (label, value, type_) in enumerate(items):
    if type_ == 'gain':
        bottom = cumulative
        color = '#2196F3'
    else:
        bottom = cumulative + value
        color = '#F44336'

    x_positions.append(i)
    heights.append(abs(value))
    bottoms.append(min(cumulative, cumulative + value))
    colors_bar.append(color)
    cumulative += value

# 受信電力(最終結果)
items.append(('Rx Power', cumulative, 'result'))
x_positions.append(len(items) - 1)
heights.append(abs(cumulative))
bottoms.append(min(0, cumulative))
colors_bar.append('#4CAF50')

labels = [item[0] for item in items]

ax.bar(x_positions, heights, bottom=bottoms, color=colors_bar,
       width=0.6, edgecolor='black', linewidth=0.8)

# 値のラベル
running = 0
for i, (label, value, type_) in enumerate(items[:-1]):
    running += value
    # バーの上に値を表示
    y_pos = bottoms[i] + heights[i] + 2
    ax.text(i, y_pos, f'{value:+.1f} dB', ha='center', fontsize=9,
            fontweight='bold')
    # 累積値を線で接続
    if i < len(items) - 2:
        ax.plot([i + 0.3, i + 0.7], [running, running], 'k--',
                linewidth=0.8, alpha=0.5)

# 最終結果
ax.text(len(items)-1, bottoms[-1] + heights[-1] + 2,
        f'{cumulative:.1f} dBW\n({cumulative+30:.1f} dBm)',
        ha='center', fontsize=10, fontweight='bold', color='green')

ax.set_xticks(x_positions)
ax.set_xticklabels(labels, fontsize=9)
ax.set_ylabel('Power Level [dBW]', fontsize=12)
ax.set_title('Link Budget Waterfall: GEO Satellite Downlink (Ku-band)', fontsize=14)
ax.grid(True, alpha=0.3, axis='y')
ax.axhline(y=0, color='gray', linewidth=0.8)

# 凡例
from matplotlib.patches import Patch
legend_elements = [
    Patch(facecolor='#2196F3', label='Gain'),
    Patch(facecolor='#F44336', label='Loss'),
    Patch(facecolor='#4CAF50', label='Result'),
]
ax.legend(handles=legend_elements, fontsize=11, loc='upper right')

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

各シナリオの電力密度の距離減衰

import numpy as np
import matplotlib.pyplot as plt

# --- 電力密度の距離減衰 ---
d = np.logspace(0, 6, 500)  # 1 m ~ 1000 km

# 各シナリオのEIRP [W]
scenarios = {
    'Wi-Fi AP (100mW, 3dBi)': 0.1 * 10**(3/10),
    'Cell Tower (20W, 18dBi)': 20 * 10**(18/10),
    'Radar (1MW, 40dBi)': 1e6 * 10**(40/10),
    'GEO Sat (100W, 35dBi)': 100 * 10**(35/10),
}

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

for name, eirp in scenarios.items():
    S = eirp / (4 * np.pi * d**2)  # 電力密度 [W/m²]
    ax1.plot(d / 1e3, S, linewidth=2, label=name)

ax1.set_xlabel('Distance [km]', fontsize=12)
ax1.set_ylabel('Power Density [W/m$^2$]', fontsize=12)
ax1.set_title('Power Density vs Distance', fontsize=13)
ax1.set_xscale('log')
ax1.set_yscale('log')
ax1.legend(fontsize=9)
ax1.grid(True, alpha=0.3, which='both')
ax1.set_ylim([1e-20, 1e5])

# 逆2乗則の確認
d_norm = np.logspace(0, 4, 100)
S_norm = 1 / d_norm**2

ax2.plot(d_norm, S_norm, 'b-', linewidth=2, label='$S \\propto 1/d^2$')
ax2.plot(d_norm, 1 / d_norm**3, 'r--', linewidth=1.5, label='$\\propto 1/d^3$ (reference)')
ax2.plot(d_norm, 1 / d_norm, 'g--', linewidth=1.5, label='$\\propto 1/d$ (reference)')

# 距離2倍→電力1/4のマーカー
d1, d2 = 10, 20
ax2.plot([d1, d1], [1/d1**2, 1e-10], 'k:', linewidth=1)
ax2.plot([d2, d2], [1/d2**2, 1e-10], 'k:', linewidth=1)
ax2.annotate(f'd={d1}: S={1/d1**2:.4f}', xy=(d1, 1/d1**2),
             xytext=(d1*2, 1/d1**2*3), fontsize=9,
             arrowprops=dict(arrowstyle='->', color='black'))
ax2.annotate(f'd={d2}: S={1/d2**2:.5f}\n(= 1/4 of above)', xy=(d2, 1/d2**2),
             xytext=(d2*2, 1/d2**2*5), fontsize=9,
             arrowprops=dict(arrowstyle='->', color='black'))

ax2.set_xlabel('Distance (normalized)', fontsize=12)
ax2.set_ylabel('Power density (normalized)', fontsize=12)
ax2.set_title('Inverse Square Law', fontsize=13)
ax2.set_xscale('log')
ax2.set_yscale('log')
ax2.legend(fontsize=10)
ax2.grid(True, alpha=0.3, which='both')

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

まとめ

本記事では、自由空間損失とフリスの伝達公式について、基礎から丁寧に導出しました。

  • 等方性アンテナの放射: 電力密度 $S = P_t/(4\pi d^2)$ は逆2乗則に従います
  • 実効開口面積: $A_e = G\lambda^2/(4\pi)$ でアンテナの電力取り込み能力を表します
  • フリスの伝達公式: $P_r = P_t G_t G_r (\lambda/(4\pi d))^2$ が自由空間での送受信電力の基本関係です
  • 自由空間損失: $\text{FSPL} = (4\pi d/\lambda)^2$ は球面的な広がりによるエネルギーの希釈です
  • dB表現: $L_{\text{fs}} = 20\log_{10}(d_{\text{km}}) + 20\log_{10}(f_{\text{MHz}}) + 32.44$ dB
  • リンクバジェット: 各要素の利得・損失をdBで積み上げることで、受信品質を体系的に計算できます
  • 数値例: Wi-Fi(66 dB)から深宇宙通信(276 dB)まで、FSPLのスケール感を具体的に確認しました

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