1980年代のFMチューナーを分解すると、基板の上には金属シールドで囲まれたコイルとセラミックフィルタがずらりと並んでいます。ところが今のスマートフォンを開けても、そんな部品はどこにも見当たりません。数ミリ角のICが1個、アンテナのすぐ後ろに座っているだけです。この40年でいったい何が変わったのでしょうか。
答えの大きな部分が、受信機アーキテクチャの変更です。かつての主流だったスーパーヘテロダイン受信機は、RF信号をいったん中間周波数(IF)に落とし、そこで高いQ値のバンドパスフィルタを使ってチャネルを選び出していました。この「高Qのフィルタ」がシリコンの上に作れない部品の代表格で、外付けのSAWフィルタやセラミックフィルタが必要でした。これに対してダイレクトコンバージョン受信機(direct conversion receiver、別名ゼロIF受信機、ホモダイン受信機)は、RFを一段でいきなり0 Hz、つまりベースバンドまで落とします。すると必要なフィルタは「低域通過フィルタ」だけになり、これはオンチップのRC回路とオペアンプで作れます。外付け部品が消え、受信機がまるごとICに入るようになったのです。
この構成を理解すると、次のような場面で何が起きているかが読めるようになります。
- SDR(ソフトウェア無線)フロントエンド: 広帯域トランシーバICの多くはゼロIFです。受信データに乗っている「中心のスパイク」や「スペクトルの左右非対称なゴースト」が何なのか、原理から説明できるようになります
- スマートフォン・Wi-Fi・Bluetooth: マルチバンド対応のRFICはほぼ例外なくゼロIFか低IFです。バンドごとに外付けIFフィルタを持てないという実装上の制約が、アーキテクチャを決めています
- FMCWレーダー: 送信チャープと受信波を直接ミキシングしてビート周波数を得る構成は、まさにゼロIFです。近距離ターゲットのビート周波数が低いため、1/fノイズとDCオフセットが感度を直接決めます
- 計測器・ベクトル信号解析: IQ復調の残留誤差が測定確度の下限になるため、IQインバランス補正は必須の校正項目です
ただし、うまい話には代償があります。ゼロIFは「イメージ周波数フィルタが要らない」という巨大な利点と引き換えに、DCオフセット・1/fノイズ・IQインバランス・偶数次歪みという、スーパーヘテロダインでは深刻にならなかった4つの問題を抱え込みます。本記事では、この利点と代償の両方を数式レベルで導出し、Pythonで劣化を実測し、補正アルゴリズムで回復させるところまでを追いかけます。
まず、これから扱う受信機の全体像を1枚の絵で押さえておきましょう。
![ゼロIF受信機のブロック図。アンテナからバンド選択フィルタ・LNAを経て直交ミキサでI/Q2本に分かれ、低域通過フィルタ・VGA・ADCを通ってI[n]+jQ[n]の複素ベースバンドになる様子](https://disassemble-channel.com/wp-content/uploads/2026/08/direct-conversion-receiver-zero-if_01_concept_zeroif_block.png)
信号の流れは左から右へ一直線で、途中に中間周波数の段がありません。局部発振器の周波数が受信したいチャネルの中心 $f_c$ そのものに設定され、そこから $0^\circ$ と $90^\circ$ の2位相を作ってI枝・Q枝の2本のミキサを駆動している点が構成上の要です。ミキサの後ろにあるフィルタはすべて低域通過フィルタで、外付けの高Q共振器が1個も登場しないこと、そして最終的に得られる $I[n] + jQ[n]$ が複素ベースバンド信号そのものであることを、この図で確認しておいてください。図の下段に赤字で並べた4つの問題が、以降の各章のテーマになります。
本記事の内容
- 複素ベースバンド表現から見た直交ミキサの動作 — なぜ「複素数の掛け算」が周波数の平行移動になるのか
- イメージ周波数が自分自身に重なるという事実と、イメージ除去フィルタが不要になる理由
- DCオフセット(LO自己混合)の発生経路と、信号レベルに対する定量的な見積り
- 1/fノイズがベースバンド中心に落ちることによる実効雑音指数のペナルティ
- IQインバランスが $y = \alpha s + \beta s^*$ という広義線形な歪みを生む導出と、イメージ抑圧比 $\mathrm{IRR}$ の公式
- Pythonによる16QAMへの劣化注入・EVM測定・Gram-Schmidt直交化/ブラインドIQ補正による回復
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
- スーパーヘテロダイン受信機の原理 — 周波数変換による高性能受信の仕組み — 比較対象となる古典的アーキテクチャ。イメージ妨害の概念はここで押さえます
- IQ直交変調 — 同相・直交成分で帯域を使い切る — 複素ベースバンド表現と直交変調・復調の基礎
- ミキサーと周波数変換 — ヘテロダイン受信機の心臓部 — 乗算による周波数変換と、和・差の周波数が生まれる仕組み
- コンステレーション図とEVM・IQ不平衡の理論と実装 — 本記事で使う品質指標EVMの定義
ゼロIF受信機とは — 「階段で降りる」か「一気に降りる」か
周波数変換を、建物の階段に例えてみましょう。2 GHzのRF信号を0 Hzのベースバンドまで運ぶのは、20階から1階まで降りるようなものです。スーパーヘテロダイン受信機は、これを踊り場付き(中間周波数)の階段で降ります。まず20階から5階へ、そこで一息ついて荷物を整理し(IFフィルタでチャネル選択、IFアンプで増幅)、それから1階へ降りる。踊り場があるおかげで、フィルタリングも増幅も「ちょうどよい周波数」で行えます。
ゼロIF受信機は、踊り場を作らずに20階から1階へ直行します。エレベーターで一気に降りるイメージです。速くて構造は単純ですが、途中で荷物を整理する場所がありません。チャネル選択も増幅も、全部1階に着いてから、つまりベースバンドでやることになります。

縦軸に信号の中心周波数を取ると、両者の違いが「段数」として見えます。左のスーパーヘテロダインでは70 MHzという踊り場が確保され、そこに外付けの高Qフィルタを置いてチャネルを選び出せる一方、第1変換の前にイメージを潰すRFフィルタも必要になります。右のゼロIFは変換が1段だけで外付けフィルタが消えますが、行き着く先の0 Hz近傍にDCオフセットと1/fノイズが待ち構えている、という構造的な事情もこの図に描き込んであります。
この「一気に降りる」を実現する鍵が、直交ミキサ(quadrature mixer)です。局部発振器(LO)の周波数を受信したいチャネルの中心周波数 $f_c$ にぴったり合わせ、$\cos(2\pi f_c t)$ を掛けた枝(I枝)と $-\sin(2\pi f_c t)$ を掛けた枝(Q枝)の2本を並べます。この2本の出力を $I(t) + jQ(t)$ という1つの複素信号とみなすと、これはRF信号に $e^{-j2\pi f_c t}$ を掛けたのと同じことになります。つまり2本の実ミキサで、複素数の掛け算を実装しているわけです。
なぜわざわざ複素数にするのか。ここが本記事の中心的なアイデアなので、次節でスペクトルの言葉に翻訳して丁寧に見ていきます。
複素ダウンコンバージョン — スペクトルの平行移動として理解する
実信号のスペクトルは必ず左右対称のペアになる
まず出発点を確認します。アンテナで受けるのは実数の電圧波形 $r(t)$ です。送りたい情報は複素ベースバンド信号
$$ s(t) = s_I(t) + j\, s_Q(t) $$
に載っていて、これを搬送波 $f_c$ に載せた実信号が
$$ \begin{equation} r(t) = \mathrm{Re}\left\{ s(t)\, e^{j 2\pi f_c t} \right\} = s_I(t)\cos(2\pi f_c t) – s_Q(t)\sin(2\pi f_c t) \end{equation} $$
です。ここで $\mathrm{Re}\{z\} = (z + z^*)/2$ という恒等式を使うと、$r(t)$ は次のように「2つの複素指数の重ね合わせ」に分解できます。
$$ \begin{equation} r(t) = \frac{1}{2} s(t) e^{j2\pi f_c t} + \frac{1}{2} s^*(t) e^{-j2\pi f_c t} \end{equation} $$
この式は非常に多くを語っています。フーリエ変換すると、第1項は $s(t)$ のスペクトル $S(f)$ を $+f_c$ に平行移動したもの、第2項は $S^*(-f)$ を $-f_c$ に平行移動したものです。つまり実信号のスペクトルは、$+f_c$ 周りの成分と $-f_c$ 周りの成分がエルミート対称なペアをなしている。情報は片方に全部入っていて、もう片方はその鏡像(複素共役の折り返し)にすぎません。実信号である以上、この冗長なペアからは逃れられません。
複素LOを掛けると、片側だけがベースバンドに来る
さて、この $r(t)$ に $2e^{-j2\pi f_c t}$ を掛けてみます。係数2は後で振幅を揃えるためのもので、本質ではありません。
$$ \begin{align} 2 r(t) e^{-j2\pi f_c t} &= 2\left[\frac{1}{2} s e^{j2\pi f_c t} + \frac{1}{2} s^* e^{-j2\pi f_c t}\right] e^{-j2\pi f_c t} \\ &= s(t) + s^*(t)\, e^{-j 4\pi f_c t} \end{align} $$
第1項の指数が完全に打ち消し合って $s(t)$ そのものが残り、第2項は $-2f_c$ という「はるか遠くの周波数」に飛ばされました。あとは低域通過フィルタ(LPF)で第2項を落とせば、複素ベースバンド信号 $s(t)$ がそのまま手に入ります。
$$ \begin{equation} \mathrm{LPF}\left\{ 2 r(t) e^{-j2\pi f_c t} \right\} = s(t) \end{equation} $$
ここで大事なのは、複素指数 $e^{-j2\pi f_c t}$ のスペクトルは $-f_c$ にただ1本の線しかないということです。畳み込みの性質から、これを掛けることはスペクトル全体を $-f_c$ だけ平行移動することに等しい。だから $+f_c$ にいた欲しい成分は0 Hzへ、$-f_c$ にいた鏡像は $-2f_c$ へと、両者は別々の場所に動きます。重なりません。

上段が乗算前、下段が乗算後です。上段では $+f_c$ 側の三角形(情報)と $-f_c$ 側の三角形(鏡像)が左右反転した形で対をなしており、片方さえ取り出せれば情報は全部揃うことがわかります。下段を見ると、両方の三角形が同じ向きに同じ量だけ動いているだけで、形も相対位置も変わっていません。移動量が1つしかないからこそ、欲しい成分が0 Hzに着地したときに鏡像は $-2f_c$ という遠方にいる — これが複素ミキサが重なりを起こさない理由の全てです。
実ミキサだと、なぜ重なってしまうのか
対照的に、実数のLOしか使わないミキサ、つまり $2\cos(2\pi f_{\mathrm{LO}} t)$ を掛ける場合を考えます。$2\cos\theta = e^{j\theta} + e^{-j\theta}$ なので、実LOのスペクトルは $+f_{\mathrm{LO}}$ と $-f_{\mathrm{LO}}$ の2本あります。したがって出力スペクトルは、入力スペクトルを $+f_{\mathrm{LO}}$ 平行移動したものと $-f_{\mathrm{LO}}$ 平行移動したものの和になります。
$$ \begin{equation} r(t)\cdot 2\cos(2\pi f_{\mathrm{LO}} t) \;\longleftrightarrow\; R(f – f_{\mathrm{LO}}) + R(f + f_{\mathrm{LO}}) \end{equation} $$

この2枚を並べると、複素ミキサと実ミキサの差が「スペクトル線の本数」というたった1点に還元されることがわかります。左の複素LOは線が1本なので平行移動の向きも1つ、右の実LOは線が2本なので $+f_{\mathrm{LO}}$ 移動と $-f_{\mathrm{LO}}$ 移動が同時に起き、その和が出力になります。ミキサの良し悪しを議論する前に、まずLOのスペクトルを描いてみれば折り返しが起きるかどうかが判定できる、というのが実務でも使える見方です。
2つの移動先が重なると、もはや分離できません。これがイメージ妨害の正体です。$f_{\mathrm{LO}}$ より $f_{\mathrm{IF}}$ だけ上にある成分($f_{\mathrm{LO}} + f_{\mathrm{IF}}$)と、$f_{\mathrm{IF}}$ だけ下にある成分($f_{\mathrm{LO}} – f_{\mathrm{IF}}$)は、どちらも $\pm f_{\mathrm{IF}}$ に落ちてきて足し算されてしまいます。スーパーヘテロダインでイメージ除去フィルタ(RFフィルタ)が必須なのは、ミキサに入る前に片方を潰しておかないと救えないからです。
ここまでで「複素ミキサなら重ならない」ことがわかりました。では、ゼロIFにおけるイメージ周波数はいったいどこへ行ってしまったのでしょうか。次節でこの問いに答えます。
イメージ周波数はどこへ行ったか — 「自分自身がイメージ」という帰結
スーパーヘテロダイン受信機のイメージ周波数は、教科書的には
$$ \begin{equation} f_{\mathrm{image}} = f_{\mathrm{LO}} \mp 2 f_{\mathrm{IF}} \quad (f_{\mathrm{RF}} = f_{\mathrm{LO}} \pm f_{\mathrm{IF}}) \end{equation} $$
で与えられます。希望波とイメージは $f_{\mathrm{LO}}$ を挟んで $2f_{\mathrm{IF}}$ だけ離れています。たとえば $f_{\mathrm{RF}} = 900$ MHz、$f_{\mathrm{IF}} = 70$ MHzなら、イメージは140 MHz離れた760 MHzです。この「140 MHzの隔たり」があるからこそ、RF段の比較的緩やかなバンドパスフィルタでイメージを叩き落とせます。
ここで $f_{\mathrm{IF}} \to 0$、つまりゼロIFの極限を取ると何が起きるか。$2f_{\mathrm{IF}} \to 0$ なので、
$$ f_{\mathrm{image}} \to f_{\mathrm{LO}} = f_{\mathrm{RF}} $$

左は $f_{\mathrm{IF}} = 70$ MHzの例で、イメージ(赤)と希望波(青)が140 MHz離れているため、緑で描いた緩やかなRFフィルタの傾斜だけでイメージを十分に減衰できています。右のゼロIFでは、そもそも赤い山を描く場所がありません。イメージの相手はチャネル帯域の内側にいる $-f$ 成分だけになり、外部の信号がイメージとして飛び込む経路が消滅するのです。左の図でフィルタが担っていた仕事が、右では丸ごと不要になっている点を見比べてください。
イメージ周波数が希望波そのものに一致します。 言い換えると、外部から飛び込んでくる別の信号がイメージとして混入する余地がなくなります。イメージとして折り返してくるのは自分自身のチャネルの中身だけ。だから、あの高価で外付けにせざるを得なかったイメージ除去フィルタが原理的に不要になるのです。これがゼロIFの最大の利点です。
ただし「イメージが自分自身」というのは、問題が消えたのではなく、問題の相手が外部から内部に移ったことを意味します。チャネル帯域を $[-B/2, +B/2]$ とすると、周波数 $+f$ の成分にとってのイメージは $-f$ の成分です。両者は同じチャネルの中にいます。理想的な複素ミキサならこの2つは完全に分離されますが、I枝とQ枝に少しでも不整合があると、$-f$ の成分の一部が $+f$ に漏れ込みます。これが後述するIQインバランスによる自己イメージです。
つまりゼロIFは、「イメージ抑圧という仕事を、外付けフィルタからI/Q整合精度へ移し替えたアーキテクチャ」だと理解できます。そしてI/Q整合精度は、RFフィルタの阻止量(60〜80 dB)ほど高くは作れません。実際のIRRは30〜40 dB程度、デジタル補正を入れても50〜60 dB程度です。ゼロIFで「イメージ問題が消える」わけではなく、「イメージ抑圧量の桁が変わる」のだと押さえておきましょう。
さて、では実際のゼロIF受信機はどんなブロックで構成されるのでしょうか。フィルタが不要になった代わりに、どこにしわ寄せが行くのかを見ていきます。
ゼロIF受信機の構成 — どこに何を置くか
典型的なゼロIF受信機の信号経路は次のとおりです。
- アンテナ → バンドセレクトフィルタ — 使用バンド全体を通す緩いフィルタ。チャネル選択ではなく「隣のバンドの巨大な信号を落とす」のが役目です
- LNA(低雑音増幅器) — 系全体の雑音指数をここで決めます。詳しくはフリスの公式によるカスケード雑音指数を参照してください
- 直交ミキサ(I/Q 2本) — LOを $0^\circ$ と $90^\circ$ の2位相で供給し、RFを一気に0 Hzへ
- 低域通過フィルタ(LPF) — ここがチャネル選択フィルタです。カットオフはチャネル帯域幅の半分 $B/2$
- VGA(可変利得増幅器) — ADCのフルスケールに合わせて振幅を調整
- ADC(I/Q 2個) — サンプリング周波数は $f_s > B$ でよい
スーパーヘテロダインとの本質的な違いは、チャネル選択が低域通過フィルタで済む点です。中心周波数2 GHz、帯域20 MHzのバンドパスフィルタを作るには $Q = 2000/20 = 100$ が必要で、これはオンチップのLC回路では到底届きません(集積インダクタのQはせいぜい10〜20)。ところがカットオフ10 MHzの低域通過フィルタなら、抵抗・容量・オペアンプで何次でも作れます。「高Qのバンドパス」を「低次のローパス」に置き換えたこと、これが集積化を可能にした技術的核心です。
ADCの要求も劇的に緩みます。IFサンプリング方式で70 MHzのIFを直接デジタル化しようとすれば、アパーチャジッタの要求が厳しく、サンプリング周波数も高くなります。ゼロIFなら複素信号として帯域 $B$ を扱えばよく、I/Q合わせて $2 \times B$ サンプル/秒のレートで足ります。実信号として帯域 $B$ の信号を扱うには $2B$ 必要なので、複素化による情報量の節約はありません。ただし扱う周波数が低いことが、消費電力と実装難易度を大きく下げます。
もう1つの重要な違いは、利得配分です。スーパーヘテロダインではIF段で大部分の利得を稼げました。ゼロIFではミキサの後がすぐベースバンドなので、大きな利得はベースバンドアンプが担います。ところがベースバンドは「DC近傍」であり、まさにそこにDCオフセットと1/fノイズが居座っています。利得を稼ぎたい場所と、直流誤差が最悪になる場所が一致してしまった — これがゼロIFの構造的な弱点です。
では、その弱点の1つ目、DCオフセットから具体的に見ていきましょう。
課題1: DCオフセットとLO自己混合
なぜDC成分が出てしまうのか
理想的なミキサは掛け算器です。入力RF信号がゼロなら出力もゼロのはずです。ところが実際には、出力に信号と無関係な直流電圧が現れます。原因は主に3つあります。
(a) LO自己混合(LO self-mixing) が最も厄介です。LO信号は $f_c$ という「受信したい周波数そのもの」で発振しています。しかもミキサを駆動するために大きな振幅(0 dBm前後)を持っています。この強力な信号が、基板の配線容量や基板を通じた結合、あるいは半導体基板を伝わって、LNAの入力やアンテナ端子まで漏れ出します。漏れたLOはアンテナで反射され、あるいは近傍の物体で反射されて戻ってきて、再びLNAで増幅されミキサに入ります。そしてそこで「自分自身」と掛け算されます。
同じ周波数の信号どうしを掛けると、差の周波数はゼロ、すなわち直流です。数式で書けば、漏洩して戻ってきた成分を $a A_{\mathrm{LO}}\cos(2\pi f_c t + \theta)$、LOを $2\cos(2\pi f_c t)$ とすると、
$$ \begin{align} a A_{\mathrm{LO}}\cos(2\pi f_c t + \theta)\cdot 2\cos(2\pi f_c t) &= a A_{\mathrm{LO}}\left[\cos\theta + \cos(4\pi f_c t + \theta)\right] \end{align} $$
となり、和の項 $\cos(4\pi f_c t + \theta)$ はLPFで落ちますが、第1項 $a A_{\mathrm{LO}}\cos\theta$ という直流が残ります。$a$ は漏洩と反射を含む往復の電圧伝達係数、$\theta$ は往復の位相です。
(b) 強い妨害波の自己混合 も同じ機構で起きます。ミキサのRF-LO間アイソレーションが有限なので、大きな妨害波がLOポートに漏れて自分自身と混合します。妨害波の電力が変動すればDC出力も変動します。
(c) 回路の素子ばらつき による静的オフセット。差動ペアのトランジスタ対や抵抗の不整合が、ミキサやベースバンドアンプの出力に固定のオフセットを生みます。
どれくらい大きいのか — 数値で見積もる
抽象的な話に見えますが、レベルを入れると深刻さがはっきりします。次のような典型例を考えます。
- 受信信号がアンテナ端で $-85$ dBm、LNA利得20 dBを経てミキサ入力で $-65$ dBm
- LO電力はミキサのLOポートで $0$ dBm
- LO → LNA入力のアイソレーションが50 dB → アンテナ端で $-50$ dBm
- アンテナの反射損失10 dB → $-60$ dBmが戻る
- LNA利得20 dB → ミキサ入力で $-40$ dBmの「LOと同一周波数・相関のある」成分
ミキサ出力では、希望信号もLO漏洩もどちらも同じLOを掛けられます。したがって出力での比は入力での比と同じ、電力比で $-40 – (-65) = 25$ dB、電圧比で $10^{25/20} \approx 17.8$ 倍。つまりDCオフセットが希望信号の振幅の約18倍ということになります。ADCのフルスケールを希望信号に合わせようとすると、DCだけで飽和してしまうレベルです。

左の経路図で、赤い破線が「LOが漏れてアンテナ端まで届く」経路、赤い両向き矢印が「放射して反射して戻る」経路です。この2つを往復した信号が最後にミキサへ戻ってきて、自分自身と掛け算されるところがDC発生の核心になります。右のレベルダイヤでは、青い希望信号の $-65$ dBmに対して赤い漏洩LOが $-40$ dBmまで持ち上がっており、その差25 dB(電圧比17.8倍)がそのままDCオフセット対希望信号比になります。信号より18倍大きい直流がADCの前に居座るという状況が、数字で具体的に見て取れます。
しかもこの $a$ と $\theta$ は時間とともに変わります。アンテナに手をかざせば反射係数が変わり、AGCで利得を切り替えれば漏洩経路のインピーダンスが変わり、温度が変われば位相が回ります。だから工場出荷時に測ったオフセット値を引くだけでは対応できません。動的に追従するキャンセルが必要です。
対策とそのトレードオフ
実装される対策はおおむね次の4つです。
AC結合(高域通過フィルタ): 最も単純です。ベースバンド経路に直列容量を入れ、DCを遮断します。ただしカットオフ周波数 $f_{\mathrm{HP}}$ の選定が難題です。高くすれば収束が速く追従性も良いが、信号のDC近傍成分を削ってしまう。低くすれば信号は守れるが、時定数が長くなりバースト受信の頭でオフセットが収束しません。たとえばWi-FiのOFDMバーストは数マイクロ秒でプリアンブルが終わるので、時定数がミリ秒では間に合いません。
DCサーボループ: 出力を積分してミキサ/アンプの入力に負帰還する構成。実質的にHPFですが、カットオフを電気的に切り替えられるのが利点です。バースト先頭では広帯域(速い収束)、データ区間では狭帯域(信号を削らない)と切り替える設計が一般的です。
デジタル推定・減算: ADC後にサンプル平均を取ってDC推定値とし、引き算します。変調信号の平均が0であることを前提にしますが、これは多くの変調方式で成り立ちます(後述のコードでもこの方法を使います)。
オフセット較正DAC: アナログ経路に補正用DACを置き、キャリブレーション時にオフセットを打ち消す電流/電圧を注入します。ADCのダイナミックレンジをオフセットに食われないという点で、デジタル減算より優れています。
面白いことに、通信規格の側もゼロIFに配慮しています。OFDMではDC成分に相当するサブキャリアを使わないのが定石で、IEEE 802.11a/gではサブキャリア0を、LTEの下りリンクでもDCサブキャリアを情報に使いません。LTEの上りリンクではさらに徹底していて、スペクトル全体をサブキャリア間隔の半分(7.5 kHz)だけシフトし、DCがサブキャリアの真ん中に来ないようにしています。「受信機のDCオフセットは避けられない」という前提が、規格の設計に織り込まれているわけです。
DCだけを狙い撃ちで消せばよいなら話は簡単ですが、DC近傍には別の敵が潜んでいます。次はその1/fノイズを見ていきます。
課題2: 1/fノイズ(フリッカノイズ)がベースバンドを汚す
低周波ほど雑音が大きいという厄介な性質
MOSトランジスタの雑音には、周波数によらない熱雑音(白色)のほかに、周波数が下がるほど大きくなるフリッカノイズ(1/fノイズ)があります。ゲート酸化膜界面のトラップにキャリアが捕獲・放出されることで生じる、半導体デバイスに固有の低周波雑音です。
雑音電力スペクトル密度は、白色成分 $S_0$ と1/f成分の和として
$$ \begin{equation} S(f) = S_0\left(1 + \frac{f_{\mathrm{co}}}{f}\right) \end{equation} $$
と書けます。$f_{\mathrm{co}}$ はフリッカコーナー周波数で、1/f成分と白色成分が等しくなる周波数です。CMOSでは数十kHzから数MHzのオーダーになります(素子サイズやプロセスに依存し、PMOSのほうが小さい傾向があります)。
スーパーヘテロダイン受信機では、信号は数十MHzのIFにいるので、$f \gg f_{\mathrm{co}}$ となり1/f成分は無視できました。ところがゼロIFでは、信号のスペクトルが $0$ から $B/2$ まで広がっています。信号のいちばんおいしい部分(スペクトル中心)が、雑音のいちばん悪い部分(DC近傍)に置かれてしまうのです。
実効的な雑音指数のペナルティを計算する
どれくらいの劣化になるか、積分して求めましょう。DC近傍は高域通過フィルタで $f_L$ 以下が除去されているとし、信号帯域を $[f_L, B]$ とします(複素ベースバンドなので $B$ は片側帯域幅、すなわちチャネル帯域幅の半分です)。帯域内の総雑音電力は
$$ \begin{align} N_{\mathrm{tot}} &= \int_{f_L}^{B} S_0\left(1 + \frac{f_{\mathrm{co}}}{f}\right) df \\ &= S_0\left[ (B – f_L) + f_{\mathrm{co}} \ln\frac{B}{f_L} \right] \end{align} $$
1行目から2行目へは、$\int df = f$ と $\int (1/f) df = \ln f$ をそれぞれ適用しただけです。白色成分だけなら $N_{\mathrm{white}} = S_0 (B – f_L)$ ですから、ペナルティは両者の比
$$ \begin{equation} \Delta \mathrm{NF} = 10\log_{10}\left[ 1 + \frac{f_{\mathrm{co}} \ln(B/f_L)}{B – f_L} \right] \ \mathrm{[dB]} \end{equation} $$
で与えられます。この式の形から重要な性質が読み取れます。分子が $\ln(B/f_L)$ という対数、分母が $B$ という一次 なので、帯域 $B$ が広いほどペナルティは小さくなります。
数値を入れてみましょう。
| 片側帯域 $B$ | コーナー $f_{\mathrm{co}}$ | 下限 $f_L$ | ペナルティ |
|---|---|---|---|
| 10 MHz | 1 MHz | 10 kHz | 2.28 dB |
| 10 MHz | 100 kHz | 10 kHz | 0.29 dB |
| 1 MHz | 1 MHz | 10 kHz | 7.52 dB |
| 100 kHz | 1 MHz | 1 kHz | 16.77 dB |
広帯域システムには軽く、狭帯域システムには致命的という傾向がはっきり出ています。20 MHzチャネル(片側10 MHz)のWi-Fi/LTEなら2 dB程度の劣化で済みますが、帯域200 kHz級の狭帯域システム(センサネットワーク、狭帯域IoT、GSM系)では17 dBという受け入れ難い劣化になります。これが「広帯域はゼロIF、狭帯域は低IF」という業界の使い分けの根拠です。Bluetooth(1 MHz帯域)やZigBeeで低IFが好まれるのは、まさにこの理由からです。
この傾向を連続的に確かめておきましょう。帯域を横軸に取ってペナルティを描くと、ゼロIFが「広帯域向けのアーキテクチャ」であることが一目で見えます。
import numpy as np
import matplotlib, matplotlib.pyplot as plt
# 図の日本語ラベルを正しく表示するためのフォント設定(以降のコードブロックでも共通)
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
def flicker_penalty_db(B, f_co, f_L):
"""帯域[f_L, B]でのフリッカノイズによる実効NFペナルティ[dB]"""
white = B - f_L
total = (B - f_L) + f_co*np.log(B/f_L)
return 10*np.log10(total/white)
B = np.logspace(4.5, 7.5, 400) # 片側帯域 30kHz 〜 30MHz
fig, ax = plt.subplots(1, 2, figsize=(13, 4.5))
for f_co in [3e6, 1e6, 300e3, 100e3]:
ax[0].semilogx(B/1e6, flicker_penalty_db(B, f_co, 10e3),
label="コーナー $f_{co}$=%.0f kHz" % (f_co/1e3))
ax[0].axvline(10, ls="--", color="k", lw=1)
ax[0].text(10.5, 9, "20MHzチャネル\n(片側10MHz)", fontsize=9)
ax[0].set_xlabel("片側信号帯域 $B$ [MHz]"); ax[0].set_ylabel("実効NFペナルティ [dB]")
ax[0].set_title("フリッカノイズによる感度劣化($f_L$=10kHz)")
ax[0].legend(fontsize=9); ax[0].grid(alpha=0.3, which="both")
f = np.logspace(3, 7.5, 500)
for f_co in [1e6, 100e3]:
ax[1].loglog(f/1e6, 1 + f_co/f, label="$f_{co}$=%.0f kHz" % (f_co/1e3))
ax[1].axhline(1, ls="--", color="k", lw=1, label="白色雑音レベル")
ax[1].axvspan(0.01, 10, color="C2", alpha=0.12)
ax[1].text(0.03, 3e2, "ゼロIFの信号帯域", fontsize=9, color="C2")
ax[1].set_xlabel("周波数 [MHz]"); ax[1].set_ylabel("正規化雑音PSD $S(f)/S_0$")
ax[1].set_title("雑音スペクトル密度 $S(f)=S_0(1+f_{co}/f)$")
ax[1].legend(fontsize=9); ax[1].grid(alpha=0.3, which="both")
plt.tight_layout(); plt.show()
for Bv, fc, fl in [(10e6, 1e6, 10e3), (10e6, 100e3, 10e3),
(1e6, 1e6, 10e3), (0.1e6, 1e6, 1e3)]:
print("B=%6.1f MHz f_co=%6.0f kHz f_L=%5.0f kHz -> %5.2f dB"
% (Bv/1e6, fc/1e3, fl/1e3, flicker_penalty_db(Bv, fc, fl)))

左のグラフから、ペナルティ曲線が帯域に対しておおむね反比例で下がることが読み取れます。コーナー周波数1 MHzの場合、片側10 MHz(20 MHzチャネル)では2.3 dB程度で済むのに対し、片側1 MHzでは7.5 dB、片側0.1 MHzでは17 dBに跳ね上がります。コーナー周波数を1 MHzから100 kHzへ一桁下げると、どの帯域でもペナルティがほぼ一桁分(dBで見て約1/8)改善する点も重要で、これがパッシブミキサや大面積デバイスによる $f_{\mathrm{co}}$ 低減が効く理由です。右のPSDのグラフでは、ゼロIFの信号帯域(緑の帯)がちょうど1/f領域と白色領域の境界をまたいでいる様子が見えます。信号帯域の下端側だけが雑音の坂を登っている — この部分的な汚染を帯域全体で平均した結果が、左のグラフのペナルティです。
回路側での対策
パッシブミキサの採用が最も効果的です。MOSをスイッチとして使い、DCバイアス電流を流さないパッシブ(受動)ミキサは、原理的にフリッカノイズをほとんど発生しません。フリッカノイズはチャネルを流れる電流に比例するため、直流電流ゼロなら1/f雑音もほぼゼロになるからです。現代のゼロIF受信機がほぼ例外なく電流駆動型パッシブミキサを使うのは、この性質のためです。
大面積デバイスの使用: フリッカノイズのPSDはゲート面積 $WL$ に反比例するため、ベースバンド初段のトランジスタを大きく作れば $f_{\mathrm{co}}$ を下げられます。ただし面積と寄生容量が増えるトレードオフがあります。
チョッパ安定化: 信号をいったん高い周波数に変調してからアンプを通し、再び戻す手法。アンプのフリッカノイズは戻す段階で高周波側に飛ばされ、信号だけがDCに戻ります。オフセットも同時に除去できるため、計測用アンプで広く使われる技法です。
DCオフセットと1/fノイズは「ベースバンド中心の汚染」という共通点を持っていました。次に見るIQインバランスは、まったく別の性質を持つ、ゼロIF特有の3つ目の敵です。
課題3: IQインバランスと自己イメージ
直交の「ほんの少しのズレ」が何を引き起こすか
直交ミキサは、LOを $0^\circ$ と $90^\circ$ にきっちり分けて2本のミキサに供給することを前提にしています。ところが現実には、
- LO分配回路の位相分割誤差(90度ハイブリッド、分周器、ポリフェーズフィルタの不完全性)
- I枝とQ枝のミキサ・アンプの利得ばらつき
- I枝とQ枝の低域通過フィルタの素子ばらつきによる振幅・位相特性の差
- I/Q 2つのADCのサンプリングタイミングのずれ
といった要因で、振幅と位相にわずかな不整合が生じます。
「わずか」がどれくらい効くのかを直感的に掴むために、ベクトルで考えてみましょう。理想の直交復調は、受信ベクトルを互いに直交する2本の軸に射影する操作です。この2本の軸が $90^\circ$ でなく $87^\circ$ だったら、片方の軸への射影にもう片方の成分が漏れ込みます。漏れ込む量は $\sin(3^\circ) \approx 0.052$、つまり約5%です。5%というと小さく聞こえますが、電力比では $-25.6$ dB。これは50 dBのイメージ抑圧を期待する用途では絶望的な数字です。

左の図では、$87^\circ$ の赤い軸と $90^\circ$ の灰色の軸がほとんど重なって見えます。見た目にはこれほど小さなズレでも、I軸への射影(赤い点線)は0.052の長さを持ち、電力にすると $-25.6$ dBの漏れ込みになるわけです。中央は誤差を大きめに取って描いた図で、理想の単位円(灰破線)が赤い楕円に潰れています。橙色の線分が各点のずれ量で、方向によって大小があること — つまり歪みが等方的でないこと — が楕円という形に表れています。右の等高線は原点を中心にほぼ同心円状に並んでおり、利得誤差をゼロにしても位相誤差1度が残れば41 dBで頭打ちになる様子が読み取れます。
誤差モデルから $y = \alpha s + \beta s^*$ を導く
きちんと導出しましょう。I枝のLOを $2\cos(2\pi f_c t)$、Q枝のLOを利得誤差 $\varepsilon$ と位相誤差 $\phi$ を持つ $-2(1+\varepsilon)\sin(2\pi f_c t + \phi)$ とします(誤差をすべてQ枝に押しつける非対称モデル。対称モデルでも結論は同じ形になります)。
I枝から始めます。 $2\cos\theta = e^{j\theta} + e^{-j\theta}$ を使い、先ほど分解した $r(t) = \frac{1}{2}(s e^{j\omega_c t} + s^* e^{-j\omega_c t})$ を代入すると
$$ \begin{align} r(t)\cdot 2\cos(2\pi f_c t) &= \frac{1}{2}\left(s e^{j\omega_c t} + s^* e^{-j\omega_c t}\right)\left(e^{j\omega_c t} + e^{-j\omega_c t}\right) \end{align} $$
ここで $\omega_c = 2\pi f_c$ と略記しました。展開すると4項出ますが、$e^{\pm j2\omega_c t}$ を含む2項はLPFで落ちます。残るのは指数が打ち消し合う2項だけです。
$$ \begin{equation} I(t) = \frac{1}{2}\left(s + s^*\right) = \mathrm{Re}\{s\} \end{equation} $$
I枝は誤差を持たせていないので、当然きれいに実部が出てきます。
次にQ枝です。 まず $-2(1+\varepsilon)\sin(\omega_c t + \phi)$ を指数関数で書き直します。$\sin\theta = (e^{j\theta} – e^{-j\theta})/(2j)$ と $-1/j = j$ を使うと
$$ \begin{align} -2(1+\varepsilon)\sin(\omega_c t + \phi) &= -\frac{(1+\varepsilon)}{j}\left(e^{j(\omega_c t+\phi)} – e^{-j(\omega_c t+\phi)}\right) \\ &= j(1+\varepsilon)\left(e^{j\omega_c t}e^{j\phi} – e^{-j\omega_c t}e^{-j\phi}\right) \end{align} $$
これに $r(t)$ を掛け、やはり $e^{\pm j2\omega_c t}$ の項をLPFで捨てます。生き残るのは、$s e^{j\omega_c t}$ と $-e^{-j\omega_c t}e^{-j\phi}$ の積、および $s^* e^{-j\omega_c t}$ と $e^{j\omega_c t}e^{j\phi}$ の積の2つです。
$$ \begin{equation} Q(t) = \frac{j(1+\varepsilon)}{2}\left( s^* e^{j\phi} – s\, e^{-j\phi} \right) \end{equation} $$
検算しておきましょう。$\varepsilon = 0, \phi = 0$ を代入すると $Q = \frac{j}{2}(s^* – s) = \frac{j}{2}(-2j\,\mathrm{Im}\{s\}) = \mathrm{Im}\{s\}$ となり、確かに理想の直交復調になっています。
最後に $y = I + jQ$ を組み立てます。 上で求めた $I(t)$ と $Q(t)$ を足し合わせると、
$$ \begin{align} y &= \frac{1}{2}(s + s^*) + j\cdot\frac{j(1+\varepsilon)}{2}\left(s^* e^{j\phi} – s e^{-j\phi}\right) \\ &= \frac{1}{2}(s + s^*) – \frac{(1+\varepsilon)}{2}\left(s^* e^{j\phi} – s e^{-j\phi}\right) \end{align} $$
ここで $j \cdot j = -1$ を使いました。$s$ と $s^*$ で項をまとめると、目標の形が現れます。
$$ \begin{equation} \boxed{\;y(t) = \alpha\, s(t) + \beta\, s^*(t)\;} \end{equation} $$
$$ \begin{equation} \alpha = \frac{1}{2}\left(1 + (1+\varepsilon)e^{-j\phi}\right), \qquad \beta = \frac{1}{2}\left(1 – (1+\varepsilon)e^{j\phi}\right) \end{equation} $$
この結果は非常に示唆的です。理想状態($\varepsilon = 0, \phi = 0$)では $\alpha = 1, \beta = 0$ となり $y = s$ です。誤差があると、信号の複素共役 $s^*$ が $\beta$ の重みで混入します。
$s^*$ の混入が意味するところを、周波数領域で考えてみましょう。$s(t)$ の周波数 $+f$ の成分は、$s^*(t)$ では周波数 $-f$ の成分になります(共役はスペクトルを周波数軸で反転させます)。つまり $\beta s^*$ とは、チャネル内のスペクトルを左右反転させたゴーストです。これが「自己イメージ」の正体です。冒頭で述べた「イメージが自分自身になる」という帰結が、ここで具体的な数式として姿を現しました。
なお、$y = \alpha s + \beta s^*$ という形は、信号処理の言葉では広義線形(widely linear)な変換と呼ばれます。通常の線形変換 $y = \alpha s$ が複素平面での回転と伸縮(円を円に写す)なのに対し、$s^*$ が入ると円が楕円に潰れます。IQインバランスがコンステレーションを「楕円に歪める」ように見えるのは、この幾何学的な性質の直接の表れです。
イメージ抑圧比(IRR)の公式を導く
歪みの大きさを1つの数字で表したい。そこで、希望成分の電力と自己イメージ成分の電力の比をイメージ抑圧比(Image Rejection Ratio, IRR)と定義します。
$$ \begin{equation} \mathrm{IRR} = \frac{|\alpha|^2}{|\beta|^2} \end{equation} $$
$|\alpha|^2$ と $|\beta|^2$ を展開しましょう。$|1 \pm (1+\varepsilon)e^{\mp j\phi}|^2$ の形なので、$|z|^2 = z z^*$ を使って
$$ \begin{align} 4|\alpha|^2 &= 1 + (1+\varepsilon)^2 + 2(1+\varepsilon)\cos\phi \\ 4|\beta|^2 &= 1 + (1+\varepsilon)^2 – 2(1+\varepsilon)\cos\phi \end{align} $$
を得ます(交差項の $e^{-j\phi} + e^{j\phi} = 2\cos\phi$ を使いました)。これが厳密式です。
実用上は $\varepsilon \ll 1$、$\phi \ll 1$(ラジアン)なので、近似しましょう。$(1+\varepsilon)^2 \approx 1 + 2\varepsilon$、$\cos\phi \approx 1 – \phi^2/2$ を代入すると、分母側は
$$ \begin{align} 4|\beta|^2 &\approx (1) + (1 + 2\varepsilon + \varepsilon^2) – 2(1+\varepsilon)\left(1 – \frac{\phi^2}{2}\right) \\ &= 2 + 2\varepsilon + \varepsilon^2 – 2 – 2\varepsilon + (1+\varepsilon)\phi^2 \\ &\approx \varepsilon^2 + \phi^2 \end{align} $$
2行目から3行目では、定数項と $\varepsilon$ の1次項がきれいに相殺し、2次の微小量だけが残ることを使いました。$\varepsilon\phi^2$ は3次なので落としています。一方、分子側は $4|\alpha|^2 \approx 4 + 4\varepsilon \approx 4$ です。したがって、イメージ成分と希望成分の電力比は
$$ \begin{equation} \frac{|\beta|^2}{|\alpha|^2} \approx \frac{\varepsilon^2 + \phi^2}{4}, \qquad \mathrm{IRR} \approx \frac{4}{\varepsilon^2 + \phi^2} \end{equation} $$
dB表記なら
$$ \begin{equation} \mathrm{IRR}\,[\mathrm{dB}] \approx -10\log_{10}\frac{\varepsilon^2 + \phi^2}{4} = -20\log_{10}\frac{\sqrt{\varepsilon^2+\phi^2}}{2} \end{equation} $$
です。$\phi$ はラジアンであることに注意してください。
この公式が美しいのは、利得誤差と位相誤差が二乗和で効く、つまり誤差ベクトルの長さとして統合される点です。片方だけを極限まで追い込んでも、もう片方が残っていれば意味がありません。$\varepsilon = 0$ で $\phi = 1^\circ = 0.01745$ rad なら $\mathrm{IRR} \approx 41.2$ dB。ここから位相誤差をゼロにしても、利得誤差0.2 dB($\varepsilon = 0.0233$)が残っていれば $\mathrm{IRR} \approx 38.7$ dBで、どのみち40 dB前後で頭打ちです。
代表的な組み合わせでの数値を、厳密式と近似式で比較しておきます(次章のコードで再現します)。
| 利得誤差 | 位相誤差 | $\varepsilon$ | IRR(厳密) | IRR(近似) |
|---|---|---|---|---|
| 0.1 dB | 0.5° | 0.0116 | 42.83 dB | 42.79 dB |
| 0.2 dB | 1.0° | 0.0233 | 36.80 dB | 36.74 dB |
| 0.4 dB | 3.0° | 0.0471 | 29.15 dB | 29.06 dB |
| 1.0 dB | 5.0° | 0.1220 | 22.83 dB | 22.50 dB |
近似は誤差が数%の範囲でも0.1 dB以内の精度、10%を超えても0.3 dB程度のずれに収まっています。設計の見積りには近似式で十分だとわかります。
周波数依存インバランスという続き
ここまでは $\varepsilon$ と $\phi$ を定数として扱いました。LOの位相分割誤差やミキサの利得差はおおむね周波数に依らないので、この扱いで問題ありません。ところがI枝とQ枝の低域通過フィルタの素子ばらつきは事情が違います。抵抗や容量の値が1%違えば、カットオフ周波数が1%ずれ、通過域の中でも周波数によって振幅も群遅延も違う量だけずれます。
この場合、$\alpha, \beta$ は周波数の関数 $\alpha(f), \beta(f)$ になり、時間領域では定数倍ではなくフィルタ(畳み込み)になります。
$$ \begin{equation} y(t) = (h_\alpha * s)(t) + (h_\beta * s^*)(t) \end{equation} $$
補正も定数1個では足りず、広義線形FIRフィルタ(適応的に係数を推定する $w(n)$ のタップ列)が必要になります。実装コストが一桁上がるため、まず周波数に依らない成分を定数で補正し、残差を短いFIRで叩く二段構成が実務では一般的です。本記事のコードでは、原理を明快にするため周波数非依存のケースを扱います。
IQインバランスの数理が固まったので、最後にゼロIF特有の4つ目の問題を短く押さえてから、実装に移りましょう。
課題4: 偶数次歪みとLO引き込み
二次歪みが包絡線をベースバンドに落とす
ミキサやLNAの非線形性のうち、スーパーヘテロダインではあまり問題にならなかったのが二次歪みです。増幅器の入出力を $y = a_1 x + a_2 x^2 + a_3 x^3 + \cdots$ と展開したとき、$a_2 x^2$ の項に注目します。
振幅変調された妨害波 $x(t) = A(t)\cos(2\pi f_b t)$ が入ってきたとしましょう。二次項は
$$ \begin{align} a_2 x^2 &= a_2 A^2(t)\cos^2(2\pi f_b t) = \frac{a_2 A^2(t)}{2} + \frac{a_2 A^2(t)}{2}\cos(4\pi f_b t) \end{align} $$
となり、第1項に $A^2(t)/2$ という妨害波の包絡線の二乗が現れます。これは搬送波を持たない低周波信号、つまりベースバンドの成分です。スーパーヘテロダインなら「ベースバンドに落ちた歪み」はIFフィルタで簡単に除去されますが、ゼロIFでは信号自身がベースバンドにいるので、そのまま希望信号に重なります。
大きさの目安には二次インターセプトポイント $\mathrm{IIP2}$ を使います。二次歪み積の電力は
$$ \begin{equation} P_{\mathrm{IM2}}\,[\mathrm{dBm}] = 2 P_{\mathrm{blocker}} – \mathrm{IIP2} \end{equation} $$
で見積もれます。妨害波が $-20$ dBm、$\mathrm{IIP2} = +50$ dBmなら $P_{\mathrm{IM2}} = -90$ dBm。感度レベルが $-100$ dBm付近の受信機では、これでも10 dBの余裕しかありません。$\mathrm{IIP2}$ が $+40$ dBmしかなければ $-80$ dBmとなり、完全に埋もれます。ゼロIF受信機で $\mathrm{IIP2}$ が最重要スペックの1つとされ、差動構成の徹底やIIP2キャリブレーション回路が実装されるのは、この計算のためです。三次歪みについては利得圧縮とIP3 — 増幅器の線形性も参照してください。
LO引き込み(LO pulling)
もう1つ、送受信を同一チップに載せるときに現れる問題があります。ゼロIFでは $f_{\mathrm{LO}} = f_c$ なので、送信機のパワーアンプが出す大電力の中心周波数とVCOの発振周波数が完全に一致します。PAの出力が基板や基板裏のグランドを通ってVCOに結合すると、VCOの発振が引き込まれて周波数や位相が乱れます(注入引き込み現象)。
対策として、VCOを $2f_c$ や $4f_c$ で発振させて分周してLOを作る、あるいは2つの発振器の周波数の和/差でLOを合成する(オフセットPLL)といった手法が使われます。「VCOをキャリア周波数で直接発振させない」のがゼロIF設計の鉄則です。位相雑音そのものについてはLeesonモデルで理解するVCOの位相雑音が参考になります。
4つの課題が出そろいました。ここからはPythonで、これらが実際にどれだけ信号品質を落とすのかを測り、補正で回復させてみます。
Pythonでの実装1: 複素ダウンコンバージョンをスペクトルで見る
まず、複素ミキサが本当に「片側だけをベースバンドに落とす」のかをスペクトルで確認します。搬送波の上下に非対称な信号(上側と下側で振幅の違う成分)を置いて、それが保存されるかどうかを見ます。
import numpy as np
import matplotlib, matplotlib.pyplot as plt
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, N = 200e6, 2**14 # サンプリング200MHz
t = np.arange(N)/fs
fc = 50e6 # 搬送波50MHz
# 複素ベースバンド: +3MHzに大きい成分, -7MHzに小さい成分(左右非対称)
s = 1.0*np.exp(2j*np.pi*3e6*t) + 0.4*np.exp(-2j*np.pi*7e6*t)
r = np.real(s*np.exp(2j*np.pi*fc*t)) # 実RF信号
lo_c = np.exp(-2j*np.pi*fc*t) # 複素LO(線1本)
y_c = 2*r*lo_c # 複素ダウンコンバージョン
y_r = 2*r*np.cos(2*np.pi*fc*t) # 実ミキサ(比較用)
def spec(x):
X = np.fft.fftshift(np.fft.fft(x*np.hanning(N)))/N
f = np.fft.fftshift(np.fft.fftfreq(N, 1/fs))
return f/1e6, 20*np.log10(np.abs(X)+1e-12)
fig, ax = plt.subplots(1, 3, figsize=(15, 4))
for a, (x, ttl) in zip(ax, [(r, "① 実RF信号 $r(t)$"),
(y_c, "② 複素LO乗算後"),
(y_r, "③ 実LO乗算後")]):
f, S = spec(x)
a.plot(f, S, lw=0.8)
a.set_xlim(-70, 70); a.set_ylim(-80, 5)
a.set_title(ttl); a.set_xlabel("周波数 [MHz]"); a.grid(alpha=0.3)
ax[0].set_ylabel("振幅 [dB]")
plt.tight_layout(); plt.show()

なお、冒頭の数行は前章と同じく図の日本語ラベルを正しく表示するためのフォント設定です。以降のコードブロックはこの設定を引き継ぐ前提で書いていますので、途中のブロックだけを単体で動かすときは同じ設定を先頭に足してください。
3枚のスペクトルから、複素ミキサの働きが一目でわかります。①の実RF信号は $\pm 50$ MHz の周りに鏡像対のスペクトルを持ち、$+53$ MHzの大きな成分に対して $-53$ MHzにも同じ大きさの成分が立っています(エルミート対称)。②の複素LO乗算後では、$+3$ MHzに振幅1、$-7$ MHzに振幅0.4という元の非対称性がそのまま保たれ、鏡像側は $-100$ MHz付近へ移動しています。LPFをかければ $s(t)$ が完全に復元できる状態です。③の実LO乗算後を見ると、$\pm 3$ MHzと $\pm 7$ MHzの両方に成分が現れ、しかも振幅が混ざり合っています。非対称な情報が失われており、もはや上側と下側を区別できません。これが「実ミキサではイメージが折り返す」という現象の実体です。
複素ミキサの正しさが確認できたので、次は「その複素ミキサが不完全だったら何が起きるか」をIRRの数値で確かめます。
Pythonでの実装2: イメージ抑圧比(IRR)の厳密値と近似式
先ほど導いた $\mathrm{IRR} \approx 4/(\varepsilon^2 + \phi^2)$ が、どの程度の誤差範囲で使えるのかを確認します。
import numpy as np
import matplotlib.pyplot as plt
def alpha_beta(eps, phi):
"""利得誤差 eps, 位相誤差 phi[rad] に対する alpha, beta"""
a = 0.5*(1.0 + (1.0+eps)*np.exp(-1j*phi))
b = 0.5*(1.0 - (1.0+eps)*np.exp(+1j*phi))
return a, b
# 代表点の表
print(f"{'利得[dB]':>8} {'位相[deg]':>9} {'eps':>8} {'厳密[dB]':>9} {'近似[dB]':>9}")
for gdb, pdeg in [(0.1, 0.5), (0.2, 1.0), (0.4, 3.0), (1.0, 5.0)]:
eps, phi = 10**(gdb/20)-1, np.deg2rad(pdeg)
a, b = alpha_beta(eps, phi)
exact = 10*np.log10(abs(a)**2/abs(b)**2)
approx = -10*np.log10((eps**2+phi**2)/4)
print(f"{gdb:8.1f} {pdeg:9.1f} {eps:8.4f} {exact:9.2f} {approx:9.2f}")
# 等高線: 利得誤差[dB] × 位相誤差[deg] → IRR[dB]
g = np.linspace(0.02, 1.5, 200) # 0を含めると IRR が発散するので少し離す
p = np.linspace(0.05, 8.0, 200)
G, P = np.meshgrid(g, p)
E, PH = 10**(G/20)-1, np.deg2rad(P)
A, B = alpha_beta(E, PH)
IRR = 10*np.log10(np.abs(A)**2/np.abs(B)**2)
plt.figure(figsize=(7, 5))
cs = plt.contourf(G, P, IRR, levels=np.arange(20, 62, 2), cmap="viridis")
plt.colorbar(cs, label="イメージ抑圧比 IRR [dB]")
cl = plt.contour(G, P, IRR, levels=[25, 30, 35, 40, 45, 50], colors="w", linewidths=0.8)
plt.clabel(cl, fmt="%d dB", fontsize=8)
plt.xlabel("利得誤差 [dB]"); plt.ylabel("位相誤差 [度]")
plt.title("IQインバランスとイメージ抑圧比の関係")
plt.tight_layout(); plt.show()

数値表を見ると、厳密式と近似式の差は0.1 dB以下(1 dB/5°という大きな誤差でも0.33 dB)にとどまり、設計見積りには近似式で十分だとわかります。等高線図からは、IRRの等高線が原点を中心とした同心円(楕円)状に並ぶことが読み取れます。これは $\varepsilon^2 + \phi^2$ という二乗和の構造そのもので、利得誤差だけ、あるいは位相誤差だけを追い込んでも意味がないことを視覚的に示しています。40 dBのIRRを得るには、利得誤差0.2 dB以下かつ位相誤差1度以下という、両方の同時達成が必要です。
IRRという「歪みの大きさ」がわかったので、次はそれが変調信号にどう現れるかをコンステレーションで見ます。
Pythonでの実装3: 16QAMに劣化を注入してEVMを測る
16QAM信号に、IQインバランスとDCオフセットを注入し、EVMがどれだけ悪化するかを測定します。
import numpy as np
import matplotlib.pyplot as plt
rng = np.random.default_rng(0)
def qam16(n, rng):
"""平均電力1に正規化した16QAMシンボル"""
lv = np.array([-3, -1, 1, 3])
return (rng.choice(lv, n) + 1j*rng.choice(lv, n))/np.sqrt(10.0)
def evm_percent(y, s):
"""最小二乗で複素利得を除去してからEVM[%]を計算"""
g = np.vdot(s, y)/np.vdot(s, s) # 受信機の等化器が取り除くゲイン
return 100*np.sqrt(np.mean(np.abs(y/g - s)**2)/np.mean(np.abs(s)**2))
N = 200_000
s = qam16(N, rng)
eps = 10**(0.4/20) - 1 # 利得誤差 0.4 dB
phi = np.deg2rad(3.0) # 位相誤差 3 度
alpha = 0.5*(1 + (1+eps)*np.exp(-1j*phi))
beta = 0.5*(1 - (1+eps)*np.exp(+1j*phi))
snr_db = 30
noise = (rng.normal(size=N) + 1j*rng.normal(size=N))/np.sqrt(2)*10**(-snr_db/20)
dc = 0.05*np.exp(1j*np.deg2rad(30)) # DCオフセット(振幅5%)
y_ideal = s + noise
y_iq = alpha*s + beta*np.conj(s) + noise
y_all = alpha*s + beta*np.conj(s) + dc + noise
print("イメージ比 |beta/alpha| = %.5f (%.2f dB)"
% (abs(beta/alpha), 20*np.log10(abs(beta/alpha))))
print("理論イメージEVM = %.3f %%" % (100*np.sqrt((eps**2+phi**2)/4)))
for name, y in [("理想(AWGN 30dB)", y_ideal), ("IQインバランスのみ", y_iq),
("IQ + DCオフセット", y_all)]:
print(f"{name:>18}: EVM = {evm_percent(y, s):.3f} %")
出力は次のようになります。イメージ比 $|\beta/\alpha| = 0.03487$($-29.15$ dB)、理論イメージEVMは3.52%、測定EVMは理想3.167%、IQインバランスのみ4.659%、DCオフセット追加で6.757%です。ここから3つのことが読み取れます。第一に、理論値 $\sqrt{(\varepsilon^2+\phi^2)}/2 = 3.52\%$ が実測の $|\beta/\alpha| = 3.49\%$ とほぼ一致しており、導いた近似式が正しいことが確認できます。第二に、雑音由来EVM 3.17%とイメージ由来EVM 3.49%が独立に足し合わされ、$\sqrt{3.17^2 + 3.49^2} = 4.71\%$ が実測4.66%とよく合います。各劣化要因は誤差ベクトルとして二乗和で積み上がるという設計上重要な性質です。第三に、振幅5%のDCオフセットを加えるだけでEVMが6.76%に跳ね上がります。$\sqrt{4.66^2+5^2}=6.84\%$ と整合し、DCオフセットが単独で最大の劣化要因になっていることがわかります。
この数字をコンステレーション図で目に見える形にしてみましょう。
import numpy as np
import matplotlib.pyplot as plt
M = 4000 # 表示するシンボル数
fig, ax = plt.subplots(1, 3, figsize=(15, 5))
sets = [(y_ideal, "理想(AWGN のみ)"),
(y_iq, "IQインバランス\n(利得0.4dB / 位相3°)"),
(y_all, "IQインバランス + DCオフセット")]
for a, (y, ttl) in zip(ax, sets):
a.plot(y[:M].real, y[:M].imag, ".", ms=1.5, alpha=0.5)
lv = np.array([-3, -1, 1, 3])/np.sqrt(10)
ref = np.array([complex(i, q) for i in lv for q in lv])
a.plot(ref.real, ref.imag, "rx", ms=9, mew=1.5, label="理想シンボル点")
a.axhline(0, color="k", lw=0.5); a.axvline(0, color="k", lw=0.5)
a.set_xlim(-1.6, 1.6); a.set_ylim(-1.6, 1.6); a.set_aspect("equal")
a.set_title(f"{ttl}\nEVM = {evm_percent(y, s):.2f} %")
a.set_xlabel("同相成分 I"); a.grid(alpha=0.3)
ax[0].set_ylabel("直交成分 Q"); ax[0].legend(loc="upper right", fontsize=8)
plt.tight_layout(); plt.show()

3枚を見比べると、劣化の「形」が違うことがわかります。理想では各シンボル点の周りに等方的な円形の雲ができています(AWGNは全方向に等しく効く)。IQインバランスでは雲の中心が理想点からずれ、しかもずれ方が象限ごとに違います。外側の点ほどずれが大きいのは、$\beta s^*$ という乗法的な歪みが振幅に比例するためです。全体としてコンステレーションが斜めの楕円方向に引き伸ばされます。DCオフセットを加えると、コンステレーション全体が一様に平行移動します。これは加法的な歪みなので、内側の点も外側の点も同じ量だけ動きます。乗法的なIQインバランスと加法的なDCオフセットは、コンステレーション上の見え方が明確に違う — この違いこそが、次節で両者を別々のアルゴリズムで補正できる根拠になります。
Pythonでの実装4: DCオフセット除去とIQインバランス補正
補正の原理
補正は2段階です。
第1段: DCオフセット除去。 変調信号の平均が0であることを利用して、受信サンプルの平均を推定値とし、引きます。
$$ \hat{y}(n) = y(n) – \frac{1}{N}\sum_{k} y(k) $$
第2段: IQインバランス補正。 2つの方法を試します。
(a) Gram-Schmidt直交化(GSOP)。理想の $s$ では、実部と虚部が無相関($\mathbb{E}[s_I s_Q] = 0$)で、かつ電力が等しい($\mathbb{E}[s_I^2] = \mathbb{E}[s_Q^2]$)はずです。この2条件が崩れているのを直す、というのが発想です。受信のI/Qを $y_I, y_Q$ とし、$P_I = \mathbb{E}[y_I^2]$、$\rho = \mathbb{E}[y_I y_Q]$ として
$$ z_I = \frac{y_I}{\sqrt{P_I}}, \qquad z_Q’ = y_Q – \frac{\rho}{P_I}y_I, \qquad z_Q = \frac{z_Q’}{\sqrt{\mathbb{E}[z_Q’^2]}} $$
とすれば、$z_I$ と $z_Q$ は無相関かつ単位電力になります。これは線形代数のGram-Schmidt直交化そのもので、$y_Q$ から $y_I$ 方向の成分を差し引き、残った直交成分を正規化しています。位相誤差は相関 $\rho$ として、利得誤差は電力の不一致として現れるので、両方が同時に直ります。
(b) 擬似共分散を使ったブラインド補正。もう少し洗練された方法があります。理想の $s$ はプロパー(proper)、すなわち $\mathbb{E}[s^2] = 0$ を満たします(16QAMなら $\mathbb{E}[s^2] = \mathbb{E}[s_I^2] – \mathbb{E}[s_Q^2] + 2j\mathbb{E}[s_I s_Q] = 0$)。ところが $y = \alpha s + \beta s^*$ の擬似共分散を計算すると、
$$ \begin{align} \mathbb{E}[y^2] &= \mathbb{E}[(\alpha s + \beta s^*)^2] = \alpha^2\mathbb{E}[s^2] + 2\alpha\beta\,\mathbb{E}[|s|^2] + \beta^2\mathbb{E}[(s^*)^2] \\ &= 2\alpha\beta\,\sigma_s^2 \end{align} $$
$\mathbb{E}[s^2] = \mathbb{E}[(s^*)^2] = 0$ を使って中央の項だけが生き残りました。ゼロであるべき量がゼロでない、その値がインバランスの大きさを直接教えてくれるわけです。一方 $\mathbb{E}[|y|^2] = (|\alpha|^2 + |\beta|^2)\sigma_s^2$ なので、$|\beta| \ll |\alpha| \approx 1$ の近似のもとで
$$ \begin{equation} \hat{w} = \frac{\mathbb{E}[y^2]}{2\,\mathbb{E}[|y|^2]} \approx \frac{\beta}{\alpha^*} \end{equation} $$
が得られます。この $w = \beta/\alpha^*$ を使うと、補正は次の広義線形フィルタで完了します。
$$ \begin{align} y – w y^* &= (\alpha s + \beta s^*) – \frac{\beta}{\alpha^*}(\alpha^* s^* + \beta^* s) \\ &= \alpha s – \frac{\beta\beta^*}{\alpha^*}s = \left(\alpha – \frac{|\beta|^2}{\alpha^*}\right) s \end{align} $$
1行目で $y^* = \alpha^* s^* + \beta^* s$ を代入しました。2行目では $s^*$ の項が完全に相殺しています。残ったのは $s$ の定数倍だけ — 自己イメージが消え、あとは通常の等化器が取り除ける単純な複素利得だけが残ります。訓練信号を一切使わずに、統計量だけからこれができるのが「ブラインド」の意味です。
実装と結果
import numpy as np
def remove_dc(y):
"""DCオフセット除去(平均値の減算)"""
return y - np.mean(y)
def gsop(y):
"""Gram-Schmidt直交化によるIQ補正"""
yi, yq = y.real, y.imag
p_i = np.mean(yi**2)
rho = np.mean(yi*yq)
z_i = yi/np.sqrt(p_i)
t = yq - (rho/p_i)*yi # I方向の成分を差し引く
z_q = t/np.sqrt(np.mean(t**2))
return z_i + 1j*z_q
def blind_wl(y):
"""擬似共分散を用いたブラインド広義線形補正"""
w = np.mean(y**2)/(2*np.mean(np.abs(y)**2)) # w ≒ beta/alpha*
return y - w*np.conj(y), w
def irr_measured(y, s):
"""既知の s を使って実効IRRを測る(評価用)"""
A = np.vdot(s, y)/np.vdot(s, s)
B = np.vdot(np.conj(s), y)/np.vdot(np.conj(s), np.conj(s))
return 20*np.log10(abs(A)/abs(B))
y1 = remove_dc(y_all)
y2 = gsop(y1)
y3, w_hat = blind_wl(y1)
print("補正前 : EVM=%.3f %% IRR=%.2f dB" % (evm_percent(y_all, s), irr_measured(y_all, s)))
print("DC除去 : EVM=%.3f %% IRR=%.2f dB" % (evm_percent(y1, s), irr_measured(y1, s)))
print("DC除去 + GSOP : EVM=%.3f %% IRR=%.2f dB" % (evm_percent(y2, s), irr_measured(y2, s)))
print("DC除去 + ブラインド: EVM=%.3f %% IRR=%.2f dB" % (evm_percent(y3, s), irr_measured(y3, s)))
print("推定 w = %s / 真値 = %s" % (np.round(w_hat, 5), np.round(beta/np.conj(alpha), 5)))
print("雑音のみのEVM下限 : %.3f %%" % evm_percent(y_ideal, s))
実行結果は次のとおりです。補正前はEVM 6.757%・IRR 28.77 dB。DC除去だけでEVMは4.660%に下がりますが、IRRは28.77 dBのまま変わりません(DCオフセットはイメージとは無関係な加法成分なので当然です)。GSOPを適用するとEVM 3.108%・IRR 54.34 dB、ブラインド補正でもEVM 3.108%・IRR 54.25 dBと、イメージ抑圧が25 dB以上改善します。EVMは雑音のみの下限3.167%とほぼ同じ値まで戻っており、IQインバランスの影響が実質的に消えたことを示しています(わずかに下回るのは、GSOPが各軸を単位電力に正規化する際に雑音による利得誤差もいくらか吸収するためです)。推定された $\hat{w} = -0.02213 – 0.02778j$ は真値 $-0.02304 – 0.02617j$ と数%以内で一致しており、訓練信号なしでもインバランスが正確に同定できることが確認できます。

棒グラフにすると、DC除去がイメージ抑圧に対してまったく効いていないことが一目でわかります。左2本の高さが完全に同じなのは、DCオフセットが $s^*$ とは無関係な加法成分だからで、対処すべき相手が別物であることを示しています。一方でGSOPとブラインド広義線形補正はどちらも54 dB台まで一気に持ち上げており、アルゴリズムの流儀が違っても到達点がほぼ同じである点も重要です。
補正後のIRRが54 dB程度で頭打ちになる理由も重要です。これは補正アルゴリズムの限界ではなく、有限サンプル数($N = 2\times 10^5$)での統計量推定誤差と雑音の影響です。サンプル数を増やせば推定精度は $1/\sqrt{N}$ で改善します。逆に言えば、短いバーストしか観測できないシステムでは、達成可能なIRRがサンプル数で制限されるということです。
補正の効果を図で確認しましょう。
import numpy as np
import matplotlib.pyplot as plt
M = 4000
fig = plt.figure(figsize=(15, 4.5))
stages = [(y_all, "補正前"), (y1, "DCオフセット除去後"), (y2, "GSOP補正後")]
for k, (y, ttl) in enumerate(stages):
a = fig.add_subplot(1, 4, k+1)
yy = y/(np.vdot(s, y)/np.vdot(s, s)) # 表示用にゲイン正規化
a.plot(yy[:M].real, yy[:M].imag, ".", ms=1.5, alpha=0.5)
lv = np.array([-3, -1, 1, 3])/np.sqrt(10)
ref = np.array([complex(i, q) for i in lv for q in lv])
a.plot(ref.real, ref.imag, "rx", ms=8, mew=1.4)
a.set_xlim(-1.5, 1.5); a.set_ylim(-1.5, 1.5); a.set_aspect("equal")
a.set_title("%s\nEVM=%.2f %%" % (ttl, evm_percent(y, s)))
a.set_xlabel("同相成分 I"); a.grid(alpha=0.3)
if k == 0: a.set_ylabel("直交成分 Q")
a = fig.add_subplot(1, 4, 4)
names = ["補正前", "DC除去", "DC+GSOP", "DC+ブラインド", "雑音下限"]
vals = [evm_percent(x, s) for x in [y_all, y1, y2, y3, y_ideal]]
a.bar(names, vals, color=["#c0392b", "#e67e22", "#27ae60", "#2980b9", "#7f8c8d"])
a.axhline(vals[-1], ls="--", color="k", lw=1)
for i, v in enumerate(vals):
a.text(i, v+0.12, "%.2f" % v, ha="center", fontsize=9)
a.set_ylabel("EVM [%]"); a.set_title("補正段階ごとのEVM")
a.tick_params(axis="x", rotation=30); a.grid(axis="y", alpha=0.3)
plt.tight_layout(); plt.show()

コンステレーションの変化が補正の効果を雄弁に語ります。補正前は全体が平行移動し、かつ楕円状に歪んでいます。DC除去後は中心が原点に戻りますが、歪みは残ったままで、外側のシンボル点ほど理想点からずれているのが見て取れます。GSOP補正後は各シンボル点が理想点(赤い×印)にきれいに収束し、雲の形も等方的な円に戻っています。棒グラフでは、補正前6.76%から段階的に下がり、最終的に雑音下限3.17%の破線とほぼ同じ高さになっていることが確認できます。残った誤差は熱雑音だけ — アナログの不完全性はデジタル信号処理で取り戻せた、というのがゼロIF受信機の実務上の結論です。
最後に、周波数領域で自己イメージがどう見えるのかを、OFDMを例に確認しておきます。
Pythonでの実装5: OFDMにおける鏡像サブキャリア干渉
OFDMでは、IQインバランスの影響が「サブキャリア $+k$ に、サブキャリア $-k$ の共役が漏れ込む」という非常にわかりやすい形で現れます。式で書けば
$$ \begin{equation} Y_k = \alpha X_k + \beta X_{-k}^* \end{equation} $$
です。時間領域の $y = \alpha s + \beta s^*$ をDFTすれば直ちに得られます($s^*(n)$ のDFTが $S^*_{-k}$ になることを使います)。
import numpy as np
import matplotlib.pyplot as plt
rng2 = np.random.default_rng(7)
Nfft, used = 64, [k for k in range(-26, 27) if k != 0] # DCサブキャリアは未使用
X = np.zeros(Nfft, complex)
X[[k % Nfft for k in used]] = qam16(len(used), rng2)
x = np.fft.ifft(X)*np.sqrt(Nfft) # 時間領域OFDMシンボル
y = alpha*x + beta*np.conj(x) # IQインバランスを注入
Y = np.fft.fft(y)/np.sqrt(Nfft)
err = np.array([Y[k % Nfft] - alpha*X[k % Nfft] for k in used]) # 誤差成分
pred = np.array([beta*np.conj(X[(-k) % Nfft]) for k in used]) # 理論予測
print("誤差と理論予測の最大差 =", np.max(np.abs(err - pred)))
print("平均漏れ込み比 = %.2f dB" % (20*np.log10(abs(beta/alpha))))
plt.figure(figsize=(11, 4.5))
plt.stem(used, 20*np.log10(np.abs([Y[k % Nfft] for k in used])), linefmt="C0-",
markerfmt="C0.", basefmt=" ", label="受信サブキャリア振幅")
plt.stem(used, 20*np.log10(np.abs(err)+1e-12), linefmt="C3-",
markerfmt="C3x", basefmt=" ", label="鏡像サブキャリアからの漏れ込み")
plt.axhline(20*np.log10(abs(beta/alpha)), ls="--", color="k", lw=1,
label="平均漏れ込みレベル %.1f dB" % (20*np.log10(abs(beta/alpha))))
plt.xlabel("サブキャリア番号 $k$"); plt.ylabel("振幅 [dB]")
plt.title("OFDMにおける鏡像サブキャリア干渉($Y_k = \\alpha X_k + \\beta X_{-k}^*$)")
plt.legend(fontsize=9); plt.grid(alpha=0.3)
plt.tight_layout(); plt.show()

「誤差と理論予測の最大差」がほぼ0(浮動小数点精度)になることから、$Y_k = \alpha X_k + \beta X_{-k}^*$ という関係が厳密に成り立っていることが確認できます。図では、青いサブキャリア振幅に対して赤い漏れ込み成分が平均 $-29.15$ dB下に分布しています。注目すべきは漏れ込み量がサブキャリアごとにばらつくことです。16QAMでは振幅が最大 $3\sqrt{2}$、最小 $\sqrt{2}$ と3倍(9.5 dB)の差があるため、「自分が内側の点で鏡像が外側の点」というサブキャリアでは漏れ込み比が平均より9.5 dB悪化します。平均IRRが29 dBでも、最悪のサブキャリアでは20 dB以下まで落ちる — これが、規格の要求するEVMマージンを見積もる際に平均値だけでは不十分な理由です。
ここまでゼロIFの原理と課題を見てきました。最後に、実務でよく比較される低IF方式との関係を整理しておきましょう。
ゼロIFと低IFの使い分け
低IF(low-IF)方式は、LOをチャネル中心から少しだけ(典型的にはチャネル帯域幅の1〜2倍)ずらし、信号を1〜2 MHz程度の低い中間周波数に置く方式です。ゼロIFとスーパーヘテロダインの中間に位置します。
低IFの利点は明快で、信号がDCから離れるためDCオフセットとフリッカノイズの問題を回避できます。先ほどの計算で見たように、狭帯域システムほど1/fペナルティが致命的でしたから、Bluetooth・ZigBee・GSM・NB-IoTのような狭帯域方式では低IFが自然な選択になります。
代わりに戻ってくるのがイメージ問題です。$f_{\mathrm{IF}}$ が小さいので、イメージは $2f_{\mathrm{IF}}$ だけ離れた隣接チャネルになります。RFフィルタでは近すぎて分離できないため、複素信号処理でイメージを落とす必要があります。ここで使われるのが複素バンドパスフィルタ(ポリフェーズフィルタ) です。実信号のフィルタは必ず $\pm f$ 対称な特性しか作れませんが、I/Q 2本の経路をクロス結合したフィルタは $+f$ と $-f$ で違う特性を持てるため、片側だけを通せます。ハートレー(Hartley)方式やウィーバー(Weaver)方式のイメージリジェクションミキサも同じ原理に基づきます。
そして重要なのは、これらのイメージ除去性能も結局は同じ $\mathrm{IRR} \approx 4/(\varepsilon^2+\phi^2)$ に支配されるという点です。低IFの複素フィルタもI/Q整合精度が命なので、達成できるイメージ抑圧はゼロIFの自己イメージ抑圧と同じ30〜40 dBのオーダーになります。低IFはDCと1/fの問題をイメージ問題と交換しただけで、根本的にはどちらも「I/Q整合精度をどこまで追い込めるか」に帰着します。
| 項目 | スーパーヘテロダイン | ゼロIF | 低IF |
|---|---|---|---|
| イメージの相手 | 遠く離れた別周波数 | 自分自身(チャネル内) | 隣接チャネル |
| イメージ抑圧手段 | RFフィルタ(外付け) | I/Q整合 + デジタル補正 | 複素フィルタ + デジタル補正 |
| 典型的イメージ抑圧 | 60〜80 dB | 30〜40 dB(補正で50〜60) | 30〜50 dB |
| チャネル選択 | IFフィルタ(外付け) | ベースバンドLPF(内蔵) | 複素BPF(内蔵) |
| DCオフセット | 問題なし | 深刻 | 問題なし |
| 1/fノイズ | 問題なし | 広帯域なら軽微 | 問題なし |
| IIP2要求 | 緩い | 厳しい | 中程度 |
| 集積度・コスト | 低い・高価 | 高い・安価 | 高い・安価 |
| 向く用途 | 高性能計測、放送 | 広帯域(LTE/Wi-Fi/SDR) | 狭帯域(BLE/ZigBee) |
この表を眺めると、アーキテクチャ選択が「どの問題を引き受けるか」の選択であることがよくわかります。万能な受信機構成は存在せず、扱う帯域幅・要求する妨害耐力・コスト制約から逆算して選ぶことになります。それでは最後に、ここまでたどってきた原理と課題、そして補正の効果を整理しておきましょう。
まとめ
本記事では、ダイレクトコンバージョン(ゼロIF)受信機の原理と、それが抱える固有の課題を数式レベルで追いかけました。
- 複素ダウンコンバージョン: 実信号 $r(t) = \frac{1}{2}(s e^{j\omega_c t} + s^* e^{-j\omega_c t})$ に複素LO $e^{-j\omega_c t}$ を掛けると、スペクトルが $-f_c$ だけ平行移動する。複素指数のスペクトルは線1本なので、欲しい成分と鏡像が重ならない。これが直交ミキサの本質
- イメージが不要になる理由: $f_{\mathrm{IF}} \to 0$ の極限でイメージ周波数 $f_{\mathrm{LO}} \mp 2f_{\mathrm{IF}}$ は希望波自身に一致する。外部からのイメージ妨害が原理的に存在しなくなり、外付けイメージ除去フィルタが不要になる。ただし問題は「外部から内部(I/Q整合精度)」へ移動しただけ
- DCオフセット: LOが受信周波数そのものであるため、漏洩したLOが自分自身と混合してDCを生む。典型的な数値では希望信号の18倍(25 dB上)にもなり、しかも時変。AC結合・DCサーボ・デジタル減算で対処し、規格側もDCサブキャリアを空けている
- 1/fノイズ: 信号のスペクトル中心が雑音の最悪領域に置かれる。ペナルティは $10\log_{10}[1 + f_{\mathrm{co}}\ln(B/f_L)/(B-f_L)]$ で、広帯域(片側10 MHz)なら2.28 dBだが狭帯域(100 kHz)では16.8 dBに達する。これが「広帯域はゼロIF、狭帯域は低IF」の分水嶺
- IQインバランス: 利得誤差 $\varepsilon$ と位相誤差 $\phi$ は $y = \alpha s + \beta s^*$ という広義線形な歪みを生む。$\alpha = \frac{1}{2}(1 + (1+\varepsilon)e^{-j\phi})$、$\beta = \frac{1}{2}(1-(1+\varepsilon)e^{j\phi})$ であり、イメージ電力比は $|\beta/\alpha|^2 \approx (\varepsilon^2+\phi^2)/4$。利得と位相が二乗和で効くため、片方だけの追い込みは無意味
- 補正の実測: 利得0.4 dB・位相3°・DC 5%を注入した16QAMのEVMは6.76%(IRR 28.8 dB)。DC除去で4.66%、GSOPまたはブラインド広義線形補正でEVM 3.11%・IRR 54 dBまで回復し、雑音下限3.17%に到達した。アナログの不完全性は、統計量に基づくデジタル補正で十分に取り戻せる
ゼロIF受信機は「フィルタという物理部品を、信号処理という数式に置き換えたアーキテクチャ」だと総括できます。外付けの高Qフィルタが消えた代わりに、DCオフセット推定・1/f対策・IQ補正という数式の仕事が増えました。この交換が成立したのは、CMOSのデジタル処理が安くなり、アナログの高Q共振器が安くならなかったからです。無線工学の進歩が「難しい物理を、易しい数学に翻訳し続けてきた歴史」であることが、この一例からもよく見えてきます。
次のステップとして、以下の記事も参考にしてください。
- スーパーヘテロダイン受信機の原理 — 周波数変換による高性能受信の仕組み — 比較対象となる古典的アーキテクチャの詳細
- コンステレーション図とEVM・IQ不平衡の理論と実装 — EVMの定義と各種劣化要因の切り分け
- 解析信号と瞬時周波数 — ヒルベルト変換で信号の”今”を読む — 複素ベースバンド表現の数学的背景
- 利得圧縮とIP3 — 増幅器の線形性 — 非線形歪みとインターセプトポイントの考え方
- Leesonモデルで理解するVCOの位相雑音 — LOの位相雑音がベースバンドに与える影響
- フリスの公式によるカスケード雑音指数 — 受信機全体の雑音指数の設計
- OFDMの原理 — 直交多重で周波数選択性フェージングに勝つ — 鏡像サブキャリア干渉が問題になる変調方式