包絡線検波の原理と導出と実装

古いAMラジオの回路図を開くと、アンテナのすぐ後ろに小さなダイオードとコンデンサが1個ずつ置かれているのを見つけます。この驚くほど単純な部品だけで、数百 kHz の搬送波に乗せられた音声が、スピーカーから聞こえる音として取り出されています。真空管もトランジスタも増幅器もいらず、ダイオード1本で「電波の外形」をなぞるだけで音が復元できる — これが包絡線検波(envelope detection)の魔法です。

なぜこんなことが可能なのでしょうか。AM(振幅変調)では、伝えたい音声信号を「電波の振幅の大きさ」に写し取っています。音が大きい瞬間は電波の振幅が大きく、音が小さい瞬間は電波の振幅が小さい。つまり、高速で振動する搬送波を包み込む「外形の線」=包絡線こそが、私たちが取り出したい情報そのものなのです。搬送波の細かい振動を無視して外形だけをなぞれば、音声が戻ってきます。

包絡線検波を理解すると、通信工学の広い範囲に見通しがよくなります。

  • AM放送・短波受信機: 中波AMラジオ、航空無線(AMが今も現役)、アマチュア無線のAM復調は、いずれも包絡線検波が基本です。ゲルマラジオが電池なしで鳴るのはこの原理のおかげです。
  • 信号処理・計測: 振幅変調された信号から情報を取り出す操作は、超音波診断のエコー強度抽出、光通信の強度検波、レーダーのパルス包絡線検出、機械振動の異常検知(振動のエンベロープ解析)まで、まったく同じ数学で貫かれています。ヒルベルト変換による瞬時振幅の計算は、これらすべての共通言語です。

本記事の内容

  • 包絡線検波の直感的な理解と、AM波の包絡線が $1 + m\,a(t)$ になることの導出
  • ダイオード整流 + RC 平滑回路による検波の仕組みと、時定数条件 $1/f_c \ll RC \ll 1/f_m$ の導出
  • RC を大きくしすぎたときに生じる「対角クリッピング歪み」の発生条件の導出
  • ヒルベルト変換で作る解析信号の絶対値が包絡線に一致することの証明
  • 過変調($m > 1$)でなぜ歪むのか
  • Python によるダイオードモデルとヒルベルト検波の両実装、復元波形の MSE と時定数依存性の比較

前提知識

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

包絡線検波とは

ブランコをこいでいる子どもを、遠くから眺めている場面を想像してください。ブランコは前後に激しく揺れています(これが搬送波の高速振動です)。しかし、こぐ勢いを少しずつ弱めていくと、揺れ幅そのものがだんだん小さくなっていきます。この「揺れ幅の変化」だけを目で追えば、ブランコの細かい往復運動を無視しても、「勢いが弱まっている」という情報を読み取れます。包絡線検波がやっているのは、まさにこの「揺れ幅の変化だけを追う」操作です。

もう少し具体的に言い換えましょう。AM波は、下の図のように高速で振動する波が、ゆっくり変化する「外形の曲線」に包まれた形をしています。この外形の曲線を上と下から挟むように描いた包絡線のうち、上側の包絡線が伝えたい情報を担っています。搬送波は 1 秒間に何十万回も振動しますが、音声はせいぜい数 kHz です。この「速さの桁違い」があるからこそ、細かい振動を平滑化して外形だけを抜き出せるのです。

包絡線検波とは、変調された信号 $s(t)$ から、その振幅の時間変化(包絡線)$e(t)$ を推定する操作の総称です。厳密に言えば、信号を $s(t) = e(t)\cos(\phi(t))$ の形($e(t) \ge 0$ はゆっくり変化する振幅、$\phi(t)$ は速く回る位相)で表したときの $e(t)$ を取り出すことを指します。この記事では、これを実現する2つの方法 — 昔ながらのダイオード回路と、現代的なヒルベルト変換 — を、どちらも数式から導いて比較します。

包絡線検波の概念図。AM波と包絡線、ダイオード整流、RC平滑回路、取り出された包絡線メッセージの流れ

この図は包絡線検波の全体像です。左のAM波は速い搬送波がゆっくりした外形(水色の包絡線)に包まれた形をしており、その外形こそが伝えたい情報です。ダイオードで下半分を切り捨て、コンデンサ $C$ と抵抗 $R$ が山の高さを記憶することで、右側のなめらかなメッセージ波形が復元される、という一連の流れを表しています。

まずは、なぜ AM 波の包絡線が伝えたい音声そのものになるのか、その数学的な根拠を確認しましょう。

AM波の包絡線が $1 + m\,a(t)$ になること

伝えたい音声などのメッセージ信号を $a(t)$ とします。ここでは正規化して $|a(t)| \le 1$ とし(一番大きい音のとき $\pm 1$)、その最大周波数を $f_m$ とします。搬送波は周波数 $f_c$($f_c \gg f_m$)の余弦波 $\cos(2\pi f_c t)$ です。

AM(標準振幅変調、DSB-LC)では、搬送波の振幅を「一定成分 + メッセージ」で変化させます。変調指数(変調度)$m$($0 < m \le 1$ が正常な範囲)を使うと、送信波は次のように書けます。

$$ \begin{equation} s(t) = A_c \bigl(1 + m\,a(t)\bigr)\cos(2\pi f_c t) \end{equation} $$

ここで $A_c$ は搬送波の振幅です。以降は簡単のため $A_c = 1$ とします(定数倍は検波後にまとめて調整できます)。この式の構造を見てください。$\cos(2\pi f_c t)$ が速く振動する「キャリア」で、それに掛かっている $\bigl(1 + m\,a(t)\bigr)$ が、時間とともにゆっくり変化する「振幅の係数」です。

