空港の監視レーダーが、時速 720 km で飛んでいる旅客機だけを「見失う」ことがあります。前のスキャンまで確実に映っていた輝点が、機体が真っ直ぐレーダーに向かってきた瞬間にふっと消え、少し進路を変えるとまた現れる。故障でもノイズでもありません。これは MTI(移動目標指示)レーダーが構造的に抱えているブラインドスピード(盲速)という現象です。ある特定の速度で近づく(または遠ざかる)目標は、レーダーから見ると「静止した地面」と数学的に区別がつかなくなり、クラッタ除去フィルタによって地面もろとも消されてしまいます。
厄介なのは、盲速が「めったに起きない例外」ではないことです。盲速は $v_b, 2v_b, 3v_b, \dots$ と等間隔に無限に並びます。S バンド(波長 10 cm)で PRF 1 kHz のレーダーなら、盲速は 50 m/s(180 km/h)刻み。旅客機の巡航速度域には盲速が何本も刺さっていることになります。何もしなければ、監視レーダーは「特定の速度で飛ぶ機体を系統的に見落とす装置」になってしまうのです。
この問題に対する古典的かつ極めて効果的な解がスタガ PRF(staggered PRF)です。パルスを等間隔に打つのをやめ、パルス繰り返し間隔(PRI)を $T_1, T_2, T_1, T_2, \dots$ のように意図的にばらつかせる。たったこれだけで、最初の盲速を 4 倍にも 28 倍にも押し上げられます。この記事では、なぜ盲速が生まれるのか、なぜ間隔をばらつかせると消えるのかを、伝達関数の振幅応答と整数論(最小公倍数)の両面から省略なしに導出します。
盲速とスタガ PRF の理解が効いてくる場面は、たとえば次のようなところです。
- 航空管制・防空監視レーダー: 地面クラッタを 40〜60 dB 抑圧しつつ、あらゆる速度の航空機を取りこぼさないための PRI 設計そのものが盲速との戦いです
- 気象レーダー: 降水粒子の視線方向速度を測るドップラーレーダーでは、盲速(速度の折り返し)と最大観測距離が真正面からトレードオフし、二重 PRF・スタガ PRT で折り返し速度を拡張します
- 車載ミリ波レーダー・交通流計測: 24 GHz / 77 GHz 帯では波長が短い分だけ盲速が低く、生活速度域に盲速が入り込みます
- 宇宙状況監視(SSA)レーダー: デブリの視線速度は数 km/s に達するため、盲速格子の設計を誤ると特定の軌道傾斜角の物体だけが観測されないという偏りが生じます
本記事の内容
- パルスレーダーが「ドップラー周波数を PRF でサンプリングしている」という見方
- MTI キャンセラ $H(z) = 1 – z^{-1}$ の伝達関数と振幅応答 $|H| = 2|\sin(\pi f_d T)|$ の導出
- ブラインドスピード $v_b = n\lambda/(2T) = n \lambda f_r / 2$ の導出
- 盲速と最大非あいまい距離のトレードオフ、および不変量 $v_b R_{ua} = c\lambda/4$
- スタガ PRF の合成応答を「零点の共通部分」と「電力平均」として定式化する
- 第 1 盲速が最小公倍数側へ移動する仕組みと、比の公式 $(k_1+k_2)/2$ の導出
- $N$ 段スタガへの一般化と、$(k_1+\dots+k_N)/N$ の証明
- スタガの副作用(通過帯域リップル、高次キャンセラの重み崩れ、距離あいまいさの悪化)
- Python による速度応答曲線の可視化とパラメータ設計
前提知識
この記事を読む前に、以下の記事を読んでおくと理解が深まります。
ブラインドスピードとは — 扇風機とストロボの話

この記事の主張は、この 1 枚にほぼ集約されています。上段のとおりレーダーは PRI ごとに 1 点ずつしか目標をのぞけないので、下段のように「パルス間で位相がどれだけ回ったか」だけが速度の手がかりになります。20 m/s の目標は毎回 144° ずつ矢印が回るので動きが見えますが、50 m/s の目標は 1 パルスでちょうど 360° 回ってしまい、矢印はいつも同じ位置に戻ります。その結果、右端の静止クラッタとサンプル上まったく区別がつかなくなる — これがブラインドスピードです。
暗い部屋で回転している扇風機に、ストロボライトを一定間隔で当てる実験を想像してください。ストロボの点滅周期と羽根の回転周期がぴったり一致すると、羽根はいつも同じ位置で照らされるので、まるで止まっているように見えます。羽根は猛烈に回っているのに、観測者には静止して見える。回転が少し速ければゆっくり前に進んで見え、少し遅ければ逆回転して見える。これがストロボ効果、つまりエイリアシングです。
パルスレーダーがやっていることは、まさにこのストロボ照射です。レーダーは連続波を出しっぱなしにするのではなく、周期 $T$(PRI: Pulse Repetition Interval)ごとに短いパルスを撃ちます。目標からの反射波は、パルスごとに 1 個の複素サンプルとして返ってきます。目標が動いていれば、往復距離が変わるので反射波の位相がパルスごとに少しずつ回転する。その回転の速さがドップラー周波数です。
ところが、目標がちょうど「1 パルスの間に往復位相が $2\pi$ ぴったり回る」速度で動いていると、サンプル列に現れる位相は毎回同じ値になります。ストロボで止まって見える羽根と同じです。レーダーから見れば、この目標は「位相がまったく変化しないもの」=静止した地面や建物とまったく同じに見えます。MTI レーダーはこの「位相が変化しないもの」を消すフィルタなので、当然この目標も一緒に消してしまう。これがブラインドスピードの正体です。
大事なのは、盲速はフィルタの設計が悪いから生じるのではないという点です。仮に理想的な急峻さを持つクラッタ除去フィルタを作っても、サンプル列そのものに情報が残っていないので目標は救えません。盲速はサンプリング定理に由来する原理的な限界であり、フィルタの改良ではなくサンプリングの仕方(=パルスの打ち方)を変えることでしか回避できないのです。この視点が、後半のスタガ PRF を理解する鍵になります。
では、この直感を数式にしていきましょう。まずは「パルスレーダーがドップラー周波数をサンプリングしている」という描像を、位相の計算から厳密に立ち上げます。
パルスレーダーはドップラー周波数をサンプリングしている
往復位相からドップラー周波数を導く
送信周波数 $f_0$、波長 $\lambda = c/f_0$ のレーダーが、距離 $R(t)$ にある目標を照射しているとします。電波は目標まで行って戻ってくるので、伝搬距離は $2R(t)$ です。受信波の位相は、この往復距離を波長で割った回数だけ回転しているので、
$$ \phi(t) = -\frac{2\pi \cdot 2R(t)}{\lambda} = -\frac{4\pi R(t)}{\lambda} $$
と書けます。符号は「遠いほど位相が遅れる」という約束です。目標が一定の視線方向速度(レーダーに近づく向きを正)$v_r$ で動いているとすると $R(t) = R_0 – v_r t$ なので、これを代入すると
$$ \phi(t) = -\frac{4\pi (R_0 – v_r t)}{\lambda} = -\frac{4\pi R_0}{\lambda} + \frac{4\pi v_r}{\lambda} t $$
となります。位相が時間に比例して増えているので、その傾きが角周波数です。$\phi(t) = \phi_0 + 2\pi f_d t$ と見比べれば、
$$ \begin{equation} f_d = \frac{2 v_r}{\lambda} \end{equation} $$
が得られます。往復するために $2$ が付くのがレーダーのドップラー周波数の特徴です。波長 10 cm の S バンドなら、視線速度 1 m/s あたり 20 Hz。速度 50 m/s の目標は 1 kHz のドップラーを持ちます。
パルス間位相差という「サンプル」

