コンステレーション図とEVM・IQ不平衡の理論と実装

衛星通信の地上局で受信した信号を復調器に通すと、画面に無数の点が散らばった図が表示されます。送信側が「ここに点を打ったはずだ」という理想の格子に対して、受信した点はわずかにずれ、ぼやけ、ときには全体がねじれて表示されます。このにじみ具合を一目で示すのが「コンステレーション図(信号空間ダイアグラム)」であり、にじみの大きさを 1 つの数値に凝縮したのが「EVM(Error Vector Magnitude、誤差ベクトル振幅)」です。通信機器の試験室では、スペクトラムアナライザやベクトル信号解析器の画面にこのコンステレーション図と EVM 値が常時表示され、「送信機が規格を満たしているか」「受信した信号がどれだけ劣化しているか」を判断する最初の指標として使われています。

なぜこの 2 つを学ぶのでしょうか。たとえば、あなたが設計した QAM 送信機の出力を測定したら、コンステレーションの点が左右に伸びた楕円状に広がっていたとします。これは雑音でしょうか、それとも回路の不具合でしょうか。実は「広がり方の形」を見れば原因が切り分けられます。全方向に均等にぼやけていれば熱雑音(AWGN)、特定の方向に伸びていれば I チャネルと Q チャネルの利得バランスの崩れ(IQ 振幅不平衡)、格子が平行四辺形にゆがんでいれば I 軸と Q 軸が直交していない(直交誤差)、点が円弧状に流れていれば局部発振器の位相雑音 — というように、劣化の種類ごとに固有の「指紋」がコンステレーション図に現れるのです。

EVM とコンステレーション図を理解すると、以下のような場面で見通しが格段に良くなります。

  • 送信機・受信機の品質評価: 3GPP(LTE/5G)や DVB-S2X などの通信規格は、送信機の EVM に上限値(たとえば 64QAM で 8%)を定めています。EVM を測れば規格適合性を定量的に判定できます
  • 故障診断とキャリブレーション: コンステレーションの歪み方から IQ 不平衡や位相雑音といった具体的なハードウェア起因を特定し、補償回路のパラメータを調整できます
  • リンク設計の指標: EVM は SNR と直接結びついており、変調方式ごとのビット誤り率(BER)を見積もる橋渡しになります
  • 適応変調の判断材料: 受信品質に応じて変調多値数を切り替える適応変調(ACM)では、EVM 相当の品質指標がモード選択のトリガになります

本記事の内容

  • コンステレーション図の意味と、誤差ベクトルの幾何学的な捉え方
  • EVM の定義(誤差電力と参照電力の比)と、複数の規格化方法
  • EVM と SNR、EVM と BER の関係式の導出
  • IQ 振幅不平衡・直交誤差を 2×2 行列でモデル化し、理想シンボルにかかる線形変換を導く
  • 位相雑音をランダムウォーク位相過程として表現する方法
  • Python 実装: 16QAM / QPSK に AWGN・IQ 不平衡・位相雑音を順に加え、コンステレーションの崩れ方と EVM の増加を対応づける可視化

前提知識

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

コンステレーション図とは

複素平面に打たれた点としてのシンボル

ディジタル変調では、送りたいビット列をいくつかのまとまり(シンボル)に区切り、各シンボルを「振幅と位相の組」に対応させて電波に乗せます。たとえば QPSK なら 2 ビットを 4 通りの位相に、16QAM なら 4 ビットを 16 通りの「振幅と位相の組」に割り当てます。ここで重要なのは、「振幅と位相の組」は複素平面上の 1 点と完全に同じ情報を持つということです。振幅を $A$、位相を $\theta$ とすれば、複素数 $A e^{j\theta} = A\cos\theta + jA\sin\theta$ の実部が同相成分(I 成分)、虚部が直交成分(Q 成分)に対応します。

つまり、1 つのシンボルは複素平面(I-Q 平面)上の 1 点で表せます。送信機が使う全シンボルを複素平面に打点した図を コンステレーション図(信号空間ダイアグラム) と呼びます。星座(constellation)になぞらえた呼び名で、16QAM なら 4×4 の格子状に 16 個の星が並びます。

イメージとしては、ダーツの的を思い浮かべてください。送信側は「ここを狙う」という理想の的の位置(理想シンボル点)を決めています。受信側で観測される点は、雑音や回路の不完全さによって的の中心から少しずれた場所に着弾します。何度も投げて着弾点を重ねると、的の周りに点の雲ができます。この雲の散らばり具合こそが信号品質の可視化であり、雲が小さく的の中心に集中しているほど良い信号です。

誤差ベクトルという見方

受信したシンボル点を複素数 $z$、本来あるべき理想シンボル点を $s$ とすると、両者の差

$$ \bm{e} = z – s $$