包絡線の定義から確認する

包絡線とは、信号 $s(t)$ を上下から挟む滑らかな曲線のことです。$s(t) = g(t)\cos(2\pi f_c t)$ の形をしていて、係数 $g(t) = 1 + m\,a(t)$ が搬送波の1周期の中ではほとんど変化しないほどゆっくりしている($f_c \gg f_m$)とき、余弦は1周期ごとに $+1$ と $-1$ に達します。したがって $s(t)$ の局所的な最大値・最小値は、そのときの $\pm g(t)$ に張り付きます。信号の「外形」を数式で書けば $\pm |g(t)|$ となり、上側の包絡線は次のようになります。

$$ \begin{equation} e(t) = \bigl|\,1 + m\,a(t)\,\bigr| \end{equation} $$

AM波を上下から挟む包絡線。速い搬送波を遅い外形が包む様子

この図から、灰色の速い搬送波が、上側(水色)と下側(橙破線)の2本のなめらかな包絡線 $\pm(1+m\,a(t))$ にぴったり挟まれていることが読み取れます。搬送波の振動の山と谷が1周期ごとに $\pm e(t)$ に張り付いているため、外形の線がそのまま $|1+m\,a(t)|$ を描いています。速い振動を無視して上側の線だけを追えば、それがメッセージを担う包絡線です。

ここで絶対値が付いていることが重要です。$1 + m\,a(t) \ge 0$ が常に成り立つ限り、絶対値は外れて、

$$ e(t) = 1 + m\,a(t) $$

となります。包絡線が「定数 $1$ + メッセージ $a(t)$ の定数倍」になる、つまり包絡線を取り出して直流分 $1$ を差し引けば、そのままメッセージ $a(t)$ が復元できるのです。これが AM が「包絡線検波で復調できる変調方式」である理由の核心です。

包絡線から直流分1を引くとメッセージが戻ることを示すグラフ

この図は、包絡線 $e(t)=1+m\,a(t)$(水色)から直流分 $1$(橙破線)を引くと、残るのが $m\,a(t)$(緑)=メッセージそのものになることを示しています。緑の曲線は $0$ を中心に振動する正弦波で、送信した音声波形と相似です。包絡線を抜き出して直流を切るだけで情報が戻る、という復調の本質がひと目で分かります。

$1 + m\,a(t) \ge 0$ という条件

上の議論には「$1 + m\,a(t) \ge 0$ が常に成り立つ」という前提がありました。$|a(t)| \le 1$ のとき、$1 + m\,a(t)$ の最小値は $a(t) = -1$ のときの $1 – m$ です。したがって、

$$ 1 – m \ge 0 \quad \Longleftrightarrow \quad m \le 1 $$

が、包絡線がそのままメッセージになるための条件です。$m \le 1$ なら包絡線は決して $0$ を下回らず、絶対値は無害です。一方、$m > 1$(過変調)だと $1 + m\,a(t)$ が負になる瞬間があり、絶対値が「折り返し」を起こして包絡線が歪みます。この過変調の話は後の節で詳しく扱います。

ここまでで、「AM 波の外形(包絡線)を取り出して直流分を引けば音声が戻る」という目標が数式で明確になりました。では、この包絡線を実際にどうやって取り出すのか。まずは真空管もコンピュータもなかった時代から使われてきた、ダイオード1本の回路から見ていきましょう。

ダイオード検波の原理

包絡線を取り出す最も古典的で、いまも広く使われる方法が、ダイオードとコンデンサを組み合わせたダイオード検波(包絡線検波器)です。回路は驚くほど単純で、信号源にダイオード $D$ を直列につなぎ、その後ろにコンデンサ $C$ と抵抗 $R$ を並列にして接地するだけです。

整流:波の下半分を捨てる

ダイオードは「電流を一方向にしか流さない」素子です。入力信号 $s(t)$ が正のときだけ電流を通し、負のときは遮断します。理想ダイオードなら、出力はいったん次のような「半波整流」された波形になります。

$$ s_{\text{rect}}(t) = \max\bigl(s(t),\; 0\bigr) $$

これは AM 波の上半分(正の部分)だけを残し、下半分をバッサリ切り捨てた波形です。搬送波の山だけが櫛の歯のように並んだ形になり、その山の高さは、その瞬間の包絡線 $e(t)$ に等しくなっています。つまり整流の時点で、包絡線の情報は「山の高さ」として残っているのです。あとはこの櫛の歯を滑らかにつなげば包絡線が浮かび上がります。

半波整流により下半分を捨てると山の高さが包絡線に一致することを示すグラフ

この図から、半波整流 $\max(s,0)$(赤)が AM 波の負の部分を完全に捨て、正の山だけを櫛の歯状に残していることが読み取れます。残った山の頂点は、いずれも包絡線 $e(t)$(水色破線)にちょうど接しています。整流という単純な操作だけで、包絡線の情報が「山の高さの列」として保存されるのが分かります。

平滑:コンデンサが山の高さを覚える