左のグラフでは、赤い 50 m/s の波形は 1 ms のあいだに 1 周期ぶんまるごと振動しているのに、標本点(丸)は毎回同じ値 1.0 に落ち、灰色の静止クラッタの点列と完全に重なっています。波形そのものは激しく動いていても、レーダーが手にするサンプル列は静止物と 1 ビットも変わりません。右のグラフはこれを周波数で表したもので、真のドップラー周波数(灰破線)が PRF ごとにノコギリ状に折り返し、▼ の 50 m/s ごとにちょうど 0 Hz、すなわちクラッタの居場所へ戻ってくることが見て取れます。
レーダーは連続的に位相を観測しているわけではありません。周期 $T$ ごとにパルスを撃ち、パルスごとに 1 個の複素振幅 $x[n]$ を得ます。$n$ 番目のパルスに対応する時刻を $t_n = nT$ とすると、
$$ x[n] = A \exp\left(j\phi(nT)\right) = A e^{j\phi_0} \exp\left(j 2\pi f_d n T\right) $$
です。隣り合うパルス間の位相差は
$$ \begin{equation} \Delta\phi = \phi((n+1)T) – \phi(nT) = 2\pi f_d T = \frac{4\pi v_r T}{\lambda} \end{equation} $$
となります。つまりパルス列は、ドップラー周波数 $f_d$ の複素正弦波を、サンプリング周波数 $f_r = 1/T$(= PRF)でサンプリングした離散信号にほかなりません。ここまで来れば、あとは通常のサンプリング定理の話です。
サンプリング定理により、$f_d$ が $[-f_r/2, f_r/2)$ の外に出ると折り返し(エイリアシング)が起きます。速度に直すと、あいまいさなく測れる速度範囲は
$$ |v_r| < \frac{\lambda f_r}{4} $$
に限られます。この範囲を超えると、たとえば $f_d = f_r$ の目標は $f_d = 0$ の目標と、離散サンプル上でまったく同じ数列になります。$f_d = 0$ とは「静止したもの」、すなわちクラッタです。
盲速は「クラッタと同じ位置に折り返す速度」
以上をまとめると、盲速とは次のように言い換えられます。
ドップラー周波数がサンプリングによって折り返し、ちょうど 0 Hz(クラッタの位置)に重なってしまう速度。
$f_d$ が $f_r$ の整数倍になったときがそれです。式 (2) で $\Delta\phi = 2\pi n$、すなわち $f_d T = n$($n$ は整数)となる条件を書けば、
$$ f_d = \frac{n}{T} = n f_r $$
です。これを式 (1) に代入して速度に直すと、
$$ \begin{equation} v_b(n) = \frac{n \lambda}{2T} = \frac{n \lambda f_r}{2} \end{equation} $$
が得られます。$n = 1$ のときが第 1 盲速 $v_{b1} = \lambda f_r/2$ で、以降は等間隔に無限に並びます。
ここで一つ注意しておきます。厳密には「クラッタと重なる」だけでは検出不能とは限りません。クラッタが十分弱ければ、折り返した目標をそのまま検出できる可能性はあります。しかし実際の地上レーダーではクラッタは目標より 40〜80 dB も強いのが普通で、必ずクラッタ除去フィルタを通します。そのフィルタが 0 Hz にノッチ(急峻な減衰)を作るため、折り返した目標は確実に消えるのです。次のセクションで、そのフィルタの応答を具体的に求めましょう。
MTIキャンセラの伝達関数と振幅応答
2パルスキャンセラ(1次キャンセラ)
MTI の最も素朴で最も基本的な実装が2 パルスキャンセラです。やっていることは「隣り合うパルスの引き算」だけです。
$$ y[n] = x[n] – x[n-1] $$

引き算の結果を 3 ケースで並べたのがこの図です。入力(青い棒)はどのケースも振幅 1 で見分けがつきませんが、キャンセラ出力は中央の 20 m/s の目標だけが 1.9 という大きな値を保ち、左の静止クラッタと右の盲速目標はどちらもぴたりと 0 になります。つまりこのフィルタは「振幅」ではなく「パルス間で位相が回ったかどうか」だけを見ており、位相が回らない盲速の目標はクラッタと同じ運命をたどります。
静止クラッタは $x[n]$ がパルスによらず一定なので、引き算すればぴたりと 0 になります。一方、移動目標は位相が回転しているので引き算しても消えません。この「静止=定数を消す」という発想は、離散時間の微分(差分)そのものです。
z 変換を取ると伝達関数は
$$ \begin{equation} H_1(z) = 1 – z^{-1} \end{equation} $$
となります。周波数応答を得るために $z = e^{j2\pi f_d T}$ を代入します。ここからの変形は、指数の半分を括り出すのがコツです。まず
$$ H_1 = 1 – e^{-j2\pi f_d T} $$
の右辺から $e^{-j\pi f_d T}$ を括り出します。すると括弧の中が対称な形になります。
$$ H_1 = e^{-j\pi f_d T}\left(e^{j\pi f_d T} – e^{-j\pi f_d T}\right) $$
括弧の中はオイラーの公式そのもので $e^{j\theta} – e^{-j\theta} = 2j\sin\theta$ なので、$\theta = \pi f_d T$ とおけば
$$ H_1 = e^{-j\pi f_d T} \cdot 2j \sin(\pi f_d T) $$
を得ます。$|e^{-j\pi f_d T}| = 1$、$|2j| = 2$ なので、振幅応答は
$$ \begin{equation} |H_1(f_d)| = 2\left|\sin(\pi f_d T)\right| \end{equation} $$
です。この式が本記事の主役です。$\sin$ の中身が $\pi f_d T$ なので、$f_d T$ が整数のたびにゼロになります。すなわち $f_d = 0, f_r, 2f_r, \dots$ でゼロ。$f_d = 0$ のゼロが「クラッタ除去」という設計意図どおりの働きで、$f_d = n f_r$($n \geq 1$)のゼロが意図せず付いてくる副作用=盲速です。

応答を実際に描くと、$0$ Hz の零点はレーダー技術者が意図して作ったものである一方、$1000$ Hz、$2000$ Hz、$3000$ Hz の零点は誰も頼んでいないのに勝手に生えてくることが一目でわかります。両者は数学的にまったく同格の零点で、後者だけを消す方法はありません。応答全体が PRF = 1000 Hz を周期として同じ形を繰り返している、というのがその理由です。
正弦波の周期性を思えば当然です。フィルタ係数が離散時間上に定義されている以上、周波数応答は必ず $f_r$ 周期になります。$0$ にノッチを作れば、$f_r$ ごとに同じノッチが自動的に複製されるのです。「クラッタノッチだけ作って盲速ノッチは作らない」ということは、等間隔サンプリングである限り数学的に不可能です。
3パルスキャンセラ(2次キャンセラ)
クラッタは完全な直流ではありません。風で揺れる樹木、波立つ海面、移動する降水粒子などによってスペクトルに広がり($\sigma_f$ で数 Hz 程度)を持ちます。1 個のゼロ点では抑圧が足りないので、キャンセラを 2 段縦続にします。
$$ H_2(z) = (1 – z^{-1})^2 = 1 – 2z^{-1} + z^{-2} $$
時間領域では $y[n] = x[n] – 2x[n-1] + x[n-2]$、係数は $[1, -2, 1]$ という二項係数です。振幅応答は式 (5) の 2 乗で、
$$ |H_2(f_d)| = 4\sin^2(\pi f_d T) $$
となります。0 Hz 近傍で 2 次のゼロになるため、クラッタの裾に対する抑圧が大きく改善します。一般に $N$ 段の縦続キャンセラは係数が二項係数 $\binom{N}{k}(-1)^k$ となり、応答は $|H_N| = \left(2|\sin(\pi f_d T)|\right)^N$ です。

