PM変調(位相変調)の理論 — FM変調との関係と間接FM方式を解説

FMラジオを聴いているとき、送信機の内部では搬送波の「周波数」が音声信号に応じて揺れ動いています。しかし、周波数を直接安定に変化させるのは意外と難しい——それなら、搬送波の「位相」を変化させる方がハードウェア的に扱いやすいのではないか。この発想から生まれたのが PM変調(Phase Modulation: 位相変調) です。

PM変調はFM変調と兄弟のような関係にあり、両者をまとめて角度変調(Angle Modulation)と呼びます。実は PM と FM は数学的に微分・積分の関係で結ばれており、PM変調器にベースバンド信号を積分してから入力すれば FM 信号が得られます。この原理を応用したのがアームストロング間接FM方式であり、水晶発振器の安定度を保ちながら広帯域FM信号を生成できる画期的な技術です。

PM変調を理解すると、以下のようなさまざまな分野が見通しよくなります。

  • PSK(位相偏移変調) — ディジタル通信の基盤であるBPSK・QPSKは、PM変調をディジタル化したものです
  • 間接FM送信機の設計 — FMラジオ放送の送信機には、PM変調器を核とするアームストロング方式が広く使われてきました
  • PLL(位相同期回路) — PM信号の復調にはPLLが自然に登場し、通信システム全般の要素技術につながります

本記事の内容

  • 角度変調の統一的な枠組み
  • PM変調の数学的定義と瞬時位相
  • FM変調との微分・積分関係
  • 狭帯域角度変調の近似
  • ベッセル関数によるスペクトル展開
  • カーソンの帯域幅則のPM版
  • 間接FM方式とアームストロング変調器
  • PM/FM復調の原理
  • Pythonでの波形比較・スペクトル可視化

前提知識

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

角度変調とは — 振幅を固定し、角度に情報を載せる

AM変調(振幅変調)では搬送波の「振幅」をベースバンド信号に応じて変化させます。一方、搬送波の振幅は一定に保ったまま、位相や周波数に情報を載せる方式を総称して角度変調と呼びます。

角度変調信号の一般的な表現は次の通りです。

$$ s(t) = A_c \cos\!\left[\theta(t)\right] $$

ここで $A_c$ は一定の振幅、$\theta(t)$ は瞬時位相(instantaneous phase)です。AM変調では $A_c$ の部分が信号に応じて変化しますが、角度変調では $A_c$ は定数のまま $\theta(t)$ だけが変化します。

この瞬時位相 $\theta(t)$ をどのように信号と関連づけるかで、2つの方式に分かれます。

  • PM変調: 瞬時位相そのものをベースバンド信号に比例させる
  • FM変調: 瞬時周波数(= 瞬時位相の時間微分)をベースバンド信号に比例させる

イメージとしては、PM変調は「時計の針の角度を直接動かす」操作であり、FM変調は「時計の針の回転速度を変える」操作です。角度を直接いじれば、回転速度(= 角度の微分)も間接的に変化しますし、逆に回転速度を変えれば角度(= 速度の積分)も変わります。つまり PM と FM は本質的に結びついているのです。

ここまでで角度変調の概念を掴みました。次に、PM変調の数学的な定義を厳密に書き下してみましょう。

PM変調の数学的定義

瞬時位相とベースバンド信号

PM変調では、瞬時位相 $\theta(t)$ をベースバンド信号 $x(t)$ に直接比例させます。具体的には、搬送波の位相に信号に比例した成分を加えます。

$$ \theta(t) = 2\pi f_c t + k_p \, x(t) $$

ここで各記号の意味は次の通りです。

  • $f_c$: 搬送波周波数 [Hz]
  • $k_p$: 位相感度(phase sensitivity)[rad/V]
  • $x(t)$: ベースバンド信号(変調信号)

したがって、PM変調信号は次のように書けます。

$$ \boxed{ s_{\text{PM}}(t) = A_c \cos\!\left[ 2\pi f_c t + k_p \, x(t) \right] } $$

この式は非常にシンプルです。搬送波 $\cos(2\pi f_c t)$ の位相引数に $k_p \, x(t)$ という項が足されているだけです。ベースバンド信号の振幅が大きくなれば位相のズレが大きくなり、信号がゼロなら搬送波そのものに戻ります。

最大位相偏移

ベースバンド信号の最大振幅を $A_m$(つまり $|x(t)| \leq A_m$)とすると、最大位相偏移 $\Delta\phi$ は次のようになります。

$$ \Delta\phi = k_p \, A_m \quad \text{[rad]} $$

この $\Delta\phi$ がPM変調における重要なパラメータであり、FM変調における最大周波数偏移 $\Delta f$ に対応する量です。

PM変調の瞬時周波数

PM変調信号の瞬時角周波数 $\omega_i(t)$ は、瞬時位相を時間微分すれば得られます。

$$ \omega_i(t) = \frac{d\theta(t)}{dt} = 2\pi f_c + k_p \frac{dx(t)}{dt} $$

瞬時周波数に直すと、

$$ f_i(t) = \frac{\omega_i(t)}{2\pi} = f_c + \frac{k_p}{2\pi} \frac{dx(t)}{dt} $$

ここに注目してください。PM変調信号の瞬時周波数は、ベースバンド信号そのものではなく、その時間微分 $dx/dt$ に比例しています。これは FM 変調との関係を理解する上で決定的に重要なポイントです。

ここまででPM変調の数学的な定義が整いました。次に、PM変調とFM変調の関係を定量的に明らかにしましょう。

PM変調とFM変調の数学的関係

定義の対比

PM変調とFM変調の定義を並べて比較してみます。

PM変調:

$$ s_{\text{PM}}(t) = A_c \cos\!\left[ 2\pi f_c t + k_p \, x(t) \right] $$

FM変調FM変調の記事で導出した式):

$$ s_{\text{FM}}(t) = A_c \cos\!\left[ 2\pi f_c t + 2\pi k_f \int_{-\infty}^{t} x(\tau) \, d\tau \right] $$

どちらも搬送波 $\cos(2\pi f_c t)$ の位相に何らかの項が加わる形です。その「何か」が、PM では $k_p \, x(t)$(信号そのもの)、FM では $2\pi k_f \int x(\tau) d\tau$(信号の積分)になっています。

微分・積分の関係

この対比から、PM と FM の間には次の美しい関係が成り立つことがわかります。

PM → FM への変換: PM変調器に入力するベースバンド信号を、あらかじめ積分してから入力すれば FM 信号が得られます。

$$ s_{\text{FM}}(t) = A_c \cos\!\left[ 2\pi f_c t + k_p \int_{-\infty}^{t} x(\tau) \, d\tau \right] $$

