レーダーのパルス積分(コヒーレント積分・ノンコヒーレント積分)を理解する

暗い夜空を天体望遠鏡で覗いても、目では見えない淡い銀河があります。ところが同じ望遠鏡にカメラを付けて30秒間シャッターを開けっぱなしにすると、その銀河がくっきり写ります。1秒あたりに届く光子の数は変わっていないのに、なぜ見えるようになるのでしょうか。答えは単純で、光(信号)は時間とともに積み上がるのに対し、センサーのランダムなノイズは足し合わせても打ち消し合う方向に働くからです。時間をかけて集めるほど、信号とノイズの比が改善していきます。

レーダーも、まったく同じことをやっています。アンテナのビームが目標を照射している短い時間のあいだに、レーダーは1発ではなく数十発から数千発のパルスを送信し、返ってきた反射波を足し合わせます。この操作を パルス積分(pulse integration) と呼びます。1発では雑音に埋もれて見えない微弱な反射も、$N$ 発を積み上げれば検出可能なレベルまで浮かび上がります。

ただし、ここには重要な分かれ道があります。パルスの 位相をそろえて複素数のまま足す のか(コヒーレント積分)、それとも 包絡線検波して大きさだけにしてから足す のか(ノンコヒーレント積分)です。前者は SNR がきれいに $N$ 倍になりますが、後者は $\sqrt{N}$ 程度にしかなりません。同じ「$N$ 発足す」という操作なのに、なぜこれほど差がつくのでしょうか。この差が生まれる仕組みを理解することが、本記事の中心的なテーマです。

パルス積分の全体像。受信サンプルを複素数のまま足すコヒーレント積分と、二乗検波してから足すノンコヒーレント積分の2ルート

この1枚が本記事の見取り図です。上下のルートは、どちらも「$N$ 個の受信サンプルを1つの数にまとめる」という同じ目的をもち、使う部品(加算器と検波器)も同じです。違うのは並び順だけ — 上は「加算 → 検波」、下は「検波 → 加算」です。ところが検波(包絡線を取る操作)は $|\cdot|$ という非線形演算なので、加算と順序を入れ替えると結果が変わります。右端の SNR 利得が $N$ と $\sqrt{N}$ に分かれるのは、この一点だけが理由です。

パルス積分を理解すると、次のような場面で見通しが一気によくなります。

  • 探知距離の設計: レーダー方程式は $R^4$ に反比例して受信電力が落ちるため、探知距離を1.5倍にするには受信電力を約5倍(7 dB)稼ぐ必要があります。送信電力を5倍にするのは大変ですが、パルス積分なら $N = 5$ でコヒーレントに稼げます。「何パルス積分すればよいか」の見積もりは、レーダー設計の最初の一歩です
  • ドップラー処理(MTI/パルスドップラー)の理解: 実は、ドップラー処理で使う FFT は「コヒーレント積分器を周波数ビンの数だけ並べたもの」に他なりません。なぜ FFT で SNR が上がるのか、なぜ CPI(コヒーレント処理間隔)を長くすると分解能と感度が同時に改善するのかが、統一的に理解できます
  • 合成開口レーダー(SAR)や GNSS 受信機: SAR の方位圧縮も、GNSS のコード相関積分も、本質はコヒーレント積分です。位相誤差がどれだけ利得を削るかという話は、そのままこれらの分野の設計指針になります

本記事の内容

  • パルス積分の直感的な意味と、コヒーレント/ノンコヒーレントの分岐点
  • コヒーレント積分で SNR が厳密に $N$ 倍($10\log_{10}N$ dB)になることの導出
  • 位相誤差 $\phi_i$ があるときの利得低下 $|\sum e^{j\phi_i}|^2 / N$ の導出と、位相雑音の許容量
  • ドップラー処理(FFT)がコヒーレント積分そのものであることの説明とスキャロッピング損
  • ノンコヒーレント積分で二乗検波損(小信号抑圧)が生じる仕組みの導出
  • 積分改善係数 $I(N)$ と積分損 $L(N)$、Barton の経験式と厳密計算の突き合わせ
  • Swerling モデル別の検出確率とパルス積分の相互作用
  • Python による検証(SNR 利得曲線、位相誤差、ROC、積分損、FFT スペクトル)

前提知識

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

パルス積分とは — 「同じ景色を何度も撮って重ねる」

冒頭の天体写真の例をもう少し丁寧に考えてみましょう。カメラのセンサーに毎秒 $s$ 個の光子が届き、同時に毎秒平均 $n$ 個のノイズ電子が発生しているとします。1秒露光すれば信号は $s$、ノイズは平均 $n$ です。では10秒露光したらどうなるでしょうか。信号は確実に $10s$ になります。一方ノイズは「平均が $10n$ になる」のではなく、ランダムな揺らぎの標準偏差が $\sqrt{10}$ 倍になるのです。ランダムなものを $N$ 個足すと、和の分散は $N$ 倍、標準偏差は $\sqrt{N}$ 倍にしかなりません。だから信号対雑音の比は $\sqrt{N}$ 倍に改善します。

信号成分は毎パルス同じ向き、雑音成分は毎パルスランダムな向きであり、積分後は信号電力がN二乗倍、雑音電力がN倍になる

左と中央のパネルを見比べてください。信号(左)は毎パルスまったく同じ値を取るので、$N$ 個足せば振幅がそのまま $N$ 倍になります。雑音(中央)は正負がばらばらなので足し合わせても打ち消し合い、電力(分散)だけが $N$ 倍になります。右のパネルはこの2つの伸び方を dB で重ねたもので、青(信号、$10\log_{10}N^2$)と赤(雑音、$10\log_{10}N$)の開き — 緑に塗った領域 — がそのままコヒーレント積分の利得 $10\log_{10}N$ dB です。

レーダーのパルス積分も、原理的にはこれと同じ「重ね合わせ」です。レーダーは PRI(パルス繰り返し間隔)ごとに1発ずつパルスを送り、同じ距離セル(レンジビン)から返ってくる信号を、パルス番号 $i = 1, 2, \dots, N$ に沿って並べます。目標が動かず(正確には、$N$ パルスのあいだ同じレンジビンに留まり)、レーダーの位相基準が安定していれば、この $N$ 個のサンプルには 同じ信号成分 が入っています。一方、熱雑音はパルスごとに完全に独立です。この「共通の信号 vs 独立な雑音」という構図こそが、積分が効く根本理由です。

ここで一つ、天体写真とレーダーの決定的な違いがあります。カメラのセンサーが記録するのは光の強度(実数、非負)だけで、位相の情報は失われています。ところがレーダーの受信機は、直交検波によって同相成分 $I$ と直交成分 $Q$ を取り出せるため、受信信号を 複素数 $x_i = I_i + jQ_i$ として保持できます。複素数のまま足せば、信号は振幅も位相もそろって足し算されます。これがコヒーレント積分です。

一方、何らかの理由で位相をそろえられない場合(あるいは、あえて位相を捨てる場合)には、まず包絡線 $r_i = |x_i|$ もしくはその二乗 $r_i^2 = I_i^2 + Q_i^2$ を取り、その実数値を足し合わせます。これがノンコヒーレント積分です。位相をそろえられないというのは、たとえばレーダーの送信管(マグネトロン)がパルスごとにランダムな初期位相で発振する場合や、目標の運動によってパルス間の位相が予測できない量だけ回転してしまう場合です。

図式的に整理すると、パルス積分は次の2つのルートに分かれます。

  • コヒーレント積分: $x_1, x_2, \dots, x_N$(複素数)を足す → $S = \sum_i x_i$ → 包絡線検波 → しきい値判定
  • ノンコヒーレント積分: 各 $x_i$ を包絡線検波 → $|x_1|^2, \dots, |x_N|^2$(実数)を足す → $Z = \sum_i |x_i|^2$ → しきい値判定

「検波の前に足すか、後で足すか」だけの違いに見えますが、包絡線検波は $|\cdot|$ という非線形演算です。非線形演算を挟むと、順序を入れ替えた結果はもはや同じにならない — この一点が、以降で見る性能差のすべての源になります。

では、両者の性能差を定量的に扱うために、まず受信信号と雑音の数学モデルをきちんと立てておきましょう。

受信信号と雑音のモデル

複素平面上の受信サンプル散布図。信号は常に同じ向きの赤い矢印、雑音は原点対称な円状のばらつきとして現れる

これから立てるモデルを、先に絵で見ておきましょう。受信サンプルの雲は、赤い矢印(信号ベクトル $A$)の先端を中心に、破線の円で示した範囲に広がっています。この雲が真円であること — すなわち特定の位相方向に偏っていないこと — が、次に述べる雑音の円対称性です。左($\chi = 10$ dB)では雲が信号ベクトルより小さいので1発でも目標が見えますが、右($\chi = 0$ dB)では雲が信号ベクトルと同程度に広がり、1発では原点付近との区別がつきません。この右の状況を救うのがパルス積分です。