その「滑らかにつなぐ」役割を果たすのが $RC$ 並列回路です。動作はこう考えると腑に落ちます。

  1. 搬送波が山に向かって立ち上がるとき、ダイオードが導通し、コンデンサ $C$ が急速に充電されて、山のてっぺん(=そのときの包絡線 $e(t)$)まで電圧が上がります。ダイオードの順方向抵抗は小さいので、充電の時定数は非常に短く、コンデンサはほぼ瞬時に山に追いつきます。
  2. 山を過ぎて搬送波が下がり始めると、コンデンサ電圧のほうが入力より高くなるため、ダイオードは逆バイアスになって遮断します。すると充電経路は切れ、コンデンサは抵抗 $R$ を通じてゆっくり放電します。この放電の時定数が $RC$ です。
  3. 放電の途中で次の山が来ると、再びダイオードが導通してコンデンサをその山の高さまで充電し直します。

この「充電(速い)+放電(遅い)」の繰り返しによって、コンデンサ電圧は搬送波の山のてっぺんを滑らかにたどっていきます。結果として、出力電圧が包絡線 $e(t)$ を近似するのです。放電が速すぎると山と山の間で電圧が落ちすぎて搬送波のギザギザが残り、放電が遅すぎると包絡線が下がるのに追いつけません。ちょうどよい放電の速さ、すなわち $RC$ の値が検波の質を決めます。

このコンデンサの放電のふるまいを式で書いておきましょう。ダイオードが遮断している間、出力電圧 $v_{\text{out}}$ は、山の頂点の値 $V_p$ から指数的に減衰します。

$$ \begin{equation} v_{\text{out}}(t) = V_p \, e^{-(t – t_p)/(RC)} \end{equation} $$

ここで $t_p$ は直前の山の時刻です。

RC平滑で急速充電と緩慢放電を繰り返し山頂を鋸歯状になぞる様子の拡大図

この拡大図から、コンデンサ電圧(橙)が搬送波の山に向かって急速に立ち上がり、山を過ぎると抵抗を通じて $RC$ の時定数でゆっくり放電し、次の山でまた充電し直す動作を繰り返していることが読み取れます。この「速い充電+遅い放電」の鋸歯が包絡線 $e(t)$(水色破線)の近傍を上下しており、放電が浅いほど山頂の列にぴったり張り付きます。放電量が残す小さなギザギザが搬送波リップルの正体です。

この放電曲線が包絡線をどれだけうまく追えるかが、次に導く時定数条件のすべてを決めます。ではその条件を定量的に導出しましょう。

時定数条件 $1/f_c \ll RC \ll 1/f_m$ の導出

ダイオード検波が正しく動くには、時定数 $RC$ が満たすべき2つの相反する要求があります。それぞれを不等式として書き下し、統合します。

要求1:搬送波のリップルを消す($RC \gg 1/f_c$)

コンデンサは山と山の間で放電します。搬送波の隣り合う山の間隔は搬送波の周期 $T_c = 1/f_c$ です。この間にコンデンサがあまり放電してしまうと、出力に搬送波周波数のギザギザ(リップル)が残り、包絡線が汚れます。放電を「1搬送波周期の間はほとんど落ちない」程度に抑えるには、放電の時定数 $RC$ が搬送波周期よりずっと長くなければなりません。

$$ RC \gg T_c = \frac{1}{f_c} $$

放電式 $(3)$ で $t – t_p = T_c$ を代入すると、1周期あたりの電圧の減り具合は $e^{-T_c/(RC)} \approx 1 – T_c/(RC)$ です。$RC \gg T_c$ なら $T_c/(RC) \ll 1$ となり、1周期での落ち込みが無視できるほど小さくなる、という意味です。これで搬送波のリップルが平滑化されます。

要求2:包絡線の変化に追従する($RC \ll 1/f_m$)

一方で、コンデンサ電圧は包絡線 $e(t)$ が変化するのに合わせて動かなければなりません。包絡線はメッセージ $a(t)$ の速さ、すなわち最大周波数 $f_m$ で変化します。包絡線が1回変化する時間スケールは $1/f_m$ です。コンデンサがこの変化に追いつくには、放電の時定数がこの時間よりずっと短くなければなりません。放電が遅すぎると、包絡線が下がっているのにコンデンサ電圧が高いままになり、追従できないのです。

$$ RC \ll \frac{1}{f_m} $$

2つの要求の統合

この2つを1本の不等式に統合すると、時定数の設計条件が得られます。

$$ \begin{equation} \frac{1}{f_c} \ll RC \ll \frac{1}{f_m} \end{equation} $$

この条件が成立するには、左辺 $1/f_c$ が右辺 $1/f_m$ よりずっと小さい、すなわち $f_c \gg f_m$ が前提として必要です。ありがたいことに AM ではまさにこれが成り立っています。中波 AM ラジオなら搬送波 $f_c \approx 1000$ kHz に対し音声は $f_m \le 5$ kHz で、桁が2つ以上違います。この「搬送波と音声の周波数の桁違い」があるからこそ、$RC$ を選べる広い「窓」が生まれ、ダイオード検波が成立するのです。逆に、この桁の差が小さい変調方式(メッセージ帯域が搬送波に近いもの)では、包絡線検波はうまくいきません。

時定数条件1/fc<<RC<<1/fmの使える窓を示す図

この図は、時定数 $RC$ の取りうる範囲を対数軸で示したものです。左端($RC < 1/f_c = 100\,\mu$s、赤)は放電が速すぎて搬送波リップルが残る領域、右端($RC > 1/f_m = 5000\,\mu$s、橙)は放電が遅すぎて対角クリッピングが出る領域で、その間の緑の帯だけが「使える窓」です。採用値 $RC=300\,\mu$s(白破線)がちょうど窓の中央に収まっていることが分かります。搬送波と音声の周波数が桁違い($f_c \gg f_m$)だからこそ、この広い窓が生まれます。

