変調や搬送波の必要性をわかりやすく解説

無線通信の勉強をしていると、数多くの変調方式が登場します。変調について勉強すると、なぜこんなにも多くの変調方式があるのか、疑問に思うことも多いと思います。

その答えは、周波数資源の有効利用にあります。基本的に、音声信号などをそのままの周波数で送ろうとすると、広範囲の周波数帯を占有してしまうため、搬送波(carrier wave)を用いて特定の周波数帯に信号を移動させ、電波の混信を防ぐようにしています。

本記事の内容

  • なぜ変調が必要なのか
  • 搬送波の役割
  • ベースバンド信号とパスバンド信号
  • 周波数スペクトルの概念
  • Pythonでの可視化

なぜ変調が必要なのか

変調が必要な理由は主に3つあります。

理由1: アンテナサイズの制約

効率的に電波を放射するには、アンテナの長さが電波の波長 $\lambda$ の程度($\lambda/4$ 以上)である必要があります。

$$ \lambda = \frac{c}{f} $$

音声信号(20 Hz – 20 kHz)をそのまま送信する場合、最低周波数20 Hzに対応するアンテナ長は、

$$ \lambda_{20\text{Hz}} = \frac{3 \times 10^8}{20} = 15{,}000 \, \text{km} $$

$\lambda/4$ でも約3,750 kmとなり、実用的ではありません。搬送波に乗せて高い周波数にすれば、アンテナを小型化できます。

理由2: 周波数の多重利用

複数の通信を同時に行うには、それぞれの信号を異なる搬送波周波数に乗せることで、周波数帯域を分け合えます。これがFDMA(周波数分割多重)の原理です。

理由3: 伝搬特性の制御

電波の伝搬特性は周波数によって大きく異なります。用途に応じた最適な周波数帯を選択し、そこに信号を配置できます。

搬送波(Carrier Wave)とは

搬送波は、情報信号を運ぶための高周波の正弦波です。

$$ c(t) = A_c \cos(2\pi f_c t + \phi_c) $$

搬送波の3つのパラメータ(振幅 $A_c$, 周波数 $f_c$, 位相 $\phi_c$)のいずれかを情報信号に応じて変化させるのが変調です。

ベースバンドとパスバンド

ベースバンド信号

元の情報信号をベースバンド信号と呼びます。周波数成分はDC(0 Hz)付近に集中しています。

$$ m(t) \leftrightarrow M(f), \quad |f| \leq W $$

ここで $W$ は信号の帯域幅です。

パスバンド信号

ベースバンド信号を搬送波で変調した信号をパスバンド信号と呼びます。スペクトルは搬送波周波数 $f_c$ を中心に分布します。

$$ s(t) = m(t) \cos(2\pi f_c t) \leftrightarrow \frac{1}{2}[M(f-f_c) + M(f+f_c)] $$

変調により、ベースバンドのスペクトルが $f_c$ だけシフトします。これが変調の本質です。

周波数スペクトル

フーリエ変換

信号の周波数成分を分析するにはフーリエ変換を使います。

$$ X(f) = \int_{-\infty}^{\infty} x(t) e^{-j2\pi ft} dt $$

帯域幅

信号が占有する周波数の幅を帯域幅 $B$ と呼びます。AM変調の場合、信号帯域幅が $W$ なら、

$$ B_{\text{AM}} = 2W $$

上側帯波(USB)と下側帯波(LSB)を合わせた帯域幅です。

Pythonでの可視化

import numpy as np
import matplotlib.pyplot as plt

# パラメータ
fs = 50000   # サンプリング周波数 [Hz]
t = np.linspace(0, 0.1, int(fs * 0.1))
f_signal = 100   # 信号波の周波数 [Hz]
f_carrier = 5000  # 搬送波の周波数 [Hz]

# ベースバンド信号(音声を模擬)
signal = np.sin(2 * np.pi * f_signal * t) + \
         0.5 * np.sin(2 * np.pi * 3 * f_signal * t)

# 搬送波
carrier = np.cos(2 * np.pi * f_carrier * t)

# AM変調
m = 0.8  # 変調指数
am_signal = (1 + m * signal) * carrier

fig, axes = plt.subplots(3, 2, figsize=(14, 12))