レーダー受信機の直交検波出力を、パルス番号 $i$ ごとに複素数で書きます。目標が存在する場合、あるレンジビンの受信サンプルは次の形になります。

$$ \begin{equation} x_i = A e^{j\theta_i} + n_i, \qquad i = 1, 2, \dots, N \end{equation} $$

ここで $A$ は反射信号の振幅(実数、$A > 0$)、$\theta_i$ はパルス $i$ における信号の位相、$n_i$ は複素雑音です。$n_i$ の実部と虚部はそれぞれ平均 0、分散 $\psi$ の独立な正規分布に従うとします。

$$ n_i = n_{I,i} + j n_{Q,i}, \qquad n_{I,i}, n_{Q,i} \sim \mathcal{N}(0, \psi) \ \ (\text{独立}) $$

このとき1複素サンプルあたりの雑音電力は $\mathbb{E}[|n_i|^2] = 2\psi$ です。信号電力は $|Ae^{j\theta_i}|^2 = A^2$ なので、1パルスあたりの SNR を次のように定義します。

$$ \begin{equation} \chi = \frac{A^2}{2\psi} \end{equation} $$

この $\chi$ は、Swerlingターゲットモデル の記事で使った記号と同じものです。整合フィルタ通過後の1パルスあたり SNR、と読み替えてもらって構いません(そもそも整合フィルタは1パルス内で SNR を最大化する操作であり、パルス積分はパルスをまたいでさらに SNR を稼ぐ操作です。両者は直交した関係にあり、順に適用できます)。

雑音の重要な性質を2つ確認しておきます。第一に、$n_i$ は $i$ について独立です。熱雑音の相関時間はレーダーの帯域幅の逆数程度(ナノ秒オーダー)であり、PRI(マイクロ秒〜ミリ秒オーダー)よりはるかに短いためです。第二に、$n_i$ は 円対称 です。つまり位相が一様分布しており、どんな位相回転 $e^{j\alpha}$ をかけても統計的性質が変わりません。この円対称性のおかげで、後の計算で「雑音の位相をそろえる」といった議論をせずに済みます。

一方、信号の位相 $\theta_i$ の振る舞いこそが、コヒーレントかノンコヒーレントかを決める鍵です。理想的なコヒーレントレーダーで静止目標を観測するなら $\theta_i$ は全パルスで一定($\theta_i = \theta_0$)です。目標がドップラー周波数 $f_d$ で動いているなら $\theta_i = \theta_0 + 2\pi f_d (i-1) T_r$($T_r$ は PRI)と規則的に回転します。この場合も、回転量がわかっていれば逆回転させてそろえられるので、実質的にコヒーレント積分が可能です。

これで道具立てがそろいました。まずは位相が完全にそろっている理想ケース、コヒーレント積分から見ていきましょう。

コヒーレント積分 — SNRが厳密にN倍になる理由

直感: 「そろえて足す」と「バラバラに足す」

$N$ 本の矢印を足すことを想像してください。全部が同じ向きを向いていれば、合成した矢印の長さは元の $N$ 倍になります。ところが向きがランダムなら、足し合わせた矢印は酔歩(ランダムウォーク)になり、長さはせいぜい $\sqrt{N}$ 倍にしかなりません。

コヒーレント積分でやっているのは、まさにこれです。信号ベクトルは全部同じ向きなので長さが $N$ 倍、雑音ベクトルはランダムな向きなので長さが $\sqrt{N}$ 倍。電力で見ると信号は $N^2$ 倍、雑音は $N$ 倍 です。したがって比は $N^2 / N = N$ 倍に改善します。この「$N^2$ 対 $N$」という非対称性が、コヒーレント積分の全てです。

複素平面での累積和の軌跡。位相がそろっていると一直線に伸びて|S|=14.66、ランダムだと酔歩になり|S|=5.56にとどまる

同じ雑音を使い、信号の位相だけを変えて累積和の軌跡を描いたものです($N = 16$、$A = 1$)。左では16本の矢印が同じ向きに積み上がって $|S| = 14.66$ と理想値 $NA = 16$ にほぼ達しているのに対し、右では軌跡が折れ曲がって原点付近をさまよい、$|S| = 5.56$ で止まっています。位相をランダムにすると和は酔歩そのものになり、多数回平均すると $\sqrt{N} = 4$ に収束します。「そろえて足す」ことの利得が、幾何学的にそのまま見えている図です。

導出

$\theta_i = 0$(位相が完全にそろっている、あるいは既知の位相回転を補償済み)として、複素サンプルをそのまま加算します。

$$ S = \sum_{i=1}^{N} x_i = \sum_{i=1}^{N} \left(A + n_i\right) = NA + \sum_{i=1}^{N} n_i $$

第1項が信号成分、第2項が雑音成分です。信号成分の電力は決定論的に定まります。

$$ P_s^{(N)} = |NA|^2 = N^2 A^2 $$

雑音成分については、独立な確率変数の和の分散が分散の和になる性質を使います。$\mathbb{E}[n_i] = 0$ かつ $i \neq k$ で $\mathbb{E}[n_i n_k^*] = 0$(独立かつ平均 0)なので、

$$ P_n^{(N)} = \mathbb{E}\left[\left|\sum_{i=1}^{N} n_i\right|^2\right] = \sum_{i=1}^{N}\sum_{k=1}^{N} \mathbb{E}[n_i n_k^*] = \sum_{i=1}^{N} \mathbb{E}[|n_i|^2] = 2N\psi $$

ここで交差項 $i \neq k$ がすべて消えたのが決定的です。雑音が無相関だから、電力(分散)だけが単純に足し算される のに対し、信号は相関 1 なので振幅が足し算されて電力は二乗で効く、という非対称性が数式に現れています。

両者の比を取ると、コヒーレント積分後の SNR が得られます。

$$ \chi_{\mathrm{coh}} = \frac{P_s^{(N)}}{P_n^{(N)}} = \frac{N^2 A^2}{2N\psi} = N \cdot \frac{A^2}{2\psi} $$

右辺の $A^2/(2\psi)$ は定義より1パルス SNR $\chi$ そのものです。したがって、

$$ \begin{equation} \boxed{\ \chi_{\mathrm{coh}} = N \chi\ } \end{equation} $$

デシベルで書けば、コヒーレント積分の利得は

$$ G_{\mathrm{coh}}\,[\mathrm{dB}] = 10\log_{10} N $$

です。$N = 10$ なら 10 dB、$N = 100$ なら 20 dB、$N = 1024$ なら約 30 dB。これは近似でも経験則でもなく、上の仮定(位相完全一致・雑音無相関・線形加算)のもとでの 厳密な等式 です。

「SNRがN倍」が実務でもつ意味

左: 探知距離はNの4乗根で伸び、N=16で2倍、N=256で4倍。右: 積分利得はlogで増えるがドウェル時間はNに比例して増える

左図は積分パルス数と探知距離の関係です。SNR が $N$ 倍になっても距離は $N^{1/4}$ 倍にしか伸びないため、距離を2倍にするには $N = 16$、4倍にするには $N = 256$ が必要になります(オレンジの破線はノンコヒーレント小信号極限で、同じ $N$ でも $N^{1/8}$ 倍にしかなりません)。右図はその代償を示していて、青い利得の棒が対数的にしか伸びないのに対し、オレンジのドウェル時間は $N$ に比例して増えます。$N = 1024$ で 30 dB 稼ぐには1方向に1秒留まる必要があり、全空域の走査周期が犠牲になるわけです。

レーダー方程式によれば、受信電力は距離の4乗に反比例します。したがって探知距離 $R$ を伸ばすには SNR を $R^4$ で稼ぐ必要があり、$N$ パルスのコヒーレント積分は探知距離を $N^{1/4}$ 倍にします。$N = 16$ なら 2 倍、$N = 256$ なら 4 倍です。送信電力を256倍にするのは現実的でありませんが、パルスを256発積分するのは(コヒーレンスさえ保てれば)ソフトウェア処理で済みます。現代のレーダーが「低ピーク電力・長い CPI」の方向に進化してきたのは、この事情によるところが大きいです。

もう一つ重要なのは、積分は無料ではない ことです。$N$ パルスを積分するには $N \cdot T_r$ の時間がかかります。捜索レーダーなら、その時間はビームを1方向に留めておく時間(ドウェル時間)であり、全空域を走査する周期と直接トレードオフになります。「感度を上げるか、走査を速くするか」という設計上の緊張関係が、ここから生まれます。

さて、ここまでは「位相が完全にそろっている」という理想を前提にしてきました。しかし現実のレーダーでは、発振器の位相雑音、目標の予測できない運動、伝搬媒質の揺らぎなどによって、位相は必ずいくらかズレます。次はそのズレが利得をどれだけ削るのかを定量化しましょう。

位相誤差によるコヒーレント利得の低下

一般化した利得の式

各パルスに未補償の位相誤差 $\phi_i$ が残っているとします。すなわち $x_i = A e^{j\phi_i} + n_i$ として、そのままコヒーレント加算します。

