Chirp-Z 変換 / Zoom-DFT シミュレーター 戻る
信号処理シミュレーター

Chirp-Z 変換 / Zoom-DFT シミュレーター — 狭帯域高分解能解析

DFT は周波数 0〜F_s/2 を N 等分しますが、CZT(Chirp-Z 変換)は任意の周波数範囲 [f_start, f_end] を M 点でズーム解析できます。近接 2 周波数の分離をリアルタイムに可視化。

パラメータ設定
第 1 周波数 f_1
Hz
第 2 周波数 f_2
Hz
CZT 開始周波数 f_start
Hz
CZT 終端周波数 f_end
Hz

サンプリング周波数 F_s = 1000 Hz、サンプル数 N = 256、CZT 出力点数 M = 256 固定。入力信号は x[n] = sin(2π f_1 n/F_s) + sin(2π f_2 n/F_s)。

計算結果
DFT 分解能 F_s/N (Hz)
CZT 分解能 (f_end-f_start)/M (Hz)
ターゲット 2 周波数差 Δf (Hz)
CZT で分離されたピーク数
DFT(上)と CZT(下)の振幅スペクトル

上:DFT 振幅 |X[k]|(青)0〜F_s/2 を N 等分/下:CZT 振幅(赤)[f_start, f_end] を M 等分/黄縦線=f_1, f_2

理論・主要公式

Chirp-Z 変換(CZT)は、Z 平面上の等比螺旋に沿って M 点でサンプリングする一般化 DFT です:

$$X[k] = \sum_{n=0}^{N-1} x[n]\,A^{-n}\,W^{nk}, \qquad k = 0,1,\dots,M-1$$

ここで $A = A_0 e^{j\theta_0}$、$W = W_0 e^{-j\phi_0}$。Zoom-DFT 用には:

$$A = e^{j\,2\pi f_\text{start}/F_s}, \qquad W = e^{-j\,2\pi (f_\text{end}-f_\text{start})/(M\,F_s)}$$

これにより $[f_\text{start}, f_\text{end}]$ を M 点で等分した周波数応答が得られます。DFT は 0〜F_s/2 を N 等分するので、分解能はそれぞれ:

$$\Delta f_\text{DFT} = \frac{F_s}{N}, \qquad \Delta f_\text{CZT} = \frac{f_\text{end}-f_\text{start}}{M}$$

既定値(F_s=1000, N=M=256, f_start=90, f_end=120)では DFT は 3.91 Hz/bin、CZT は 0.117 Hz/bin と約 33 倍の分解能差になります。

Chirp-Z 変換 / Zoom-DFT シミュレーターとは

🙋
DFT で 100Hz と 105Hz を分けたいんですけど、ピークが 1 個にしか見えません。何が起きてるんですか?
🎓
それが「DFT の分解能の壁」だ。ざっくり言うと、DFT は周波数 0〜F_s/2 を N 等分するから、分解能は $\Delta f = F_s/N$。サンプリング 1000Hz、N=256 なら約 3.91Hz/bin。5Hz の差はギリギリで、リーク(窓関数の影響)と重なるとピークが融合して見えるんだ。上の DFT グラフを見て——青いカーブの 100Hz 付近が 1 つの山になってるだろう。
🙋
じゃあサンプル数を増やせば見えるんですか?
🎓
理屈はそう。でも例えば 0.1Hz/bin が欲しいなら N = 10000 必要で、サンプリング時間も 10 秒。リアルタイム解析や非定常信号には致命的だよ。そこで CZT(Chirp-Z 変換)の出番。$X[k] = \sum_n x[n] A^{-n} W^{nk}$ という形で、$A$ と $W$ を選ぶことで「90〜120Hz だけを 256 点でズーム」みたいな解析ができる。下の赤いカーブを見て——同じ 256 サンプルなのに、100Hz と 105Hz がきれいに 2 ピークに分離してるだろう?
🙋
ほんとだ!分解能 0.117Hz/bin になってますね。30Hz の帯域を 256 点で割るから。これって魔法みたいですけど、何か犠牲はないんですか?
🎓
いい質問。トレードオフは「観測時間」と「ノイズ除去」だ。サンプル数 N は変わってないから、観測時間 N/F_s = 0.256 秒も同じ。だから「真の」周波数識別能力($1/T$ で決まる Rayleigh 限界)は変わらない。CZT が有利なのは「対象範囲を絞ることで、その範囲内のビン幅を細かくできる」点。実務ではレーダーの距離・速度マップや、機械振動の固有周波数同定で重宝されるよ。
🙋
FFT との計算量はどう違うんですか?
🎓
FFT は $O(N \log N)$、CZT を直接定義式で計算すると $O(N \cdot M)$ だ。でも Bluestein のアルゴリズムを使えば、CZT を 3 回の FFT に変換できて $O((N+M) \log(N+M))$ で済む。本ツールは N=M=256 と小さいから直接計算で十分速い(65,536 演算で即時)けど、N が数万になると Bluestein が必須。numpy.scipy.signal.czt は内部でこれを使ってるよ。

よくある質問