これは $k_p = 2\pi k_f$ とおけば、FM変調の定義式そのものです。

FM → PM への変換: 逆に、FM変調器に入力するベースバンド信号を、あらかじめ微分してから入力すれば PM 信号が得られます。

$$ s_{\text{PM}}(t) = A_c \cos\!\left[ 2\pi f_c t + 2\pi k_f \frac{dx(t)}{dt} \cdot t \right] $$

ここで正確に式を書くと、FM変調器の入力を $\dot{x}(t) = dx/dt$ に置き換えればよいので、

$$ s(t) = A_c \cos\!\left[ 2\pi f_c t + 2\pi k_f \int_{-\infty}^{t} \dot{x}(\tau) d\tau \right] = A_c \cos\!\left[ 2\pi f_c t + 2\pi k_f \, x(t) \right] $$

$2\pi k_f = k_p$ とおけば PM 変調の定義式に一致します。

この関係をまとめると、次の対応表が得られます。

PM変調 FM変調
位相への付加項 $k_p \, x(t)$ $2\pi k_f \int x(\tau) d\tau$
瞬時周波数への寄与 $\frac{k_p}{2\pi} \dot{x}(t)$ $k_f \, x(t)$
PM→FM変換 入力を積分
FM→PM変換 入力を微分

なぜこの関係が重要なのか

この微分・積分の関係は、単なる数学的好奇心ではありません。実用上の大きな意味があります。

FM変調を直接実現するには VCO(電圧制御発振器)を使いますが、VCO の周波数安定度を高く保つのは困難です。一方、PM変調は水晶発振器の安定した搬送波に対して位相変調をかけるだけなので、周波数安定度に優れています。そこで、PM変調器の前段にベースバンド信号を積分する回路を置けば、周波数安定度の高いFM信号を生成できます。これがアームストロング間接FM方式の核心です。

ここまでで PM と FM の本質的な関係を理解しました。次に、正弦波でPM変調をかけた場合のスペクトルを詳しく調べましょう。

正弦波PM変調の変調指数

PM変調の具体的な振る舞いを見るために、最も基本的なケースとして、単一正弦波 $x(t) = A_m \cos(2\pi f_m t)$ でPM変調をかけた場合を分析します。

PM変調信号は次のようになります。

$$ s_{\text{PM}}(t) = A_c \cos\!\left[ 2\pi f_c t + k_p A_m \cos(2\pi f_m t) \right] $$

ここでPM変調指数 $h$ を次のように定義します。

$$ \boxed{ h = k_p A_m = \Delta\phi \quad \text{[rad]} } $$

$h$ は最大位相偏移そのものです。これを使うと、PM信号は次のように簡潔に書けます。

$$ s_{\text{PM}}(t) = A_c \cos\!\left[ 2\pi f_c t + h \cos(2\pi f_m t) \right] $$

FM変調指数との比較

FM変調の場合、同じ正弦波入力 $x(t) = A_m \cos(2\pi f_m t)$ に対する変調指数 $\beta$ は、

$$ \beta = \frac{\Delta f}{f_m} = \frac{k_f A_m}{f_m} $$

でした。ここに決定的な違いが現れます。

  • PM変調指数 $h$: 変調信号の周波数 $f_m$ に依存しない。$h = k_p A_m$ は $f_m$ を含みません
  • FM変調指数 $\beta$: 変調信号の周波数 $f_m$ に反比例する。$\beta = k_f A_m / f_m$

これは PM と FM を区別する重要な特徴です。PM変調では、変調信号の振幅 $A_m$ だけで位相偏移量が決まります。一方、FM変調では同じ振幅でも周波数が低いほど大きく周波数が偏移し、変調指数が大きくなります。

PM信号の瞬時周波数を確認する

PM信号の瞬時周波数を具体的に計算してみましょう。

$$ f_i(t) = f_c + \frac{k_p}{2\pi} \frac{d}{dt}\left[A_m \cos(2\pi f_m t)\right] = f_c – \frac{k_p A_m f_m}{1} \sin(2\pi f_m t) $$

途中の微分を丁寧に書くと、

$$ \frac{d}{dt}\left[A_m \cos(2\pi f_m t)\right] = -2\pi f_m A_m \sin(2\pi f_m t) $$

この微分結果を先ほどの瞬時周波数の式に代入し、$2\pi$ を約分して整理すると次のようになります。

$$ f_i(t) = f_c – k_p A_m f_m \sin(2\pi f_m t) = f_c – h f_m \sin(2\pi f_m t) $$

したがって、PM信号の最大周波数偏移は $\Delta f_{\text{PM}} = h f_m$ です。FM変調では $\Delta f$ は $f_m$ に依存しない定数でしたが、PM変調では $\Delta f_{\text{PM}} = h f_m$ のように $f_m$ に比例します。つまり、PM変調は高い周波数成分ほど大きな周波数偏移を生む——一種の「高域強調」特性を持っています。

ここまでで PM 変調指数と FM 変調指数の違いを明確にできました。次に、PM信号が周波数領域でどのようなスペクトルを持つかを調べましょう。

狭帯域角度変調の近似

スペクトルの本格的な解析に入る前に、変調指数が小さい場合($h \ll 1$)の近似表現を導いておきます。これは狭帯域角度変調(Narrowband Angle Modulation)と呼ばれ、AM変調との比較がしやすい重要な近似です。

三角関数の加法定理による展開

PM変調信号を加法定理で展開します。

$$ s_{\text{PM}}(t) = A_c \cos\!\left[2\pi f_c t + h\cos(2\pi f_m t)\right] $$

加法定理 $\cos(\alpha + \gamma) = \cos\alpha \cos\gamma – \sin\alpha \sin\gamma$ を適用すると、

$$ s_{\text{PM}}(t) = A_c \cos(2\pi f_c t)\cos\!\left[h\cos(2\pi f_m t)\right] – A_c \sin(2\pi f_c t)\sin\!\left[h\cos(2\pi f_m t)\right] $$

小信号近似

$h \ll 1$ のとき、$\cos(h\cos\theta) \approx 1$、$\sin(h\cos\theta) \approx h\cos\theta$ と近似できます。これを代入すると、

$$ s_{\text{PM}}(t) \approx A_c \cos(2\pi f_c t) – A_c h \cos(2\pi f_m t) \sin(2\pi f_c t) $$

積和の公式 $\cos\alpha \sin\beta = \frac{1}{2}[\sin(\alpha+\beta) – \sin(\alpha-\beta)]$ を第2項に適用すると、

$$ s_{\text{PM}}(t) \approx A_c \cos(2\pi f_c t) – \frac{A_c h}{2}\sin\!\left[2\pi(f_c + f_m)t\right] + \frac{A_c h}{2}\sin\!\left[2\pi(f_c – f_m)t\right] $$