条件 $(4)$ は「速すぎず遅すぎず」という、いわばゴルディロックス条件です。では条件を破って $RC$ を大きくしすぎると、具体的にどんな歪みが出るのでしょうか。それが有名な「対角クリッピング」です。

対角クリッピング歪みの導出

$RC$ を大きくしすぎたとき、すなわち条件 $(4)$ の右側 $RC \ll 1/f_m$ を破ったときに起きるのが対角クリッピング(diagonal clipping、斜めクリッピング)です。包絡線が急に下がる局面で、コンデンサの放電が間に合わず、出力波形が包絡線の下降カーブを「斜めに突っ切って」直線的に落ちてしまう現象です。オシロスコープで見ると、なめらかな包絡線の谷が、鋸歯状の斜め直線で削り取られたように見えます。

この歪みが起きない条件を、放電の速さと包絡線の下降速度の競争として定量的に導きましょう。

追従できる条件

ダイオードが遮断してコンデンサが放電しているとき、出力電圧の下降の速さは、放電式 $(3)$ を微分して、

$$ \left.\frac{d v_{\text{out}}}{dt}\right| = -\frac{V_p}{RC} \approx -\frac{v_{\text{out}}}{RC} $$

です(放電開始直後は $v_{\text{out}} \approx V_p$)。一方、追いかけたい包絡線 $e(t)$ の下降の速さは $de/dt$(負の値)です。出力が包絡線に追従できるためには、コンデンサが「放置しても包絡線と同じかそれより速く落ちられる」必要があります。つまり、どの瞬間でも次が成り立たなければなりません。

$$ \frac{v_{\text{out}}}{RC} \ge -\frac{de}{dt} $$

出力が包絡線を追えているときは $v_{\text{out}} \approx e(t)$ なので、条件は次の形になります。

$$ \begin{equation} \frac{1}{RC} \ge \frac{-\,de/dt}{e(t)} \qquad (\text{すべての } t \text{ で}) \end{equation} $$

右辺は「包絡線の相対的な下降率」です。これが最も大きくなる(最も追従が厳しくなる)瞬間で条件が満たされれば、他の瞬間でも自動的に満たされます。

単一トーンでの最悪条件

メッセージが単一トーン $a(t) = \cos(2\pi f_m t)$ の場合を考えます。角周波数を $\omega_m = 2\pi f_m$、$\theta = \omega_m t$ と置くと、包絡線は $e = 1 + m\cos\theta$、その時間微分は $de/dt = -m\,\omega_m \sin\theta$ です。相対下降率は、

$$ g(\theta) = \frac{-\,de/dt}{e} = \frac{m\,\omega_m \sin\theta}{1 + m\cos\theta} $$

この $g(\theta)$ を最大化する $\theta$ を求めます。分子・分母を $\theta$ で微分して極値条件(商の微分の分子をゼロ)を立てると、

$$ \frac{d}{d\theta}\bigl[m\,\omega_m \sin\theta\bigr]\,(1 + m\cos\theta) – m\,\omega_m\sin\theta \cdot (-m\sin\theta) = 0 $$

左辺を展開すると、$m\,\omega_m\bigl[\cos\theta\,(1 + m\cos\theta) + m\sin^2\theta\bigr]$ となります。ここで $\cos^2\theta + \sin^2\theta = 1$ を使って $m\cos^2\theta + m\sin^2\theta = m$ とまとめると、括弧の中は $\cos\theta + m$ に簡約されます。したがって極値条件は、

$$ \cos\theta + m = 0 \quad \Longleftrightarrow \quad \cos\theta = -m $$

このとき $\sin\theta = \sqrt{1 – m^2}$ です。これらを $g(\theta)$ に代入します。分母は $1 + m\cos\theta = 1 + m(-m) = 1 – m^2$ なので、

$$ g_{\max} = \frac{m\,\omega_m \sqrt{1 – m^2}}{1 – m^2} = \frac{m\,\omega_m}{\sqrt{1 – m^2}} $$

対角クリッピングを防ぐ条件

この最悪値を条件 $(5)$ に代入すると、$1/RC \ge m\,\omega_m/\sqrt{1 – m^2}$、すなわち時定数の上限が得られます。

$$ \begin{equation} RC \le \frac{\sqrt{1 – m^2}}{m\,\omega_m} = \frac{\sqrt{1 – m^2}}{2\pi f_m\, m} \end{equation} $$

これが対角クリッピングを起こさないための、$RC$ の上限を与える有名な公式です。この式から2つの重要な設計指針が読み取れます。第一に、変調指数 $m$ が $1$ に近づくと右辺の分子 $\sqrt{1-m^2}$ がゼロに近づき、許される $RC$ が急激に小さくなります。深く変調するほど包絡線の谷が急峻になり、放電を速くしないと追いつけないのです。第二に、メッセージ周波数 $f_m$ が高いほど許される $RC$ は小さくなります。高い音ほど包絡線が速く変化するためです。

具体例として、$m = 0.5$、$f_m = 200$ Hz なら、$RC \le \sqrt{1 – 0.25}/(2\pi \times 200 \times 0.5) = \sqrt{0.75}/628.3 \approx 1.38$ ms です。実際、後の Python 実験でも $RC \approx 1.4$ ms を超えると対角クリッピング歪みが目立ち始めることを確認します。要求2の $RC \ll 1/f_m = 5$ ms という緩い条件よりも、こちらの $(6)$ のほうが厳しい上限を与えることに注意してください。

対角クリッピングを防ぐRC上限が変調指数mとともに変化する曲線