FFT は N 点の DFT を O(N log N) で計算します。CZT は本質的に O(N·M) の直接計算ですが、Bluestein のアルゴリズムを使うと長さ L = 2^ceil(log2(N+M-1)) の FFT 3 回(前向き 2 回、逆向き 1 回)に変換でき、O(L log L) で計算できます。本ツールは N=M=256 と小さいため直接計算で十分高速ですが、実装上は Bluestein 法が標準的です。
レーダーのドップラー解析や機械振動の固有周波数同定では、関心帯域がスペクトル全体のごく一部に集中することが多いです。FFT で全帯域を高分解能で見るには長時間サンプリングが必要ですが、CZT なら関心帯域だけをズームできます。例えば 100Hz±10Hz を 256 点で解析すれば、20/256 = 0.078Hz の分解能が得られ、DFT 換算では N = F_s/Δf = 12,800 点に相当します。
Goertzel は単一周波数(または少数の周波数)の DFT 係数を効率的に計算するアルゴリズムで、O(N) で 1 周波数を取得できます。M 個の周波数なら O(N·M)。CZT も同じ O(N·M) ですが、CZT は等比螺旋上の M 点を一度に計算するため、隣接周波数群の解析に向いています。Goertzel は DTMF 検出のような疎な周波数の検出に、CZT はズームスペクトル全体の取得に使われます。
CZT の周波数分解能は (f_end − f_start)/M で、ビン幅で見たときの最小分解能です。ただし真の精度は SNR と窓関数で決まり、放物線補間やゼロ詰め補間を併用すると、ビン幅の 1/10 以下まで周波数を推定できます。本ツールでは 30Hz 帯域を 256 点に分けるので 0.117Hz/bin、補間まで含めると 0.01Hz オーダーの周波数推定が可能です。

実世界での応用

レーダー・ソナーの高分解能ドップラー解析:パルスドップラーレーダーでは、目標速度に対応するドップラー周波数の帯域がレーダー帯域全体のごく一部です。CZT を使うと関心ドップラー帯のみを高分解能で解析でき、近接した複数目標(編隊飛行する航空機など)の速度識別が可能になります。同じ思想は気象レーダーの風速推定や、医療超音波のカラードップラー画像にも応用されています。

機械振動の固有周波数同定(モーダル解析):回転機械の軸受異常診断や橋梁・建築物の常時微動測定では、固有振動数の僅かなシフト(材料劣化や損傷の兆候)を検出する必要があります。CZT で関心周波数帯(例えば 50〜60Hz の 1 次曲げモード)をズーム解析することで、0.01Hz オーダーの周波数追跡が可能になり、構造ヘルスモニタリング(SHM)の感度を大幅に向上できます。

通信信号の搬送波周波数推定:衛星通信や狭帯域 IoT 通信では、ドップラーシフトや発振器ドリフトによる搬送波周波数の僅かなずれを補正する必要があります。CZT で受信信号の搬送波付近を高分解能解析することで、AFC(自動周波数制御)の追従性能を高めることができます。LoRa など狭帯域変調方式の同期処理にも応用されています。

音響・楽器の倍音構造解析:楽器の音色や歌声の音響解析では、基本周波数とその倍音(ハーモニクス)の僅かなずれや揺らぎ(ビブラート、コーラス効果)が音色を決めます。CZT で各倍音の周辺をズーム解析することで、通常の FFT では見えない微細な周波数変動を可視化でき、楽器の音色設計や音声合成の品質向上に活用されます。

よくある誤解と注意点

最も多い誤解は、「CZT を使えばどんな近接周波数でも分離できる」と思い込むことです。CZT が改善するのは「ビン幅」(表示分解能)であって、信号本来の周波数識別能力ではありません。観測時間 $T = N/F_s$ で決まる Rayleigh 限界 $\Delta f_R = 1/T$ は CZT を使っても変わらず、本ツールの設定では $1/0.256 \approx 3.9$ Hz が真の限界です。5Hz 差は限界ぎりぎりで分離できますが、3Hz 差以下になるとビン幅をいくら細かくしてもピークが融合します。試しに f_2 を 102Hz に下げてみてください。CZT でもピークが 1 つに見えるはずです。

次に多いのが、「CZT は FFT より常に高速」と勘違いすることです。直接計算の CZT は $O(N \cdot M)$ で、N=M=8192 なら 67,108,864 演算と FFT($N \log_2 N \approx 106,496$ 演算)の 600 倍以上遅くなります。CZT の真価は Bluestein のアルゴリズムによる $O((N+M) \log(N+M))$ 実装で、ようやく FFT と同等オーダーになります。本ツールは教育目的で直接定義式を使っていますが、実務では scipy.signal.czt や CZT 専用 IP コアを使ってください。

最後に、「CZT 出力のスペクトル振幅と DFT のそれが直接比較できる」と考えるのも注意点です。CZT の各ビンには異なる周波数の解析窓(実質的に $A^{-n}$ による位相回転)が掛かっており、ビン間のスペクトル形状(メインローブ幅・サイドローブレベル)は等しくありません。絶対振幅を測定する場合は、各ビンの応答を別途キャリブレーションするか、ハニング・ハミングなどの窓関数を入力信号 x[n] に適用して窓補正係数で割る必要があります。本ツールの縦軸は相対振幅であり、絶対値の測定には適していない点に注意してください。