スマートフォンが隣のチャネルの電波に妨害されずに目的の信号だけを受信できるのはなぜでしょうか。あるいは、無線LANやレーダー、衛星測位がますます高いデータレート・高い分解能を実現できているのはなぜでしょうか。これらの性能を最終的に決めているのが、受信機・送信機の心臓部にある「局部発振器」の純度です。理想的な発振器は完璧な正弦波 $\cos(2\pi f_0 t)$ を出力しますが、現実の発振器の出力は時間とともに位相がわずかにふらつきます。このふらつきが 位相雑音(phase noise) であり、無線システムの感度・選択度・誤り率を左右する最も重要な指標の一つです。
位相雑音がなぜ実務で重要なのかを、具体的な応用で見てみましょう。
- 受信機の相互変調・相反混合(reciprocal mixing): 強い妨害波が近接チャネルにあると、局部発振器の裾野(スカート)に乗った位相雑音と妨害波が混合し、目的信号の帯域に雑音が落ち込みます。位相雑音が悪いと、いくらRFフィルタを工夫しても近接妨害に弱い受信機になってしまいます。
- デジタル変調の誤り率: QAMや OFDM のように位相に情報を載せる変調方式では、位相雑音がそのままコンスタレーションの「にじみ」になり、EVM(誤差ベクトル振幅)を悪化させてビット誤り率を上げます。256-QAM 以上の高次変調では位相雑音の管理が死活問題です。
- レーダーのドップラー分解能: 移動目標の微小なドップラーシフトを検出するには、送信波が非常に純粋でなければなりません。位相雑音は弱い目標を覆い隠す「クラッタ」として効いてきます。
このように位相雑音は分野を問わず効いてくる量ですが、その大きさを設計段階で見積もり、回路パラメータと結びつける半経験的な公式が Leeson(リーソン)の式 です。1966年に D. B. Leeson が提案したこの式は、共振器の Q値、増幅器の雑音指数、出力電力、フリッカ雑音といった「設計者が触れるパラメータ」から、位相雑音スペクトルの形状($1/f^3$ 領域・$1/f^2$ 領域・雑音フロア)を一つの式で説明します。本記事では、この Leeson 式を直感から出発して丁寧に導出し、Python で位相雑音スペクトルとそれに対応するジッタを可視化します。
本記事の内容
- 位相雑音とは何か — 時間波形・スペクトル・位相のゆらぎの3つの見方
- 位相雑音の定義 $\mathcal{L}(f_m)$ と、PM側帯波としての表現
- 共振器に蓄えられたエネルギーと帯域、そして $Q$ 値の役割
- Leeson 式の導出(雑音指数・熱雑音・フリッカ雑音から $1/f^3$・$1/f^2$ 領域が現れる機構)
- 位相雑音からジッタ(時間ゆらぎ)への変換
- Python 実装: Leeson スペクトルの描画、各領域の傾き確認、ジッタ積分、時間波形シミュレーション
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
PLL は VCO を負帰還で制御して周波数を安定化する回路で、ループ帯域の内外で VCO の位相雑音がどう整形されるかを理解する土台になります。スーパーヘテロダイン受信機は、局部発振器の位相雑音が相反混合を通じて受信性能に直結する典型例です。
位相雑音とは
理想的な発振器の出力は、振幅 $V_0$、周波数 $f_0$ の完璧な正弦波です。
$$ v_{\text{ideal}}(t) = V_0 \cos(2\pi f_0 t) $$
しかし現実の発振器の出力には、振幅と位相の両方にゆらぎが乗ります。
$$ v(t) = \bigl[V_0 + a(t)\bigr]\cos\bigl(2\pi f_0 t + \phi(t)\bigr) $$
ここで $a(t)$ が振幅ゆらぎ、$\phi(t)$ が位相ゆらぎです。発振器にはリミッタ作用(振幅を一定に保とうとする非線形の働き)があるため、振幅ゆらぎ $a(t)$ は抑制されやすく、問題になるのは主に位相ゆらぎ $\phi(t)$ です。これが「位相雑音」と呼ばれる所以です。
イメージとしては、メトロノームを思い浮かべると分かりやすいでしょう。理想のメトロノームは正確に等間隔で「カチ、カチ」と鳴りますが、現実のメトロノームは少しずつタイミングがずれます。「カチ」の鳴る瞬間が早くなったり遅くなったりする — このタイミングのふらつきが、発振器でいう位相のゆらぎ $\phi(t)$ に相当します。周波数が一定でも、いつ波のピークが来るかが揺らいでいるのです。
3つの見方 — 時間・位相・スペクトル
位相雑音は同じ現象を3つの異なる角度から眺めることができます。この対応関係を最初に押さえておくと、後の議論が一気に見通しよくなります。
- 時間波形の見方: 波のゼロ交差点が早くなったり遅くなったりする。これを時間軸で測ったものが ジッタ(jitter) です。
- 位相の見方: 位相 $\phi(t)$ がランダムに変動する。瞬時周波数は $f(t) = f_0 + \frac{1}{2\pi}\frac{d\phi}{dt}$ なので、位相のゆらぎは周波数のゆらぎでもあります。
- スペクトルの見方: 理想ならスペクトルは $f_0$ にデルタ関数状の鋭いピークになるはずですが、位相雑音があると $f_0$ の周りに裾野(スカート)が広がります。
特に重要なのがスペクトルの見方です。発振器の出力をスペクトラムアナライザで見ると、キャリア $f_0$ を中心に左右対称の裾が見えます。この裾の高さこそが位相雑音であり、キャリアから離れた周波数 $f_m$(オフセット周波数)での裾の高さを定量化したものが、次節で定義する $\mathcal{L}(f_m)$ です。
ここまでで位相雑音の正体が「位相のランダムなゆらぎ」であり、それがスペクトル上の裾として観測されることを把握しました。次に、この裾の高さを正確に定義しましょう。
位相雑音の定義 $\mathcal{L}(f_m)$
スペクトラムアナライザで発振器の出力を観測したとき、キャリアから $f_m$ だけ離れた位置に現れる裾の大きさを、キャリア電力で規格化して表したものが位相雑音 $\mathcal{L}(f_m)$ です。直感的には「キャリアの何分の一の電力が、$f_m$ 離れたところの単位帯域に漏れ出ているか」を表します。
正式には、$\mathcal{L}(f_m)$ は次のように定義されます。
$$ \mathcal{L}(f_m) = \frac{P_{\text{SSB}}(f_0 + f_m,\ 1\,\text{Hz})}{P_{\text{carrier}}} $$
ここで $P_{\text{SSB}}(f_0 + f_m,\ 1\,\text{Hz})$ はキャリアから $f_m$ 離れた位置の片側帯域(single sideband)における、帯域幅 1 Hz あたりの雑音電力、$P_{\text{carrier}}$ はキャリアの全電力です。単位は「キャリアに対する1 Hz帯域あたりの比」なので dBc/Hz(dB relative to carrier per Hz)で表します。たとえば「10 kHz オフセットで $-110$ dBc/Hz」のように記述します。
位相ゆらぎのスペクトル密度 $S_\phi(f_m)$ との関係
位相雑音を回路理論で扱うには、観測量 $\mathcal{L}(f_m)$ を位相ゆらぎ $\phi(t)$ の 片側パワースペクトル密度 $S_\phi(f_m)$(単位 $\text{rad}^2/\text{Hz}$)と結びつける必要があります。両者の関係を導くために、位相ゆらぎが小さい場合を考えましょう。
位相がゆらぐ信号を複素表現で書くと、
$$ v(t) = V_0\, \text{Re}\bigl[e^{j(2\pi f_0 t + \phi(t))}\bigr] = V_0\, \text{Re}\bigl[e^{j2\pi f_0 t}\, e^{j\phi(t)}\bigr] $$
位相ゆらぎが小さい($|\phi(t)| \ll 1$ rad)とき、$e^{j\phi} \approx 1 + j\phi$ と一次近似できます。これを代入すると、
$$ v(t) \approx V_0\, \text{Re}\Bigl[e^{j2\pi f_0 t}\bigl(1 + j\phi(t)\bigr)\Bigr] = V_0\cos(2\pi f_0 t) – V_0\,\phi(t)\sin(2\pi f_0 t) $$
第1項がキャリア、第2項が位相変調による側帯波です。ここで重要なのは、側帯波の振幅が位相ゆらぎ $\phi(t)$ そのものに比例していることです。キャリアの電力は $P_{\text{carrier}} = V_0^2/2$ です。一方、第2項(位相による側帯波)の電力スペクトル密度は、$\phi(t)$ のスペクトル密度 $S_\phi(f_m)$ に $V_0^2/2$ を掛けたものになります。
片側帯域の雑音電力をキャリア電力で割ると、$V_0^2/2$ が約分されて、
$$ \mathcal{L}(f_m) = \frac{1}{2} S_\phi(f_m) $$
という美しい関係が得られます。係数 $1/2$ は、位相変調のパワーが上側帯波と下側帯波に折半され、$\mathcal{L}$ が片側(SSB)だけを見ていることから来ます。
注意: 近年の IEEE 標準では位相雑音を $\mathcal{L}(f_m) = \frac{1}{2}S_\phi(f_m)$ と定義し直していますが、歴史的にはスペクトラムアナライザで「片側帯波/キャリア」を直接読んだ値を $\mathcal{L}$ と呼んでいました。位相ゆらぎが小さい領域では両者は一致します。本記事では小ゆらぎ近似のもとで両者を区別せずに扱います。
dB 表記では、$1/2$ は $-3$ dB に相当するので、
$$ \mathcal{L}(f_m)\,[\text{dBc/Hz}] = S_\phi(f_m)\,[\text{dB rad}^2/\text{Hz}] – 3\ \text{dB} $$
この関係式が、これから導く Leeson 式(位相ゆらぎ $S_\phi$ の理論式)と、測定で得られる $\mathcal{L}(f_m)$ を橋渡しします。
位相雑音の定義と、それが位相ゆらぎのスペクトル密度と $1/2$ の係数で結ばれることが分かりました。次は、発振器の心臓部である共振器がこの位相ゆらぎをどう整形するかを、$Q$ 値の観点から考えます。
共振器と $Q$ 値の役割
発振器は本質的に「増幅器 + 共振器 + 正帰還ループ」でできています。共振器(LC タンク回路や水晶振動子、マイクロ波の誘電体共振器など)は、特定の周波数 $f_0$ でエネルギーを蓄え、その周波数の信号を選択的に通す「フィルタ」の役割を果たします。共振器が鋭いほど($Q$ 値が高いほど)、発振周波数からずれた雑音を強く抑え込むため、位相雑音が小さくなります。
$Q$ 値の定義
共振器の鋭さを表すのが品質係数 $Q$ です。直感的には「共振器が1サイクルあたりどれだけエネルギーを失わずに保持できるか」を表します。$Q$ が高い共振器は、一度蓄えたエネルギーをなかなか手放さない「鳴り続ける鐘」のようなものです。正式な定義は、
$$ Q = 2\pi \frac{\text{蓄えられたエネルギー}}{\text{1周期あたりに失われるエネルギー}} = \frac{f_0}{\Delta f_{3\text{dB}}} $$
右辺の第2の表現は、共振器の周波数応答が $-3$ dB になる帯域幅 $\Delta f_{3\text{dB}}$ と共振周波数の比です。$Q$ が高いほど共振のピークが鋭く、帯域が狭くなります。
共振器が位相をフィルタする様子
なぜ $Q$ 値が位相雑音に効くのでしょうか。共振器の位相応答を考えてみましょう。共振周波数 $f_0$ 付近では、共振器の伝達関数の位相 $\theta$ は周波数に対して急峻に変化します。一次近似すると、共振点からの周波数オフセット $\Delta f$ に対して、
$$ \frac{d\theta}{df}\bigg|_{f_0} = -\frac{2Q}{f_0} $$
という関係があります。$Q$ が大きいほど、わずかな周波数変化に対して位相が大きく動く(鋭い位相傾斜を持つ)ことを意味します。
発振が定常状態にあるとき、ループ全体の位相は常に $0$(または $2\pi$ の整数倍)に保たれていなければなりません(バルクハウゼンの位相条件)。増幅器側で発生した余分な位相雑音 $\Delta\theta$ が加わると、ループは位相条件を満たすために発振周波数を $\Delta f$ だけずらして補償します。この補償量は、
$$ \Delta f = -\frac{f_0}{2Q}\,\Delta\theta $$
で与えられます。つまり、共振器の $Q$ が高いほど、同じ位相擾乱 $\Delta\theta$ に対する周波数のずれ $\Delta f$ が小さくなります。これが「$Q$ を上げると位相雑音が下がる」ことの物理的な核心です。共振器は急峻な位相傾斜によって、増幅器の位相雑音を周波数のゆらぎへと「変換しにくくする」フィルタとして働くのです。
ここで $Q$ が位相雑音を $1/Q^2$ で改善することが見え隠れしてきました(後で導出するように、Leeson 式では実際に $Q^2$ が分母に現れます)。次は、増幅器が発生する雑音そのものを定量化し、それが共振器のフィルタを通ってどう位相雑音スペクトルになるかを組み立てます。
Leeson 式の導出
いよいよ本記事の核心、Leeson 式を導きます。ゴールは、発振器を構成する増幅器の雑音指数 $F$、出力電力 $P_s$、共振器の $Q$、フリッカ雑音のコーナー周波数 $f_c$ という設計パラメータから、位相雑音スペクトル $\mathcal{L}(f_m)$ の全体形状を一つの式で表すことです。
ステップ1: 増幅器入力の位相雑音フロア
発振ループ内の増幅器には、必ず熱雑音が入力されます。抵抗 $R$ や能動素子から生じる熱雑音の電力スペクトル密度は、絶対温度 $T$ と増幅器の雑音指数 $F$ を使って、
$$ N = F\,k_B T $$
と書けます。ここで $k_B = 1.38\times10^{-23}\ \text{J/K}$ はボルツマン定数です。雑音指数 $F$ は、増幅器が理想的な熱雑音 $k_B T$ をどれだけ余分に増やすかを表す係数($\geq 1$)です。
増幅器の入力には、キャリア信号(電力 $P_s$)と雑音(密度 $F k_B T$)が共存しています。この雑音は振幅成分と位相成分に等しく分かれるので、位相雑音だけを取り出すと、雑音電力の半分が位相に寄与します。キャリア電力で規格化した位相雑音の床(フロア)は、
$$ S_\phi^{\text{floor}} = \frac{F\,k_B T}{P_s} $$
となります。ここで分子の $F k_B T$ には熱雑音の全体が入っていますが、振幅/位相の折半($\times \tfrac12$)と、$\mathcal{L} = \tfrac12 S_\phi$ の係数を後でまとめて扱うため、まずは位相のスペクトル密度として上式を出発点とします。この量は周波数オフセット $f_m$ に依存しない「白色(平坦)」なフロアです。
ステップ2: 共振器による位相 → 周波数の変換($1/f^2$ の出現)
前節で見たように、増幅器で発生した位相擾乱は、共振器の急峻な位相傾斜を通じて発振周波数のゆらぎに変換されます。定量的には、共振器の伝達関数を考えると、オフセット周波数 $f_m$ における位相ゆらぎ $S_\phi^{\text{osc}}$ は、増幅器入力の位相ゆらぎ $S_\phi^{\text{floor}}$ に、共振器のフィルタ係数を掛けたものになります。
共振器の半値半幅は $f_0/(2Q)$ です。発振器のループ解析(リープニク/Leeson の議論)によると、オフセット $f_m$ がこの半値半幅より小さい領域では、位相擾乱は次の伝達係数で増幅されます。
$$ S_\phi^{\text{osc}}(f_m) = \left[1 + \left(\frac{f_0}{2Q f_m}\right)^2\right] S_\phi^{\text{floor}} $$
この $1 + (f_0/2Qf_m)^2$ という係数が Leeson 式の心臓部です。中身を読み解きましょう。
- $f_m$ が大きいとき(共振器の帯域より外): 第2項が無視でき、$S_\phi^{\text{osc}} \approx S_\phi^{\text{floor}}$ となります。これは周波数によらない平坦なフロアです。
- $f_m$ が小さいとき(共振器の帯域内): 第2項が支配的になり、$S_\phi^{\text{osc}} \propto 1/f_m^2$ となります。これが位相雑音スペクトルの $1/f^2$($-20$ dB/decade)の傾きの正体です。
物理的には、共振器の帯域内では位相擾乱がそのまま周波数ゆらぎに変換され、周波数を積分すると位相になる(積分は $1/f$ の係数を生む)ため、位相のスペクトルには $1/f_m^2$ が現れるのです。$f_0/(2Qf_m)$ という形に $Q$ が分母として入っていることに注目してください。$Q$ を2倍にすると、この $1/f^2$ 領域の位相雑音は $1/4$($-6$ dB)に下がります。これが「$Q^2$ で効く」という先ほどの予告の数式的な裏付けです。
ステップ3: フリッカ雑音の取り込み($1/f^3$ の出現)
ここまでは増幅器の白色熱雑音だけを考えました。しかし、実際の能動素子(トランジスタ)には低周波で増大する フリッカ雑音(1/f 雑音、フリッカノイズ) があります。これはトランジスタの欠陥準位への電荷のトラップ・デトラップなどに起因する雑音で、その電力スペクトル密度はベースバンドで $1/f$ に比例して増大します。
増幅器の位相ゆらぎのフロアは、白色成分にこのフリッカ成分が上乗せされ、
$$ S_\phi^{\text{floor}}(f_m) = \frac{F\,k_B T}{P_s}\left(1 + \frac{f_c}{f_m}\right) $$
と修正されます。ここで $f_c$ は フリッカコーナー周波数(flicker corner) で、白色雑音とフリッカ雑音が等しくなるオフセット周波数です。$f_m > f_c$ では白色項($1$)が支配的、$f_m < f_c$ ではフリッカ項($f_c/f_m$)が支配的になります。
ステップ4: Leeson 式の完成
ステップ2の共振器フィルタと、ステップ3のフリッカ修正を組み合わせ、最後に $\mathcal{L} = \tfrac12 S_\phi$ の関係を使うと、Leeson 式が得られます。
$$ \boxed{\ \mathcal{L}(f_m) = \frac{1}{2}\cdot\frac{F\,k_B T}{P_s}\left[1 + \left(\frac{f_0}{2Q\,f_m}\right)^2\right]\left(1 + \frac{f_c}{f_m}\right)\ } $$
この一つの式が、位相雑音スペクトルの全体形状を表します。式の中の2つの括弧を掛け合わせると、$f_m$ のべき乗に応じて3つの領域が現れます。
3つの領域の出現
Leeson 式の2つの括弧を展開すると、$f_m$ に対して以下の領域に分かれます。キャリアに近い($f_m$ が小さい)順に並べると、
- $1/f^3$ 領域($-30$ dB/decade): $f_m$ が非常に小さく、共振器項の $1/f_m^2$ とフリッカ項の $1/f_m$ が同時に効く領域。両者の積で $1/f_m^3$ になります。最もキャリアに近い裾です。
- $1/f^2$ 領域($-20$ dB/decade): 共振器項の $1/f_m^2$ は効くがフリッカ項は平坦($f_m > f_c$)になった領域。白色雑音が共振器でフィルタされた裾です。
- 雑音フロア($0$ dB/decade、平坦): $f_m$ が共振器の半値半幅 $f_0/(2Q)$ より大きくなり、共振器項も平坦になった領域。ここでは位相雑音はオフセットによらず一定です。
実際のスペクトルでは、$1/f^3$ と $1/f^2$ の境界がフリッカコーナー $f_c$、$1/f^2$ と平坦フロアの境界が共振器の半値半幅 $f_0/(2Q)$ で決まります(ただし両者の大小関係によっては $1/f^3$ 領域が見えない、あるいは $1/f^2$ 領域が見えないこともあります)。
導出の各ステップを振り返ると、Leeson 式の各因子が物理的に何を表すかが明確です。$F k_B T / P_s$ は信号対雑音比の逆数(キャリアに対する熱雑音の床)、$[1 + (f_0/2Qf_m)^2]$ は共振器のフィルタ作用、$(1 + f_c/f_m)$ は能動素子のフリッカ雑音、先頭の $1/2$ は片側帯域への折半です。
数式の形が分かったところで、次はこの位相雑音スペクトルが、時間領域でどれだけの「タイミングのふらつき」(ジッタ)に対応するのかを見ましょう。
位相雑音からジッタへの変換
スペクトル上の位相雑音 $\mathcal{L}(f_m)$ は、時間領域では波のゼロ交差点のばらつき、すなわちジッタとして観測されます。デジタル回路の設計者にとっては、dBc/Hz よりも「ps(ピコ秒)のジッタ」の方が直感的に扱いやすいことが多いので、両者の変換は実務上とても重要です。
積分位相ゆらぎ(RMS)
ある周波数オフセット範囲 $[f_1, f_2]$ にわたって位相雑音を積分すると、その帯域に含まれる位相ゆらぎの分散(RMS位相の2乗)が得られます。$\mathcal{L} = \tfrac12 S_\phi$ なので、
$$ \sigma_\phi^2 = \int_{f_1}^{f_2} S_\phi(f_m)\, df_m = 2\int_{f_1}^{f_2} \mathcal{L}(f_m)\, df_m $$
ここで $\sigma_\phi$ は積分RMS位相ゆらぎ(単位 rad)です。両側帯波(キャリアの上下両方の裾)を考慮するため、係数 $2$ が掛かります。
RMSジッタへの換算
位相のゆらぎ $\sigma_\phi$(rad)を時間のゆらぎ(秒)に直すには、位相が $2\pi$ 進む間に時間が1周期 $T_0 = 1/f_0$ だけ進むことを使います。
$$ \sigma_t = \frac{\sigma_\phi}{2\pi f_0} $$
これが RMSジッタ(または時間ジッタ)です。たとえば $\sigma_\phi = 0.01$ rad の積分位相ゆらぎが、$f_0 = 1$ GHz の発振器にあれば、$\sigma_t = 0.01/(2\pi\times10^9) \approx 1.6$ ps のジッタに相当します。
ジッタの式から重要な設計指針が読み取れます。同じ位相ゆらぎ $\sigma_\phi$ でも、発振周波数 $f_0$ が高いほどジッタ $\sigma_t$ は小さくなります。一方、$1/f^2$・$1/f^3$ 領域では位相雑音そのものが $f_0$ に依存(共振器項に $f_0$ が入る)するので、両者を合わせて考える必要があります。
これで理論の枠組みが完成しました。次は Python で Leeson スペクトルを実際に描き、3つの領域の傾きを確認し、ジッタを数値積分してみましょう。
Python による実装と可視化
Leeson 式のスペクトルを描く
まず、Leeson 式をそのままコードに落とし込み、位相雑音スペクトル $\mathcal{L}(f_m)$ をオフセット周波数に対して描画します。代表的な VCO のパラメータ($f_0 = 2.4$ GHz、$Q = 20$、雑音指数 $F = 6$ dB、出力電力 $0$ dBm、フリッカコーナー $f_c = 100$ kHz)を使います。
import numpy as np
import matplotlib.pyplot as plt
# 物理定数
kB = 1.38e-23 # ボルツマン定数 [J/K]
T = 300.0 # 絶対温度 [K]
# VCOパラメータ
f0 = 2.4e9 # 発振周波数 [Hz]
Q = 20.0 # 共振器のQ値(オンチップLCタンクの典型値)
F_dB = 6.0 # 増幅器の雑音指数 [dB]
F = 10**(F_dB / 10) # 雑音指数(真数)
Ps_dBm = 0.0 # 出力電力 [dBm]
Ps = 10**(Ps_dBm / 10) * 1e-3 # 出力電力 [W]
fc = 100e3 # フリッカコーナー周波数 [Hz]
def leeson(fm, f0, Q, F, Ps, fc, kB, T):
"""Leeson式による位相雑音 L(fm) を返す(真数, /Hz)"""
resonator = 1 + (f0 / (2 * Q * fm))**2 # 共振器フィルタ項
flicker = 1 + fc / fm # フリッカ項
floor = F * kB * T / Ps # 熱雑音フロア
return 0.5 * floor * resonator * flicker
# オフセット周波数(対数スケール)
fm = np.logspace(2, 8, 2000) # 100 Hz 〜 100 MHz
L = leeson(fm, f0, Q, F, Ps, fc, kB, T)
L_dBc = 10 * np.log10(L) # dBc/Hz に変換
plt.figure(figsize=(9, 6))
plt.semilogx(fm, L_dBc, color='tab:blue', lw=2)
plt.xlabel('Offset frequency $f_m$ [Hz]')
plt.ylabel('Phase noise $\\mathcal{L}(f_m)$ [dBc/Hz]')
plt.title('Leeson Phase Noise Spectrum (f0=2.4 GHz, Q=20)')
plt.grid(True, which='both', alpha=0.3)
plt.tight_layout()
plt.savefig('leeson_spectrum.png', dpi=150, bbox_inches='tight')
plt.show()
このグラフから、位相雑音スペクトルの典型的な形状が読み取れます。キャリアに近い低オフセット側で位相雑音が高く、オフセットが大きくなるにつれて単調に減少し、最終的に平坦なフロアに漸近します。$10$ kHz オフセットあたりで $-100$ dBc/Hz 前後という、一般的なオンチップ VCO の数値に近い結果が得られています。横軸が対数なので、傾きが一定の直線区間が「べき乗領域」に対応していることも見て取れます。
3つの領域の傾きを分離して確認する
次に、Leeson 式の各因子(フリッカ込みの全体、共振器項のみ、フロアのみ)を分解して描き、$1/f^3$・$1/f^2$・平坦の3領域がどこで切り替わるかを可視化します。傾きの基準線($-30$, $-20$, $0$ dB/decade)も重ねます。
import numpy as np
import matplotlib.pyplot as plt
kB, T = 1.38e-23, 300.0
f0, Q, F = 2.4e9, 20.0, 10**(6.0/10)
Ps = 1e-3 # 0 dBm
fc = 100e3
fm = np.logspace(2, 8, 2000)
floor = F * kB * T / Ps
# 各成分
L_full = 0.5 * floor * (1 + (f0/(2*Q*fm))**2) * (1 + fc/fm) # 全体
L_white = 0.5 * floor * (1 + (f0/(2*Q*fm))**2) # フリッカ無し
L_flat = 0.5 * floor * np.ones_like(fm) # フロアのみ
plt.figure(figsize=(9, 6))
plt.semilogx(fm, 10*np.log10(L_full), lw=2, label='Full Leeson')
plt.semilogx(fm, 10*np.log10(L_white), lw=1.5, ls='--', label='No flicker (1/f^2 + floor)')
plt.semilogx(fm, 10*np.log10(L_flat), lw=1.5, ls=':', label='Thermal floor')
# 境界周波数の目印
f_corner_res = f0 / (2*Q) # 1/f^2 -> floor の境界
plt.axvline(fc, color='gray', ls='-.', alpha=0.6)
plt.axvline(f_corner_res, color='black', ls='-.', alpha=0.6)
plt.text(fc, -50, ' $f_c$ (flicker corner)', rotation=90, va='bottom', fontsize=9)
plt.text(f_corner_res, -50, ' $f_0/2Q$', rotation=90, va='bottom', fontsize=9)
plt.xlabel('Offset frequency $f_m$ [Hz]')
plt.ylabel('Phase noise [dBc/Hz]')
plt.title('Decomposition of the Leeson Spectrum')
plt.legend(loc='upper right')
plt.grid(True, which='both', alpha=0.3)
plt.tight_layout()
plt.savefig('leeson_regions.png', dpi=150, bbox_inches='tight')
plt.show()
この分解図から、Leeson 式の構造が一目で分かります。フリッカ項を外した破線(白色雑音 + 共振器)は、$f_0/2Q$ より低オフセットで $-20$ dB/decade の傾き($1/f^2$)を示し、それより高オフセットで平坦なフロアに落ち着きます。フリッカを加えた実線は、フリッカコーナー $f_c$ より低オフセットで実線が破線から立ち上がり、傾きが $-30$ dB/decade($1/f^3$)に急峻化します。2本の縦線($f_c$ と $f_0/2Q$)がちょうど3領域の境界に一致していることが確認でき、導出で述べた「境界周波数」の意味が視覚的に裏付けられます。
$Q$ 値を変えたときの位相雑音
Leeson 式の最大の設計含意は「$Q$ を上げれば位相雑音が下がる」という点です。これを定量的に確認するため、$Q$ を 10, 20, 50, 100 と変えてスペクトルを比較します。
import numpy as np
import matplotlib.pyplot as plt
kB, T = 1.38e-23, 300.0
f0, F, Ps, fc = 2.4e9, 10**(6.0/10), 1e-3, 100e3
fm = np.logspace(2, 8, 2000)
plt.figure(figsize=(9, 6))
for Q in [10, 20, 50, 100]:
L = 0.5 * (F*kB*T/Ps) * (1 + (f0/(2*Q*fm))**2) * (1 + fc/fm)
plt.semilogx(fm, 10*np.log10(L), lw=2, label=f'Q = {Q}')
plt.xlabel('Offset frequency $f_m$ [Hz]')
plt.ylabel('Phase noise $\\mathcal{L}(f_m)$ [dBc/Hz]')
plt.title('Effect of Resonator Q on Phase Noise')
plt.legend()
plt.grid(True, which='both', alpha=0.3)
plt.tight_layout()
plt.savefig('leeson_Q_effect.png', dpi=150, bbox_inches='tight')
plt.show()
このグラフから、$Q$ を2倍にすると $1/f^2$・$1/f^3$ 領域の位相雑音が約 $6$ dB($=20\log_{10}2 \times 2$、つまり $1/Q^2$ ぶん)下がることが読み取れます。たとえば $Q=10$ と $Q=100$ を比べると、低オフセット領域で約 $20$ dB の差があり、これは $Q$ 比 $10$ の2乗($100$ 倍 $=20$ dB)に対応します。一方、高オフセットの平坦フロアは $Q$ に依存しないため、4本の曲線が同じ高さに収束します。これは導出で見た通り、フロアは共振器項が効かない領域だからです。高い $Q$ の水晶振動子($Q \sim 10^4$〜$10^6$)が、オンチップ LC 共振器より圧倒的に低位相雑音を実現できる理由がここにあります。
位相雑音からジッタを積分する
設計の最終段では、位相雑音スペクトルを積分してRMSジッタを求めます。指定したオフセット範囲で $S_\phi = 2\mathcal{L}$ を数値積分し、RMS位相ゆらぎ、そして時間ジッタへと換算します。
import numpy as np
kB, T = 1.38e-23, 300.0
f0, Q, F, Ps, fc = 2.4e9, 20.0, 10**(6.0/10), 1e-3, 100e3
def leeson(fm):
return 0.5 * (F*kB*T/Ps) * (1 + (f0/(2*Q*fm))**2) * (1 + fc/fm)
# 積分範囲: 1 kHz 〜 10 MHz(通信系で代表的な区間)
f1, f2 = 1e3, 10e6
fm = np.logspace(np.log10(f1), np.log10(f2), 100000)
# S_phi = 2 * L を台形則で積分 -> RMS位相の2乗 [rad^2]
S_phi = 2 * leeson(fm)
sigma_phi2 = np.trapz(S_phi, fm)
sigma_phi = np.sqrt(sigma_phi2) # RMS位相 [rad]
sigma_t = sigma_phi / (2 * np.pi * f0) # RMSジッタ [s]
print(f"積分RMS位相ゆらぎ : {sigma_phi:.4e} rad ({np.degrees(sigma_phi):.4f} deg)")
print(f"RMSジッタ : {sigma_t*1e15:.2f} fs")
print(f"積分位相雑音(dBc) : {10*np.log10(sigma_phi2/2):.2f} dBc")
このコードを実行すると、$1$ kHz〜$10$ MHz の帯域で積分したRMS位相ゆらぎが約 $0.01$ rad(おおむね $0.5$ 度程度)、RMSジッタが数百フェムト秒のオーダーで得られます。出力された数値から、位相雑音という周波数領域の量が、時間領域では「波のピーク位置がどれだけ揺らぐか」という具体的なジッタに換算できることが分かります。積分範囲を広げると(特に低オフセット側に $1/f^3$ 領域を含めると)位相ゆらぎは急増するため、どの帯域で積分するかがジッタ評価では本質的に重要です。
時間波形で位相雑音を「見る」
最後に、位相雑音を時間領域のシミュレーションで再現してみましょう。Leeson スペクトルに従う位相ゆらぎ $\phi(t)$ を生成し、それを乗せた発振波形 $V_0\cos(2\pi f_0 t + \phi(t))$ を理想波形と比較します。位相系列はスペクトルを整形した白色雑音から作ります。
import numpy as np
import matplotlib.pyplot as plt
# シミュレーションのサンプリング(発振波形を見やすくするため低い f0 を使う)
f0 = 10e6 # 表示用に 10 MHz
fs = 1e9 # サンプリング周波数 1 GHz
N = 2**16
t = np.arange(N) / fs
# 位相ゆらぎ phi(t) を 1/f^2 寄りのスペクトルで生成
# 白色雑音を周波数領域で 1/f で重み付け -> 積分性の位相ノイズ
rng = np.random.default_rng(0)
white = rng.standard_normal(N)
W = np.fft.rfft(white)
freqs = np.fft.rfftfreq(N, 1/fs)
freqs[0] = freqs[1] # DC のゼロ割を回避
shape = 1.0 / freqs # 1/f 重み -> 位相は 1/f^2 スペクトル
phi = np.fft.irfft(W * shape, n=N)
phi *= 0.05 / np.std(phi) # 位相ゆらぎの大きさを調整 [rad]
# 理想波形と位相雑音付き波形
v_ideal = np.cos(2*np.pi*f0*t)
v_noisy = np.cos(2*np.pi*f0*t + phi)
# 時間波形(拡大表示)
plt.figure(figsize=(9, 4))
sl = slice(0, 400)
plt.plot(t[sl]*1e9, v_ideal[sl], label='Ideal', lw=1.2)
plt.plot(t[sl]*1e9, v_noisy[sl], label='With phase noise', lw=1.2, alpha=0.8)
plt.xlabel('Time [ns]')
plt.ylabel('Amplitude')
plt.title('Oscillator Waveform: Ideal vs. Phase-Noisy')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('leeson_waveform.png', dpi=150, bbox_inches='tight')
plt.show()
この時間波形を見ると、位相雑音付きの波形(オレンジ)が理想波形(青)に対して、時間が進むにつれてゼロ交差のタイミングが少しずつずれていく様子が分かります。振幅はほぼ一定ですが、波のピークが来る位置が左右に「呼吸」するように揺らいでいます。これがまさに、冒頭で述べた「メトロノームのタイミングのふらつき」であり、スペクトル上の裾野と同じ現象を時間領域から見たものです。
生成波形のスペクトルを確認する
時間波形が本当にキャリアの周りに裾を持つことを、FFT でスペクトルを計算して確認します。
import numpy as np
import matplotlib.pyplot as plt
f0, fs, N = 10e6, 1e9, 2**16
t = np.arange(N) / fs
rng = np.random.default_rng(0)
white = rng.standard_normal(N)
W = np.fft.rfft(white)
freqs = np.fft.rfftfreq(N, 1/fs); freqs[0] = freqs[1]
phi = np.fft.irfft(W / freqs, n=N); phi *= 0.05/np.std(phi)
v_noisy = np.cos(2*np.pi*f0*t + phi)
v_ideal = np.cos(2*np.pi*f0*t)
# 窓関数をかけてスペクトルを計算
win = np.hanning(N)
def spectrum(v):
V = np.fft.rfft(v*win)
psd = 20*np.log10(np.abs(V) + 1e-12)
return psd - psd.max() # ピークを 0 dB に規格化
f = np.fft.rfftfreq(N, 1/fs)
plt.figure(figsize=(9, 6))
plt.plot(f/1e6, spectrum(v_ideal), label='Ideal', lw=1.2)
plt.plot(f/1e6, spectrum(v_noisy), label='With phase noise', lw=1.0, alpha=0.85)
plt.xlim((f0-2e6)/1e6, (f0+2e6)/1e6)
plt.ylim(-100, 5)
plt.xlabel('Frequency [MHz]')
plt.ylabel('Normalized PSD [dB]')
plt.title('Spectrum: Ideal Carrier vs. Phase-Noisy Carrier')
plt.legend()
plt.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('leeson_psd.png', dpi=150, bbox_inches='tight')
plt.show()
このスペクトル図から、理想キャリア(青)が $10$ MHz にほぼデルタ関数状の鋭いピークを持つのに対し、位相雑音付き(オレンジ)はキャリアの両側に裾野(スカート)が広がっていることがはっきり分かります。窓関数で漏れを抑えてもなお残るこの裾こそが位相雑音であり、キャリアから離れるほど低くなる様子は、Leeson スペクトルで描いた $\mathcal{L}(f_m)$ の右肩下がりの形状と定性的に一致します。時間領域・周波数領域の両方から同じ現象を確認できたことで、位相雑音という概念が立体的に理解できたはずです。
まとめ
本記事では、VCO(電圧制御発振器)の位相雑音と、それを設計パラメータと結びつける Leeson 式について、定義から導出、Python 実装まで解説しました。
- 位相雑音は発振器の位相ゆらぎ $\phi(t)$ が生む現象で、スペクトル上ではキャリアの裾野、時間領域ではジッタとして観測される。観測量 $\mathcal{L}(f_m)$ と位相ゆらぎのスペクトル密度は $\mathcal{L}(f_m) = \tfrac12 S_\phi(f_m)$ で結ばれる。
- 共振器の $Q$ 値は急峻な位相傾斜によって増幅器の位相擾乱を周波数ゆらぎに変換しにくくし、位相雑音を $1/Q^2$ で改善する。
- Leeson 式 $\mathcal{L}(f_m) = \frac{1}{2}\frac{Fk_BT}{P_s}\left[1+\left(\frac{f_0}{2Qf_m}\right)^2\right]\left(1+\frac{f_c}{f_m}\right)$ は、熱雑音フロア・共振器フィルタ・フリッカ雑音の3つの因子からなり、$1/f^3$・$1/f^2$・平坦フロアの3領域を一つの式で説明する。
- 境界周波数は、フリッカコーナー $f_c$ と共振器の半値半幅 $f_0/(2Q)$ で決まる。
- 位相雑音を帯域積分すれば RMS位相ゆらぎ、さらに $\sigma_t = \sigma_\phi/(2\pi f_0)$ でジッタに換算できる。
Leeson 式は半経験的なモデルであり、現代の精密設計ではより厳密な時変雑音解析(Hajimiri-Lee の ISF 理論など)が使われますが、設計の第一歩として位相雑音の支配因子を見通すうえで今なお最も有用な枠組みです。
次のステップとして、以下の記事も参考にしてください。
- PLL(位相同期回路)の原理と設計を基礎から理解する — VCO の位相雑音がループ帯域でどう整形されるかを学べます
- スーパーヘテロダイン受信機の原理を理解する — 局部発振器の位相雑音が相反混合を通じて受信性能に効く例