$$ S = A \sum_{i=1}^{N} e^{j\phi_i} + \sum_{i=1}^{N} n_i $$

信号成分の電力は、複素指数の和の絶対値二乗で決まります。

$$ P_s^{(N)} = A^2 \left|\sum_{i=1}^{N} e^{j\phi_i}\right|^2 $$

雑音電力は先ほどと変わらず $2N\psi$ です(雑音は円対称なので位相誤差の影響を受けません)。したがって積分後の SNR は、

$$ \chi_{\mathrm{coh}} = \frac{A^2 \left|\sum_i e^{j\phi_i}\right|^2}{2N\psi} = \chi \cdot \frac{\left|\sum_{i=1}^{N} e^{j\phi_i}\right|^2}{N} $$

すなわち、コヒーレント積分の利得は次の量で与えられます。

$$ \begin{equation} G_{\mathrm{coh}} = \frac{1}{N}\left|\sum_{i=1}^{N} e^{j\phi_i}\right|^2 \end{equation} $$

位相誤差の標準偏差が0、0.4、1.0、2.0 radのときのフェーザ和。誤差が増えるほど折れ線が曲がり、合成フェーザが短くなる

この式が何を表しているかは、フェーザを継ぎ足した折れ線で見るのが一番早いです。$\sigma_\phi = 0$(左端)では16本が一直線に並んで合成長が16に達し、利得は理想値 $N = 16$ です。$\sigma_\phi$ が増えるにつれて折れ線が蛇行しはじめ、$\sigma_\phi = 1.0$ rad では合成長が12程度(利得 9.2)、$\sigma_\phi = 2.0$ rad ではほぼ丸まってしまって利得 1.4 — つまり16発積分してもほとんど1発分の価値しかありません。$G_{\mathrm{coh}}$ とは「赤い矢印の長さの二乗を $N$ で割った量」であり、位相がそろっているほど長く伸びる、というだけの話です。

$\phi_i \equiv 0$ のとき $|\sum e^{j0}|^2 = N^2$ なので $G_{\mathrm{coh}} = N$ となり、前節の結果を含んでいます。逆に $\phi_i$ が完全にランダム(一様分布)なら、和は酔歩になって $\mathbb{E}|\sum e^{j\phi_i}|^2 = N$ 程度、つまり $G_{\mathrm{coh}} \approx 1$ — 積分してもまったく得をしません。この式は「矢印をそろえて足す」という直感の、そのままの数式化になっています。

ランダム位相誤差の期待値

実務でよくあるのは、$\phi_i$ が平均 0、標準偏差 $\sigma_\phi$ の小さなランダム変動である場合です。このとき利得の期待値を求めておくと便利です。二重和に展開します。

$$ \mathbb{E}\left|\sum_{i} e^{j\phi_i}\right|^2 = \sum_{i}\sum_{k} \mathbb{E}\left[e^{j(\phi_i – \phi_k)}\right] $$

対角項($i = k$)は $\mathbb{E}[e^{j0}] = 1$ が $N$ 個。非対角項($i \neq k$)は $\phi_i$ と $\phi_k$ が独立なので $\mathbb{E}[e^{j\phi_i}]\mathbb{E}[e^{-j\phi_k}] = |\mathbb{E}[e^{j\phi}]|^2$ に分解でき、これが $N(N-1)$ 個あります。

$$ \mathbb{E}\left|\sum_{i} e^{j\phi_i}\right|^2 = N + N(N-1)\left|\mathbb{E}[e^{j\phi}]\right|^2 $$

$\phi \sim \mathcal{N}(0, \sigma_\phi^2)$ の特性関数は $\mathbb{E}[e^{j\phi}] = e^{-\sigma_\phi^2/2}$ なので、$|\mathbb{E}[e^{j\phi}]|^2 = e^{-\sigma_\phi^2}$ を代入して $N$ で割ると、

$$ \begin{equation} \mathbb{E}[G_{\mathrm{coh}}] = 1 + (N-1)e^{-\sigma_\phi^2} \end{equation} $$

$N \gg 1$ なら $\mathbb{E}[G_{\mathrm{coh}}] \approx N e^{-\sigma_\phi^2}$ なので、理想利得 $N$ に対する損失は

$$ L_\phi\,[\mathrm{dB}] \approx 10\log_{10}\left(e^{\sigma_\phi^2}\right) = \frac{10}{\ln 10}\sigma_\phi^2 \approx 4.343\,\sigma_\phi^2 $$

となります。これは非常に使いやすい設計式です。位相誤差の RMS が 0.4 rad(約23度)なら損失は $4.343 \times 0.16 \approx 0.69$ dB、1 rad(約57度)なら約 4.3 dB です。実際、$N = 32$ でモンテカルロ計算すると $\sigma_\phi = 0.4$ で 0.67 dB、$\sigma_\phi = 1.0$ で 4.12 dB の損失となり、上の近似とよく一致します(大きい $\sigma_\phi$ で近似がわずかに過大評価になるのは、$(N-1)$ が $N$ でない分の効果です)。

コヒーレント積分時間を制限するもの

この結果は「コヒーレント積分をどこまで長くできるか」という実務的な問いに直結します。位相誤差の主な発生源は次の3つです。

  1. 発振器の位相雑音: 送受信の局部発振器が完全に安定でないため、パルス間で位相がランダムに漂います。積分時間が長いほど累積位相誤差が大きくなるので、CPI を伸ばすほど厳しい位相雑音要求が課されます
  2. 目標の運動: 目標が等速なら位相回転は線形で補償可能ですが、加速度があると位相は二次的にずれます。往復波長 $\lambda/2$ に対して加速度 $a$、積分時間 $T$ なら位相誤差は $\sim 2\pi a T^2 / \lambda$ 程度。X バンド($\lambda \approx 3$ cm)で $a = 10\ \mathrm{m/s^2}$ なら、$T = 30$ ms でもう 1 rad 級の誤差になります
  3. 伝搬媒質の揺らぎ: 電離層や対流圏の屈折率変動によって位相が揺らぎます。低周波ほど電離層の影響が大きくなります

だからこそ、実際のレーダーは「コヒーレント積分をできる範囲で行い、それを超える分はノンコヒーレント積分でつなぐ」という二段構えを取ります。たとえば $N = 64$ パルスを1 CPI としてコヒーレント積分し、8 CPI 分をノンコヒーレントに足す、といった構成です。ノンコヒーレント積分は位相コヒーレンスを要求しないので、CPI をまたいでも、スキャンをまたいでも使えます。

ここで、コヒーレント積分の最も重要な実装形態に触れておかなければなりません。実務では「単純に足す」ことはめったになく、代わりに FFT が使われます。その理由を次に見ましょう。

ドップラー処理(FFT)はコヒーレント積分そのもの

なぜ単純加算ではダメなのか

前節までの導出は「位相が既知でそろっている」ことを前提にしていました。しかし捜索レーダーでは、目標の速度は未知です。目標がドップラー周波数 $f_d$ で動いていれば、パルス $i$ の位相は

$$ \theta_i = 2\pi f_d (i-1) T_r $$

と回転します。これを知らずにそのまま足すと、$G_{\mathrm{coh}} = |\sum_i e^{j\theta_i}|^2/N$ の値は激しく落ち込みます。$f_d T_r$ がわずか $1/N$ でも、位相は1周してしまい和がほぼゼロになります。

解決策は単純です。あらゆる $f_d$ の候補について、それぞれ位相を補償してから足す のです。候補周波数を $f = k/(NT_r)$($k = 0, 1, \dots, N-1$)と離散化して、候補 $k$ に対する補償後の和を書くと、

$$ S_k = \sum_{i=1}^{N} x_i\, e^{-j2\pi k (i-1)/N} $$

これは離散フーリエ変換(DFT)そのものです。つまり、ドップラー FFT とは、$N$ 個の異なる速度仮説それぞれに対するコヒーレント積分器を、$N$ 本並べたフィルタバンク に他なりません。FFT はそれを $O(N\log N)$ で一気に計算する高速アルゴリズムというだけです。

左: 速度仮説kごとに位相補償して加算する積分器を並べた模式図。右: 各FFTビンのフィルタ応答が並び、隣接ビンの交差点が-3.92 dB

左の模式図が DFT の正体です。同じ受信サンプル列 $x_1 \dots x_N$ を $N$ 本の枝に配り、各枝で異なる位相補償 $e^{-j2\pi k i/N}$ をかけてから足す — 目標の速度に一致した枝(青くハイライトした $k = k_0$)だけで位相がそろい、$|S_{k_0}|^2 = N^2A^2$ という大きな出力が出ます。他の枝では位相がそろわないので雑音レベル $2N\psi$ のままです。右図はこれを周波数応答として描いたもので、$N$ 本のフィルタが等間隔に並んでいる様子と、隣り合うフィルタが $-3.92$ dB の高さで交差していることがわかります。この交差点の深さが、次に述べるスキャロッピング損の正体です。