誤差ベクトル(error vector) と呼びます。これは「的の中心から着弾点へ向かう矢印」に相当します。誤差ベクトルが短いほど受信品質が良く、長いほど劣化が大きいことを意味します。

ここで大切なのは、誤差ベクトルが複素数(=平面上のベクトル)なので、「大きさ」だけでなく「向き」も情報を持つという点です。後で見るように、雑音は誤差ベクトルを全方向にランダムに散らしますが、IQ 不平衡や位相雑音は誤差ベクトルを特定の方向に偏らせます。この「向きの偏り」を読み取ることが、コンステレーション図による故障診断の本質です。

コンステレーション図が「点の散らばり」を視覚的に示すものだとわかったところで、この散らばりを 1 つの数値に凝縮する指標 — EVM を定義しましょう。

EVM の定義

誤差電力と参照電力の比

コンステレーション図は直感的ですが、「どれくらい悪いのか」を 1 つの数値で言いたい場面が多くあります。たとえば規格適合の判定や、2 つの送信機の比較です。そこで、たくさんのシンボルにわたる誤差ベクトルの大きさを平均し、信号の大きさで規格化したものが EVM です。

直感的には、EVM は「平均してどれくらい的の中心からずれているかを、的の大きさで割った割合」です。同じ 1 mm のずれでも、的が小さければ深刻、大きければ些細 — この相対性を表現するために規格化します。

$N$ 個のシンボルを観測し、$k$ 番目の受信シンボルを $z_k$、対応する理想シンボルを $s_k$ とします。誤差ベクトルは $\bm{e}_k = z_k – s_k$ です。EVM は次のように定義されます。

$$ \begin{equation} \mathrm{EVM}_{\mathrm{rms}} = \sqrt{\frac{\dfrac{1}{N}\displaystyle\sum_{k=1}^{N} |z_k – s_k|^2}{\dfrac{1}{N}\displaystyle\sum_{k=1}^{N} |s_k|^2}} \end{equation} $$

分子は 平均誤差電力、分母は 平均参照電力(理想シンボルの平均電力)です。電力は振幅の 2 乗なので、平方根を取ることで「振幅の比」に戻しています。EVM は無次元量で、しばしば百分率(%)で表します。たとえば EVM = 5% なら、誤差ベクトルの実効値が理想信号の実効振幅の 5% であることを意味します。

規格化方法のバリエーション

分母の「参照電力」をどう取るかには、いくつかの流儀があります。最も一般的なのは上記のように 全シンボルの平均電力 で割る方法(RMS 規格化)です。一方で、分母を 最外周シンボルのピーク電力 で割る定義もあり、これは規格によって使い分けられます。本記事では断りのない限り平均電力による RMS 規格化を用います。

理想シンボルの集合が決まっていれば平均参照電力は定数なので、$P_{\mathrm{ref}} = \frac{1}{N}\sum |s_k|^2$ と書けば、

$$ \mathrm{EVM}_{\mathrm{rms}} = \frac{1}{\sqrt{P_{\mathrm{ref}}}}\sqrt{\frac{1}{N}\sum_{k=1}^{N}|z_k – s_k|^2} $$

とシンプルに表せます。分子の平方根の中身が「誤差ベクトルの実効値の 2 乗(=誤差の分散に相当)」であることに注目してください。EVM はまさに「誤差の標準偏差を信号振幅で割った量」なのです。

EVM を定義できたので、次に EVM が通信工学のもう一つの基本指標である SNR とどう結びつくかを見ていきましょう。両者は本質的に同じものを別の角度から見ています。

EVM と SNR の関係

誤差を雑音とみなす

EVM の分子(平均誤差電力)と分母(平均参照電力)は、それぞれ雑音電力と信号電力に相当します。もし誤差ベクトルが純粋に加法性白色ガウス雑音(AWGN)だけによって生じているなら、平均誤差電力は雑音電力 $P_n$、平均参照電力は信号電力 $P_s$ そのものです。SNR は信号電力と雑音電力の比なので、

$$ \mathrm{SNR} = \frac{P_s}{P_n} = \frac{P_{\mathrm{ref}}}{\frac{1}{N}\sum|z_k – s_k|^2} $$

一方、EVM の 2 乗は誤差電力を参照電力で割ったものなので、

$$ \mathrm{EVM}_{\mathrm{rms}}^2 = \frac{\frac{1}{N}\sum|z_k – s_k|^2}{P_{\mathrm{ref}}} = \frac{P_n}{P_s} = \frac{1}{\mathrm{SNR}} $$

ここから、EVM と SNR の間に極めて簡潔な逆数関係が成り立つことがわかります。

$$ \begin{equation} \mathrm{EVM}_{\mathrm{rms}} = \frac{1}{\sqrt{\mathrm{SNR}}}, \qquad \mathrm{SNR} = \frac{1}{\mathrm{EVM}_{\mathrm{rms}}^2} \end{equation} $$