同じことを z 平面で見ると、盲速の必然性がさらに鮮明になります。左のように速度は単位円上の角度に対応し、$v$ が $0 \to 50$ m/s と増えるあいだに点は円をちょうど 1 周して出発点 $z = 1$ に戻ってきます。右の図が示すとおり、振幅応答は「点 $z$ と零点 $z=1$ の距離(弦の長さ)」に等しく、これがまさに $2|\sin(\pi f_d T)|$ です。零点は $z = 1$ ただ一点しかないのに、速度が 1 周するたびに点が必ずそこへ戻る — だから盲速は等間隔に無限に並ぶのです。
ここで決定的に重要なのは、段数をいくら増やしても盲速の位置は 1 ミリも動かないということです。$\sin$ のゼロ点は $f_d T \in \mathbb{Z}$ のままで、段数が増えるとむしろノッチが広く深くなり、盲速付近で検出できない速度帯が広がります。フィルタ設計の改良は盲速問題の解にならない、という前節の主張が式の上で確認できました。
盲速を動かすには、$\sin$ の中身にある $T$ そのものに手を付けるしかありません。その最も直接的な方法が「$T$ を短くする(PRF を上げる)」です。しかし、そこには距離側の代償が待っています。
距離あいまいさとのトレードオフ
最大非あいまい距離
式 (3) は $v_{b1} = \lambda f_r / 2$ ですから、PRF を上げれば盲速はいくらでも高くできそうに見えます。ところがパルスレーダーには「次のパルスを撃つ前にエコーが帰ってきていなければならない」という別の制約があります。距離 $R$ の目標からのエコーは往復に $2R/c$ かかるので、これが PRI $T$ を超えると、そのエコーは次の送信周期に紛れ込み、あたかも近距離の目標のように誤って表示されます(距離あいまいさ/二次エコー)。あいまいさなく測れる最大距離は
$$ \begin{equation} R_{ua} = \frac{cT}{2} = \frac{c}{2 f_r} \end{equation} $$
です。PRF を上げると $R_{ua}$ は反比例して縮みます。
不変量 $v_{b1} R_{ua} = c\lambda/4$
盲速と最大非あいまい距離を掛け合わせてみましょう。$f_r$ が見事に打ち消し合います。
$$ v_{b1} \cdot R_{ua} = \frac{\lambda f_r}{2} \cdot \frac{c}{2 f_r} = \frac{c\lambda}{4} $$
$$ \begin{equation} v_{b1} R_{ua} = \frac{c\lambda}{4} \end{equation} $$
PRF をどう選んでも、この積は波長だけで決まる定数になります。これはレーダー設計における最も基本的な制約の一つで、「距離あいまいさと速度あいまいさは同時には解消できない」というレーダーの不確定性関係と呼ぶべきものです。
具体的な数値を入れてみます。S バンド $f_0 = 3$ GHz($\lambda = 0.1$ m)なら $c\lambda/4 = 7.5 \times 10^6\ \mathrm{m^2/s}$ です。監視レーダーとして $R_{ua} = 150$ km が必要なら、$v_{b1} = 7.5\times10^6 / 150000 = 50$ m/s、つまり 180 km/h。旅客機の速度域(200〜260 m/s)には第 4、第 5 の盲速がまともに入り込みます。逆に第 1 盲速を 300 m/s にしようとすると $R_{ua} = 25$ km しか取れず、監視レーダーとして成立しません。
X バンド $f_0 = 10$ GHz($\lambda = 0.03$ m)ではさらに厳しく、$c\lambda/4 = 2.25 \times 10^6$ です。$R_{ua} = 100$ km を確保すると $v_{b1} = 22.5$ m/s(81 km/h)にしかなりません。波長が短いほど角度分解能やアンテナ小型化には有利ですが、盲速の観点では不利になるという設計上の緊張関係がここにあります。
波長を変える手はあるか
式 (7) を見れば「波長を長くすれば積を大きくできる」と気付きます。実際、遠距離監視レーダーが L バンドや UHF を使うのは、この不変量を大きく取れることが理由の一つです。しかし波長を長くするとアンテナが巨大化し、角度分解能が落ち、周波数割当も窮屈になります。波長は他の要求で先に決まってしまうことが多く、盲速のために自由に選べるパラメータではありません。
つまり、$f_r$ でも $\lambda$ でも $N$ 段化でも、盲速は根本的には解決しません。残された道は一つ、「等間隔サンプリングをやめる」ことです。次のセクションでその発想を見ていきます。
スタガPRFの発想 — 2本のものさしで測る
再びストロボの比喩に戻ります。ストロボを一定周期で光らせている限り、その周期に同期した回転は必ず止まって見えます。では、光らせる間隔を 2 種類混ぜたらどうなるでしょうか。周期 $T_1$ に同期して止まって見える回転数と、周期 $T_2$ に同期して止まって見える回転数は一般に別物です。$T_1$ の点滅では止まって見えても、$T_2$ の点滅では動いて見える。両方の点滅を混ぜて観測すれば、「どちらでも止まって見える」回転数はぐっと少なくなります。
これがスタガ PRFの核心です。パルス間隔を $T_1, T_2, T_1, T_2, \dots$ と交互にすると、目標のパルス間位相差も $2\pi f_d T_1$ と $2\pi f_d T_2$ が交互に現れます。ある目標が $T_1$ の系列では盲速に落ちても、$T_2$ の系列では位相が動くので検出できる。両方同時に盲速になる速度だけが真の盲速として残ります。
日常的な比喩をもう一つ挙げるなら、目盛りが 4 mm 刻みのものさしと 5 mm 刻みのものさしの併用です。4 mm ものさしだけでは 4, 8, 12, … mm の位置しか「ぴったり」判定できませんが、両方の目盛りが同時にぴったり一致する長さは 20 mm(最小公倍数)まで現れません。スタガ PRF がやっているのは、まさにこの最小公倍数の引き延ばしです。
ただし、ここで注意深く考えるべき点があります。「両方の応答を掛け算する」のか「平均する」のか、合成応答の定義を曖昧にしたまま議論すると、結論が真逆になります。次のセクションで、この合成応答を丁寧に定式化します。
スタガPRFの合成応答を定式化する
何を「応答」と呼ぶべきか
PRI が $T_1, T_2$ と交互に来る系列に、2 パルスキャンセラ $y = x[n] – x[n-1]$ をかけます。$n$ 番目の引き算に関わるパルス対の間隔が $T_1$ なら、出力振幅は
$$ |y_n| = 2A\left|\sin(\pi f_d T_1)\right| $$
で、次の引き算では間隔が $T_2$ になるので
$$ |y_{n+1}| = 2A\left|\sin(\pi f_d T_2)\right| $$
です。つまり出力は 1 本の周波数応答では書けず、2 種類の応答が交互に現れる時変システムになります。
ここで「合成応答」をどう定義するかが問題です。素朴に $|H_1(f_d)| \cdot |H_2(f_d)|$ と積を取ると、片方でもゼロになれば積はゼロ、すなわち零点は和集合になり、盲速は増えてしまいます。これは物理的に誤りです。積が正しいのは「$T_1$ 用フィルタと $T_2$ 用フィルタを縦続に通す」場合であって、スタガ PRF はそういう構成ではありません。
正しい描像はこうです。1 回のドウェル(同一方向にビームを向けている間)で、レーダーは同じ目標を $T_1$ の対でも $T_2$ の対でも観測します。検出器はこれらの出力を非コヒーレントに積分(電力を足し合わせ)してから閾値判定します。したがって実効的な速度応答は、各応答の二乗平均(電力平均)として定義するのが妥当です。$N$ 種類の PRI $T_1, \dots, T_N$ を巡回的に使う場合、
$$ \begin{equation} \left|H_{\mathrm{stag}}(f_d)\right| = \sqrt{\frac{1}{N}\sum_{i=1}^{N} \left|H_i(f_d)\right|^2} = 2\sqrt{\frac{1}{N}\sum_{i=1}^{N} \sin^2(\pi f_d T_i)} \end{equation} $$