FFTで得られる利得

目標のドップラーがビン $k_0$ にぴったり一致している場合、$S_{k_0}$ の信号成分は位相が完全にそろって $NA$、雑音成分の電力は $2N\psi$ です。つまり前節と同じく SNR は $N$ 倍。実際に $N = 64$、雑音電力 1、信号振幅 1 で FFT を計算すると、ピークのパワースペクトル値は $|S_{k_0}|^2 \approx N^2 = 4096$、雑音床の平均は $N = 64$ となり、比は 64 倍(18 dB)です。

これは同時に、ドップラー分解能と感度が同じパラメータ(CPI 長)で決まる ことを示しています。CPI を長くすれば周波数分解能 $\Delta f = 1/(NT_r)$ が細かくなり、同時に積分利得 $10\log_{10}N$ も増えます。FFT が「速度を測る道具」であると同時に「感度を稼ぐ道具」でもあるのは、この二重の役割によります。さらに、クラッタ(地面や海面からの強い反射)がゼロドップラー付近に集中する一方で移動目標が別のビンに落ちるため、FFT は SNR だけでなく SCR(信号対クラッタ比) も改善します。詳しくは パルスドップラーレーダー を参照してください。

スキャロッピング損

目標のドップラーが FFT ビンの中心からずれるとどうなるでしょうか。ずれ量を $\delta$(ビン単位、$-0.5 \le \delta \le 0.5$)とすると、補償後の位相は $2\pi\delta(i-1)/N$ ずつ回転し、和は等比級数になります。

$$ \left|\sum_{i=0}^{N-1} e^{j2\pi\delta i/N}\right| = \left|\frac{\sin(\pi\delta)}{\sin(\pi\delta/N)}\right| \approx N\,|\mathrm{sinc}(\delta)| $$

最悪ケースは目標がちょうど2つのビンの中間にある $\delta = 0.5$ のときで、振幅は $\mathrm{sinc}(0.5) = 2/\pi \approx 0.637$ 倍、電力では $20\log_{10}(2/\pi) \approx -3.92$ dB になります。これを スキャロッピング損(scalloping loss) と呼びます。

スキャロッピング損の曲線。ビン中心からのずれが0.5ビンのとき矩形窓で3.92 dB、ハニング窓では1.4 dBの損失になる

青い実線(窓関数なし)は、目標がビン中心にあるとき損失ゼロ、ビンの谷間($\delta = \pm 0.5$)で最大 3.92 dB という U 字を描きます。目標の速度は選べないので、実際には 0〜3.92 dB のどこかの損失を確率的に被ることになり、$\delta$ が一様分布なら平均 1.26 dB の目減りです。オレンジの破線はハニング窓を掛けた場合で、ビン形状がなだらかになるぶん最悪損失が 1.42 dB(平均 0.47 dB)まで下がります。ただしこれは「主ローブが広がって雑音等価帯域が 1.5 ビンに増える」代償の上に成り立っており、窓関数損として別途 $10\log_{10}1.5 = 1.76$ dB を支払っています。ホタテ貝の縁のようにギザギザした感度特性になることからこの名がついています。実務では FFT の点数をパルス数より多く取る(ゼロパディング)か、窓関数を掛けてビン形状をなだらかにすることで、スキャロッピング損とサイドローブのバランスを取ります。ただし窓関数は主ローブを広げ、SNR 的には別の損(窓関数損)を生むため、ここにもトレードオフがあります。

ここまでで、位相をそろえて足す世界の話は一通り済みました。次はいよいよ、位相を捨てて足すノンコヒーレント積分に移ります。なぜ $N$ ではなく $\sqrt{N}$ しか稼げないのか、その理由を検波器の統計から導きます。

ノンコヒーレント積分と二乗検波損

なぜ位相を捨てるのか

「位相を捨てたら損をするなら、なぜ捨てるのか」という疑問が当然生じます。理由は主に2つです。第一に、位相をそろえられない物理的な事情があるから。マグネトロン送信機はパルスごとに初期位相がランダムですし、CPI をまたぐと発振器の位相がドリフトします。第二に、そもそも検出判定は包絡線で行われる から。しきい値判定に位相は不要で、しかも CFAR 処理や表示は包絡線(振幅)ドメインで組み立てられています。CPI 内は FFT でコヒーレント処理し、CPI をまたぐ分は包絡線を足す — というのが現代レーダーの標準的な構成です。

ノンコヒーレント積分では、各パルスを二乗検波(square-law detection)してから足します。

$$ Z = \sum_{i=1}^{N} |x_i|^2 = \sum_{i=1}^{N}\left(I_i^2 + Q_i^2\right) $$

$|\cdot|^2$ という非線形演算のせいで、雑音と信号が「混ざる」のがポイントです。それを次に見ます。

二乗検波器の出力統計

1パルス分の出力 $y = |x|^2 = (A + n_I)^2 + n_Q^2$ の統計量を計算します。まず期待値です。$\mathbb{E}[n_I] = \mathbb{E}[n_Q] = 0$、$\mathbb{E}[n_I^2] = \mathbb{E}[n_Q^2] = \psi$ を使うと、

$$ \mathbb{E}[y] = A^2 + 2\mathbb{E}[n_I]A + \mathbb{E}[n_I^2] + \mathbb{E}[n_Q^2] = A^2 + 2\psi $$

第1項が「信号らしさ」を運ぶ成分、第2項は目標がなくても出てくる雑音のバイアスです。したがって、目標の有無による出力平均の差(=検出に使える情報量)は

$$ \Delta = \mathbb{E}[y \mid \text{目標あり}] – \mathbb{E}[y \mid \text{目標なし}] = A^2 $$

です。次に分散を求めます。$y/\psi$ は自由度 2、非心度 $\lambda = A^2/\psi$ の非心カイ二乗分布に従います。非心カイ二乗分布の分散公式 $\mathrm{Var} = 2(k + 2\lambda)$($k$ は自由度)を使うと、

$$ \mathrm{Var}[y] = \psi^2 \cdot 2\left(2 + \frac{2A^2}{\psi}\right) = 4\psi^2 + 4\psi A^2 $$

分散が2つの項に分かれているのが重要です。$4\psi^2$ は「雑音×雑音」から来る項、$4\psi A^2$ は「信号×雑音」のクロス項から来る項です。検波器という非線形素子を通したせいで、信号自身が雑音を増幅している格好になっています。

偏差SNRと小信号抑圧

検出のしやすさを測る指標として、偏差 SNR(deflection SNR) を「平均の差の二乗 ÷ 分散」で定義します。

$$ D_1 = \frac{\Delta^2}{\mathrm{Var}[y]} = \frac{A^4}{4\psi^2 + 4\psi A^2} $$

ここに $A^2 = 2\psi\chi$ を代入して整理します。分子は $(2\psi\chi)^2 = 4\psi^2\chi^2$、分母は $4\psi^2 + 4\psi\cdot 2\psi\chi = 4\psi^2(1 + 2\chi)$ なので、$4\psi^2$ が約分されて

$$ \begin{equation} D_1 = \frac{\chi^2}{1 + 2\chi} \end{equation} $$

という、驚くほどきれいな式が得られます。この式の2つの極限が、ノンコヒーレント積分のすべてを説明します。

  • 大信号領域($\chi \gg 1$): $D_1 \approx \chi/2$。検波器出力の「検出しやすさ」は入力 SNR に 比例 します
  • 小信号領域($\chi \ll 1$): $D_1 \approx \chi^2$。検波器出力の「検出しやすさ」は入力 SNR の 二乗 に落ちます

後者が 小信号抑圧(small-signal suppression)、あるいは 二乗検波損 と呼ばれる現象です。入力 SNR が 1/10 になると、検波後の「検出しやすさ」は 1/100 になってしまう。非線形素子が弱い信号を不利に扱うのです。ラジオの AM 検波で、弱い電波ほど急激に聞こえなくなる(キャプチャ効果の一種)のと同じ根っこの現象だと思ってください。

N倍ではなく√N倍にしかならない理由

いよいよ本題です。$N$ パルスをノンコヒーレント積分すると、平均の差は $N$ 倍(各パルスが $A^2$ ずつ寄与)、分散は $N$ 倍(独立なので加算)になります。したがって積分後の偏差 SNR は

$$ D_N = \frac{(N\Delta)^2}{N\,\mathrm{Var}[y]} = N \cdot \frac{\chi^2}{1 + 2\chi} $$

です。ここで「所定の検出性能 $D$ を達成するのに必要な1パルスあたり SNR」を比べます。1パルスなら $\chi_1$ が $\chi_1^2/(1+2\chi_1) = D$ を満たし、$N$ パルスなら $\chi_N$ が $N\chi_N^2/(1+2\chi_N) = D$ を満たします。積分改善係数を $I(N) = \chi_1/\chi_N$ と定義して、2つの極限で評価しましょう。

大信号領域では $\chi_1/2 = D$、$N\chi_N/2 = D$ なので $\chi_N = \chi_1/N$、すなわち