これをデシベル表記に直すと、両辺の対数を取って $10\log_{10}$ を掛けることで、

$$ \mathrm{SNR}\,[\mathrm{dB}] = -20\log_{10}\left(\mathrm{EVM}_{\mathrm{rms}}\right) $$

が得られます。振幅比である EVM は対数で $20\log_{10}$(電力比なら $10\log_{10}$ ですが、EVM は振幅比なので係数 20)になる点に注意してください。たとえば EVM = 10%(=0.1)なら $\mathrm{SNR} = -20\log_{10}(0.1) = 20$ dB、EVM = 1% なら 40 dB です。EVM が小さいほど SNR が大きい(高品質)という、直感に合う関係になっています。

雑音以外の劣化があるとき

実際の EVM には、AWGN だけでなく IQ 不平衡や位相雑音、非線形歪みなど多くの劣化が含まれます。これらの劣化が互いに独立で、それぞれが誤差電力 $P_{n,1}, P_{n,2}, \dots$ を加えるとみなせば、誤差電力は加算されるので、

$$ \mathrm{EVM}_{\mathrm{total}}^2 = \mathrm{EVM}_{\mathrm{AWGN}}^2 + \mathrm{EVM}_{\mathrm{IQ}}^2 + \mathrm{EVM}_{\mathrm{PN}}^2 + \cdots $$

のように、各劣化要因の EVM の 2 乗(=寄与する誤差電力の割合)が足し合わされます。これは、独立な誤差成分の分散が加算的であることの帰結です。この「2 乗和の関係」は実用上とても便利で、測定した総合 EVM を要因ごとに分解したり、逆に各要因の許容値から総合 EVM を見積もったりするのに使えます。

EVM が雑音指標の SNR と結びつくことがわかりました。では、その先にある最終的な性能指標 — ビット誤り率(BER)とはどう関係するのでしょうか。

EVM と BER の関係

受信判定の誤りとしての BER

通信システムの究極の品質は、何ビットに 1 つ誤るかという BER で測られます。コンステレーション図でいえば、受信点が雑音で散らばった結果、本来のシンボル領域(判定境界で区切られた領域)からはみ出して隣のシンボルと誤判定されると、ビット誤りが生じます。点の雲が判定境界をまたぐ確率が BER に直結するのです。

EVM が SNR の逆数で表せることを使えば、SNR から BER を求める既知の公式を EVM で書き直せます。$M$ 値の QAM($M = 4, 16, 64, \dots$)に対するシンボル誤り率は、シンボルあたりの SNR を $\gamma_s$ として、近似的に

$$ P_s \approx 4\left(1 – \frac{1}{\sqrt{M}}\right) Q\!\left(\sqrt{\frac{3\gamma_s}{M-1}}\right) $$

で与えられます。ここで $Q(x) = \frac{1}{\sqrt{2\pi}}\int_x^\infty e^{-t^2/2}\,dt$ は標準正規分布の上側裾確率です。SNR を EVM で置き換えるために、$\gamma_s = 1/\mathrm{EVM}_{\mathrm{rms}}^2$ を代入すると、

$$ P_s \approx 4\left(1 – \frac{1}{\sqrt{M}}\right) Q\!\left(\sqrt{\frac{3}{(M-1)\,\mathrm{EVM}_{\mathrm{rms}}^2}}\right) $$

が得られます。さらに、グレイ符号化されたシンボルでは 1 シンボルあたり $\log_2 M$ ビットを運び、隣接シンボル誤りが 1 ビット誤りに対応するため、ビット誤り率は近似的に

$$ \begin{equation} P_b \approx \frac{P_s}{\log_2 M} \approx \frac{4}{\log_2 M}\left(1 – \frac{1}{\sqrt{M}}\right) Q\!\left(\sqrt{\frac{3}{(M-1)\,\mathrm{EVM}_{\mathrm{rms}}^2}}\right) \end{equation} $$

と表せます。この式の意味するところは重要です。EVM が大きくなる($\mathrm{EVM}^2$ が増える)と $Q$ 関数の引数が小さくなり、$Q$ 関数は単調減少なので BER が増加します。また、多値数 $M$ が大きいほど分母の $(M-1)$ が効いて引数が小さくなり、同じ EVM でも BER が悪化します。これは「16QAM より 64QAM の方がシンボル間隔が狭く、同じ雑音でも誤りやすい」という直感と一致します。

EVM 規格値の意味

この関係から、規格が定める EVM 上限値の意味が読み取れます。たとえば 64QAM で BER を $10^{-3}$ 以下に抑えたいとき、上式を逆算すると必要な EVM の上限が定まります。3GPP が 64QAM の送信機 EVM を 8% に制限しているのは、こうした BER 要求から逆算された数値です。逆に言えば、EVM を測るだけで、実際に長時間ビットを流さなくても BER をある程度予測できるのが EVM の実用的な強みです。