積と平均で結論がどれだけ変わるかを並べたのがこの図です。左の「積」で合成すると、$T_1$ の零点と $T_2$ の零点がそのまま両方残り、0〜260 m/s のあいだに 8 か所も零点ができてしまいます。スタガにしたのに盲速が増えるという、直感とも実測とも合わない結論です。右の電力平均なら零点は両者が同時にゼロになる 225 m/s のただ 1 点だけで、これが実際のレーダーで観測される振る舞いと一致します。
となります。この形なら、すべての項が同時にゼロのときに限って合成応答がゼロになります。つまり零点の集合は各応答の零点集合の共通部分(積集合)です。「零点の集合は積(共通部分)、応答の大きさは平均」と覚えておくと混乱しません。
真の盲速の条件
式 (8) がゼロになる条件を書き下します。$\sin^2$ は非負なので、和がゼロであることとすべての項がゼロであることは同値です。したがって
$$ \begin{equation} \sin(\pi f_d T_i) = 0 \quad (\forall i) \iff f_d T_i \in \mathbb{Z} \quad (\forall i) \end{equation} $$
が真の盲速の条件です。言い換えると、すべての PRI に対して同時にドップラー位相が $2\pi$ の整数倍回るような $f_d$ だけが盲速になります。
整数比で PRI を設計する
条件 (9) を満たす $f_d$ を具体的に求めるため、PRI を共通の基本単位 $T_0$ の整数倍に取ります。
$$ T_i = k_i T_0, \quad k_i \in \mathbb{Z}_{>0}, \quad \gcd(k_1, \dots, k_N) = 1 $$
$\gcd = 1$(互いに素)という条件が後で効いてきます。$x = f_d T_0$ とおくと、条件 (9) は「すべての $i$ について $x k_i \in \mathbb{Z}$」になります。この $x$ の集合を求めましょう。
まず $x$ は有理数でなければなりません。もし $x$ が無理数なら $x k_1$ は決して整数になれないからです。そこで既約分数 $x = p/q$($\gcd(p, q) = 1$、$q > 0$)と書きます。$x k_i = p k_i / q \in \mathbb{Z}$ は $q \mid p k_i$ を意味しますが、$p$ と $q$ は互いに素なので $q \mid k_i$ でなければなりません。これがすべての $i$ について成り立つので、$q$ はすべての $k_i$ の公約数、すなわち $q \mid \gcd(k_1,\dots,k_N) = 1$ となり、$q = 1$ が確定します。
逆に $q = 1$ すなわち $x$ が整数なら $x k_i$ は当然整数です。よって条件 (9) を満たす $x$ は整数全体であり、正で最小のものは $x = 1$ です。速度に戻すと、
$$ \begin{equation} f_{d,\mathrm{blind}}^{(1)} = \frac{1}{T_0}, \qquad v_1 = \frac{\lambda}{2 T_0} \end{equation} $$
が第 1 盲速です。$T_0$ は全 PRI の最大公約時間なので、$T_0$ を小さく取れば取るほど第 1 盲速は高くなります。周波数側で見れば、$1/T_0$ は個々の PRF $f_{r,i} = 1/(k_i T_0)$ の最小公倍数です($f_{r,i}$ の共通の倍数は $s/T_0$ の形に限られ、最小は $1/T_0$)。冒頭で述べた「最小公倍数の議論」がここで数式として現れました。
第1盲速の比の公式
スタガの効果を測るには、比較対象を決めなければなりません。公平な比較は「同じ平均 PRI を持つ等間隔レーダー」です。パルス数が同じならドウェル時間も同じになり、送信デューティ比もおおむね揃うからです。平均 PRI を
$$ \bar{T} = \frac{1}{N}\sum_{i=1}^{N} T_i = \frac{T_0}{N}\sum_{i=1}^{N} k_i $$
とすると、この $\bar{T}$ で等間隔に打った場合の第 1 盲速は $v_{\mathrm{ref}} = \lambda/(2\bar{T})$ です。式 (10) との比を取ると、$\lambda/2$ が約分されて
$$ \frac{v_1}{v_{\mathrm{ref}}} = \frac{\lambda/(2T_0)}{\lambda/(2\bar{T})} = \frac{\bar{T}}{T_0} $$
となり、$\bar{T}$ を代入すれば
$$ \begin{equation} \frac{v_1}{v_{\mathrm{ref}}} = \frac{k_1 + k_2 + \dots + k_N}{N} \end{equation} $$
が得られます。これがスタガ PRF の第 1 盲速比の公式です。特に 2 段スタガ($T_1 : T_2 = k_1 : k_2$)では
$$ \frac{v_1}{v_{\mathrm{ref}}} = \frac{k_1 + k_2}{2} $$
というきれいな形になります。たとえば $4:5$ なら $4.5$ 倍、$25:26$ なら $25.5$ 倍です。
なお、比較の基準を「平均 PRI」ではなく「平均 PRF」に取ると、$\bar{f_r} = \frac{1}{N}\sum 1/T_i$ は調和平均系になるため厳密には式 (11) と一致しません。ただし $k_i$ が互いに近い実用的な設計では差はごくわずかです。教科書によって記述が揺れる箇所なので、どちらの基準で議論しているかを意識しておくと安全です。
具体例で確かめる
$T_1 : T_2 = 4 : 5$、平均 PRI $\bar{T} = 1$ ms、$\lambda = 0.1$ m の場合を計算します。$\bar{T} = 4.5 T_0$ なので $T_0 = 222.2\ \mu$s、したがって
$$ T_1 = 888.9\ \mu\mathrm{s}\ (f_{r1} = 1125\ \mathrm{Hz}), \qquad T_2 = 1111.1\ \mu\mathrm{s}\ (f_{r2} = 900\ \mathrm{Hz}) $$
です。$T_1$ 単独の盲速は $\lambda f_{r1}/2 = 56.25$ m/s 刻み、$T_2$ 単独は $45$ m/s 刻みです。両者が一致する最初の速度は、$56.25 \times 4 = 225$、$45 \times 5 = 225$ で、$225$ m/s。式 (10) からも $v_1 = \lambda/(2T_0) = 0.1/(2 \times 222.2\times10^{-6}) = 225$ m/s と確認できます。等間隔 1 ms の場合の $50$ m/s と比べて、ちょうど $4.5$ 倍です。
ここまでで、スタガ PRF が第 1 盲速を押し上げる仕組みは完全に理解できました。しかし「$25:26$ にすれば 25.5 倍だから最強」とはなりません。次のセクションで、その落とし穴を定量化します。
スタガの副作用1: 通過帯域のリップル
「真の盲速」と「実質的な盲速」は違う
式 (8) の合成応答は、真の盲速以外ではゼロになりません。しかしゼロでなければ検出できる、というわけではないのが実務です。応答が $-20$ dB まで落ち込めば、その速度の目標のエコーは 1/10 に減衰し、検出確率は激減します。レーダー技術者はこれを「実質的な盲速」あるいは「盲速に準ずる速度帯」として扱います。
そして残念なことに、第 1 盲速比を大きくするほど、この落ち込み(リップル)は深くなります。理由は直感的です。$k_1 : k_2 = 25 : 26$ のように 2 つの PRI をほとんど同じにすると、2 本のものさしの目盛りがほぼ揃ってしまい、「片方だけがゼロ、もう片方は大きい」という状況が作れません。$T_1$ の盲速の近くでは $T_2$ の応答もほとんどゼロに近い値しか取らないのです。
数値で見るトレードオフ
平均 PRI $\bar{T} = 1$ ms、$\lambda = 0.1$ m($v_{\mathrm{ref}} = 50$ m/s)として、2 パルスキャンセラ+スタガの合成応答を数値評価した結果が次の表です。「最深リップル」は、第 1 盲速の 90 % までの速度域で合成応答が最も落ち込む深さを、通過帯域の最大値($0$ dB)を基準に示したものです。
| PRI 比 $k_1:k_2:\dots$ | 第1盲速比 | 第1盲速 [m/s] | 最深リップル [dB] |
|---|---|---|---|
| $1$(等間隔) | 1.00 | 50 | — (真のゼロ) |
| $2:3$ | 2.50 | 125 | $-4.9$ |
| $3:4$ | 3.50 | 175 | $-7.4$ |
| $4:5$ | 4.50 | 225 | $-9.4$ |
| $5:6$ | 5.50 | 275 | $-11.0$ |
| $9:10$ | 9.50 | 475 | $-15.7$ |
| $25:26$ | 25.50 | 1275 | $-24.2$ |
| $25:30:27$ | 27.33 | 1367 | $-12.7$ |
| $25:30:27:31$ | 28.25 | 1413 | $-11.7$ |
| $25:30:27:31:33$ | 29.20 | 1460 | $-10.5$ |
2 段スタガの部分(上から 7 行)を見ると、第 1 盲速比とリップル深さがきれいに連動しているのが分かります。$25:26$ は第 1 盲速を 25.5 倍にしますが、代わりに $-24.2$ dB のディップができます。$-24$ dB のディップは実質的に盲速と変わらないので、「第 1 盲速は 1275 m/s です」と胸を張っても意味がありません。
段数を増やすとリップルが埋まる
表の下 3 行が重要です。$25:30:27:31$ という 4 段スタガは、第 1 盲速比 28.25 という $25:26$ を上回る値を実現しながら、最深リップルは $-11.7$ dB に収まっています。$25:26$ の $-24.2$ dB に比べて 12 dB 以上も浅い。
理由は「ものさしの本数」です。2 本では、片方がゼロのとき残り 1 本で補うしかありません。4 本あれば、1 本がゼロでも残り 3 本が平均に寄与するので、合成応答が深く落ち込みにくくなります。式 (8) の平均が $N$ 項になることが効いているわけです。実際、$N$ 本のうち 1 本だけがゼロで他が最大値 $2$ を取る最良ケースでは、合成応答は $2\sqrt{(N-1)/N}$ となり、$N=2$ で $-3.0$ dB、$N=4$ で $-1.2$ dB です。段数を増やすほど「1 本のゼロ」の影響が薄まります。
したがって実用的なスタガ設計の指針は次のようになります。
- 段数は 3〜5 段程度取る。2 段では高い盲速比とリップルの両立が難しい
- $k_i$ は互いに素な整数にする。共通因子 $g$ があると第 1 盲速が $1/g$ 倍に落ちる(式 (10) の導出参照)
- $k_i$ の値をあまり離しすぎない。離すと PRI の変動幅が大きくなり、後述の距離あいまいさと受信窓の設計が苦しくなる
- 目標速度域全体で合成応答をプロットし、閾値(たとえば $-6$ dB)を下回る速度帯の総幅を評価指標にする
古典的な設計例である $25:30:27:31$(Skolnik の教科書で紹介される 4 段スタガ)は、これらの条件をすべて満たす良い妥協点です。
リップルは「検出しにくい速度が残る」という副作用でしたが、スタガにはもう一つ、より見落としやすい副作用があります。高次キャンセラのフィルタ係数が壊れるという問題です。
スタガの副作用2: 高次キャンセラの重みが崩れる
$[1, -2, 1]$ が使えなくなる
3 パルスキャンセラの係数 $[1, -2, 1]$ は、等間隔サンプリングを前提に「$f_d = 0$ で 2 次のゼロを持つ」ように設計されています。この 2 次のゼロが、広がりを持つクラッタスペクトルの裾を強力に抑えていました。
ところが PRI が不等間隔になると、この前提が崩れます。3 つのパルスの時刻を $t_0 = 0$、$t_1 = T_1$、$t_2 = T_1 + T_2$ とし、重み $\bm{w} = (w_0, w_1, w_2)$ を掛けて足す構成を考えます。周波数応答は
$$ H(f_d) = \sum_{i=0}^{2} w_i e^{-j2\pi f_d t_i} $$
です。$f_d = 0$ でゼロになる条件(1 次のゼロ)は、指数部が全部 1 になるので
$$ \sum_i w_i = 0 $$
です。さらに 2 次のゼロを持つには、$f_d = 0$ で導関数もゼロになる必要があります。微分すると
$$ \frac{dH}{df_d} = \sum_i w_i \cdot (-j2\pi t_i) e^{-j2\pi f_d t_i} $$
なので、$f_d = 0$ を代入して $-j2\pi$ を括り出せば、条件は
$$ \begin{equation} \sum_i w_i t_i = 0 \end{equation} $$
となります。これは「重み付き重心が原点にある」という、力学のモーメント釣り合いとまったく同じ形の条件です。
さて、$[1, -2, 1]$ でこの条件を確かめてみましょう。
$$ \sum_i w_i t_i = 1\cdot 0 + (-2)\cdot T_1 + 1 \cdot (T_1 + T_2) = T_2 – T_1 $$
等間隔($T_1 = T_2$)ならゼロですが、スタガでは $T_2 – T_1 \neq 0$ なので条件を満たしません。つまり、不等間隔サンプリングに $[1,-2,1]$ をそのまま適用すると、直流のゼロは 1 次に退化し、クラッタ抑圧性能が大きく劣化します。
スタガ対応の重みを導出する
条件を満たす重みを求めましょう。連立方程式は
$$ w_0 + w_1 + w_2 = 0, \qquad w_1 T_1 + w_2 (T_1 + T_2) = 0 $$
の 2 本、未知数は 3 個なので、スケール自由度を残して解が定まります。第 2 式から $w_1 = -w_2 (T_1+T_2)/T_1$ です。分母を払うために $w_2 = T_1$ と選ぶと $w_1 = -(T_1 + T_2)$ となり、第 1 式から $w_0 = -w_1 – w_2 = (T_1 + T_2) – T_1 = T_2$ が決まります。まとめると
$$ \begin{equation} \bm{w} = \left(T_2,\ -(T_1 + T_2),\ T_1\right) \end{equation} $$
です。$T_1 = T_2 = T$ を代入すると $(T, -2T, T) \propto (1, -2, 1)$ となり、等間隔の場合に古典的な二項係数へ正しく帰着することが確認できます。
効果を数値で確認する
$T_1 = 400\ \mu$s、$T_2 = 500\ \mu$s(比 $4:5$)とすると、式 (13) は $\bm{w} \propto (5, -9, 4)$ という整数の組になります。実際に $\sum w_i = 5 – 9 + 4 = 0$、$\sum w_i t_i = -9 \times 400 + 4 \times 900 = -3600 + 3600 = 0\ [\mu\mathrm{s}]$ で両条件を満たしています。
スペクトル幅 $\sigma_f$ のガウス形クラッタに対する MTI 改善係数(信号利得をクラッタ利得で割った値)を数値計算すると、次のようになります。
| クラッタ幅 $\sigma_f$ | $[1,-2,1]$(誤用) | $(5,-9,4)$(正しい重み) | 差 |
|---|---|---|---|
| 0.5 Hz | 77.8 dB | 117.1 dB | 39.3 dB |
| 1 Hz | 71.8 dB | 105.1 dB | 33.3 dB |
| 2 Hz | 65.8 dB | 93.0 dB | 27.3 dB |
| 5 Hz | 57.8 dB | 77.1 dB | 19.3 dB |
差は 20〜40 dB に達します。絶対値はシステム安定度や雑音を無視した理想上限なので実機ではここまで出ませんが、重みを直すだけで抑圧性能が桁違いに変わるという相対的な傾向は信頼できます。スタガ PRF を導入するときに $[1,-2,1]$ を流用してしまい、「スタガにしたらクラッタが抜けるようになった」と悩む — これは実際によくある落とし穴です。
なお、4 パルス以上のキャンセラでも同じ考え方で重みを設計できます。$M$ 次のゼロを持たせたいなら、$\sum_i w_i t_i^m = 0$($m = 0, 1, \dots, M-1$)というヴァンデルモンド型の連立方程式を解けばよく、解は一意に(スケールを除いて)定まります。
副作用はまだあります。距離側にも代償があるのです。
スタガの副作用3: 距離あいまいさとドップラー処理
最大非あいまい距離は最短 PRI で決まる
スタガでは PRI がばらつくので、最大非あいまい距離は最も短い PRI で決まります。
$$ R_{ua}^{\mathrm{stag}} = \frac{c \min_i T_i}{2} $$
平均 PRI $\bar{T} = 1$ ms(等間隔なら $R_{ua} = 150$ km)の場合を計算すると、$4:5$ スタガでは $T_{\min} = 888.9\ \mu$s なので $R_{ua} = 133.3$ km、$25:30:27:31$ では $T_{\min} = 885.0\ \mu$s なので $132.8$ km です。約 11 % の損失。$2:3$ のように比を大きく離すと $T_{\min} = 800\ \mu$s で $120$ km となり、20 % も失います。
これは前節の「$k_i$ を離しすぎない」という指針の別の根拠になります。スタガは盲速を改善する代わりに、距離側で少しずつ支払いをしているのです。式 (7) の不変量は「等間隔レーダーでの厳密な等式」でしたが、スタガはこの制約を破っているのではなく、平均 PRI で決まる距離性能をわずかに犠牲にしつつ、速度側の折り返し格子を疎にしていると理解するのが正確です。
等間隔でないと FFT が使えない
もう一つの実務的な制約が信号処理側にあります。パルスドップラーレーダーはドップラーフィルタバンクを FFT で実装するのが定石ですが、FFT は等間隔サンプリングを前提としています。PRI がパルスごとに変わると、そのままでは FFT にかけられません。
このため実際のレーダーでは、次のような使い分けをします。
- パルス間スタガ(pulse-to-pulse stagger): PRI をパルスごとに変える。時間領域の MTI キャンセラ(数タップの FIR)と相性がよく、盲速拡張に最も効く。本記事で扱ってきた方式
- バースト間 PRF ダイバーシチ(PRF diversity / block staggering): 1 つの CPI(コヒーレント処理区間)内は等間隔にしておき、CPI ごとに PRF を切り替える。CPI 内で FFT が使えるので本格的なドップラー処理と両立する。ただし盲速の解消は「複数 CPI の検出結果を統合する」形($M$-of-$N$ 検出)になる
高性能なパルスドップラーレーダーでは後者が主流で、複数 PRF の観測を組み合わせて距離あいまいさと速度あいまいさを同時に解く「中国剰余定理(CRT)によるあいまいさ解消」が行われます。詳しくは パルスドップラーレーダー を参照してください。一方、単純な 2 次元 MTI 表示を行う監視レーダーや気象レーダーでは、いまでもパルス間スタガが現役です。
そのほかの注意点
- 送信デューティと受信窓: PRI が変わると受信窓の長さも変わります。短い PRI の周期では遠距離の観測時間が削られ、レンジゲートの割り当てを PRI ごとに変える必要があります
- クラッタの距離折り返し: 短い PRI の周期で折り返してくる遠距離クラッタは、PRI が変わると別の距離セルに現れるため、時間的に不安定なクラッタ残渣として見えます。これは MTI 出力にスパイク状の偽像を生みます
- 送信機の安定度: PRI が変わると送信管の熱的条件が変わり、パルス間の位相安定度(コヒーレンス)が落ちることがあります。改善係数は最終的にこの安定度で頭打ちになります
ここまでで理論と実務上の注意点が揃いました。最後に、これらを 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
c = 3.0e8 # 光速 [m/s]
lam = 0.10 # 波長 [m] (Sバンド 3 GHz)
T_avg = 1.0e-3 # 平均PRI [s]
v_ref = lam / (2 * T_avg) # 等間隔PRIでの第1盲速 [m/s]
def resp_single(v, T, order=1):
"""PRI=T の N次MTIキャンセラの振幅応答(速度 v の関数)"""
fd = 2.0 * v / lam # ドップラー周波数
return (2.0 * np.abs(np.sin(np.pi * fd * T))) ** order
def resp_stagger(v, Ts, order=1):
"""スタガPRIの合成応答(各PRI応答の電力平均)"""
R = np.array([resp_single(v, T, order) for T in Ts])
return np.sqrt((R ** 2).mean(axis=0))
def pri_set(ks, T_avg):
"""整数比 ks から平均PRIが T_avg になるPRI列を作る"""
ks = np.asarray(ks, dtype=float)
T0 = T_avg / ks.mean()
return T0 * ks
print(f"等間隔PRI {T_avg*1e3:.2f} ms の第1盲速 = {v_ref:.1f} m/s = {v_ref*3.6:.0f} km/h")
実行すると 等間隔PRI 1.00 ms の第1盲速 = 50.0 m/s = 180 km/h と表示されます。S バンドで PRI 1 ms という、遠距離監視レーダーとしてごく標準的な設定でも、第 1 盲速が高速道路の速度域に来てしまうことがこの 1 行から読み取れます。以降のグラフはすべてこの $v_{\mathrm{ref}} = 50$ m/s を基準に描きます。
図1: 単一PRFの速度応答と盲速
まず、等間隔 PRI の場合の速度応答を 1 次・2 次・3 次キャンセラで比較します。
v = np.linspace(0, 250, 4001) # 視線速度 [m/s]
plt.figure(figsize=(10, 5))
for order, style in [(1, "-"), (2, "--"), (3, ":")]:
R = resp_single(v, T_avg, order)
R_db = 20 * np.log10(np.maximum(R / R.max(), 1e-6))
plt.plot(v, R_db, style, lw=1.8, label=f"{order+1}パルスキャンセラ({order}次)")
for n in range(1, 6):
plt.axvline(n * v_ref, color="crimson", lw=0.8, alpha=0.6)
plt.text(52, -3, "盲速 v_b, 2v_b, ...", color="crimson", fontsize=10)
plt.xlabel("視線方向速度 [m/s]")
plt.ylabel("正規化応答 [dB]")
plt.title("等間隔PRI(1 ms, λ=0.1 m)のMTI速度応答:盲速が50 m/s刻みで並ぶ")
plt.ylim(-60, 5); plt.grid(alpha=0.3); plt.legend(loc="lower right")
plt.tight_layout(); plt.show()