$$ I(N) \approx N \qquad (\chi \gg 1) $$

コヒーレント積分と同じ利得が得られます。

小信号領域では $\chi_1^2 = D$、$N\chi_N^2 = D$ なので $\chi_N = \chi_1/\sqrt{N}$、すなわち

$$ I(N) \approx \sqrt{N} \qquad (\chi \ll 1) $$

利得が $\sqrt{N}$ にとどまります。デシベルで書けば $5\log_{10}N$ — コヒーレント積分の $10\log_{10}N$ のちょうど半分です。

なぜこうなるのかを、もう一度直感で押さえておきましょう。ノンコヒーレント積分でも「信号は $N$ 倍、雑音の揺らぎは $\sqrt{N}$ 倍」という基本構図自体は成り立っています。問題は、その 1パルスあたりの出発点が二乗で不利になっている ことです。小信号領域では検波器が入力 SNR を二乗に潰してしまうので、そこから $N$ 倍を回復しても、入力 SNR 換算では平方根しか戻ってこないのです。

実際に偏差ベースで数値計算すると、目標の検出しやすさ $D = 0.01$(小信号)では $N = 64$ の改善が 9.41 dB($5\log_{10}64 = 9.03$ dB に近い)、$D = 100$(大信号)では 17.50 dB($10\log_{10}64 = 18.06$ dB に近い)となり、両極限が数値的にも確認できます。実務的な動作点はこの中間なので、$I(N)$ は $\sqrt{N}$ と $N$ のあいだのどこかに落ち着きます。

この「中間のどこか」を定量的に押さえるのが、次に扱う積分改善係数と積分損です。

積分改善係数 I(N) と積分損 L(N)

定義

前節では偏差 SNR という近似的な指標を使いましたが、レーダー工学では検出確率 $P_d$ と誤警報確率 $P_{fa}$ を直接使って定義します。

$$ \begin{equation} I(N) = \frac{\chi_1(P_d, P_{fa})}{\chi_N(P_d, P_{fa})} \end{equation} $$

ここで $\chi_1$ は1パルスで所定の $(P_d, P_{fa})$ を達成するのに必要な SNR、$\chi_N$ は $N$ パルスをノンコヒーレント積分したときに必要な 1パルスあたり SNR です。理想的なコヒーレント積分なら $I(N) = N$ ですから、その差を 積分損(integration loss) として

$$ \begin{equation} L(N)\,[\mathrm{dB}] = 10\log_{10}\frac{N}{I(N)} = 10\log_{10}N – I(N)\,[\mathrm{dB}] \end{equation} $$

と定義します。$L(N) \ge 0$ で、値が大きいほどノンコヒーレント積分が不利だということです。

厳密計算 — Marcum Q関数

非変動ターゲット(Swerling 0、あるいは Marcum ケース)について、$P_d$ と $P_{fa}$ を厳密に書き下せます。$N$ パルスの二乗検波和 $Z = \sum_i |x_i|^2$ を $\psi$ で規格化した $Z/\psi$ は、目標がないとき自由度 $2N$ のカイ二乗分布、目標があるとき自由度 $2N$・非心度 $\lambda = NA^2/\psi = 2N\chi$ の非心カイ二乗分布に従います。したがって規格化しきい値を $T$ とすれば、

$$ P_{fa} = \Pr\left[\chi^2_{2N} > T\right] = \frac{\Gamma(N, T/2)}{\Gamma(N)} $$

$$ P_d = \Pr\left[{\chi’}^2_{2N}(2N\chi) > T\right] = Q_N\!\left(\sqrt{2N\chi},\ \sqrt{T}\right) $$

ここで $Q_M(a,b)$ は 一般化 Marcum の Q 関数 です。$N = 1$ のときは $P_{fa} = e^{-T/2}$ という簡単な形になり、Swerlingターゲットモデル の記事で導いた式に一致します。この2式から数値的に $\chi_N$ を解けば $I(N)$ が厳密に求まります。

$P_{fa} = 10^{-6}$、$P_d = 0.9$ の条件で計算した結果を表にまとめます。

$N$ 1パルス所要SNR [dB] $I(N)$ [dB] コヒーレント $10\log_{10}N$ [dB] 積分損 $L(N)$ [dB]
1 13.18 0.00 0.00 0.00
2 10.65 2.53 3.01 0.48
4 8.25 4.94 6.02 1.08
8 5.97 7.21 9.03 1.82
16 3.83 9.35 12.04 2.69
32 1.82 11.36 15.05 3.69
64 $-0.08$ 13.27 18.06 4.80

まず $N = 1$ の所要 SNR が 13.18 dB という値に注目してください。これはレーダーの教科書に「$P_d = 0.9$、$P_{fa} = 10^{-6}$ で約 13.2 dB」として載っている定番の数値であり、計算が正しいことの確認になります。

表から読み取れることは明快です。$N$ が小さいうちは積分損が 1 dB 未満で、ノンコヒーレント積分でもほぼコヒーレント並みに稼げます。ところが $N$ が増えるにつれて損が単調に増え、$N = 64$ では 4.8 dB — つまり本来 18 dB 稼げるはずが 13.3 dB しか稼げていません。この傾向は前節の理論と整合します。$N$ を増やすほど1パルスあたりの所要 SNR が下がり($N = 64$ でついに負、$-0.08$ dB)、検波器が小信号領域に入って二乗検波損が効いてくるからです。

$N$ をさらに増やすと、この傾向はよりはっきりします。$P_d = 0.5$ の条件で計算すると、$N = 10^4$ では 1パルスあたり所要 SNR が $-13.16$ dB(完全に小信号領域)、$I(N) = 24.40$ dB、コヒーレントなら 40 dB のはずが積分損 15.6 dB です。このとき $5\log_{10}(10^4) = 20$ dB なので、$I(N) \approx 5\log_{10}N + 4.4$ dB、つまり $\sqrt{N}$ 則に定数オフセットを足した形 に漸近しています。導出した小信号極限がそのまま現れているわけです。

Barton の経験式

厳密計算は数値的に解くしかないので、設計初期の見積もりには経験式が便利です。Barton による近似式(Mahafza のレーダー教科書に収録された形)は次のものです。

$$ \begin{equation} I(N)\,[\mathrm{dB}] = 6.79\,(1 + 0.235 P_d)\left(1 + \frac{\log_{10}(1/P_{fa})}{46.6}\right)\log_{10}(N)\left(1 – 0.140\log_{10}N + 0.0183 (\log_{10}N)^2\right) \end{equation} $$

一見すると係数だらけで意味が取りづらいので、構造を分解して読んでみましょう。

  • $\log_{10}(N)$ の因子 — 積分利得の骨格。係数 $6.79$ は、コヒーレントの $10$ とインコヒーレント極限の $5$ のあいだの値になっています
  • $(1 + 0.235 P_d)$ — 要求する $P_d$ が高いほど積分の効きがよくなります。高い $P_d$ を狙うほど動作点が大信号側に寄り、二乗検波損が軽くなるためです
  • $(1 + \log_{10}(1/P_{fa})/46.6)$ — $P_{fa}$ が厳しい(小さい)ほど積分が効きます。しきい値が高くなるぶん動作点が大信号側に寄る、同じ理屈です
  • 最後の括弧($\log_{10}N$ の二次式)— $N$ が大きくなるほど利得の伸びが鈍る効果、つまり小信号抑圧の効きを補正する項です

この式を先ほどの厳密計算と突き合わせてみます。$P_{fa} = 10^{-6}$、$P_d = 0.9$ で $N = 10$ のとき、経験式は 8.16 dB、厳密計算は 7.92 dB。$N = 64$ では経験式 13.53 dB に対して厳密 13.27 dB。$P_d = 0.5$ でも $N = 100$ で経験式 13.59 dB、厳密 13.81 dB。いずれも 0.3 dB 以内で一致しており、リンクバジェットの初期見積もりには十分な精度です。ただし厳密計算が数行のコードで書ける現代では、経験式は「感覚をつかむための構造式」として使い、最終的な数値は厳密計算で確認するのが正しい姿勢でしょう。

ここまでは目標の反射断面積(RCS)が一定だと仮定してきました。しかし現実の目標は揺らぎます。次はその効果を組み込みましょう。

Swerlingモデル別の検出確率とパルス積分

変動が積分に与える影響

Swerlingターゲットモデル では、RCS の揺らぎ方によって目標を4種類(+非変動の Swerling 0)に分類しました。パルス積分の観点で決定的なのは、揺らぎの 時間スケール です。

  • スキャン間変動(Swerling I, III): 1回のスキャン($N$ パルス)のあいだ RCS は一定で、スキャンごとに独立に変わります
  • パルス間変動(Swerling II, IV): パルスごとに RCS が独立に変わります

この違いが積分の効き方を根本から変えます。スキャン間変動では、たまたま RCS が小さいスキャンに当たると $N$ パルスすべてが弱く、積分してもどうにもなりません。逆にパルス間変動では、$N$ パルスのうちいくつかは強いはずなので、平均化が効いて「全部同時に弱い」という最悪ケースが起きにくくなります。これが ダイバーシティ利得 です。