$-\sin\theta = \cos(\theta + \pi/2)$ を使って余弦に統一すると、

$$ \boxed{ s_{\text{NBPM}}(t) \approx A_c \cos(2\pi f_c t) + \frac{A_c h}{2}\cos\!\left[2\pi(f_c + f_m)t + \frac{\pi}{2}\right] + \frac{A_c h}{2}\cos\!\left[2\pi(f_c – f_m)t – \frac{\pi}{2}\right] } $$

AM変調との比較

AM変調の正弦波変調信号は次のように書けます。

$$ s_{\text{AM}}(t) = A_c \cos(2\pi f_c t) + \frac{mA_c}{2}\cos\!\left[2\pi(f_c + f_m)t\right] + \frac{mA_c}{2}\cos\!\left[2\pi(f_c – f_m)t\right] $$

NBPMとAMを比較すると、どちらも搬送波 $f_c$ と上下側帯波 $f_c \pm f_m$ の3成分で構成されています。大きな違いは側帯波の位相です。

  • AM: 両側帯波は搬送波と同位相(振幅方向に変動)
  • NBPM: 側帯波は搬送波に対して $\pm\pi/2$ の位相差(位相方向に変動)

フェーザ図で見ると、AM では側帯波の合成ベクトルが搬送波と同じ方向に伸び縮みするため振幅が変化します。一方、NBPM では側帯波の合成ベクトルが搬送波に対して直角方向を向くため、合成ベクトルの角度(位相)が変化します。これはまさに位相変調が行われていることの幾何学的な表現です。

なお、狭帯域FM(NBFM)でも同様の3成分構造が現れますが、側帯波の位相関係が NBPM とは異なります。NBFM では $\sin$ の入力が $\sin(2\pi f_m t)$(PM では $\cos(2\pi f_m t)$)であるため、側帯波の符号パターンが変わります。

ここまでで狭帯域近似を使った直感的な理解が得られました。しかし、変調指数が大きい場合にはこの近似は使えません。一般的なスペクトルを求めるために、ベッセル関数の力を借りましょう。

ベッセル関数によるスペクトル展開

複素表現への変換

PM変調信号のスペクトルを厳密に求めるために、複素指数表現を用います。

$$ s_{\text{PM}}(t) = A_c \, \text{Re}\!\left[ e^{j(2\pi f_c t + h\cos(2\pi f_m t))} \right] = A_c \, \text{Re}\!\left[ e^{j2\pi f_c t} \cdot e^{jh\cos(2\pi f_m t)} \right] $$

スペクトル構造を決める核心は $e^{jh\cos(2\pi f_m t)}$ の展開です。

ヤコビ-アンガー展開(余弦バージョン)

FM変調の記事では $e^{j\beta \sin\phi}$ のヤコビ-アンガー展開を用いました。PM変調では引数が $\cos$ なので、対応する展開を使います。

$\cos\phi = \sin(\phi + \pi/2)$ ですから、$\psi = \phi + \pi/2$ とおくと、

$$ e^{jh\cos\phi} = e^{jh\sin\psi} = \sum_{n=-\infty}^{\infty} J_n(h) \, e^{jn\psi} = \sum_{n=-\infty}^{\infty} J_n(h) \, e^{jn(\phi + \pi/2)} $$

$e^{jn\pi/2} = j^n$ を用いると、

$$ \boxed{ e^{jh\cos\phi} = \sum_{n=-\infty}^{\infty} j^n \, J_n(h) \, e^{jn\phi} } $$

FM変調の場合と比較すると、各フーリエ係数に $j^n$ という位相因子が余分に掛かっていることがわかります。これがPMとFMのスペクトルの違いを生む根源です。

PM信号のスペクトル表現

$\phi = 2\pi f_m t$ を代入してPM信号を展開します。

$$ s_{\text{PM}}(t) = A_c \, \text{Re}\!\left[ e^{j2\pi f_c t} \sum_{n=-\infty}^{\infty} j^n \, J_n(h) \, e^{jn \cdot 2\pi f_m t} \right] $$

実部を取ると、

$$ s_{\text{PM}}(t) = A_c \sum_{n=-\infty}^{\infty} J_n(h) \cos\!\left[ 2\pi(f_c + nf_m)t + \frac{n\pi}{2} \right] $$

これがPM信号のスペクトル展開の最終結果です。枠で囲んでまとめます。

$$ \boxed{ s_{\text{PM}}(t) = A_c \sum_{n=-\infty}^{\infty} J_n(h) \cos\!\left[ 2\pi(f_c + nf_m)t + \frac{n\pi}{2} \right] } $$

FM信号のスペクトルとの比較

FM信号のスペクトル表現は(FM変調の記事参照)、

$$ s_{\text{FM}}(t) = A_c \sum_{n=-\infty}^{\infty} J_n(\beta) \cos\!\left[ 2\pi(f_c + nf_m)t \right] $$

両者を比較すると次のことがわかります。

  1. スペクトル線の位置: どちらも $f = f_c + nf_m$($n = 0, \pm 1, \pm 2, \ldots$)で同じ
  2. スペクトル線の振幅: PM は $|A_c J_n(h)|$、FM は $|A_c J_n(\beta)|$ で、変調指数の値が同じなら振幅の絶対値も同じ
  3. スペクトル線の位相: PM では各スペクトル線に $n\pi/2$ の追加位相がある。FM にはこれがない

つまり、PM と FM は振幅スペクトルは同じ形ですが、位相スペクトルが異なります。パワースペクトル(振幅の2乗)を見る限り、変調指数が同じであれば PM と FM の区別はつきません。

ベッセル関数の性質の復習

第1種ベッセル関数 $J_n(h)$ の重要な性質を確認しておきます。

対称性: $J_{-n}(h) = (-1)^n J_n(h)$

エネルギー保存: $\sum_{n=-\infty}^{\infty} J_n^2(h) = 1$

この第2の性質は、PM信号の全電力が $A_c^2/2$ で一定であることを保証します。変調指数 $h$ を変えても信号の全電力は変わらず、スペクトル成分間のエネルギー配分が変化するだけです。これは角度変調の重要な特徴であり、AM変調とは本質的に異なる点です。AM変調では変調度を上げると全電力が増加しますが、角度変調では電力は常に一定で、スペクトルが広がるだけです。

小引数近似($h \ll 1$):

$$ J_0(h) \approx 1, \quad J_1(h) \approx \frac{h}{2}, \quad J_n(h) \approx 0 \quad (|n| \geq 2) $$