ここまでは「誤差ベクトルが全方向に均等に散らばる」雑音による劣化を念頭に置いてきました。しかし、実際のハードウェアにはもっと構造的な歪みが存在します。次に、I チャネルと Q チャネルのアンバランスが生む IQ 不平衡を、行列を使ってモデル化しましょう。

IQ 不平衡のモデル化

IQ 変調器の構造から生じる歪み

IQ 直交変調器は、I 成分を $\cos$ 搬送波に、Q 成分を $\sin$ 搬送波(理想的には $\cos$ から正確に 90° 位相がずれた波)に乗せて足し合わせます。ところが現実の回路では、(1) I 経路と Q 経路の利得(増幅率)がわずかに異なり、(2) 2 つの搬送波の位相差が正確に 90° にならない、という 2 種類の不完全さが生じます。前者を 振幅不平衡(gain imbalance)、後者を 直交誤差(quadrature error / phase imbalance) と呼びます。

直感的には、I-Q 平面の「目盛り」が歪むと考えてください。振幅不平衡は I 軸方向と Q 軸方向で目盛りの幅が違う状態(縦横比の崩れ)、直交誤差は I 軸と Q 軸が直角からずれて斜交座標になる状態(平行四辺形へのゆがみ)です。理想の正方格子が、これらによって長方形やひし形に変形します。

振幅不平衡と直交誤差の数式化

理想的なベースバンド信号を $s = s_I + j s_Q$($s_I$ が I 成分、$s_Q$ が Q 成分)とします。振幅不平衡を表すために、I 経路の利得を $(1+\epsilon)$、Q 経路の利得を $(1-\epsilon)$ と置きます($\epsilon$ は小さな実数で、$\epsilon=0$ なら平衡)。また、直交誤差として Q 搬送波が理想の 90° から $\phi$ だけずれているとします。

理想では I 成分は $\cos(\omega t)$、Q 成分は $\sin(\omega t)$ に乗りますが、直交誤差があると Q 成分は $\sin(\omega t + \phi)$ に乗ります。この位相ずれを加法定理で展開すると、

$$ \sin(\omega t + \phi) = \sin(\omega t)\cos\phi + \cos(\omega t)\sin\phi $$

つまり、Q 成分の一部 $\sin\phi$ が I 軸方向($\cos$ 成分)に漏れ込みます。利得不平衡もあわせて、復調後の I 成分 $x_I$ と Q 成分 $x_Q$ は、理想成分 $s_I, s_Q$ の線形結合として書けます。慣習的な表記では、

$$ \begin{aligned} x_I &= (1+\epsilon)\, s_I \\ x_Q &= (1-\epsilon)\left(s_Q\cos\phi + s_I\sin\phi\right) \end{aligned} $$

のようなクロストークが生じます。ここで重要なのは、$x_I, x_Q$ が $s_I, s_Q$ の 線形変換 になっている点です。線形変換は行列で書けます。

2×2 行列による表現

上の関係を行列形式でまとめると、IQ 不平衡は理想ベクトル $(s_I, s_Q)^\top$ に 2×2 の実行列 $\bm{G}$ を掛ける変換として表せます。標準的なモデルでは、振幅不平衡 $\epsilon$ と直交誤差 $\phi$ を対称に配分して、

$$ \begin{equation} \begin{pmatrix} x_I \\ x_Q \end{pmatrix} = \underbrace{\begin{pmatrix} (1+\epsilon)\cos\dfrac{\phi}{2} & -(1+\epsilon)\sin\dfrac{\phi}{2} \\[2mm] -(1-\epsilon)\sin\dfrac{\phi}{2} & (1-\epsilon)\cos\dfrac{\phi}{2} \end{pmatrix}}_{\bm{G}} \begin{pmatrix} s_I \\ s_Q \end{pmatrix} \end{equation} $$

この行列 $\bm{G}$ が、コンステレーションにかかる線形歪みの正体です。各パラメータの効果を分けて見ると理解しやすくなります。$\phi = 0$(直交誤差なし)の場合、$\bm{G}$ は対角行列 $\mathrm{diag}(1+\epsilon,\ 1-\epsilon)$ になり、I 軸方向に $(1+\epsilon)$ 倍、Q 軸方向に $(1-\epsilon)$ 倍する 異方的なスケーリング です。正方格子が長方形に伸縮します。一方、$\epsilon=0$(振幅平衡)で $\phi \neq 0$ の場合、非対角成分 $-\sin(\phi/2)$ が現れ、I と Q が互いに混ざり合う せん断(shear) が生じます。正方格子が平行四辺形にゆがみます。

複素表現と像信号

IQ 不平衡はもう一つの見方ができます。受信複素信号 $x = x_I + j x_Q$ を、理想信号 $s$ とその複素共役 $s^*$ の線形結合で書く表現です。線形代数的に、任意の実 2×2 行列による変換は