このグラフから 3 つのことが読み取れます。第一に、応答は 50 m/s(=$v_{\mathrm{ref}}$)ごとに深いノッチを持ち、赤い縦線とぴったり一致します。これは式 (3) の $v_b = n\lambda f_r/2$ が正しいことの数値的な確認です。第二に、キャンセラの次数を上げるとノッチが深くかつ広くなります。0 Hz 近傍のクラッタ抑圧は改善しますが、盲速付近で $-6$ dB を下回る速度幅も広がるため、「検出できない速度帯」はむしろ増えます。第三に、ノッチの位置は次数によらず不変です。フィルタ設計では盲速を動かせないという主張が、図として確認できました。
図2: 盲速と最大非あいまい距離のトレードオフ
次に、式 (7) の不変量 $v_{b1} R_{ua} = c\lambda/4$ を可視化します。
fr = np.linspace(200, 5000, 1000) # PRF [Hz]
plt.figure(figsize=(9, 5))
for lam_i, name in [(0.23, "Lバンド λ=23 cm"), (0.10, "Sバンド λ=10 cm"),
(0.03, "Xバンド λ=3 cm")]:
vb = lam_i * fr / 2.0 # 第1盲速 [m/s]
Rua = c / (2.0 * fr) / 1e3 # 最大非あいまい距離 [km]
plt.plot(Rua, vb, lw=2, label=f"{name}(積={c*lam_i/4:.2e} m²/s)")
plt.xscale("log"); plt.yscale("log")
plt.xlabel("最大非あいまい距離 R_ua [km]")
plt.ylabel("第1盲速 v_b1 [m/s]")
plt.title("盲速と距離あいまいさは反比例する(両対数で直線)")
plt.grid(alpha=0.3, which="both"); plt.legend()
plt.tight_layout(); plt.show()