数値で見る違い

指数分布 RCS(レイリー振幅、$K = 1$)のケースについて、$P_{fa} = 10^{-6}$、$P_d = 0.9$ で必要な平均 SNR(1パルスあたり)を計算すると次のようになります。

$N$ Swerling 0(非変動) Swerling I(スキャン間) Swerling II(パルス間)
1 13.18 dB 21.14 dB 21.14 dB
4 8.25 dB 16.36 dB 10.51 dB
16 3.83 dB 12.12 dB 4.51 dB
64 $-0.08$ dB 8.36 dB 0.12 dB

左: Swerling 0/I/IIの所要平均SNRとNの関係。右: 積分改善係数。Swerling IIはN=64で21.03 dBとコヒーレント理論値18.06 dBを上回る

表の内容をグラフにしたものです。左図では、$N = 1$ で重なっていた赤(Swerling I)と青(Swerling II)が、$N$ が増えるにつれてみるみる離れ、$N = 64$ で 8.2 dB もの差がつきます。青は $N = 16$ 付近で黒(非変動)にほぼ追いつき、それ以降は事実上「揺らがない目標」と同じ扱いになります。右図の改善係数を見ると、青だけが黒い破線(コヒーレント理論値 $10\log_{10}N$)を上回っており、パルス間変動だけが「SNR を稼ぐ」ことに加えて「変動損失を削る」という第二の利得をもつことがはっきりします。

$N = 1$ では Swerling I と II が完全に一致します。1パルスしかなければ「スキャン間」も「パルス間」も区別がつかないので当然です。このとき非変動と比べて 8 dB 近く所要 SNR が上がっており、これが 変動損失 です。

$N$ が増えると両者は劇的に分かれます。$N = 64$ では Swerling I が 8.36 dB を要求するのに対し、Swerling II はわずか 0.12 dB — 8 dB 以上の差がつき、しかも非変動($-0.08$ dB)にほぼ追いついています。改善係数で見るとさらにわかりやすく、Swerling II の $I(64)$ は 21.03 dB で、コヒーレント積分の理論値 18.06 dB すら上回っています。積分損があるにもかかわらず理論値を超えるのは、積分が SNR を稼ぐと同時に 変動損失そのものを削っている からです。64個の独立な RCS サンプルを平均すれば、揺らぎはほとんど消えてしまいます。

一方 Swerling I の $I(64)$ は 12.78 dB で、非変動の 13.27 dB とほぼ同じ(わずかに悪い)値です。スキャン間変動では変動損失が積分では消えないので、積分は純粋に SNR を稼ぐ効果しかもたないわけです。

この事実は、レーダーの運用設計に直接効いてきます。目標の RCS がスキャン間変動タイプ(大型で滑らかな目標をゆっくり照射する場合など)なら、1回のドウェルでパルス数を増やしても変動損失は減りません。それより 周波数アジリティ(パルスごとに送信周波数を変える)を使って人為的にパルス間変動を作り出すほうが、はるかに大きな利得が得られます。周波数を変えると目標上の散乱体からの干渉パターンが変わり、RCS が実質的に独立化するためです。この「周波数ダイバーシティ」は、Swerling I の目標を Swerling II に変換する技術だと理解できます。

さて、理論の議論はここまでです。実際に Python でこれらの主張を一つずつ確かめていきましょう。

Pythonによる検証

コヒーレント積分とノンコヒーレント積分を並べて見る

まずは最も基本的な事実、すなわち「複素数のまま足すと信号が積み上がる」ことを、波形レベルで確認します。位相をそろえた場合とランダムにした場合で、和がどう変わるかを見ます。

import numpy as np
import matplotlib
import 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

rng = np.random.default_rng(0)
N = 16
A = 1.0          # 信号振幅
psi = 0.1        # 1成分あたりの雑音分散 (雑音電力は 2*psi)

# 位相がそろっている場合とランダムな場合
noise = rng.normal(0, np.sqrt(psi), N) + 1j * rng.normal(0, np.sqrt(psi), N)
x_coh = A * np.ones(N) + noise
x_rnd = A * np.exp(1j * rng.uniform(0, 2*np.pi, N)) + noise

fig, axes = plt.subplots(1, 2, figsize=(12, 5))
for ax, x, ttl in [(axes[0], x_coh, "位相がそろっている場合"),
                   (axes[1], x_rnd, "位相がランダムな場合")]:
    cum = np.cumsum(x)                       # 累積和の軌跡
    ax.plot(cum.real, cum.imag, "o-", color="tab:blue", label="累積和の軌跡")
    ax.plot([0, N*A], [0, 0], "r--", lw=2, label="理想の信号成分 (振幅 N*A)")
    ax.scatter([cum[-1].real], [cum[-1].imag], s=120, c="tab:red", zorder=5, label="最終の和")
    ax.set_xlabel("実部 (I)"); ax.set_ylabel("虚部 (Q)")
    ax.set_title(ttl); ax.grid(alpha=0.3); ax.legend(); ax.set_aspect("equal")
plt.tight_layout(); plt.show()

print("位相そろい: |S| = %.2f  (理想 N*A = %.1f)" % (abs(x_coh.sum()), N*A))
print("位相ランダム: |S| = %.2f" % abs(x_rnd.sum()))

# 位相ランダムの場合の |S| をアンサンブル平均して sqrt(N) 則を確認
M = 100000
nz = rng.normal(0, np.sqrt(psi), (M, N)) + 1j*rng.normal(0, np.sqrt(psi), (M, N))
xr = A * np.exp(1j * rng.uniform(0, 2*np.pi, (M, N))) + nz
print("位相ランダムの平均 |S| = %.2f  (sqrt(N) = %.2f)"
      % (np.abs(xr.sum(axis=1)).mean(), np.sqrt(N)))

冒頭の「直感」節で見た累積和の軌跡は、まさにこのコードが出力したものです。位相がそろっている場合は矢印が同じ方向に積み上がり、最終的な和の大きさは 14.66 と、理想値 $NA = 16$ にほぼ達します。一方、位相がランダムな場合は軌跡が酔歩となって原点付近をさまよい、この試行では 5.56 にとどまりました。10万回のアンサンブル平均を取ると 3.90 となり、理論の $\sqrt{N} = 4$ とよく一致します。これが「そろえて足すか、バラバラに足すか」の違いであり、コヒーレント積分の利得 $N$ 倍の視覚的な正体です。

SNR利得がNに比例することの実測

次に、コヒーレント積分後の SNR が本当に $N$ 倍になるかをモンテカルロで確かめます。信号電力と雑音電力を別々に測って比を取ります。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(1)
A, psi = 1.0, 1.0
trials = 20000
Ns = np.array([1, 2, 4, 8, 16, 32, 64, 128, 256])

gains = []
for N in Ns:
    # 各試行で N パルスをコヒーレント加算
    noise = (rng.normal(0, np.sqrt(psi), (trials, N))
             + 1j * rng.normal(0, np.sqrt(psi), (trials, N)))
    S_noise = noise.sum(axis=1)
    P_sig = abs(N * A) ** 2              # 決定論的な信号電力
    P_noi = np.mean(np.abs(S_noise) ** 2)  # 実測した雑音電力
    snr_out = P_sig / P_noi
    snr_in = A**2 / (2 * psi)
    gains.append(snr_out / snr_in)

gains = np.array(gains)
plt.figure(figsize=(8, 5))
plt.plot(Ns, 10*np.log10(gains), "o-", label="コヒーレント積分 (実測)")
plt.plot(Ns, 10*np.log10(Ns), "k--", label="理論値 $10\\log_{10}N$")
plt.plot(Ns, 5*np.log10(Ns), ":", color="tab:red",
         label="小信号ノンコヒーレント極限 $5\\log_{10}N$")
plt.xscale("log", base=2); plt.xlabel("積分パルス数 N")
plt.ylabel("SNR利得 [dB]"); plt.title("コヒーレント積分のSNR利得")
plt.grid(alpha=0.3, which="both"); plt.legend(); plt.tight_layout(); plt.show()

for N, g in zip(Ns, gains):
    print("N=%4d  実測利得=%6.2f dB  理論=%6.2f dB" % (N, 10*np.log10(g), 10*np.log10(N)))

コヒーレント積分のSNR利得の実測と理論。実測点が10log10Nの直線に乗り、5log10Nとの差が積分損の上限を表す

実測値は理論直線 $10\log_{10}N$ の上にぴたりと乗ります($N = 16$ で実測 12.07 dB、理論 12.04 dB)。誤差は雑音電力の標本推定に由来する 0.1 dB 未満のばらつきだけです。同じ図に引いた $5\log_{10}N$ の直線は、次に見るノンコヒーレント積分の小信号極限で、コヒーレントとの差がそのまま積分損の上限を表しています。$N = 256$ ではその差が 12 dB にもなり、位相コヒーレンスを保つ価値の大きさがわかります。