$$ x = \alpha\, s + \beta\, s^* $$

の形に書き換えられます。ここで $\alpha, \beta$ は不平衡パラメータ $\epsilon, \phi$ から定まる複素係数です。第 1 項 $\alpha s$ は本来の信号(わずかに減衰・回転)、第 2 項 $\beta s^*$ が 像信号(image) で、これが IQ 不平衡特有の劣化です。共役 $s^*$ は複素平面で実軸に関する鏡像なので、像信号はシンボルを反転させた成分を混入させます。$\beta$ が大きいほど像が強く、コンステレーションが歪みます。この「像の混入比」$|\beta/\alpha|$ は イメージ抑圧比(IRR) として測定され、IQ 不平衡の品質指標になります。

IQ 不平衡は「決まった行列がかかる」決定論的な歪みでした。対照的に、次に扱う位相雑音は時々刻々ランダムに変化する確率的な歪みです。両者の違いがコンステレーション図にどう現れるかに注目しながら見ていきましょう。

位相雑音のモデル化

発振器のゆらぎとしての位相雑音

送受信機は、ベースバンド信号を高周波に変換するために局部発振器(LO)が生成する正弦波を使います。理想の発振器は完全に一定の周波数で振動しますが、現実の発振器はトランジスタの熱雑音などにより、瞬時の位相が小刻みにゆらぎます。このゆらぎが 位相雑音(phase noise) です。

直感的には、時計の針が一定速度で回る代わりに、わずかに進んだり遅れたりしながら回っている状態を想像してください。針の角度(位相)が本来あるべき位置からじわじわとさまよいます。受信信号にこの位相ゆらぎ $\theta(t)$ が乗ると、複素信号は

$$ x(t) = s(t)\, e^{j\theta(t)} $$

のように、理想シンボル $s$ が時刻ごとに角度 $\theta(t)$ だけ回転します。回転なので、コンステレーション上では各点が原点を中心に円弧状に流れます。これが位相雑音の「指紋」です。雑音が放射状(半径方向)に散らすのに対し、位相雑音は接線方向(角度方向)に散らす点が決定的に異なります。

ランダムウォーク(ウィーナー過程)による表現

位相雑音の最も基本的なモデルは、位相がランダムウォーク(離散時間のウィーナー過程)に従うとするものです。各シンボル時刻 $k$ で、位相が前の時刻からランダムな増分 $\Delta\theta_k$ だけ変化すると考えます。

$$ \begin{equation} \theta_k = \theta_{k-1} + \Delta\theta_k, \qquad \Delta\theta_k \sim \mathcal{N}(0,\ \sigma_\Delta^2) \end{equation} $$

ここで増分 $\Delta\theta_k$ は平均 0、分散 $\sigma_\Delta^2$ の独立な正規乱数です。この $\theta_k$ は前の値を覚えている(記憶を持つ)過程である点が、各時刻で独立な AWGN とは本質的に異なります。

ランダムウォークの重要な性質は、初期位相を 0 とすると時刻 $k$ での位相が増分の和

$$ \theta_k = \sum_{i=1}^{k}\Delta\theta_i $$

になり、独立な正規分布の和はまた正規分布なので、$\theta_k \sim \mathcal{N}(0,\ k\sigma_\Delta^2)$ となることです。すなわち 位相のばらつき(分散)が時間とともに線形に増大 します。これは、針が長時間さまようほど本来の位置から離れていくことを意味します。短い観測区間ではコンステレーションの回転は小さく、長く観測すると点が大きく円弧を描いて広がります。

増分分散と発振器品質の対応

増分の標準偏差 $\sigma_\Delta$ は、発振器の品質と直接対応します。発振器の位相雑音は通常、搬送波からのオフセット周波数に対する電力スペクトル密度(dBc/Hz)で規定されます。ランダムウォークモデルでは、増分分散はおおよそ

$$ \sigma_\Delta^2 \approx 2\pi\,\beta_{\mathrm{3dB}}\, T_s $$

程度のオーダーで、発振器のローレンツ型スペクトルの線幅 $\beta_{\mathrm{3dB}}$ とシンボル周期 $T_s$ の積に比例します。線幅が広い(質の悪い)発振器ほど $\sigma_\Delta$ が大きく、シンボルレートが低い($T_s$ が大きい)ほど 1 シンボルあたりの位相ドリフトが大きくなります。これは、低シンボルレートのシステムほど位相雑音の影響を受けやすいという実務上の知見と一致します。

3 種類の劣化要因 — AWGN・IQ 不平衡・位相雑音 — のモデルが揃いました。これらが理想シンボルにどう作用するかをまとめると、受信信号は次のように書けます。

$$ z_k = \underbrace{\bm{G}\,(s_k)}_{\text{IQ不平衡}} \cdot \underbrace{e^{j\theta_k}}_{\text{位相雑音}} + \underbrace{n_k}_{\text{AWGN}} $$