両対数プロットで 3 本の直線が傾き $-1$ の平行線になります。これは $v_{b1} R_{ua}$ が一定、すなわち式 (7) の不変量そのものです。線の高さ(切片)は波長だけで決まるので、L バンドは同じ距離性能でも X バンドより 7.7 倍高い盲速を確保できることが読み取れます。逆に言えば、波長を決めた時点で「距離と速度のどちらを取るか」という直線上のどこに乗るかしか選べません。この制約を破るには、直線を移動するのではなく、そもそも等間隔サンプリングをやめるしかないのです。
図3: 2段スタガの個別応答と合成応答
いよいよスタガの効果を見ます。$4:5$ の 2 段スタガについて、個々の PRI の応答と合成応答を重ねて描きます。
Ts = pri_set([4, 5], T_avg)
v = np.linspace(0, 260, 6001)
plt.figure(figsize=(10, 5))
for T, lab in zip(Ts, ["PRI 1 = 888.9 us (PRF 1125 Hz)", "PRI 2 = 1111.1 us (PRF 900 Hz)"]):
plt.plot(v, resp_single(v, T) / 2.0, lw=1.0, alpha=0.6, label=lab)
Rc = resp_stagger(v, Ts) / 2.0
plt.plot(v, Rc, "k-", lw=2.2, label="合成応答(電力平均)")
plt.axvline(4.5 * v_ref, color="crimson", ls="--", lw=1.5)
plt.text(4.5 * v_ref - 5, 1.06, "第1盲速 225 m/s(4.5倍)", color="crimson", ha="right")
for vm in [49.3, 175.7]: # リップルの底(数値探索で求めた位置)
plt.plot(vm, 0.34, "v", color="darkorange", ms=10, zorder=5)
plt.text(58, 0.30, "リップル 0.34(−9.4 dB)が 49 m/s と 176 m/s に残る",
color="darkorange", fontsize=9.5)
plt.xlabel("視線方向速度 [m/s]"); plt.ylabel("正規化振幅応答")
plt.title("2段スタガ(PRI比 4:5):個別にはゼロでも合成は225 m/sまでゼロにならない")
plt.ylim(0, 1.48); plt.grid(alpha=0.3)
plt.legend(loc="upper center", fontsize=9, ncol=3, framealpha=0.95)
plt.tight_layout(); plt.show()