この近似を使うと、先ほど導いた狭帯域角度変調(NBPM)の結果が再現されます。$n = 0, \pm 1$ のみを残せば搬送波と1次側帯波だけが残り、3成分のNBPM信号になります。

スペクトルの構造が明らかになったところで、次に実用上重要な帯域幅の問題を考えましょう。

カーソンの帯域幅則 — PM版

FM版の帯域幅則との関係

FM変調のカーソンの帯域幅則は次のようでした。

$$ B_{\text{FM}} \approx 2(\Delta f + f_m) = 2f_m(\beta + 1) $$

PM変調でも同様の議論が適用できます。PM信号のスペクトル構造は FM と同じ形なので、有意なスペクトル線の数も変調指数 $h$ で決まり、$\pm(h + 1)$ 次程度の側帯波が有意であると見なせます。

PM版カーソンの帯域幅則の導出

PM信号の帯域幅は、有意な側帯波の次数が $\pm(h+1)$ 程度であることから、

$$ B_{\text{PM}} \approx 2(h + 1)f_m $$

ここで $h = \Delta\phi$ は最大位相偏移です。また、PM信号の最大周波数偏移が $\Delta f_{\text{PM}} = h f_m$ であることを使うと、

$$ B_{\text{PM}} \approx 2(h + 1)f_m = 2(hf_m + f_m) = 2(\Delta f_{\text{PM}} + f_m) $$

$\Delta f_{\text{PM}} = hf_m$ を用いて整理すると、PM版カーソンの帯域幅則が得られます。

$$ \boxed{ B_{\text{PM}} \approx 2(\Delta f_{\text{PM}} + f_m) = 2f_m(h + 1) } $$

形式的にはFMのカーソンの帯域幅則と全く同じ形ですが、変調指数の意味が異なることに注意してください。

PM特有の帯域幅特性

ここで PM 変調の特有の性質が現れます。FM変調では $\Delta f = k_f A_m$ が $f_m$ に依存しないため、帯域幅は $B_{\text{FM}} = 2(k_f A_m + f_m)$ となります。

一方、PM変調では $\Delta f_{\text{PM}} = h f_m = k_p A_m f_m$ なので、

$$ B_{\text{PM}} = 2(k_p A_m f_m + f_m) = 2f_m(k_p A_m + 1) $$

つまり、PM変調の帯域幅は変調信号の周波数 $f_m$ に比例します。変調信号の周波数が高くなると帯域幅も比例して広がります。FM変調では低周波成分ほど大きな周波数偏移を生みますが、PM変調では高周波成分ほど大きな帯域幅を必要とします。

この性質は音声信号のように広い帯域にわたるベースバンド信号を扱う際に重要になります。音声信号には低域から高域まで様々な周波数成分が含まれますが、PM変調ではその中の高域成分が帯域幅を支配します。

ここまでで PM 信号のスペクトルと帯域幅の理論が整いました。次に、PM変調が実用でどのように使われるか——特に間接FM方式について詳しく見ていきましょう。

間接FM方式とアームストロング変調器

直接FM方式の課題

FM変調を実現する最も素朴な方法は、VCO(Voltage-Controlled Oscillator: 電圧制御発振器)を使うことです。VCOの入力電圧をベースバンド信号で変化させれば、出力周波数がそれに応じて変わり、FM信号が得られます。これを直接FM方式と呼びます。

しかし、直接FM方式には周波数安定度の問題があります。VCOの自走発振周波数は温度変動や電源変動の影響を受けやすく、長時間にわたって搬送波周波数を安定に保つことが困難です。FMラジオ放送のように搬送波周波数の精度が厳しく規定されている用途では、これは深刻な問題です。

間接FM方式の着想

ここで、PM変調とFM変調の微分・積分関係が活きてきます。PM変調器は水晶発振器の安定した搬送波に対して位相変調をかけるため、搬送波の周波数安定度は水晶発振器で決まり、非常に高い精度が得られます。

PM変調器にベースバンド信号を積分してから入力すれば、出力は FM 信号になります。具体的に式で確認しましょう。

ベースバンド信号 $x(t)$ の積分を $y(t) = \int_{-\infty}^{t} x(\tau) d\tau$ とします。これをPM変調器に入力すると、

$$ s(t) = A_c \cos\!\left[2\pi f_c t + k_p \, y(t)\right] = A_c \cos\!\left[2\pi f_c t + k_p \int_{-\infty}^{t} x(\tau) d\tau\right] $$

$k_p = 2\pi k_f$ とおけば、これはFM変調信号 $s_{\text{FM}}(t)$ そのものです。このように、PM変調器を核として FM 信号を生成する方式を間接FM方式と呼びます。

アームストロング変調器

1933年にエドウィン・アームストロング(Edwin H. Armstrong)が考案した間接FM送信機は、以下の構成を持ちます。

ステップ1: ベースバンド信号の積分

音声信号 $x(t)$ を積分回路(ローパスフィルタで近似可能)に通し、$y(t) = \int x(\tau) d\tau$ を得ます。

ステップ2: 狭帯域PM変調(NBPM)

水晶発振器の安定した搬送波を用いて、$y(t)$ で狭帯域PM変調をかけます。狭帯域にする理由は、広帯域PM変調では歪みが生じやすいためです。NBPM変調器は比較的単純な回路で実現でき、平衡変調器(balanced modulator)を使って側帯波を生成し、搬送波と合成する方式が一般的です。

この段階での変調指数は小さく($h \ll 1$)、帯域幅も狭い NBFM 信号が得られます。

ステップ3: 逓倍器による変調指数の拡大

NBFM信号の変調指数を広帯域FM(WBFM)レベルまで拡大するために、周波数逓倍器(frequency multiplier)を使います。

周波数逓倍器は非線形素子を使って入力信号の $n$ 倍の周波数成分を取り出す回路です。$n$ 逓倍すると、搬送波周波数は $nf_c$ に、変調指数は $nh$ に、周波数偏移は $n \cdot \Delta f$ になります。

$$ s_{\text{out}}(t) = A_c \cos\!\left[n \cdot 2\pi f_c t + nh\sin(2\pi f_m t)\right] $$

例えば、元の変調指数が $h = 0.1$ rad で $n = 750$ 倍の逓倍を行えば、$nh = 75$ rad の広帯域FM信号が得られます。

ステップ4: 周波数変換(必要に応じて)

逓倍により搬送波周波数も $n$ 倍になってしまうため、所望の搬送波周波数に合わせるためにミキサ(周波数変換器)を途中に挿入します。ミキサで周波数を下げてから再度逓倍することで、搬送波周波数と変調指数を独立に制御できます。

アームストロング変調器の設計例

具体的な数値で設計例を見てみましょう。

