デシベルとリンクバジェット
dB・dBm・dBW・dBiによるデシベル計算、フリスの伝達公式、ITU-R P.525と照合した自由空間損失、numpyによるリンクバジェット計算機
このレッスンで学ぶこと
- ワット・dBm・dBWを相互に変換し、利得・損失・電力をdBで正しく組み合わせる
- フリスの伝達公式から自由空間損失を導出し、ITU-R P.525と0.05 dB以内で一致させる
- 送信電力、アンテナ利得、損失、受信感度からリンクバジェットを組み立て、リンクマージンを計算する
- 必要なフェージングマージンを確保できる自由空間リンクの最大距離を求める
リンクバジェットが答える問いは一つです。受信機に十分な電力が届くかどうかです。送信機の出力から受信機の入力までのすべての利得と損失を足し合わせ、その結果を受信機が必要とする電力と比べます。センサノードから衛星まで、あらゆる無線設計はリンクバジェットから始まります。このレッスンでは、計算を簡単にするデシベル演算を扱い、フリスの伝達公式から自由空間損失を導出してITU-Rの式と照合し、最後にnumpyで小さなリンクバジェット計算機を作ります。
レッスン01でデシベルを紹介しました。ここでは本格的に使います。
デシベルの計算
デシベルは、二つの電力の比を対数尺度で表したもので、10 log10(P2 / P1) です。比であるため、単位の付かないdB値は利得か損失を表し、電力を表すことはありません。アンプには20 dBの利得があります。ケーブルには3 dBの損失があります。
絶対電力には基準が必要で、単位名がその基準を示します。
| 単位 | 基準 | この単位での0の意味 | 主な用途 |
|---|---|---|---|
| dBm | 1 mW | 1 mW | 送信電力・受信電力 |
| dBW | 1 W | 1 W(30 dBmに相当) | 大電力送信機、衛星のEIRP |
| dBi | 等方性アンテナ | 理想的な等方性放射体の利得 | アンテナ利得 |
| dB | なし(比) | 1倍 | 利得、損失、SNR |
dBmとdBWの差は常に30 dBです。dBiは、すべての方向に同じ電力を放射するアンテナを基準としたアンテナ利得です。実在のアンテナにそのようなものはありませんが、自由空間損失の式が前提とする基準は等方性アンテナです。
規則は対数の性質から導かれます。電力に利得を掛けることは、dBでは足し算になります。dBmの電力にdBの利得を足すと、dBmの電力になります。dBmの電力から別のdBmの電力を引くと、信号対雑音比のようなdBの比になります。してはいけないのは、dBmの電力同士を足すことです。二つの信号はワット単位で足し合わされるので、ワットに変換して足し、元に戻します。
import numpy as np
def watts_to_dbm(p_w: float) -> float:
return 10 * np.log10(p_w / 1e-3)
def dbm_to_watts(p_dbm: float) -> float:
return 1e-3 * 10 ** (p_dbm / 10)
for p in [1e-12, 1e-6, 1e-3, 0.1, 1.0, 20.0]:
print(f"{p:8.0e} W = {watts_to_dbm(p):7.1f} dBm = {watts_to_dbm(p) - 30:7.1f} dBW")
# Gains and losses add in dB, but powers must be added in watts
print(f"2x power: {10 * np.log10(2):.2f} dB")
print(f"0 dBm + 0 dBm (two equal signals) = {watts_to_dbm(2 * dbm_to_watts(0)):.2f} dBm")
print(f"20 dBm + 10 dBm = {watts_to_dbm(dbm_to_watts(20) + dbm_to_watts(10)):.2f} dBm")
1e-12 W = -90.0 dBm = -120.0 dBW
1e-06 W = -30.0 dBm = -60.0 dBW
1e-03 W = 0.0 dBm = -30.0 dBW
1e-01 W = 20.0 dBm = -10.0 dBW
1e+00 W = 30.0 dBm = 0.0 dBW
2e+01 W = 43.0 dBm = 13.0 dBW
2x power: 3.01 dB
0 dBm + 0 dBm (two equal signals) = 3.01 dBm
20 dBm + 10 dBm = 20.41 dBm
1ピコワットは−90 dBmで、受信信号として典型的な桁です。等しい二つの信号を足すと、一方だけの場合より3.01 dB大きくなります。20 dBmの信号に10 dBmの信号を足しても、合計は0.41 dBしか増えません。電力が10分の1しかないためです。この最後の結果は、雑音フロアに干渉を加える場合に重要です。フロアより10 dB低い干渉源は、フロアを約0.4 dB押し上げます。
フリスの伝達公式
電力Ptをすべての方向に均等に放射する送信機を考えます。距離dでは、その電力は面積4πd²の球面に広がるので、電力束密度はPt / (4πd²) W/m²です。受信アンテナは、その実効開口に入射する電力束を捕らえます。勧告ITU-R P.525-5は、等方性受信アンテナの実効開口をλ²/(4π)としています。ここでλは波長です。この二つを掛けます。
Pr = Pt · 1/(4π d²) · λ²/(4π) = Pt · (λ / (4π d))²
実際のアンテナは電力を集中させます。利得Gtのアンテナは、最も強い方向に等方性アンテナのGt倍の電力を送ります。利得Grの受信アンテナは、Gr倍の実効開口を持ちます。両方を含めるとフリスの伝達公式になります。名前は、1946年にこの式を発表したHarald Friisにちなみます。
Pr = Pt · Gt · Gr · (λ / (4π d))²
デシベルでは、積が和になります。
Pr (dBm) = Pt (dBm) + Gt (dBi) + Gr (dBi) − FSPL (dB)
FSPL = 20 log10(4π d / λ)
FSPLは自由空間損失で、二つの等方性アンテナ間の損失です。P.525-5はこれを自由空間基本伝送損失と呼び、式(5)として同じ式を示しています。式(6)は実用的な単位で表したもので、fはMHz、dはkmです。
Lbf = 32.4 + 20 log10(f) + 20 log10(d) dB
定数32.4は、20 log10(4π · 10⁹ / c)を丸めた値です。次のブロックでは、五つの周波数と三つの距離について両方の方法で経路損失を計算し、最大の差を表示します。
import numpy as np
C = 299_792_458.0 # speed of light, m/s (exact by definition)
def fspl_db(f_hz: float, d_m: float) -> float:
"""Free-space path loss between isotropic antennas, from the Friis equation."""
wavelength = C / f_hz
return 20 * np.log10(4 * np.pi * d_m / wavelength)
def fspl_p525_db(f_mhz: float, d_km: float) -> float:
"""ITU-R P.525-5 equation (6): f in MHz, d in km."""
return 32.4 + 20 * np.log10(f_mhz) + 20 * np.log10(d_km)
print(f"exact constant: {20 * np.log10(4 * np.pi * 1e6 * 1e3 / C):.4f} dB")
worst = 0.0
for f_mhz in [433.92, 868.0, 2450.0, 3500.0, 28000.0]:
for d_km in [0.01, 1.0, 10.0]:
a, b = fspl_db(f_mhz * 1e6, d_km * 1e3), fspl_p525_db(f_mhz, d_km)
worst = max(worst, abs(a - b))
if d_km == 1.0:
print(f"{f_mhz:8.2f} MHz, 1 km: Friis {a:6.2f} dB, P.525 {b:6.2f} dB")
print(f"largest difference over the grid: {worst:.3f} dB")
print(f"doubling distance adds {fspl_db(2.45e9, 200) - fspl_db(2.45e9, 100):.2f} dB")
exact constant: 32.4478 dB
433.92 MHz, 1 km: Friis 85.20 dB, P.525 85.15 dB
868.00 MHz, 1 km: Friis 91.22 dB, P.525 91.17 dB
2450.00 MHz, 1 km: Friis 100.23 dB, P.525 100.18 dB
3500.00 MHz, 1 km: Friis 103.33 dB, P.525 103.28 dB
28000.00 MHz, 1 km: Friis 121.39 dB, P.525 121.34 dB
largest difference over the grid: 0.048 dB
doubling distance adds 6.02 dB
厳密な定数は32.4478 dBなので、P.525の簡易式はどの条件でも0.048 dB低い値になります。これは実際のどのリンクバジェットの不確かさと比べても十分に小さい差です。距離を2倍にすると6.02 dB、10倍にすると20 dB増えます。アンテナと伝搬の公式集も参照してください。
経路損失が周波数とともに増える理由
実効開口に含まれるλ²がすべてを説明します。周波数が高いと、利得が一定のアンテナは物理的に小さくなり、通過する電波を捕らえる量が減ります。距離dでの電力密度そのものは周波数にまったく依存しません。アンテナの利得ではなく物理的な面積を一定にすると、利得は周波数とともに上がります。リンクの両端でこれが起きると、20 log10(f)の項を打ち消して余りあります。ミリ波リンクはこうして成立します。高利得アンテナを使い、その代わりにアンテナの向きを合わせる必要があります。
リンクバジェットを組み立てる
リンクバジェットは表です。送信機の出力電力から始めます。受信機の入力に至るまでの各項目を足し引きします。その結果を受信機の受信感度と比べます。その差がリンクマージンです。
項目を順に示します。
- 無線機の出力での送信電力(dBm)。
- 送信側のケーブル・コネクタ損失(dB)。
- 送信アンテナ利得(dBi)。項目1〜3を合わせたものが等価等方輻射電力(EIRP)です。使用する帯域と国で適用される放射電力の上限と比べてください。
- 経路損失(dB)。自由空間損失が最小値です。実際の経路では、遮蔽物・樹木・建物による損失が加わります。
- その他の損失:偏波の不整合、携帯機器での人体損失、レドーム、経年劣化に備えたマージン。
- 受信アンテナ利得(dBi)と受信側のケーブル損失(dB)。
- 受信感度(dBm):受信機が誤り率の目標をまだ満たせる最も弱い信号の電力。その由来はレッスン04で説明します。
マージンは、最後の行の後に残る値です。このマージンで、バジェットがモデル化していないもの、とりわけフェージングを賄う必要があります。レッスン07で扱うレイリーフェージングチャネルでは、受信電力が平均より10 dB以上低くなる時間が約10%、20 dB以上低くなる時間が約1%あります。マージン1 dBで成立するバジェットは、実際には機能しません。
以下の計算機は、2.45 GHzのポイントツーポイントリンクを扱います。数値は教材用の設計上の仮定であり、特定の製品の仕様ではありません。EIRPと受信電力を計算し、自由空間の式を逆に解いて、10 dBのフェージングマージンが残る最長距離を求めます。
import numpy as np
C = 299_792_458.0 # speed of light, m/s
def fspl_db(f_hz: float, d_m: np.ndarray) -> np.ndarray:
return 20 * np.log10(4 * np.pi * d_m * f_hz / C)
# An example 2.45 GHz point-to-point link. All values are design assumptions.
link = {
"tx_power_dbm": 20.0, # transmitter output
"tx_cable_loss_db": 1.0,
"tx_antenna_gain_dbi": 6.0,
"rx_antenna_gain_dbi": 6.0,
"rx_cable_loss_db": 1.0,
"other_losses_db": 3.0, # polarisation mismatch, body loss, ageing
"sensitivity_dbm": -92.0, # receiver sensitivity at the chosen data rate
"fade_margin_db": 10.0, # what we want left over
}
f_hz = 2.45e9
eirp_dbm = link["tx_power_dbm"] - link["tx_cable_loss_db"] + link["tx_antenna_gain_dbi"]
def rx_power_dbm(d_m: np.ndarray) -> np.ndarray:
return (eirp_dbm - fspl_db(f_hz, d_m) - link["other_losses_db"]
+ link["rx_antenna_gain_dbi"] - link["rx_cable_loss_db"])
# Largest path loss that still leaves the fade margin, then the matching distance
max_loss_db = (eirp_dbm - link["other_losses_db"] + link["rx_antenna_gain_dbi"]
- link["rx_cable_loss_db"] - link["sensitivity_dbm"] - link["fade_margin_db"])
d_max_m = C / (4 * np.pi * f_hz) * 10 ** (max_loss_db / 20)
print(f"EIRP: {eirp_dbm:.1f} dBm")
print(f"allowed free-space loss: {max_loss_db:.1f} dB")
print(f"range with {link['fade_margin_db']:.0f} dB margin: {d_max_m / 1e3:.2f} km")
for d in [100.0, 1000.0, 5000.0]:
p = rx_power_dbm(np.array(d))
print(f"at {d / 1e3:5.1f} km: received {p:6.1f} dBm, margin {p - link['sensitivity_dbm']:5.1f} dB")
d_grid = np.logspace(1, 5, 17) # 10 m to 100 km
print("chart:", ", ".join(f"[{d:.0f}, {p:.1f}]" for d, p in zip(d_grid, rx_power_dbm(d_grid))))
EIRP: 25.0 dBm
allowed free-space loss: 109.0 dB
range with 10 dB margin: 2.74 km
at 0.1 km: received -53.2 dBm, margin 38.8 dB
at 1.0 km: received -73.2 dBm, margin 18.8 dB
at 5.0 km: received -87.2 dBm, margin 4.8 dB
chart: [10, -33.2], [18, -38.2], [32, -43.2], [56, -48.2], [100, -53.2], [178, -58.2], [316, -63.2], [562, -68.2], [1000, -73.2], [1778, -78.2], [3162, -83.2], [5623, -88.2], [10000, -93.2], [17783, -98.2], [31623, -103.2], [56234, -108.2], [100000, -113.2]
バジェットは次のとおりです。
| 項目 | 値 |
|---|---|
| 送信電力 | 20.0 dBm |
| 送信ケーブル損失 | −1.0 dB |
| 送信アンテナ利得 | +6.0 dBi |
| EIRP | 25.0 dBm |
| その他の損失 | −3.0 dB |
| 受信アンテナ利得 | +6.0 dBi |
| 受信ケーブル損失 | −1.0 dB |
| 受信感度 | −92.0 dBm |
| 必要なフェージングマージン | 10.0 dB |
| 許容される自由空間損失 | 109.0 dB |
| 最大距離 | 2.74 km |
1 kmでは、リンクに18.8 dBのマージンがあり、必要量を十分に上回ります。5 kmでは4.8 dBしかなく、深いフェージングに耐えるには足りません。グラフは、受信電力を距離に対して対数軸で示しています。自由空間損失のため、グラフは1桁あたり20 dB下がる直線になります。この線が受信感度とマージンの和を上回る範囲で、リンクは機能します。
バジェットを信頼できるものにする習慣が二つあります。一つは、すべての項目を単位付きで書くことです。dBの欄にdBmの値を入れるのが最もよくある間違いだからです。もう一つは、仮定を数値の隣に書いておくことです。そうすれば、アンテナや無線機が変わったときに、どの行を変えればよいかが誰にでもわかります。デシベルとリンクバジェットのチートシートが、このレッスンの早見表です。
一度に1行ずつ変える
足し算なので、トレードオフがはっきりわかります。バジェットのどこであれ6 dB増やすと、自由空間での到達距離は2倍になります。6 dBiのアンテナを両方とも12 dBiのものに替えると12 dB増え、距離は4倍になります。ただしビーム幅が狭くなるので、アンテナの向きを合わせる必要があります。受信感度が3 dB良い受信機は、送信電力を3 dB上げたのと同じ距離を稼げ、通常はバッテリーの負担も小さくて済みます。データレートを半分にすると、受信感度は通常約3 dB改善します。受信機が半分の帯域幅を使えるので、取り込む雑音も半分になるためです。この帯域幅・雑音・受信感度の関係が、次のレッスンの主題です。
演習
- 47 dBmをワットとdBWに変換してください。ある基地局が、ケーブル損失0.5 dBを介して、利得17 dBiのアンテナに47 dBmを供給しています。EIRPはdBmとワットでそれぞれいくつですか。
fspl_dbを使い、12 GHzで36 000 kmの経路の自由空間損失を計算してください。上に表示した1 kmの値と比べ、その差を一つの引き算で説明してください。- 計算機で2.45 GHzの搬送波を868 MHzに置き換え、他はそのままにしてください。10 dBマージンでの到達距離はどれだけ変わり、何倍になりますか。その倍率を二つの周波数の比と照らし合わせてください。
- 規制当局がリンクのEIRPの上限を20 dBmとしています。同じアンテナでバジェットを組み直してください。新しい最大距離はいくつですか。
- 屋内の受信機を想定して
linkに15 dBの壁透過損失を追加し、新しい到達距離を示してください。
まとめ
- dBは比です。dBmとdBWは、それぞれ1 mWと1 Wを基準とする絶対電力です。dBiは等方性アンテナを基準とするアンテナ利得です。利得はdBで足しますが、電力はワットで足します。
- フリスの伝達公式Pr = Pt Gt Gr (λ / 4πd)²から、自由空間損失は20 log10(4πd/λ)となります。ITU-R P.525-5はこれを32.4 + 20 log10(MHz単位のf) + 20 log10(km単位のd)と書き、厳密な式と0.048 dB以内で一致します。
- 自由空間損失は、距離が2倍になるごとに6 dB、距離または周波数が10倍になるごとに20 dB増えます。これは基準線であり、保証された下限ではありません。ITU-R P.1411は約10 GHz以上での見通し内の経路損失指数を約1.9〜2.2としており、実測の損失がこれをわずかに下回ることがあります。
- リンクバジェットは、送信電力からEIRP、経路損失、受信側の利得を経て受信電力を求め、それを受信感度と比べます。残ったマージンでフェージングを賄う必要があります。2.45 GHzのリンク例は、10 dBの余裕を残して2.74 kmまで届きます。
さらに読む
- Recommendation ITU-R P.525-5, Calculation of free-space attenuation (11/2024):上で使った式(4)〜(6)に加え、電界強度とレーダーの形式も示しています。
- H. T. Friis, “A note on a simple transmission formula”, 「Proceedings of the IRE」, vol. 34, no. 5, pp. 254-256, 1946:伝達公式についての短い原論文です。
- A. Goldsmith, 「Wireless Communications」, Cambridge University Press, 2005:第2章「Path Loss and Shadowing」で、自由空間から経験的な経路損失モデルまでを扱っています。
- T. S. Rappaport, 「Wireless Communications: Principles and Practice」, 2nd edition, Cambridge University Press, 2024 reissue:セルラーシステムの伝搬とリンク設計に関する標準的な工学書です。
訂正
- 2026年11月15日:まとめでは、自由空間損失を実際の経路損失の下限としていました。ITU-R P.1411-13は約10 GHz以上での見通し内の経路損失指数を約1.9〜2.2としており、実際の損失が自由空間の線をわずかに下回ることがあります。現在の項目はその旨を記載しています。