薄い 2 本の曲線は、それぞれの PRI が単独で作る応答です。片方は 56.25 m/s ごと、もう片方は 45 m/s ごとにゼロになりますが、ゼロの位置がずれているのがはっきり見えます。太い黒線の合成応答は、片方がゼロでももう片方が値を持つので落ちきらず、両方が同時にゼロになる 225 m/s ではじめてゼロに達します。これが式 (10)(11) の内容です。同時に、合成応答が 49 m/s 付近と 176 m/s 付近で 0.34($-9.4$ dB)まで沈むことも見えます。これがリップルであり、次の図で定量化する副作用です。
図4: 段数を変えたときの応答比較
段数の効果を dB スケールで比較します。
configs = [([1], "等間隔(比1.0)"), ([4, 5], "2段 4:5(比4.5)"),
([25, 26], "2段 25:26(比25.5)"),
([25, 30, 27, 31], "4段 25:30:27:31(比28.25)")]
fig, axes = plt.subplots(1, 2, figsize=(13.5, 5.4), sharey=True)
for ax, (vmax, npts, sub) in zip(axes, [(300, 30001, "拡大:旅客機の速度域(0〜300 m/s)"),
(1600, 60001, "全体:第1盲速が現れる速度まで(0〜1600 m/s)")]):
v = np.linspace(0, vmax, npts)
for ks, lab in configs:
Ts = pri_set(ks, T_avg)
R = resp_stagger(v, Ts) / 2.0
ax.plot(v, 20 * np.log10(np.maximum(R, 1e-4)), lw=1.3, label=lab)
ax.axhline(-6, color="gray", ls=":", lw=1.2)
ax.set_xlabel("視線方向速度 [m/s]"); ax.set_title(sub, fontsize=11.5)
ax.set_ylim(-45, 3); ax.grid(alpha=0.3)
axes[0].set_ylabel("正規化応答 [dB]")
axes[0].text(300, -5.4, "検出限界の目安 −6 dB", color="gray", fontsize=9, ha="right")
axes[1].legend(loc="lower left", fontsize=9, framealpha=0.95)
fig.suptitle("スタガ構成による速度応答の比較(2パルスキャンセラ、平均PRI 1 ms)", fontsize=13)
fig.tight_layout(rect=[0, 0, 1, 0.93]); plt.show()

左の拡大図から読み取れることが本質です。等間隔(青)は 50 m/s ごとに底なしのノッチが並び、旅客機の速度域が完全に櫛状に抜けています。$4:5$ の 2 段(橙)は第 1 盲速 225 m/s までのあいだノッチが $-9.4$ dB 止まりになり、$-6$ dB の目安線を割る速度帯はごく狭い範囲に限られます。$25:26$(緑)は第 1 盲速こそ 1275 m/s と高いものの、50 m/s 付近で $-24$ dB まで沈んでおり、実質的にこの速度は見えません。4 段 $25:30:27:31$(赤)は最も落ち込みが浅く、広い速度域で $-12$ dB 以上を保っています。右の全体図では、橙が 225 m/s、緑が 1275 m/s で真のゼロに落ちる位置も確認できます。「第 1 盲速比だけを見て設計してはいけない」という主張が、この 1 枚に凝縮されています。
図5: 第1盲速比とリップル深さの関係
2 段スタガについて、比 $k:(k+1)$ を変えたときの第 1 盲速比と最深リップルの関係をプロットします。
v = np.linspace(0.35 * v_ref, 1e4, 400001)
ratios, dips = [], []
for k in range(2, 41):
ks = [k, k + 1]
Ts = pri_set(ks, T_avg)
ratio = sum(ks) / len(ks)
m = v < 0.90 * ratio * v_ref # 第1盲速の90%まで
R = resp_stagger(v[m], Ts) / 2.0
ratios.append(ratio); dips.append(20 * np.log10(R.min()))
plt.figure(figsize=(9, 5))
plt.plot(ratios, dips, "o-", lw=1.6, ms=4, color="darkorange", label="2段スタガ k:(k+1)")
# 多段スタガの設計例を星印で重ねる
for ks, col, lab in [([25, 30, 27], "#1f77b4", "3段 25:30:27"),
([25, 30, 27, 31], "#2ca02c", "4段 25:30:27:31"),
([25, 30, 27, 31, 33], "crimson", "5段 25:30:27:31:33")]:
Ts = pri_set(ks, T_avg)
ratio = sum(ks) / len(ks)
vv = np.linspace(0.35 * v_ref, 0.90 * ratio * v_ref, 400001)
d = 20 * np.log10((resp_stagger(vv, Ts) / 2.0).min())
plt.plot(ratio, d, "*", ms=17, color=col, label=lab, zorder=5)
print(f"{lab}: 比={ratio:.2f}, 最深リップル={d:.1f} dB")
plt.axhline(-6, color="gray", ls=":"); plt.axhline(-12, color="gray", ls="--")
plt.text(3, -5.5, "−6 dB", color="gray"); plt.text(3, -11.5, "−12 dB", color="gray")
plt.xlabel("第1盲速比 (k1+...+kN)/N"); plt.ylabel("通過帯域の最深リップル [dB]")
plt.title("2段では盲速を上げるほど通過帯域が沈むが、段数を増やすと同じ盲速比でも浅く済む")
plt.grid(alpha=0.3); plt.legend(fontsize=9, loc="lower left")
plt.tight_layout(); plt.show()