目標: FMラジオ放送($f_c = 100$ MHz, $\Delta f = 75$ kHz)

  1. 水晶発振器の周波数: $f_1 = 200$ kHz
  2. NBPM変調器の変調指数: $h = 0.1$ rad($\Delta f_1 = h \cdot f_m = 0.1 \times 15 = 1.5$ kHz)
  3. 第1逓倍器($n_1 = 50$ 倍): $f_2 = 10$ MHz, $\Delta f_2 = 75$ kHz, $h_2 = 5$ rad
  4. ミキサで $f_{\text{LO}} = 9$ MHz と混合: $f_3 = 1$ MHz, $\Delta f_3 = 75$ kHz
  5. 第2逓倍器($n_2 = 100$ 倍): $f_c = 100$ MHz, $\Delta f = 75$ kHz, $h = 500$ rad

このように、逓倍とミキシングを組み合わせることで、水晶発振器の高い周波数安定度を保ちながら、所望の搬送波周波数と広帯域FM変調を実現できます。

ここまでで間接FM方式の原理と実装を理解しました。次に、PM/FM信号を受信側で復調する方法を見ていきましょう。

PM/FM復調の原理

FM復調 — 周波数弁別器

FM信号の復調(検波)は、瞬時周波数を振幅に変換することで実現します。基本的な方法は周波数弁別器(Frequency Discriminator)です。

FM信号を時間微分すると、

$$ \frac{d}{dt}s_{\text{FM}}(t) = -A_c\left[2\pi f_c + 2\pi k_f x(t)\right] \sin\!\left[\theta_{\text{FM}}(t)\right] $$

この信号の包絡線は $A_c |2\pi f_c + 2\pi k_f x(t)|$ であり、瞬時周波数に比例しています。$|k_f x(t)| \ll f_c$ であれば、包絡線から直流成分 $2\pi A_c f_c$ を除去するだけでベースバンド信号 $x(t)$ が復元できます。

実際の周波数弁別器は、微分器の代わりに傾斜検波回路(スロープ検波)やフォスター・シーリー検波器、比検波器などが使われます。

PM復調 — 位相比較器

PM信号の復調は、搬送波と信号の位相差を検出することで実現します。受信側で搬送波と同じ周波数のローカル信号 $\cos(2\pi f_c t)$ を用意し、受信信号との位相差を取り出します。

受信PM信号 $s_{\text{PM}}(t) = A_c \cos[2\pi f_c t + k_p x(t)]$ とローカル信号 $\cos(2\pi f_c t)$ を乗算すると、

$$ s_{\text{PM}}(t) \cdot \cos(2\pi f_c t) = \frac{A_c}{2}\cos\!\left[k_p x(t)\right] + \frac{A_c}{2}\cos\!\left[4\pi f_c t + k_p x(t)\right] $$

ここで積和の公式 $\cos\alpha\cos\beta = \frac{1}{2}[\cos(\alpha – \beta) + \cos(\alpha + \beta)]$ を用いました。低域通過フィルタで第2項($2f_c$ 付近の高周波成分)を除去すると、

$$ v(t) = \frac{A_c}{2}\cos\!\left[k_p x(t)\right] $$

$k_p x(t) \ll 1$(狭帯域の場合)なら $\cos[k_p x(t)] \approx 1 – \frac{[k_p x(t)]^2}{2}$ となり、線形復調は困難です。これでは信号成分が2乗になってしまい、歪みが生じます。

PLL(位相同期回路)によるPM復調

より実用的なPM復調にはPLL(Phase-Locked Loop: 位相同期回路) が用いられます。

PLLは、位相比較器・ループフィルタ・VCOから構成されるフィードバック系です。VCOの出力位相が入力信号の位相に追従するように動作します。PLLがロック状態にあるとき、ループフィルタの出力電圧は入力信号の位相偏移 $k_p x(t)$ に比例します。

PLLの基本動作を数式で追ってみましょう。位相比較器の出力は入力と VCO 出力の位相差に比例し、

$$ e(t) = K_d \left[\theta_{\text{in}}(t) – \theta_{\text{VCO}}(t)\right] $$

ここで $K_d$ は位相比較器のゲイン、$\theta_{\text{in}}(t) = 2\pi f_c t + k_p x(t)$、$\theta_{\text{VCO}}(t)$ は VCO の出力位相です。ループフィルタを通してVCOを制御するフィードバックにより、$\theta_{\text{VCO}}(t) \to \theta_{\text{in}}(t)$ に追従し、ループフィルタの出力が $k_p x(t)$ に比例する信号を与えます。

PLLは線形な復調が可能であり、広帯域PM信号にも対応できる点が大きな利点です。

FM復調にもPLLが使える

PLLはFM復調にも使えます。FM信号の場合、PLLがロック状態にあるとき VCO の制御電圧は入力信号の瞬時周波数偏移に比例します。VCOの制御電圧を取り出せば、それがベースバンド信号 $x(t)$ に比例した復調出力です。

$$ v_{\text{VCO}}(t) \propto f_i(t) – f_c = k_f x(t) $$

PLLによるFM復調は、従来の周波数弁別器に比べて雑音特性が優れており、現代の通信システムで広く使われています。

ここまでで PM/FM 復調の原理を理解しました。最後に、これらの理論を Python で実装し、波形やスペクトルを視覚的に確認しましょう。

Pythonでの実装 — PM/FM信号の波形比較

まず、PM変調とFM変調の波形を並べて表示し、両者の違いを直感的に理解します。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
fs = 100000        # サンプリング周波数 [Hz]
t = np.arange(0, 0.01, 1/fs)  # 時間軸 10ms
fc = 5000          # 搬送波周波数 [Hz]
fm = 300           # 変調信号周波数 [Hz]
Ac = 1.0           # 搬送波振幅

# ベースバンド信号(単一正弦波)
x = np.cos(2 * np.pi * fm * t)

# PM変調 (h=2 rad)
h = 2.0            # PM変調指数
s_pm = Ac * np.cos(2 * np.pi * fc * t + h * np.cos(2 * np.pi * fm * t))

# FM変調 (beta=2)
beta = 2.0         # FM変調指数
kf = beta * fm     # 周波数感度
s_fm = Ac * np.cos(2 * np.pi * fc * t + beta * np.sin(2 * np.pi * fm * t))

# プロット
fig, axes = plt.subplots(3, 1, figsize=(12, 8), sharex=True)

axes[0].plot(t * 1000, x, 'gray', linewidth=1.5)
axes[0].set_ylabel('Amplitude')
axes[0].set_title('Baseband Signal: $x(t) = \\cos(2\\pi f_m t)$')
axes[0].grid(True, alpha=0.3)