この図は、対角クリッピングを防ぐ $RC$ の上限 $\sqrt{1-m^2}/(2\pi f_m m)$ を、変調指数 $m$ とメッセージ周波数 $f_m$ の関数として描いたものです。$m$ が $1$ に近づくと分子 $\sqrt{1-m^2}$ がゼロへ向かい、許される $RC$ が急落する(深い変調ほど放電を速くしないと追いつけない)ことが読み取れます。また $f_m$ が高い曲線ほど下側にあり、高い音ほど厳しい上限になることも分かります。赤星が本文の具体例 $m=0.5,f_m=200$ Hz の $1.38$ ms です。

対角クリッピングは、放電時定数と包絡線下降速度の競争として理解できました。ダイオード検波は単純ですが、このように時定数のチューニングが必要で、原理的にリップルや歪みが避けられません。ここで発想を変えて、「そもそも包絡線とは何か」を信号処理の言葉で厳密に定義し、時定数のいらない検波法を導きましょう。それがヒルベルト変換による方法です。

ヒルベルト変換による包絡線

ダイオード検波は「回路が物理的に山をなぞる」アナログな方法でした。これに対し、包絡線を数学的に厳密な量として定義し、計算で正確に取り出すのが解析信号(analytic signal)を使う方法です。中心にあるのがヒルベルト変換です。

実信号を複素信号にする

実数値の信号 $s(t)$ を、大きさと角度を持つ複素数の回転として捉え直したい、というのが出発点です。実軸上を往復するだけの $\cos$ よりも、複素平面をぐるぐる回る $e^{j\omega t}$ のほうが「振幅」と「位相」を素直に分離できます。そこで $s(t)$ に対して、その虚部を補うようにヒルベルト変換 $\hat{s}(t) = \mathcal{H}[s](t)$ を付け加え、解析信号を作ります。

$$ \begin{equation} s_a(t) = s(t) + j\,\hat{s}(t) \end{equation} $$

ヒルベルト変換 $\mathcal{H}$ は、信号のすべての周波数成分の位相を $-90^\circ$ ずらす操作です。周波数領域では、正の周波数に $-j$、負の周波数に $+j$ を掛けることに相当します。この操作のポイントは、$\cos$ を $\sin$ に変える点にあります。実際、$\mathcal{H}[\cos(\omega t)] = \sin(\omega t)$、$\mathcal{H}[\sin(\omega t)] = -\cos(\omega t)$ です($\omega > 0$)。この性質が、次に見る包絡線抽出の鍵になります。

解析信号の絶対値が包絡線に一致すること

AM 波 $s(t) = e(t)\cos(2\pi f_c t)$ のヒルベルト変換を考えます。ここで包絡線 $e(t) = 1 + m\,a(t)$ は搬送波よりずっとゆっくり変化する(帯域が $f_c$ より低い)信号です。このときベドロシアンの定理(Bedrosian’s theorem)が使えます。定理は「低周波の因子と高周波の因子の積のヒルベルト変換は、低周波因子をそのままにして高周波因子だけを変換したものに等しい」という主張で、スペクトルが重ならない($e(t)$ の帯域と搬送波が分離している)ときに成り立ちます。これを適用すると、

$$ \hat{s}(t) = \mathcal{H}\bigl[e(t)\cos(2\pi f_c t)\bigr] = e(t)\,\mathcal{H}\bigl[\cos(2\pi f_c t)\bigr] = e(t)\sin(2\pi f_c t) $$

となります。$e(t)$ は変換の外に出て、$\cos$ だけが $\sin$ に変わりました。したがって解析信号は、

$$ \begin{equation} s_a(t) = e(t)\cos(2\pi f_c t) + j\,e(t)\sin(2\pi f_c t) = e(t)\,e^{\,j 2\pi f_c t} \end{equation} $$

という美しい形になります。実部が搬送波の $\cos$、虚部が搬送波の $\sin$ で、その両方に同じ包絡線 $e(t)$ が掛かった構造です。ここで絶対値を取ると、$|e^{\,j 2\pi f_c t}| = 1$ なので搬送波がきれいに消えて、

$$ \begin{equation} \bigl| s_a(t) \bigr| = e(t)\sqrt{\cos^2(2\pi f_c t) + \sin^2(2\pi f_c t)} = |e(t)| \end{equation} $$

が得られます。解析信号の絶対値(瞬時振幅)が、まさに包絡線そのものなのです。三角関数の恒等式 $\cos^2 + \sin^2 = 1$ が、搬送波の振動を完全に打ち消してくれる点が核心です。

解析信号の3次元らせん。半径が包絡線に一致する様子

この3次元プロットは、解析信号 $s_a(t)=e(t)e^{j2\pi f_c t}$(水色)が複素平面を高速で回転しながら時間軸に沿って進むらせんであることを示しています。実部が $\cos$、虚部が $\sin$ で、回転の半径がそのまま包絡線 $|s_a|=e(t)$(橙)に一致します。搬送波の速い回転は「らせんの巻き」に押し込まれ、その半径を測るだけでリップルなく包絡線が取り出せる、というのがヒルベルト検波の幾何的なからくりです。ダイオード検波では放電時定数を苦労して調整してリップルと戦いましたが、こちらは数学的に搬送波が消えるので、リップルも対角クリッピングも原理的に存在しません。

実装上のヒルベルト変換

実際の計算では、scipy.signal.hilbert が便利です。この関数は名前に反してヒルベルト変換そのものではなく、解析信号 $s_a(t)$ を返す点に注意してください(FFT で負の周波数成分をゼロにし、正の周波数を2倍する方法で実装されています)。したがって復調は「解析信号を作り、その絶対値を取り、直流分 $1$ を引く」の3ステップで完結します。