位相誤差による利得低下

続いて、位相誤差 $\sigma_\phi$ が利得をどれだけ削るかを確認します。導いた式 $\mathbb{E}[G] = 1 + (N-1)e^{-\sigma_\phi^2}$ と、簡易近似 $L \approx 4.343\sigma_\phi^2$ dB の妥当性を検証します。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(2)
sigmas = np.linspace(0, 1.6, 33)   # 位相誤差の標準偏差 [rad]
trials = 40000

plt.figure(figsize=(8, 5))
for N, c in [(8, "tab:blue"), (32, "tab:orange"), (128, "tab:green")]:
    mc, th = [], []
    for sd in sigmas:
        phi = rng.normal(0, sd, (trials, N))
        g = np.abs(np.exp(1j*phi).sum(axis=1))**2 / N   # 利得 |Σe^{jφ}|^2 / N
        mc.append(g.mean())
        th.append(1 + (N - 1) * np.exp(-sd**2))
    loss_mc = 10*np.log10(N / np.array(mc))
    loss_th = 10*np.log10(N / np.array(th))
    plt.plot(sigmas, loss_mc, "o", ms=3, color=c, label="N=%d 実測" % N)
    plt.plot(sigmas, loss_th, "-", color=c, label="N=%d 理論" % N)

plt.plot(sigmas, 4.343*sigmas**2, "k--", lw=2, label="近似 $4.343\\sigma_\\phi^2$ dB")
plt.xlabel("位相誤差の標準偏差 $\\sigma_\\phi$ [rad]")
plt.ylabel("コヒーレント利得の損失 [dB]")
plt.title("位相誤差によるコヒーレント積分損失")
plt.grid(alpha=0.3); plt.legend(); plt.ylim(0, 10)
plt.tight_layout(); plt.show()

位相誤差による損失の実測と理論。N=8/32/128の3本が重なり、簡易近似4.343σ^2はNが大きいほどよく一致する

3本の理論曲線と実測点がきれいに重なり、導いた式 $\mathbb{E}[G] = 1 + (N-1)e^{-\sigma_\phi^2}$ が正しいことが確認できます。破線の簡易近似 $4.343\sigma_\phi^2$ は $N$ が大きい領域($N = 128$)でほぼ一致し、$N$ が小さいと理論値のほうが小さくなります($N$ が小さいと $(N-1)/N$ の補正が効くため)。実用的な読み取りとしては、位相誤差 RMS を 0.5 rad(約29度)以下に抑えれば損失は 1 dB 程度で済む ということです。これが発振器の位相雑音仕様や CPI 長を決める根拠になります。

二乗検波の小信号抑圧

次に、ノンコヒーレント積分の核心である二乗検波損を、偏差 SNR $D_1 = \chi^2/(1+2\chi)$ の形で確かめます。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(3)
chi_db = np.arange(-15, 21, 1.0)
psi = 1.0
mc, theory = [], []
for cdb in chi_db:
    chi = 10 ** (cdb / 10)
    A = np.sqrt(2 * psi * chi)
    n = 200000
    y1 = rng.normal(A, np.sqrt(psi), n)**2 + rng.normal(0, np.sqrt(psi), n)**2  # 目標あり
    y0 = rng.normal(0, np.sqrt(psi), n)**2 + rng.normal(0, np.sqrt(psi), n)**2  # 雑音のみ
    mc.append((y1.mean() - y0.mean())**2 / y1.var())
    theory.append(chi**2 / (1 + 2*chi))

plt.figure(figsize=(8, 5))
plt.plot(chi_db, 10*np.log10(mc), "o", ms=4, label="モンテカルロ実測")
plt.plot(chi_db, 10*np.log10(theory), "-", lw=2, label="理論 $\\chi^2/(1+2\\chi)$")
plt.plot(chi_db, 2*chi_db, "--", color="tab:red", label="小信号漸近 $\\chi^2$ (傾き2)")
plt.plot(chi_db, chi_db - 10*np.log10(2), ":", color="tab:green",
         label="大信号漸近 $\\chi/2$ (傾き1)")
plt.xlabel("1パルスあたり入力SNR $\\chi$ [dB]")
plt.ylabel("二乗検波後の偏差SNR $D_1$ [dB]")
plt.title("二乗検波器の小信号抑圧")
plt.grid(alpha=0.3); plt.legend(); plt.ylim(-35, 20)
plt.tight_layout(); plt.show()

二乗検波後の偏差SNRのグラフ。高SNR側は傾き1、低SNR側は傾き2になり、χ=0 dB付近で折れ曲がる

このグラフが小信号抑圧の正体をはっきり示しています。入力 SNR が高い領域(右側)では曲線の傾きが 1(1 dB 入れれば 1 dB 出る)ですが、低い領域(左側)では傾きが 2 になっています。つまり入力 SNR が 1 dB 下がると出力は 2 dB 下がる — 弱い信号ほど検波器に不利に扱われるのです。折れ曲がり点は $\chi \approx 0$ dB($2\chi \approx 1$)付近にあり、これは理論式 $\chi^2/(1+2\chi)$ の分母が切り替わる点と一致します。実測点も理論曲線に完全に一致しており、導出した分散公式が正しいことが裏付けられます。

検出確率曲線と積分改善係数

いよいよ、非心カイ二乗分布(=一般化 Marcum Q 関数)を使って厳密な検出確率曲線を描き、積分改善係数を測ります。

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import chi2, ncx2
from scipy.optimize import brentq

Pfa = 1e-6

def pd_noncoh(chi_db, N, Pfa=1e-6):
    """非変動ターゲット, Nパルス ノンコヒーレント積分の検出確率"""
    T = chi2.isf(Pfa, df=2*N)                    # 規格化しきい値
    chi = 10 ** (chi_db / 10)                    # 1パルスあたりSNR
    return ncx2.sf(T, df=2*N, nc=2*N*chi)        # = Q_N(sqrt(2N*chi), sqrt(T))

def req_snr_db(N, Pd, Pfa=1e-6):
    """所定の Pd を得るのに必要な 1パルスあたりSNR [dB]"""
    return brentq(lambda d: pd_noncoh(d, N, Pfa) - Pd, -40, 40)

snr = np.linspace(-8, 20, 400)
plt.figure(figsize=(9, 6))
for N, c in [(1, "tab:blue"), (4, "tab:orange"), (16, "tab:green"), (64, "tab:red")]:
    plt.plot(snr, [pd_noncoh(s, N) for s in snr], color=c,
             label="ノンコヒーレント N=%d" % N)
    # 同じNをコヒーレント積分した場合 (1パルスSNRがN倍になるだけ)
    plt.plot(snr, [pd_noncoh(s + 10*np.log10(N), 1) for s in snr],
             "--", color=c, alpha=0.6, label="コヒーレント N=%d" % N)
plt.axhline(0.9, color="k", ls=":", lw=1)
plt.xlabel("1パルスあたりSNR [dB]"); plt.ylabel("検出確率 $P_d$")
plt.title("パルス積分による検出確率の改善 ($P_{fa}=10^{-6}$)")
plt.grid(alpha=0.3); plt.legend(fontsize=9, ncol=2); plt.tight_layout(); plt.show()

print("Pd=0.9, Pfa=1e-6 での所要SNR")
for N in [1, 2, 4, 8, 16, 32, 64]:
    s = req_snr_db(N, 0.9)
    I = req_snr_db(1, 0.9) - s
    print("N=%3d  1パルス所要=%6.2f dB  I(N)=%5.2f dB  積分損=%4.2f dB"
          % (N, s, I, 10*np.log10(N) - I))

N=1/4/16/64の検出確率曲線。実線がノンコヒーレント、破線がコヒーレントで、N=64ではPd=0.9の高さで4.80 dBの差が開く

実線(ノンコヒーレント)と破線(コヒーレント)の間隔が、そのまま積分損です。$N = 1$ では定義上まったく同じ曲線が重なり、$N = 4$ では隔たりが 1 dB 程度とわずかですが、$N = 64$ になると明確に離れ、$P_d = 0.9$ の高さで約 4.8 dB の差が開きます。出力からも、所要 SNR が $N = 1$ の 13.18 dB から $N = 64$ で $-0.08$ dB まで下がる一方、その改善量 13.27 dB は理想の 18.06 dB に届いていないことが読み取れます。曲線の形にも注目してください。$N$ が増えるほど曲線が急峻になります。これは多数のサンプルを平均することで統計的な揺らぎが減り、しきい値を境に「ほぼ確実に検出/ほぼ確実に見逃し」という決定論的な振る舞いに近づくためです。

積分改善係数と積分損 — 厳密解とBartonの経験式

上で測った $I(N)$ を、Barton の経験式と並べて描いてみます。

import numpy as np
import matplotlib.pyplot as plt