axes[1].plot(t * 1000, s_pm, 'C0', linewidth=0.8)
axes[1].set_ylabel('Amplitude')
axes[1].set_title(f'PM Signal (h = {h} rad)')
axes[1].grid(True, alpha=0.3)

axes[2].plot(t * 1000, s_fm, 'C1', linewidth=0.8)
axes[2].set_ylabel('Amplitude')
axes[2].set_title(f'FM Signal ($\\beta$ = {beta})')
axes[2].set_xlabel('Time [ms]')
axes[2].grid(True, alpha=0.3)

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

上のグラフから、PM変調とFM変調の波形の違いが明瞭に読み取れます。

  1. PM信号の瞬時周波数の変化パターン: PM信号では、ベースバンド信号 $x(t) = \cos(2\pi f_m t)$ の微分に比例して瞬時周波数が変化します。$x(t)$ のピーク付近(微分がゼロ)では搬送波周波数に近づき、$x(t)$ のゼロクロス付近(微分が最大)で瞬時周波数の偏移が最大になります。
  2. FM信号の瞬時周波数の変化パターン: FM信号では、ベースバンド信号そのものに比例して瞬時周波数が変化します。$x(t)$ のピークで周波数偏移が最大になり、$x(t)$ のゼロクロスで搬送波周波数に戻ります。
  3. 位相関係の違い: PM信号とFM信号の「密な部分」(周波数が高い部分)と「疎な部分」(周波数が低い部分)の位置が、ベースバンド信号に対して約90度ずれています。これは $\cos$ と $\sin$ の位相差(= $\pi/2$)に対応しています。

Pythonでの実装 — 瞬時周波数の比較

PM信号とFM信号の瞬時周波数を数値微分で求め、比較してみましょう。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
fs = 100000
t = np.arange(0, 0.01, 1/fs)
fc = 5000
fm = 300
Ac = 1.0
h = 2.0
beta = 2.0

x = np.cos(2 * np.pi * fm * t)

# PM: 瞬時位相と瞬時周波数
theta_pm = 2 * np.pi * fc * t + h * np.cos(2 * np.pi * fm * t)
f_inst_pm = np.gradient(theta_pm, 1/fs) / (2 * np.pi)

# FM: 瞬時位相と瞬時周波数
theta_fm = 2 * np.pi * fc * t + beta * np.sin(2 * np.pi * fm * t)
f_inst_fm = np.gradient(theta_fm, 1/fs) / (2 * np.pi)

# 理論値
f_theory_pm = fc - h * fm * np.sin(2 * np.pi * fm * t)  # dx/dt = -sin
f_theory_fm = fc + beta * fm * np.cos(2 * np.pi * fm * t)

fig, axes = plt.subplots(2, 1, figsize=(12, 6), sharex=True)

axes[0].plot(t * 1000, f_inst_pm, 'C0', linewidth=1.0, label='Numerical')
axes[0].plot(t * 1000, f_theory_pm, 'k--', linewidth=0.8, label='Theory')
axes[0].axhline(fc, color='gray', linestyle=':', alpha=0.5)
axes[0].set_ylabel('Freq [Hz]')
axes[0].set_title(f'PM Instantaneous Frequency (h = {h} rad)')
axes[0].legend()
axes[0].grid(True, alpha=0.3)

axes[1].plot(t * 1000, f_inst_fm, 'C1', linewidth=1.0, label='Numerical')
axes[1].plot(t * 1000, f_theory_fm, 'k--', linewidth=0.8, label='Theory')
axes[1].axhline(fc, color='gray', linestyle=':', alpha=0.5)
axes[1].set_ylabel('Freq [Hz]')
axes[1].set_title(f'FM Instantaneous Frequency ($\\beta$ = {beta})')
axes[1].set_xlabel('Time [ms]')
axes[1].legend()
axes[1].grid(True, alpha=0.3)

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

上のグラフから、PM変調とFM変調の瞬時周波数の違いが鮮明に確認できます。

  1. PM信号: 瞬時周波数は $f_c – hf_m\sin(2\pi f_m t)$ に従い、ベースバンド信号の微分(= $-\sin$)に比例して変化しています。数値微分の結果(青線)と理論式(黒破線)が完全に一致しており、理論の正しさが確認できます。最大周波数偏移は $hf_m = 2 \times 300 = 600$ Hz です。
  2. FM信号: 瞬時周波数は $f_c + \beta f_m\cos(2\pi f_m t)$ に従い、ベースバンド信号そのもの(= $\cos$)に比例して変化しています。最大周波数偏移は $\beta f_m = 2 \times 300 = 600$ Hz で、PM の場合と同じ値ですが、位相が $\pi/2$ ずれています。
  3. 位相差: PM の瞬時周波数パターンは FM に対して $\pi/2$ 遅れています。これは $\cos$ を微分すると $-\sin$ になることの直接的な帰結です。

Pythonでの実装 — ベッセル関数とスペクトル解析

次に、PM信号のスペクトルをFFTで計算し、ベッセル関数の理論値と比較します。

import numpy as np
import matplotlib.pyplot as plt
from scipy.special import jv  # 第1種ベッセル関数

# パラメータ設定
fs = 100000
N = 100000           # サンプル数(1秒分)
t = np.arange(N) / fs
fc = 5000
fm = 500             # 見やすいように500Hzに設定
Ac = 1.0
h = 3.0              # PM変調指数

# PM信号
s_pm = Ac * np.cos(2 * np.pi * fc * t + h * np.cos(2 * np.pi * fm * t))

# FFT
S = np.fft.fft(s_pm) / N
freq = np.fft.fftfreq(N, 1/fs)

# 正の周波数のみ(片側スペクトル)
mask = (freq >= 0) & (freq <= fc + 10 * fm)
freq_pos = freq[mask]
S_pos = 2 * np.abs(S[mask])  # 片側なので2倍

# ベッセル関数の理論スペクトル
n_max = 8
n_range = np.arange(-n_max, n_max + 1)
f_theory = fc + n_range * fm
amp_theory = np.abs(Ac * jv(n_range, h))

fig, axes = plt.subplots(2, 1, figsize=(12, 8))

# FFTスペクトル
axes[0].plot(freq_pos, S_pos, 'C0', linewidth=0.8)
axes[0].set_xlabel('Frequency [Hz]')
axes[0].set_ylabel('Amplitude')
axes[0].set_title(f'PM Signal Spectrum (FFT) — h = {h} rad, $f_c$ = {fc} Hz, $f_m$ = {fm} Hz')
axes[0].set_xlim(fc - 6000, fc + 6000)
axes[0].grid(True, alpha=0.3)

# 理論値との比較(ステムプロット)
axes[1].stem(f_theory, amp_theory, linefmt='C1-', markerfmt='C1o',
             basefmt='gray', label='Bessel $|J_n(h)|$')