$$ \hat{a}(t) = \frac{|s_a(t)| – 1}{m} $$

理論上は完璧なこの方法にも、実は $m \le 1$ という同じ限界があります。式 $(9)$ の右辺が $|e(t)|$ と絶対値付きで出てくるためです。$m > 1$ で $e(t)$ が負になると、ダイオード検波と同じ折り返し歪みが生じます。次にこの過変調の歪みを詳しく見ましょう。

過変調 $m > 1$ の歪み

ここまでの2つの検波法は、どちらも最終的に $|1 + m\,a(t)|$、すなわち包絡線の絶対値を出力します。ダイオードは整流という物理的な絶対値操作で、ヒルベルトは式 $(9)$ の数学的な絶対値で、同じ結果に至ります。この「絶対値」が、$m \le 1$ では無害でも $m > 1$ では致命的になります。

折り返しのメカニズム

変調指数が $m > 1$ のとき、メッセージが最小値 $a(t) = -1$ を取る付近で $1 + m\,a(t) = 1 – m < 0$ となり、包絡線の中身が負に落ち込みます。ところが検波器が出力するのは絶対値 $|1 + m\,a(t)|$ なので、負に落ち込んだ部分は $x \mapsto |x|$ によって正側に折り返されます。本来「谷」であるべき部分が「山」として現れてしまうのです。

トーン $a(t) = \cos\omega_m t$ で見ると分かりやすいでしょう。真の包絡線の中身 $1 + m\cos\omega_m t$ は、$m > 1$ のとき1周期に2回ゼロを横切って負になります。検波出力 $|1 + m\cos\omega_m t|$ は、その負の区間で符号が反転し、なめらかだった谷底に鋭い尖り(ゼロ点でのV字の折れ曲がり)が2つ現れます。この鋭い折れ曲がりは高調波を大量に含むため、復調音には強い歪みが乗ります。しかも、折り返された部分からは元の $a(t)$ の符号情報が失われるので、単純な包絡線検波では原理的に復元不能です。

包絡線検波の適用限界

したがって、包絡線検波が使えるのは $m \le 1$ の範囲に限られます。送信側は過変調を避けるように変調指数を管理しなければなりません(実際のAM放送では $m$ を $0.8$ 前後に抑え、ピークでも $1$ を超えないよう制限します)。$m > 1$ で送られた信号や、そもそも搬送波を送らない DSB-SC(抑圧搬送波両側波帯)や SSB(単側波帯)では、包絡線 $|a(t)|$ がメッセージの絶対値になってしまい情報が壊れるため、包絡線検波は使えず、搬送波と同期して掛け算する同期検波(コヒーレント検波)が必要になります。「搬送波を一緒に送る(電力を食う)代わりに、受信機を極限まで単純にできる」というのが AM の設計思想であり、その単純さを支えているのが包絡線検波なのです。

過変調の歪みは、絶対値操作という両検波法に共通する限界から生じることが分かりました。ここまでの理論を、実際に Python で両方の検波器を実装して確かめましょう。

Python による実装と比較

理論で導いた3点を、コードで実測して確認します。(1) ダイオードモデル(半波整流+一次RCローパス)とヒルベルト変換の両方で正しく復調できること、(2) 時定数 $RC$ を変えると復元誤差(MSE)がU字を描き、条件 $(4)$ の中央で最小になること、(3) 過変調で折り返し歪みが出ること、の3つです。

AM波の生成と2つの検波器

まず AM 波を作り、ダイオードモデルとヒルベルト検波の関数を用意します。搬送波 $f_c = 10$ kHz、メッセージ $f_m = 200$ Hz、変調指数 $m = 0.5$ とします。

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

# 日本語フォント設定
import matplotlib
for cand in ["Hiragino Sans", "Yu Gothic", "Noto Sans CJK JP", "IPAexGothic", "Meiryo"]:
    if any(cand == f.name for f in matplotlib.font_manager.fontManager.ttflist):
        plt.rcParams["font.family"] = cand
        break
plt.rcParams["axes.unicode_minus"] = False

# パラメータ
fs = 500_000.0   # サンプリング周波数 [Hz]
fc = 10_000.0    # 搬送波 [Hz]
fm = 200.0       # メッセージ [Hz]
m  = 0.5         # 変調指数
t  = np.arange(0, 0.05, 1/fs)

a = np.cos(2*np.pi*fm*t)            # 正規化メッセージ a(t)
env_true = 1 + m*a                 # 真の包絡線 (m<=1 なので常に正)
s = env_true * np.cos(2*np.pi*fc*t)  # AM波

このコードで、伝えたいメッセージ $a(t)$ とそれを振幅に写した AM 波 $s(t)$ が用意できました。env_true が私たちが復元したい目標の包絡線 $1 + m\,a(t)$ です。$m = 0.5 \le 1$ なので env_true は常に正で、絶対値による折り返しは起きません。

次に2つの検波器を関数にします。ダイオードモデルは「半波整流 $\max(s, 0)$ + 一次ローパスフィルタ(コンデンサの充放電を離散化したもの)」で、ヒルベルト検波は scipy.signal.hilbert の絶対値です。

def diode_detect(s, fs, RC):
    """ダイオード検波: 半波整流 + 一次RCローパス"""
    rect = np.maximum(s, 0.0)          # 半波整流(ダイオード)
    dt = 1/fs
    alpha = dt/(RC + dt)               # 一次ローパスの係数
    y = np.empty_like(rect)
    acc = 0.0
    for i, x in enumerate(rect):
        acc += alpha*(x - acc)         # y[n] = y[n-1] + alpha*(x[n]-y[n-1])
        y[i] = acc
    return y