# ベースバンド信号(時間域)
axes[0, 0].plot(t * 1000, signal, 'b-', linewidth=1)
axes[0, 0].set_title('Baseband Signal (Time Domain)')
axes[0, 0].set_xlabel('Time [ms]')
axes[0, 0].set_ylabel('Amplitude')
axes[0, 0].set_xlim(0, 50)

# ベースバンド信号(周波数域)
freq = np.fft.fftfreq(len(t), 1/fs)
signal_fft = np.abs(np.fft.fft(signal)) / len(t)
axes[0, 1].plot(freq[:len(freq)//2], 2*signal_fft[:len(freq)//2], 'b-')
axes[0, 1].set_title('Baseband Signal (Frequency Domain)')
axes[0, 1].set_xlabel('Frequency [Hz]')
axes[0, 1].set_ylabel('Magnitude')
axes[0, 1].set_xlim(0, 1000)

# 搬送波(時間域)
axes[1, 0].plot(t * 1000, carrier, 'r-', linewidth=0.5)
axes[1, 0].set_title(f'Carrier Wave (fc = {f_carrier} Hz)')
axes[1, 0].set_xlabel('Time [ms]')
axes[1, 0].set_ylabel('Amplitude')
axes[1, 0].set_xlim(0, 5)

# 搬送波(周波数域)
carrier_fft = np.abs(np.fft.fft(carrier)) / len(t)
axes[1, 1].plot(freq[:len(freq)//2], 2*carrier_fft[:len(freq)//2], 'r-')
axes[1, 1].set_title('Carrier Wave (Frequency Domain)')
axes[1, 1].set_xlabel('Frequency [Hz]')
axes[1, 1].set_ylabel('Magnitude')
axes[1, 1].set_xlim(0, 10000)

# AM変調信号(時間域)
axes[2, 0].plot(t * 1000, am_signal, 'g-', linewidth=0.5)
axes[2, 0].plot(t * 1000, 1 + m * signal, 'r--', linewidth=1, alpha=0.7)
axes[2, 0].set_title('AM Modulated Signal')
axes[2, 0].set_xlabel('Time [ms]')
axes[2, 0].set_ylabel('Amplitude')
axes[2, 0].set_xlim(0, 50)

# AM変調信号(周波数域)
am_fft = np.abs(np.fft.fft(am_signal)) / len(t)
axes[2, 1].plot(freq[:len(freq)//2], 2*am_fft[:len(freq)//2], 'g-')
axes[2, 1].set_title('AM Signal (Frequency Domain)')
axes[2, 1].set_xlabel('Frequency [Hz]')
axes[2, 1].set_ylabel('Magnitude')
axes[2, 1].set_xlim(0, 10000)

# スペクトルの特徴を注釈
axes[2, 1].annotate('Carrier', xy=(f_carrier, 0.5), fontsize=10, color='red')
axes[2, 1].annotate('USB', xy=(f_carrier + f_signal, 0.2), fontsize=9, color='blue')
axes[2, 1].annotate('LSB', xy=(f_carrier - f_signal, 0.2), fontsize=9, color='blue')

plt.tight_layout()
plt.show()

# アンテナサイズの比較
print("=== 周波数とアンテナサイズ(lambda/4)の関係 ===")
freqs_example = [100, 1e3, 1e6, 100e6, 1e9, 10e9]
for f in freqs_example:
    lam = 3e8 / f
    antenna = lam / 4
    if antenna > 1000:
        print(f"  {f/1e6:10.3f} MHz: lambda={lam:.1f}m, "
              f"antenna={antenna/1e3:.1f}km")
    elif antenna > 1:
        print(f"  {f/1e6:10.3f} MHz: lambda={lam:.2f}m, "
              f"antenna={antenna:.2f}m")
    else:
        print(f"  {f/1e6:10.3f} MHz: lambda={lam*100:.2f}cm, "
              f"antenna={antenna*100:.2f}cm")

まとめ

本記事では、変調と搬送波の必要性について解説しました。

  • 変調はアンテナの小型化、周波数の多重利用、伝搬特性の制御のために必要である
  • 搬送波は情報信号を運ぶ高周波の正弦波で、振幅・周波数・位相を変化させる
  • 変調の本質はベースバンド信号のスペクトルを搬送波周波数にシフトすることである
  • AM変調では搬送波とUSB・LSBの3つのスペクトル成分が現れる

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