(ここで $\bm{G}(s_k)$ は行列 $\bm{G}$ による I-Q 変換を複素数で表したもの)。それぞれが固有の歪みを与えるこの構造を、Python で実際にシミュレートして、コンステレーションの崩れ方と EVM の増加を目で確認しましょう。

Python による劣化シミュレーション

シンボル生成と EVM 計算の基盤

まず、16QAM と QPSK のシンボル集合を生成し、EVM を計算する基本的な関数を用意します。理想シンボルの平均電力で規格化し、定義通りに EVM を求めます。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(42)  # 再現性のための乱数シード

def qam16_constellation():
    """16QAMの理想シンボル集合(平均電力1に正規化)を返す"""
    levels = np.array([-3, -1, 1, 3])           # 各軸の振幅レベル
    I, Q = np.meshgrid(levels, levels)
    points = (I + 1j * Q).flatten()
    points /= np.sqrt(np.mean(np.abs(points)**2))  # 平均電力を1に正規化
    return points

def qpsk_constellation():
    """QPSKの理想シンボル集合(平均電力1に正規化)を返す"""
    points = np.array([1+1j, 1-1j, -1+1j, -1-1j])
    points /= np.sqrt(np.mean(np.abs(points)**2))
    return points

def compute_evm(rx, ref):
    """受信シンボルrxと理想シンボルrefからRMS EVM(%)を計算"""
    err_power = np.mean(np.abs(rx - ref)**2)   # 平均誤差電力
    ref_power = np.mean(np.abs(ref)**2)        # 平均参照電力
    return 100 * np.sqrt(err_power / ref_power)

このコードでは、16QAM を 4×4 の格子点として作り、平均電力が 1 になるよう正規化しています。正規化することで、異なる変調方式や劣化条件の EVM を公平に比較できます。compute_evm は定義式そのもので、誤差電力を参照電力で割って平方根を取り、百分率にしています。理想シンボルと受信シンボルを渡すだけで EVM が一意に定まる点が、この指標の扱いやすさを示しています。

AWGN による劣化

最初に、最も基本的な劣化である AWGN を加えます。指定した SNR(dB)から雑音分散を決め、複素ガウス雑音を加算します。理論上は EVM が $1/\sqrt{\mathrm{SNR}}$ に一致するはずなので、それを確認します。

def add_awgn(symbols, snr_db):
    """シンボルにSNR[dB]相当の複素ガウス雑音を加える"""
    snr_linear = 10**(snr_db / 10)
    sig_power = np.mean(np.abs(symbols)**2)
    noise_power = sig_power / snr_linear
    # 実部・虚部に等分配(各々 noise_power/2 の分散)
    noise = np.sqrt(noise_power / 2) * (rng.standard_normal(len(symbols))
                                        + 1j * rng.standard_normal(len(symbols)))
    return symbols + noise

# 16QAMシンボルを多数生成
ref16 = qam16_constellation()
N = 4000
tx = rng.choice(ref16, size=N)          # ランダムにシンボルを選ぶ

for snr_db in [25, 20, 15, 10]:
    rx = add_awgn(tx, snr_db)
    evm = compute_evm(rx, tx)
    theory = 100 / np.sqrt(10**(snr_db/10))   # 理論EVM = 1/sqrt(SNR)
    print(f"SNR={snr_db:2d}dB  EVM(測定)={evm:5.2f}%  EVM(理論)={theory:5.2f}%")

このループの出力では、各 SNR に対する測定 EVM と理論値 $100/\sqrt{\mathrm{SNR}}$ がほぼ一致します(たとえば SNR=20dB で約 10%、15dB で約 17.8%)。これは先に導いた関係式 $\mathrm{EVM} = 1/\sqrt{\mathrm{SNR}}$ がシミュレーションで再現されたことを意味します。SNR が下がるほど EVM が増え、雑音による誤差ベクトルが大きくなる様子が数値として確認できます。

IQ 不平衡による劣化

次に、IQ 不平衡を表す行列 $\bm{G}$ を適用します。振幅不平衡 $\epsilon$ と直交誤差 $\phi$ を引数に取り、複素シンボルに線形変換をかけます。

def apply_iq_imbalance(symbols, epsilon, phi_deg):
    """IQ不平衡(振幅不平衡epsilon, 直交誤差phi[deg])を複素シンボルに適用"""
    phi = np.deg2rad(phi_deg)
    sI, sQ = symbols.real, symbols.imag
    # 2x2行列 G による I-Q 変換
    g11 = (1 + epsilon) * np.cos(phi / 2)
    g12 = -(1 + epsilon) * np.sin(phi / 2)
    g21 = -(1 - epsilon) * np.sin(phi / 2)
    g22 = (1 - epsilon) * np.cos(phi / 2)
    xI = g11 * sI + g12 * sQ
    xQ = g21 * sI + g22 * sQ
    return xI + 1j * xQ