def hilbert_detect(s):
    """ヒルベルト検波: 解析信号の絶対値"""
    return np.abs(hilbert(s))          # |s + j*H[s]| = 包絡線

diode_detect の一次ローパスは、コンデンサ電圧の更新式 $v[n] = v[n-1] + \alpha\,(x[n] – v[n-1])$ で、$\alpha = \Delta t/(RC + \Delta t)$ は時定数 $RC$ を反映した平滑係数です。$RC$ が大きいほど $\alpha$ が小さくなり、平滑が強く(放電が遅く)なります。hilbert_detect は式 $(9)$ をそのまま実装したもので、たった1行です。

波形の比較

時定数を条件 $(4)$ の中央付近 $RC = 300\,\mu$s($RC \cdot f_c = 3$、$RC \cdot f_m = 0.06$)に選び、両検波器の出力を真の包絡線と重ねて描きます。

RC = 300e-6
y_diode = diode_detect(s, fs, RC)
y_hil   = hilbert_detect(s)

fig, ax = plt.subplots(figsize=(9, 4.5))
ax.plot(t*1e3, s, color="0.8", lw=0.6, label="AM波 $s(t)$")
ax.plot(t*1e3, env_true, "k--", lw=1.8, label="真の包絡線 $1+m\\,a(t)$")
ax.plot(t*1e3, y_diode, color="tab:red", lw=1.4, label="ダイオード検波")
ax.plot(t*1e3, y_hil, color="tab:blue", lw=1.4, label="ヒルベルト検波")
ax.set_xlabel("時間 [ms]"); ax.set_ylabel("振幅")
ax.set_title("AM波の包絡線検波($f_c$=10kHz, $f_m$=200Hz, $m$=0.5, $RC$=300$\\mu$s)")
ax.set_xlim(0, 15); ax.legend(loc="upper right")
plt.tight_layout(); plt.show()

ダイオード検波とヒルベルト検波と真の包絡線を重ねた波形比較

このグラフから、両検波器とも真の包絡線(黒破線)の正弦波状の変化をよくなぞっていることが読み取れます。ヒルベルト検波(青)は破線とほぼ完全に重なり、搬送波のリップルが一切見えません。式 $(9)$ の通り、搬送波が数学的に消えているためです。一方、ダイオード検波(赤)はおおむね包絡線を追えていますが、よく見ると搬送波周期の細かなギザギザ(リップル)がわずかに残り、包絡線がやや遅れて追従しています。これが $RC$ を有限に保つことの代償です。

時定数を変えたときの誤差

理論の核心である「$RC$ が小さすぎても大きすぎてもダメで、中央で最良」を、MSE のスイープで定量化します。各 $RC$ について、直流分とスケールを最小二乗で合わせてから真の包絡線との平均二乗誤差を計算します。