# FFTのピーク値も重ねる
for n in n_range:
    f_n = fc + n * fm
    idx = np.argmin(np.abs(freq_pos - f_n))
    if idx < len(S_pos):
        axes[1].plot(f_n, S_pos[idx], 'C0x', markersize=10, markeredgewidth=2)

axes[1].plot([], [], 'C0x', markersize=10, markeredgewidth=2, label='FFT peak')
axes[1].set_xlabel('Frequency [Hz]')
axes[1].set_ylabel('Amplitude')
axes[1].set_title('Comparison: Bessel Theory vs FFT')
axes[1].set_xlim(fc - 6000, fc + 6000)
axes[1].legend()
axes[1].grid(True, alpha=0.3)

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

上のグラフから、ベッセル関数の理論とFFTによる数値計算が見事に一致していることが確認できます。

  1. スペクトル線の位置: $f_c \pm nf_m = 5000 \pm 500n$ Hz に離散的なスペクトル線が現れています。これはベッセル関数展開の理論通りです。
  2. 振幅の一致: 各スペクトル線の振幅が、理論値 $|J_n(h)|$(オレンジの丸)とFFTのピーク値(青のバツ印)で完全に一致しています。特に $h = 3$ の場合、$J_0(3) \approx -0.26$、$J_1(3) \approx 0.34$、$J_2(3) \approx 0.49$ であり、搬送波($n=0$)よりも2次側帯波($n=\pm2$)の方が大きな振幅を持つことが確認できます。
  3. 有意な側帯波の数: $h = 3$ では $|n| \leq 5$ 程度までの側帯波が有意な振幅を持っており、カーソンの帯域幅則 $B \approx 2(h+1)f_m = 2 \times 4 \times 500 = 4000$ Hz とよく整合しています。

Pythonでの実装 — 変調指数の変化とスペクトルの変化

変調指数 $h$ を変えたときにスペクトルがどう変化するか、ベッセル関数の値を可視化します。

import numpy as np
import matplotlib.pyplot as plt
from scipy.special import jv

# 変調指数の範囲
h_values = np.linspace(0, 8, 500)
n_max = 6

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

# 左: ベッセル関数 J_n(h) の挙動
colors = plt.cm.tab10(np.arange(n_max + 1))
for n in range(n_max + 1):
    Jn = jv(n, h_values)
    axes[0].plot(h_values, Jn, color=colors[n], linewidth=1.5, label=f'$J_{n}(h)$')

axes[0].axhline(0, color='gray', linewidth=0.5)
axes[0].set_xlabel('Modulation Index $h$')
axes[0].set_ylabel('$J_n(h)$')
axes[0].set_title('Bessel Functions $J_n(h)$')
axes[0].legend(loc='upper right', fontsize=9)
axes[0].grid(True, alpha=0.3)

# 右: 異なるhでのパワースペクトル
h_list = [0.5, 1.0, 2.0, 5.0]
n_range = np.arange(-10, 11)
bar_width = 0.2

for i, h in enumerate(h_list):
    power = jv(n_range, h)**2
    offset = (i - 1.5) * bar_width
    axes[1].bar(n_range + offset, power, width=bar_width, alpha=0.7,
                label=f'h = {h}')

axes[1].set_xlabel('Sideband Order $n$')
axes[1].set_ylabel('$J_n^2(h)$')
axes[1].set_title('Power Distribution across Sidebands')
axes[1].legend()
axes[1].grid(True, alpha=0.3, axis='y')

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

上のグラフから、変調指数 $h$ とスペクトル構造の関係が明確に読み取れます。

  1. 左図(ベッセル関数の振る舞い): $J_0(h)$(搬送波成分)は $h$ の増加とともに振動しながら減少します。特に $h \approx 2.41$ で $J_0 = 0$ となり、搬送波成分が消失します。これは角度変調に特有の現象で、AM変調では決して起こりません。また、高次のベッセル関数は $h$ がある程度大きくならないと有意な値を取りません。$J_n(h)$ は $n > h$ の領域で急速にゼロに近づきます。
  2. 右図(パワー配分): $h = 0.5$ では搬送波にほとんどのパワーが集中しており、狭帯域(NBPM)の領域です。$h$ が増加するにつれて側帯波にパワーが分散し、$h = 5.0$ では高次側帯波まで広がっています。しかし、全パワー $\sum J_n^2 = 1$ は常に一定です。

Pythonでの実装 — 間接FM方式のシミュレーション

PM変調器に積分した信号を入力することで FM 信号が得られることを、数値シミュレーションで確認します。

import numpy as np
import matplotlib.pyplot as plt

# パラメータ設定
fs = 100000
t = np.arange(0, 0.02, 1/fs)
fc = 5000
fm = 300
Ac = 1.0
kf = 600  # FM周波数感度 [Hz/V]

# ベースバンド信号
x = np.cos(2 * np.pi * fm * t)

# ベースバンド信号の積分(数値積分)
x_integral = np.cumsum(x) / fs

# 方法1: 直接FM変調
beta = kf / fm  # FM変調指数 = 2.0
s_fm_direct = Ac * np.cos(2 * np.pi * fc * t
                          + 2 * np.pi * kf * x_integral)

# 方法2: 間接FM(PM変調器 + 積分器)
kp = 2 * np.pi * kf  # 位相感度
s_fm_indirect = Ac * np.cos(2 * np.pi * fc * t + kp * x_integral)

# 誤差の計算
error = s_fm_direct - s_fm_indirect

fig, axes = plt.subplots(3, 1, figsize=(12, 8), sharex=True)

axes[0].plot(t * 1000, s_fm_direct, 'C0', linewidth=0.8)
axes[0].set_ylabel('Amplitude')
axes[0].set_title(f'Direct FM Signal ($\\beta$ = {beta:.1f})')
axes[0].grid(True, alpha=0.3)

axes[1].plot(t * 1000, s_fm_indirect, 'C1', linewidth=0.8)
axes[1].set_ylabel('Amplitude')
axes[1].set_title('Indirect FM Signal (PM + Integrator)')
axes[1].grid(True, alpha=0.3)

axes[2].plot(t * 1000, error, 'C3', linewidth=0.8)
axes[2].set_ylabel('Error')
axes[2].set_title('Difference (Direct - Indirect)')
axes[2].set_xlabel('Time [ms]')
axes[2].grid(True, alpha=0.3)

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

print(f"最大誤差: {np.max(np.abs(error)):.2e}")
print(f"RMS誤差: {np.sqrt(np.mean(error**2)):.2e}")