# 振幅不平衡のみ / 直交誤差のみ / 両方 を比較
cases = [
    ("振幅不平衡 eps=0.15", 0.15, 0.0),
    ("直交誤差 phi=15deg", 0.0, 15.0),
    ("両方 eps=0.1, phi=10deg", 0.1, 10.0),
]
for name, eps, phi in cases:
    rx = apply_iq_imbalance(tx, eps, phi)
    evm = compute_evm(rx, tx)
    print(f"{name:28s}  EVM={evm:5.2f}%")

この出力からは、IQ 不平衡だけでも無視できない EVM が生じることがわかります。振幅不平衡は I 軸と Q 軸で異なるスケーリングを与えるため格子が長方形に、直交誤差はせん断を与えるため格子が平行四辺形にゆがみます。重要なのは、AWGN と違ってこの誤差は決定論的(毎回同じ歪み)であり、雑音がなくても格子そのものが変形している点です。これが後の散布図で「点の雲が散る」のではなく「格子全体がずれる」形で現れます。

位相雑音による劣化

位相雑音はランダムウォークで生成します。増分の標準偏差を指定し、累積和で位相過程を作ってシンボルに乗じます。

def apply_phase_noise(symbols, sigma_delta_deg):
    """ランダムウォーク位相雑音(増分の標準偏差sigma_delta[deg])を適用"""
    sigma = np.deg2rad(sigma_delta_deg)
    dtheta = sigma * rng.standard_normal(len(symbols))  # 各時刻の位相増分
    theta = np.cumsum(dtheta)                            # 累積和=ランダムウォーク
    return symbols * np.exp(1j * theta)

for sigma_deg in [1.0, 2.0, 4.0]:
    rx = apply_phase_noise(tx, sigma_deg)
    evm = compute_evm(rx, tx)
    print(f"位相雑音 sigma_delta={sigma_deg:.1f}deg  EVM={evm:5.2f}%")

この出力では、増分標準偏差が大きいほど EVM が増えます。位相雑音は各シンボルを原点周りに回転させるため、誤差ベクトルが接線(角度)方向を向くのが特徴です。累積和を使っているため位相は時間とともにドリフトし、観測が進むにつれて回転量が増えていきます。外周のシンボル(振幅の大きい点)ほど同じ回転角でも変位が大きくなるため、16QAM の外側の点が内側より大きく流される点も後の散布図で確認できます。

コンステレーション図での比較

3 種類の劣化が散布図上でどう異なるかを並べて可視化します。これが本記事の核心となる図です。

fig, axes = plt.subplots(2, 2, figsize=(11, 11))

scenarios = [
    ("AWGN only (SNR=20dB)", lambda s: add_awgn(s, 20)),
    ("IQ imbalance (eps=0.15, phi=12deg)",
     lambda s: apply_iq_imbalance(s, 0.15, 12.0)),
    ("Phase noise (sigma=3deg)", lambda s: apply_phase_noise(s, 3.0)),
    ("All combined", lambda s: apply_phase_noise(
        apply_iq_imbalance(add_awgn(s, 22), 0.1, 8.0), 2.0)),
]

for ax, (title, func) in zip(axes.flatten(), scenarios):
    rx = func(tx)
    evm = compute_evm(rx, tx)
    ax.scatter(rx.real, rx.imag, s=4, alpha=0.3, color='cyan')
    ax.scatter(ref16.real, ref16.imag, s=80, marker='x',
               color='red', linewidths=2, label='ideal')
    ax.set_title(f"{title}\nEVM = {evm:.2f}%", fontsize=11)
    ax.set_xlabel("I"); ax.set_ylabel("Q")
    ax.set_xlim(-2, 2); ax.set_ylim(-2, 2)
    ax.set_aspect('equal'); ax.grid(alpha=0.3); ax.legend(loc='upper right')

plt.suptitle("16QAM Constellation under Different Impairments",
             fontsize=14, fontweight='bold')
plt.tight_layout()
plt.savefig('constellation_impairments.png', dpi=150, bbox_inches='tight')
plt.show()

この 4 枚の散布図から、各劣化の「指紋」が明確に読み取れます。左上の AWGN では、各理想点(赤い×)の周りに点が等方的な円形の雲となって広がります。これは雑音が全方向に均等に誤差ベクトルを散らすためです。右上の IQ 不平衡 では、点はほとんど散らばらず、代わりに格子全体が平行四辺形・長方形にゆがみ、理想点から系統的にずれます。左下の 位相雑音 では、点が原点を中心とした円弧(接線方向)に沿って流れ、外周の点ほど大きく弧を描きます。右下の 全要因合成 では、これらが重なり合い、にじみ・ゆがみ・回転が同時に現れます。同じ EVM 値でも原因によって図の形がまったく異なる、という本記事の中心メッセージが視覚的に確認できます。