def mse_of(y):
    sl = slice(len(t)//4, -len(t)//20)     # 過渡部を除いた定常区間
    A = np.vstack([y[sl], np.ones(len(y[sl]))]).T
    c, *_ = np.linalg.lstsq(A, env_true[sl], rcond=None)  # DC/スケール補正
    return np.mean((A @ c - env_true[sl])**2)

RCs = np.array([1, 3, 10, 30, 100, 300, 1000, 3000, 10000]) * 1e-6
mses = [mse_of(diode_detect(s, fs, RC)) for RC in RCs]
mse_hil = np.mean((y_hil[len(t)//20:-len(t)//20]
                   - env_true[len(t)//20:-len(t)//20])**2)

fig, ax = plt.subplots(figsize=(8, 4.5))
ax.loglog(RCs*1e6, mses, "o-", color="tab:red", label="ダイオード検波")
ax.axhline(mse_hil, color="tab:blue", ls="--", label="ヒルベルト検波")
ax.axvline(1/fc*1e6, color="gray", ls=":", label="$1/f_c$=100$\\mu$s")
ax.axvline(1/fm*1e6, color="green", ls=":", label="$1/f_m$=5000$\\mu$s")
ax.set_xlabel("時定数 $RC$ [$\\mu$s]"); ax.set_ylabel("復元 MSE")
ax.set_title("時定数と復元誤差(U字:小さすぎ=リップル / 大きすぎ=対角クリッピング)")
ax.legend(); plt.tight_layout(); plt.show()

時定数RCと復元MSEの関係。U字を描くグラフ

このグラフから、ダイオード検波の MSE がきれいなU字を描くことが読み取れます。$RC$ が小さい領域($1$〜$30\,\mu$s、$RC \ll 1/f_c$)では MSE が約 $0.09$〜$0.12$ と大きく、これは搬送波のリップルが取りきれないためです。$RC = 300\,\mu$s 付近で MSE は約 $0.019$ と最小になり、これはちょうど $1/f_c = 100\,\mu$s と $1/f_m = 5000\,\mu$s の間、条件 $(4)$ の窓の中央に位置します。さらに $RC$ を大きくすると($1000\,\mu$s 以上)MSE は再び増大し、$3000\,\mu$s では約 $0.12$ に達します。これは式 $(6)$ が予言する上限 $RC \le 1.38$ ms を超えて対角クリッピングが発生したためです。一方ヒルベルト検波(青破線)は MSE が約 $6 \times 10^{-9}$ と桁違いに小さく、時定数の調整なしに理論限界の精度を達成しています。

対角クリッピングの波形

MSE のU字の右側で何が起きているかを、波形で確認します。$RC = 3000\,\mu$s(式 $(6)$ の上限 $1.38$ ms を大きく超過)でダイオード検波した出力を見ます。

y_clip = diode_detect(s, fs, 3000e-6)

fig, ax = plt.subplots(figsize=(9, 4.5))
ax.plot(t*1e3, env_true, "k--", lw=1.8, label="真の包絡線")
ax.plot(t*1e3, y_clip, color="tab:red", lw=1.5, label="ダイオード検波 $RC$=3000$\\mu$s")
ax.set_xlabel("時間 [ms]"); ax.set_ylabel("振幅")
ax.set_title("対角クリッピング歪み(放電が包絡線の下降に追いつけない)")
ax.set_xlim(0, 15); ax.legend(loc="upper right")
plt.tight_layout(); plt.show()

RC=3000usで生じる対角クリッピング歪みの波形

このグラフから、対角クリッピングの典型的な形が読み取れます。包絡線が上昇する局面(コンデンサが充電される側)では出力は真の包絡線にぴったり張り付いていますが、包絡線が下降する局面では、出力が包絡線のなめらかな谷を追えず、直線的に(斜めに)ゆっくり落ちていきます。谷底に達する前に次の上昇が始まるため、谷が浅く削り取られたように歪みます。これはまさに式 $(5)$ の条件が破れた状態、すなわち放電速度 $1/RC$ が包絡線の相対下降率に負けている状態です。

過変調の歪み

最後に、過変調 $m > 1$ で折り返し歪みが出ることを確認します。理想的なヒルベルト検波(時定数の影響を排除するため)で $m = 1.8$ の場合を見ます。

m_over = 1.8
env_over = 1 + m_over*a                       # 負に落ち込む
s_over = env_over * np.cos(2*np.pi*fc*t)
y_over = hilbert_detect(s_over)               # 出力は |1+m a(t)|

fig, ax = plt.subplots(figsize=(9, 4.5))
ax.plot(t*1e3, env_over, "k--", lw=1.5, label="包絡線の中身 $1+m\\,a(t)$(負になる)")
ax.plot(t*1e3, y_over, color="tab:purple", lw=1.6, label="検波出力 $|1+m\\,a(t)|$")
ax.axhline(0, color="gray", lw=0.8)
ax.set_xlabel("時間 [ms]"); ax.set_ylabel("振幅")
ax.set_title("過変調 $m$=1.8 の折り返し歪み(谷が正側に跳ね返る)")
ax.set_xlim(0, 15); ax.legend(loc="upper right")
plt.tight_layout(); plt.show()

過変調m=1.8で負の谷が正側へ折り返る歪みの波形

このグラフから、過変調の折り返しがはっきり見えます。包絡線の中身 $1 + m\,a(t)$(黒破線)は $m = 1.8 > 1$ のため周期的に負に落ち込みますが、検波出力(紫)はその絶対値なので、負の谷が正側に跳ね返って鋭いV字の尖りに変わっています。本来1周期に1つのはずの谷が、折り返しによって2つの尖りとして現れ、元の正弦波の形はもはや復元できません。この尖りは高調波を多量に含むため、AM放送では送信側が変調指数を $1$ 以下に厳しく管理して、この歪みを防いでいるのです。

これらの実験は、理論で導いた条件 $(4)$・$(6)$、および $m \le 1$ という適用限界が、実際の信号処理でそのまま観測されることを示しています。

まとめ

本記事では、AM信号から情報を取り出す包絡線検波を、2つの視点から導出し実装しました。

  • AM波の包絡線: $s(t) = (1 + m\,a(t))\cos(2\pi f_c t)$ の上側包絡線は $|1 + m\,a(t)|$ であり、$m \le 1$ ならこれは $1 + m\,a(t)$ に等しく、直流分を引けばそのままメッセージ $a(t)$ が復元できる。
  • ダイオード検波: 半波整流 + RC平滑という単純な回路で包絡線をなぞる。搬送波リップルを消すには $RC \gg 1/f_c$、包絡線に追従するには $RC \ll 1/f_m$ が必要で、統合すると時定数条件 $1/f_c \ll RC \ll 1/f_m$ が得られる。これが成立するのは $f_c \gg f_m$ だから。
  • 対角クリッピング: $RC$ を大きくしすぎると放電が包絡線の下降に追いつけず歪む。単一トーンでの上限は $RC \le \sqrt{1 – m^2}/(2\pi f_m\, m)$。$m \to 1$ で許容 $RC$ が急減する。
  • ヒルベルト検波: 解析信号 $s_a(t) = s(t) + j\,\hat{s}(t)$ の絶対値が包絡線に一致する(ベドロシアンの定理 + $\cos^2 + \sin^2 = 1$)。時定数調整もリップルもなく、実験では MSE が $6 \times 10^{-9}$ と理論限界の精度を達成した。
  • 過変調の限界: 両検波法とも出力が $|1 + m\,a(t)|$ なので、$m > 1$ では谷が正側に折り返されて歪む。包絡線検波は $m \le 1$ でのみ有効で、それ以外は同期検波が必要。

ダイオード検波は「回路の物理で山をなぞる」古典的手法、ヒルベルト検波は「包絡線を数学的に厳密に取り出す」現代的手法という好対照をなします。前者は部品数個で実装できる代わりに時定数のチューニングと歪みの管理が要り、後者は正確な代わりに解析信号の計算(FFT)が必要です。目的(アナログ回路か、デジタル信号処理か)に応じて使い分けます。

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