上のグラフから、間接FM方式の原理が数値的に検証できます。

  1. 直接FMと間接FMの一致: 上段(直接FM)と中段(間接FM = PM + 積分器)の波形は目視では完全に一致しています。下段の誤差を見ると、その差は数値積分の累積誤差に起因する極めて小さな値($10^{-12}$ 程度)です。
  2. 原理の確認: PM変調器に $\int x(\tau)d\tau$ を入力することで、$k_p \int x(\tau)d\tau = 2\pi k_f \int x(\tau)d\tau$ が位相に加わり、FM変調の定義式と完全に一致することが数値的にも確認できました。
  3. 実用上の意味: この数値実験は、アームストロング間接FM方式の理論的基盤を裏付けています。水晶発振器の安定した搬送波にPM変調をかけ、入力に積分器を置くだけで、高品質なFM信号が生成できるのです。

Pythonでの実装 — PM/FM信号の復調シミュレーション

最後に、PM/FM信号の復調をシミュレーションで確認します。FM信号には周波数弁別器(微分 + 包絡線検波)を、PM信号にはPLLライクな位相検出を適用します。

import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import hilbert, butter, filtfilt

# パラメータ設定
fs = 100000
t = np.arange(0, 0.05, 1/fs)
fc = 5000
fm = 200
Ac = 1.0

# ベースバンド信号
x = np.cos(2 * np.pi * fm * t)

# PM信号
h = 1.5
s_pm = Ac * np.cos(2 * np.pi * fc * t + h * np.cos(2 * np.pi * fm * t))

# FM信号
beta = 1.5
s_fm = Ac * np.cos(2 * np.pi * fc * t + beta * np.sin(2 * np.pi * fm * t))

# --- FM復調: 微分による瞬時周波数検出 ---
# 解析信号(ヒルベルト変換)
analytic_fm = hilbert(s_fm)
inst_phase_fm = np.unwrap(np.angle(analytic_fm))
inst_freq_fm = np.gradient(inst_phase_fm, 1/fs) / (2 * np.pi)
fm_demod = inst_freq_fm - fc  # DCオフセット除去

# --- PM復調: 位相検出 ---
analytic_pm = hilbert(s_pm)
inst_phase_pm = np.unwrap(np.angle(analytic_pm))
# 搬送波位相を除去
pm_demod = inst_phase_pm - 2 * np.pi * fc * t

# ローパスフィルタ(復調出力の平滑化)
b, a = butter(4, 2 * fm / (fs / 2) * 3, btype='low')
fm_demod_filt = filtfilt(b, a, fm_demod)
pm_demod_filt = filtfilt(b, a, pm_demod)

# 正規化(比較のため)
fm_demod_norm = fm_demod_filt / np.max(np.abs(fm_demod_filt[1000:-1000]))
pm_demod_norm = pm_demod_filt / np.max(np.abs(pm_demod_filt[1000:-1000]))

fig, axes = plt.subplots(2, 1, figsize=(12, 7))

# FM復調結果
axes[0].plot(t * 1000, x, 'gray', linewidth=1.5, label='Original $x(t)$', alpha=0.6)
axes[0].plot(t * 1000, fm_demod_norm, 'C1', linewidth=1.2, label='FM Demod')
axes[0].set_ylabel('Normalized Amplitude')
axes[0].set_title(f'FM Demodulation ($\\beta$ = {beta})')
axes[0].legend()
axes[0].set_xlim(5, 45)
axes[0].grid(True, alpha=0.3)

# PM復調結果
axes[1].plot(t * 1000, x, 'gray', linewidth=1.5, label='Original $x(t)$', alpha=0.6)
axes[1].plot(t * 1000, pm_demod_norm, 'C0', linewidth=1.2, label='PM Demod')
axes[1].set_ylabel('Normalized Amplitude')
axes[1].set_title(f'PM Demodulation (h = {h} rad)')
axes[1].set_xlabel('Time [ms]')
axes[1].legend()
axes[1].set_xlim(5, 45)
axes[1].grid(True, alpha=0.3)

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

上のグラフから、PM/FM復調の正しさが確認できます。

  1. FM復調(上段): ヒルベルト変換で解析信号を求め、位相を微分して瞬時周波数を得ることで、元のベースバンド信号 $\cos(2\pi f_m t)$ が忠実に復元されています。灰色のオリジナル信号とオレンジの復調出力がほぼ完全に重なっています。
  2. PM復調(下段): 解析信号の瞬時位相から搬送波成分 $2\pi f_c t$ を除去することで、位相偏移 $h\cos(2\pi f_m t)$ が得られ、元のベースバンド信号が復元されています。こちらも高い精度で一致しています。
  3. 端部効果: 時間軸の両端でわずかに歪みが見られますが、これはヒルベルト変換とフィルタの端部効果(エッジ効果)によるものであり、定常状態では復調が正確に行われていることが確認できます。

まとめ

本記事では、PM変調(位相変調)の理論を体系的に解説しました。

  • 角度変調の統一的枠組み: PM変調とFM変調は、搬送波の「位相」と「周波数」のどちらに情報を載せるかの違いであり、両者を合わせて角度変調と呼びます。搬送波の振幅は一定に保たれるため、振幅雑音に強い特徴があります。

  • PM変調の定義: PM変調信号は $s(t) = A_c\cos[2\pi f_c t + k_p x(t)]$ で定義され、ベースバンド信号が搬送波の位相に直接加わります。PM変調指数 $h = k_p A_m$ は変調信号の周波数に依存しない点が、FM変調指数 $\beta = \Delta f / f_m$ との大きな違いです。

  • PMとFMの微分・積分関係: PM変調器に入力を積分すればFM信号が、FM変調器に入力を微分すればPM信号が得られます。この関係がアームストロング間接FM方式の理論的基盤です。

  • ベッセル関数スペクトル: PM信号のスペクトルは $f_c + nf_m$ に離散スペクトル線を持ち、振幅は $|J_n(h)|$ で与えられます。FM信号との違いは各スペクトル線の位相($n\pi/2$ の追加位相)のみで、パワースペクトルは同一です。

  • カーソンの帯域幅則(PM版): $B_{\text{PM}} \approx 2(h+1)f_m$ であり、PM変調では帯域幅が変調信号の周波数に比例して広がる高域強調特性を持ちます。

  • 間接FM方式: 水晶発振器の安定度を活かしつつ、PM変調器+積分器の構成で高品質なFM信号を生成するアームストロング方式は、FM放送の実用化に大きく貢献しました。

PM変調の理解は、ディジタル通信への橋渡しとして特に重要です。PSK(位相偏移変調)はPM変調をディジタル化したものに他ならず、BPSK・QPSK・8PSKなどの現代のディジタル変調方式はPMの原理の上に成り立っています。

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