劣化量と EVM の対応関係

最後に、各劣化パラメータを変化させたときに EVM がどう増えるかを定量的にプロットします。劣化要因ごとの感度を比較します。

fig, axes = plt.subplots(1, 3, figsize=(15, 4.5))

# (1) SNR vs EVM (理論と測定)
snr_range = np.arange(8, 31, 1)
evm_meas = [compute_evm(add_awgn(tx, s), tx) for s in snr_range]
evm_theo = 100 / np.sqrt(10**(snr_range/10))
axes[0].plot(snr_range, evm_theo, 'r-', label='theory 1/sqrt(SNR)')
axes[0].plot(snr_range, evm_meas, 'co', ms=4, label='simulated')
axes[0].set_xlabel("SNR [dB]"); axes[0].set_ylabel("EVM [%]")
axes[0].set_title("AWGN: EVM vs SNR"); axes[0].grid(alpha=0.3); axes[0].legend()

# (2) 直交誤差 phi vs EVM
phi_range = np.linspace(0, 20, 21)
evm_phi = [compute_evm(apply_iq_imbalance(tx, 0.0, p), tx) for p in phi_range]
axes[1].plot(phi_range, evm_phi, 'm.-')
axes[1].set_xlabel("quadrature error phi [deg]"); axes[1].set_ylabel("EVM [%]")
axes[1].set_title("IQ imbalance: EVM vs phi"); axes[1].grid(alpha=0.3)

# (3) 位相雑音 sigma vs EVM
sig_range = np.linspace(0, 6, 25)
evm_pn = [compute_evm(apply_phase_noise(tx, sg), tx) for sg in sig_range]
axes[2].plot(sig_range, evm_pn, 'g.-')
axes[2].set_xlabel("phase noise sigma_delta [deg]"); axes[2].set_ylabel("EVM [%]")
axes[2].set_title("Phase noise: EVM vs sigma"); axes[2].grid(alpha=0.3)

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

これら 3 つのグラフから、各劣化の EVM への寄与の仕方が読み取れます。左の SNR vs EVM では、測定値が理論曲線 $1/\sqrt{\mathrm{SNR}}$ にぴったり重なり、SNR が低い領域で EVM が急激に立ち上がります。中央の 直交誤差 vs EVM では、$\phi$ が大きくなるにつれて EVM がほぼ単調に増加し、わずか 10° 程度の直交誤差でも 10% 近い EVM を生むことがわかります。右の 位相雑音 vs EVM では、増分標準偏差 $\sigma_\Delta$ の増加とともに EVM が増えますが、ランダムウォークの累積性のため観測長に依存してばらつきが出ます。これらは「どの劣化要因がどれだけ EVM 予算を消費するか」を見積もる設計の基礎データになります。

QPSK でも同様に劣化を加えると、シンボル間隔が広いぶん同じ EVM でも誤判定が起きにくく、16QAM より頑健であることが確認できます。多値数とロバスト性のトレードオフが、コンステレーション図と EVM を通じて一貫して理解できるのです。

まとめ

本記事では、ディジタル変調の信号品質を可視化・定量化するコンステレーション図と EVM について、その定義から劣化要因のモデル化、Python による検証まで解説しました。

  • コンステレーション図 は各シンボルを複素平面上の点として表し、受信点の散らばり方から信号品質を視覚的に判断できます。理想点と受信点の差が 誤差ベクトル であり、その大きさだけでなく向きが劣化の原因を語ります
  • EVM は平均誤差電力を平均参照電力で割って平方根を取った量で、$\mathrm{EVM} = 1/\sqrt{\mathrm{SNR}}$ という簡潔な関係で SNR と結びつき、さらに $Q$ 関数を介して BER を予測できます
  • IQ 不平衡 は振幅不平衡 $\epsilon$ と直交誤差 $\phi$ による 2×2 行列の線形変換としてモデル化でき、格子を長方形・平行四辺形にゆがめます。複素表現では像信号 $\beta s^*$ の混入として現れます
  • 位相雑音 はランダムウォーク位相過程 $\theta_k = \theta_{k-1} + \Delta\theta_k$ として表され、シンボルを接線方向に回転させ、分散が時間とともに線形増大します
  • 雑音は等方的な雲、IQ 不平衡は格子のゆがみ、位相雑音は円弧状の流れ — 各劣化が固有の「指紋」をコンステレーション図に残すため、図の形から原因を切り分けられます

これらの指標は、送信機の規格適合判定、受信機のキャリブレーション、リンク設計、適応変調の判断など、通信システムの設計と運用のあらゆる場面で活躍します。とくに衛星通信では、増幅器の非線形歪みや大きなドップラーシフト、低い C/N といった厳しい条件下で EVM を管理することが、リンクを成立させる鍵になります。

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