def barton_I_db(N, Pd, Pfa):
    """Barton の積分改善係数の経験式 [dB]"""
    lg = np.log10(N)
    return (6.79 * (1 + 0.235*Pd) * (1 + np.log10(1/Pfa)/46.6)
            * lg * (1 - 0.140*lg + 0.0183*lg**2))

Ns = np.array([2, 4, 8, 16, 32, 64, 100, 256, 1000])
fig, axes = plt.subplots(1, 2, figsize=(13, 5))
for Pd, c in [(0.5, "tab:blue"), (0.9, "tab:red")]:
    I_exact = np.array([req_snr_db(1, Pd) - req_snr_db(int(N), Pd) for N in Ns])
    I_bart = barton_I_db(Ns, Pd, Pfa)
    axes[0].plot(Ns, I_exact, "o-", color=c, label="厳密 (Marcum Q) $P_d$=%.1f" % Pd)
    axes[0].plot(Ns, I_bart, "s--", color=c, alpha=0.6, label="Barton経験式 $P_d$=%.1f" % Pd)
    axes[1].plot(Ns, 10*np.log10(Ns) - I_exact, "o-", color=c, label="$P_d$=%.1f" % Pd)

axes[0].plot(Ns, 10*np.log10(Ns), "k-", lw=2, label="コヒーレント $10\\log_{10}N$")
axes[0].plot(Ns, 5*np.log10(Ns), "k:", lw=2, label="小信号極限 $5\\log_{10}N$")
axes[0].set_xscale("log"); axes[0].set_xlabel("積分パルス数 N")
axes[0].set_ylabel("積分改善係数 $I(N)$ [dB]"); axes[0].set_title("積分改善係数")
axes[0].grid(alpha=0.3, which="both"); axes[0].legend(fontsize=8)

axes[1].set_xscale("log"); axes[1].set_xlabel("積分パルス数 N")
axes[1].set_ylabel("積分損 $L=10\\log_{10}(N/I(N))$ [dB]")
axes[1].set_title("ノンコヒーレント積分損"); axes[1].grid(alpha=0.3, which="both")
axes[1].legend()
plt.tight_layout(); plt.show()

左: 積分改善係数の厳密解とBarton経験式が5log10Nと10log10Nの間に挟まれる。右: 積分損はNとともに単調増加する

左図では、厳密解(丸印の実線)が上下2本の基準線 — コヒーレント $10\log_{10}N$ と小信号極限 $5\log_{10}N$ — のちょうど間に挟まれています。小さい $N$ では上の線に近く、$N$ が増えるにつれて下の線の傾きに漸近していく様子が、導出した理論そのままに現れています。Barton の経験式(四角印の破線)は厳密解とほぼ重なっており、$N \le 100$ では 0.3 dB 以内、$N = 1000$ でも最大 0.7 dB($P_d = 0.9$ のケース)のずれに収まります。実用的な近似として十分な精度をもつことが確認できます。右図の積分損は $N$ とともに単調増加し、$N = 1000$ では $P_d = 0.5$ で 10 dB を超えます。「ノンコヒーレント積分でパルス数を増やしても、効率はどんどん悪くなる」という設計上の重要な事実です。

ドップラーFFT = コヒーレント積分の可視化

最後に、FFT がコヒーレント積分そのものであることをスペクトルで確認します。$N$ パルスの複素サンプル列を FFT し、目標ビンのピークが $N^2$、雑音床が $N$ になることを見ます。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(4)
psi = 0.5                 # 1成分あたり分散 → 雑音電力 2*psi = 1
A = 1.0                   # 1パルスSNR = A^2/(2*psi) = 1 (0 dB)
fd_norm = 3/16            # 正規化ドップラー周波数 (16/64/256点すべてでビン中心)

plt.figure(figsize=(11, 5))
for N, c in [(16, "tab:blue"), (64, "tab:orange"), (256, "tab:green")]:
    i = np.arange(N)
    x = A*np.exp(2j*np.pi*fd_norm*i) + (rng.normal(0, np.sqrt(psi), N)
                                        + 1j*rng.normal(0, np.sqrt(psi), N))
    X = np.fft.fftshift(np.fft.fft(x))
    f = np.fft.fftshift(np.fft.fftfreq(N))
    P = 10*np.log10(np.abs(X)**2)
    plt.plot(f, P, color=c, alpha=0.8,
             label="N=%d (実測ピーク%.1f dB / 理論%.1f dB, 雑音床%.1f dB)"
                   % (N, P.max(), 10*np.log10(N**2 * A**2), 10*np.log10(N * 2*psi)))
    plt.axhline(10*np.log10(N * 2*psi), color=c, ls=":", lw=1)

plt.xlabel("正規化ドップラー周波数 $f_d / \\mathrm{PRF}$")
plt.ylabel("パワースペクトル [dB]")
plt.title("ドップラーFFTはコヒーレント積分器のフィルタバンク (1パルスSNR = 0 dB)")
plt.grid(alpha=0.3); plt.legend(fontsize=9); plt.tight_layout(); plt.show()

N=16/64/256のドップラーFFTスペクトル。目標位置のピークはNの二乗、雑音床はNに比例して上がる

3本のスペクトルを比べると、目標のドップラー位置($f_d/\mathrm{PRF} = 3/16$)に立つピークは $N$ を4倍にするごとに 12 dB ずつ伸びる($N^2$ に比例)のに対し、点線で示した雑音床は 6 dB ずつしか上がっていない($N$ に比例)ことがわかります。実測ピークは理論値 $10\log_{10}(N^2A^2)$ とほぼ一致します($N = 256$ で理論 48.2 dB に対し実測 47.9 dB、$N = 64$ で理論 36.1 dB に対し実測 35.8 dB)。$N = 16$ だけ実測 25.9 dB と理論より高めに出ていますが、これは1パルス SNR が 0 dB しかないため、目標ビンで雑音が偶然強め合った分です。差し引き 6 dB ずつ SNR が改善しており、これが $10\log_{10}4 = 6$ dB のコヒーレント積分利得です。1パルスあたりの SNR はわずか 0 dB — 単一パルスでは雑音に完全に埋もれている — にもかかわらず、$N = 256$ では 24 dB の余裕をもって目標が屹立します。パルスドップラーレーダーが微弱な目標を捉えられる理由が、この1枚に凝縮されています。

7つの検証を通して、理論で導いた式がすべて数値と一致することを確認できました。最後に、ここまでの議論を設計者の視点から整理しておきましょう。

まとめ

本記事では、レーダーのパルス積分をコヒーレント/ノンコヒーレントの両面から解説しました。要点を整理します。

  • コヒーレント積分の利得は厳密に $N$ 倍: 信号は位相がそろって振幅が $N$ 倍(電力 $N^2$ 倍)、雑音は無相関なので電力が $N$ 倍。比を取ると $N^2/N = N$ で、$10\log_{10}N$ dB の利得になります
  • 位相誤差の損失は $|\sum e^{j\phi_i}|^2/N$: ランダム誤差なら期待利得は $1 + (N-1)e^{-\sigma_\phi^2}$ で、損失はおおむね $4.343\sigma_\phi^2$ dB。位相誤差 RMS を 0.5 rad 以下に抑えれば損失は 1 dB 程度に収まります
  • ドップラーFFTはコヒーレント積分器のフィルタバンク: 速度が未知でも、$N$ 個の速度仮説それぞれについて位相補償して足せばよく、それが DFT の定義そのものです。半ビンずれた目標は最大 3.92 dB のスキャロッピング損を受けます
  • 二乗検波は小信号を抑圧する: 検波後の偏差 SNR は $\chi^2/(1+2\chi)$ で、$\chi \ll 1$ では入力 SNR の二乗に潰れます。この結果、ノンコヒーレント積分の改善係数は小信号領域で $\sqrt{N}$($5\log_{10}N$ dB)にとどまります
  • 積分改善係数 $I(N)$ は $\sqrt{N}$ と $N$ の間: $P_{fa}=10^{-6}$、$P_d=0.9$ で $N=16$ なら $I=9.35$ dB(積分損 2.69 dB)、$N=64$ なら $I=13.27$ dB(積分損 4.80 dB)。Barton の経験式は $N \le 100$ の範囲で厳密解と 0.3 dB 以内で一致します
  • Swerlingモデルで積分の効き方が変わる: パルス間変動(Swerling II/IV)ではダイバーシティ利得が加わり、$I(64) = 21.03$ dB とコヒーレント理論値を上回ります。スキャン間変動(I/III)ではその恩恵がなく、周波数アジリティで人為的に独立化する価値が生まれます

パルス積分は、レーダー方程式の中に $I(N)$ や $G_{\mathrm{coh}}$ という形で必ず現れる項であり、探知距離の見積もりに欠かせない要素です。同時に、SAR の方位圧縮、GNSS 受信機のコード積分、電波天文の開口合成など、「微弱な信号を長時間かけて掘り出す」あらゆる技術の共通基盤でもあります。積分利得の限界を決めるのが結局は位相コヒーレンスであるという事実は、これらすべての分野に共通する設計思想です。

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