きれいな単調減少が現れます。第 1 盲速比 4.5($4:5$)でリップルは $-9.4$ dB、比 9.5($9:10$)で $-15.7$ dB、比 25.5($25:26$)で $-24.2$ dB。おおむね比が 2 倍になるごとに 6 dB ずつ沈んでいく傾向で、これは「1 本だけがゼロに近く、もう 1 本も比が近いためほとんどゼロ」という状況が比とともに悪化することの現れです。2 段スタガで実用的な妥協点は比 3〜6 程度、リップル $-7$〜$-11$ dB あたりであり、それ以上の盲速比が必要なら段数を増やすしかない、という設計指針が読み取れます。図に星印で重ねた 3〜5 段の設計例は、いずれも比 27〜29 という同じ領域にいながら曲線よりはるかに上(浅いリップル)に位置しており、段数が「比とリップルのトレードオフ曲線そのものを持ち上げる」効き方をすることが分かります。
図6: 3パルスキャンセラの重み補正
最後に、スタガ時に $[1,-2,1]$ を流用した場合と、式 (13) の重みを使った場合のクラッタ抑圧を比較します。
T1, T2 = 400e-6, 500e-6
t = np.array([0.0, T1, T1 + T2])
w_naive = np.array([1.0, -2.0, 1.0])
w_opt = np.array([T2, -(T1 + T2), T1]) / 1e-4 # → (5, -9, 4)
def improvement(w, t, sigma_f):
"""スペクトル幅 σ_f のガウス形クラッタに対するMTI改善係数 [dB]"""
dt = t[:, None] - t[None, :]
rho = np.exp(-2 * np.pi ** 2 * sigma_f ** 2 * dt ** 2) # クラッタの自己相関
return 10 * np.log10(np.sum(w ** 2) / np.sum(np.outer(w, w) * rho))
fd = np.linspace(0, 60, 60001) # ドップラー周波数 [Hz]
fig, axes = plt.subplots(1, 2, figsize=(13, 4.8))
for w, lab in [(w_naive, "[1, -2, 1](等間隔用をそのまま流用)"),
(w_opt, "(5, -9, 4)(スタガ対応の重み)")]:
H = np.abs((w[:, None] * np.exp(-2j * np.pi * fd[None, :] * t[:, None])).sum(axis=0))
axes[0].plot(fd, 20 * np.log10(np.maximum(H / H.max(), 1e-8)), lw=1.8, label=lab)
axes[0].axvspan(0, 3, color="crimson", alpha=0.12)
axes[0].text(3.3, -75, "地面クラッタの\nスペクトル幅の目安", color="crimson", fontsize=9)
axes[0].set_xlabel("ドップラー周波数 [Hz]"); axes[0].set_ylabel("正規化応答 [dB]")
axes[0].set_title("不等間隔サンプリングでは [1,-2,1] の\n2次ゼロが1次に退化する", fontsize=11.5)
axes[0].set_xlim(0, 20); axes[0].set_ylim(-100, 3)
axes[0].grid(alpha=0.3); axes[0].legend(fontsize=9, loc="lower right")
sig = np.linspace(0.3, 8, 200)
axes[1].plot(sig, [improvement(w_naive, t, s) for s in sig], lw=2.0, label="[1, -2, 1](誤用)")
axes[1].plot(sig, [improvement(w_opt, t, s) for s in sig], lw=2.0, label="(5, -9, 4)(正しい重み)")
axes[1].set_xlabel("クラッタのスペクトル幅 σ_f [Hz]"); axes[1].set_ylabel("MTI改善係数 [dB]")
axes[1].set_title("重みを直すだけでクラッタ抑圧が\n20〜40 dB 回復する", fontsize=11.5)
axes[1].grid(alpha=0.3); axes[1].legend(fontsize=9)
fig.tight_layout(); plt.show()
print("w_naive: Σw =", w_naive.sum(), " Σw·t =", (w_naive * t).sum())
print("w_opt : Σw =", w_opt.sum(), " Σw·t =", (w_opt * t).sum())
for s in [0.5, 1, 2, 5]:
a, b = improvement(w_naive, t, s), improvement(w_opt, t, s)
print(f"σ_f={s} Hz: [1,-2,1]={a:.1f} dB, (5,-9,4)={b:.1f} dB, 差={b-a:.1f} dB")
![左:不等間隔サンプリングで[1,-2,1]と(5,-9,4)の周波数応答を比較し2次ゼロが1次に退化することを示す図。右:クラッタスペクトル幅に対するMTI改善係数の差を示す図](https://disassemble-channel.com/wp-content/uploads/2026/08/staggered-prf-blind-speed_12_weight_correction.png)
左のグラフで 0 Hz 近傍の傾きを見比べると、$[1,-2,1]$ は 20 dB/decade でしか下がらないのに対し、$(5,-9,4)$ は 40 dB/decade で落ちており、零点の次数が 1 と 2 で違うことがそのまま傾きの差になっています。右のグラフはその帰結で、クラッタ幅 $\sigma_f$ をどこに取っても改善係数におおむね 20〜40 dB の差が付きます。重みの係数を書き換えるだけのコストで、これだけの抑圧性能が戻ってくるわけです。
出力の Σw·t を見ると、$[1,-2,1]$ では $1.0\times10^{-4}$(=$T_2 – T_1$)と非ゼロなのに対し、$(5,-9,4)$ では機械精度でゼロになります。グラフでは、0 Hz 近傍の傾きが明確に違います。$[1,-2,1]$ は 1 次のゼロなので $f_d$ に比例($20$ dB/decade)でしか下がらず、$(5,-9,4)$ は 2 次のゼロなので $f_d^2$ に比例($40$ dB/decade)で急峻に下がります。赤い帯で示した実際のクラッタ幅(数 Hz)の領域では 30 dB 以上の差が付いており、表で示した改善係数の差と整合しています。スタガを導入したら重みも必ず作り直す、という結論です。
具体例: Sバンド監視レーダーの設計
これまでの道具を使って、実際に一つ設計してみましょう。要求は次のとおりとします。
- 周波数 3 GHz($\lambda = 0.1$ m)
- 最大探知距離 130 km 以上(距離あいまいさなし)
- 目標速度域 30〜300 m/s で、MTI 後の速度応答が $-10$ dB を下回らないこと
まず等間隔で考えます。$R_{ua} \geq 130$ km から $T \geq 2\times130000/c = 866.7\ \mu$s。ここでは $\bar{T} = 1$ ms とします。すると式 (3) より第 1 盲速は 50 m/s。要求速度域 30〜300 m/s の中に $n = 1,\dots,6$ の盲速が 6 本も入るので、等間隔では要求を満たせません。
次にスタガを検討します。要求速度域の上限 300 m/s を第 1 盲速の 90 % 以下に収めたいので、$v_1 \geq 333$ m/s、すなわち第 1 盲速比 $\geq 6.7$ が必要です。ところが 2 段スタガ $6:7$(比 6.5)を実際に評価すると、30〜300 m/s の範囲で応答が 50 m/s 付近で $-12.4$ dB まで沈み、$-10$ dB 要求を満たせません。そこで段数を増やします。
$k = (5, 6, 7)$ を試すと、$\gcd = 1$ で条件を満たし、比は $(5+6+7)/3 = 6.0$ で少し足りません。$k = (6, 7, 8)$ は $\gcd(6,7,8) = 1$ なので有効で、比は $7.0$、第 1 盲速は $350$ m/s です。PRI は $T_0 = 1\,\mathrm{ms}/7 = 142.9\ \mu$s より
$$ T_1 = 857.1\ \mu\mathrm{s},\quad T_2 = 1000.0\ \mu\mathrm{s},\quad T_3 = 1142.9\ \mu\mathrm{s} $$
(PRF は 1167 Hz、1000 Hz、875 Hz)となります。最短 PRI が $857.1\ \mu$s なので $R_{ua} = c \times 857.1\times10^{-6}/2 = 128.6$ km。要求の 130 km にわずかに届かないので、$\bar{T}$ を 1.02 ms へ延ばして $T_{\min} = 874.3\ \mu$s($R_{ua} = 131.1$ km)とすれば要求を満たします。このとき第 1 盲速は $\lambda/(2T_0) = 0.1/(2\times145.7\times10^{-6}) = 343$ m/s です。

この構成の合成応答を 30〜300 m/s で数値評価すると、最も沈むのは 48 m/s 付近の $-9.1$ dB で、$-10$ dB 要求をぎりぎり満たします。図で確認すると、薄い 3 本の個別応答は要求速度域のあちこちで底を打っているのに、太い黒線の合成応答は緑の帯(要求域)の中で一度も赤い $-10$ dB のラインを割っていません。そして第 1 盲速は帯の外側、343 m/s に押し出されています。距離・速度・リップルの 3 つの要求が同時に満たされた状態が、この 1 枚で確認できます。3 本のものさし(比 $6:7:8$)が互いに十分離れているおかげで、第 1 盲速比 7.0 という高い値とリップル $-9.1$ dB を両立できました。もし要求がもっと厳しければ 4 段化してリップルをさらに浅くする、という次の一手が残っています。
このように、平均 PRI で距離要求を、整数比で盲速要求を、段数でリップル要求をそれぞれ独立に調整していくのが、スタガ PRF 設計の基本的な進め方です。3 パルスキャンセラを使うなら、$T_1, T_2$ の組ごとに式 (13) の重みを計算し直すことを忘れないでください。
まとめ
本記事では、MTI レーダーのブラインドスピードとスタガ PRF について解説しました。
- 盲速はサンプリングの問題である。パルスレーダーはドップラー周波数 $f_d = 2v_r/\lambda$ を PRF でサンプリングしており、$f_d$ が $f_r$ の整数倍になると折り返して 0 Hz(クラッタ)と区別がつかなくなる
- 2 パルスキャンセラ $H(z) = 1 – z^{-1}$ の振幅応答は $|H| = 2|\sin(\pi f_d T)|$ で、$f_d T$ が整数のたびにゼロになる。盲速は $v_b = n\lambda/(2T) = n\lambda f_r/2$
- キャンセラの次数を上げてもノッチが深く広くなるだけで、盲速の位置は動かない
- PRF を上げれば盲速は上がるが最大非あいまい距離が縮み、$v_{b1} R_{ua} = c\lambda/4$ という不変量に縛られる
- スタガ PRF は PRI を $T_i = k_i T_0$($\gcd(k_i) = 1$)と整数比で切り替える。合成応答は各応答の電力平均で、零点は各応答の零点の共通部分になる
- 第 1 盲速は $v_1 = \lambda/(2T_0)$、すなわち個々の PRF の最小公倍数に対応する速度まで押し上がる。平均 PRI 基準の比は $(k_1 + \dots + k_N)/N$、2 段なら $(k_1+k_2)/2$
- 副作用として通過帯域にリップルが生じる。$25:26$ は比 25.5 と引き換えに $-24$ dB のディップを作るが、4 段 $25:30:27:31$ は比 28.25 でリップル $-11.7$ dB と両立する
- 不等間隔では $[1,-2,1]$ の 2 次ゼロが 1 次に退化する。$\bm{w} = (T_2, -(T_1+T_2), T_1)$ に作り直せば改善係数が 20〜40 dB 回復する
- 最大非あいまい距離は最短 PRI で決まるため、距離側で約 10〜20 % の代償を払う
盲速の議論は「サンプリング定理をレーダーという物理系に持ち込むと何が起きるか」の教科書的な実例です。等間隔サンプリングが避けられない折り返しを生み、非等間隔サンプリングがそれを疎にする — この構図は、圧縮センシングのランダムサンプリングや、天文学の不等間隔時系列に対する Lomb-Scargle ピリオドグラムとも通じています。レーダーの外にも応用の効く考え方なので、ぜひ手を動かして応答曲線を描いてみてください。
次のステップとして、以下の記事も参考にしてください。