なぜ「離散信号処理の基礎」を束ねるのか
連続時間の信号処理から離散時間の信号処理に踏み込むと、標本化定理 → DTFT → DFT/FFT → Z変換 → 補間 → 相関 → 圧縮という流れの中で、似たような略語と式が大量に押し寄せる。個別記事を読み進めるうちに「結局これらはどう繋がっているのか」が見えにくくなりやすい領域である。
本ブログでは離散DSPの基礎を扱う個別記事を順次整備してきた。具体的には次の6本である:
- https://yuhi-sa.github.io/posts/20260430_sampling_theorem/1/ — 標本化定理・ナイキスト周波数・エイリアシング
- https://yuhi-sa.github.io/posts/20260430_signal_interpolation/1/ — 信号再構成と補間(sinc / 線形 / スプライン)
- https://yuhi-sa.github.io/posts/20260505_dtft_dft_fft/1/ — DTFT・DFT・FFT の関係
- https://yuhi-sa.github.io/posts/20260430_z_transform/1/ — Z変換・伝達関数・極零点
- https://yuhi-sa.github.io/posts/20260429_autocorrelation/1/ — 自己相関・相互相関
- https://yuhi-sa.github.io/posts/20260430_dct/1/ — 離散コサイン変換(DCT)
これらは独立した記事だが、根底では「連続信号を離散値列として扱うための共通の数学構造」を共有している。本ハブは、これら 6 本に外周のフィルタ設計・時間周波数解析・メタロードマップを接続し、離散信号処理の最初の数ヶ月をどう進むかを一枚図にすることを目的とする。
すでに上位のロードマップを読んだ方は、メタロードマップ https://yuhi-sa.github.io/posts/20260528_dsp_ml_roadmap/1/ に立ち戻ると本ハブの位置付けが分かりやすい。
1. 学習レベル別ロードマップ
離散DSPの基礎は、学習者の出発点によって読む順番が変わる。ここでは 4 レベルで進路を示す。
Level 1 — 完全初心者(連続信号の経験が浅い)
目標: 「連続と離散の違い」を理解し、ナイキスト周波数・エイリアシングという中核語彙を獲得する。
- https://yuhi-sa.github.io/posts/20260225_fft/1/ — FFT 入門で「離散時刻の周波数表現」に慣れる
- https://yuhi-sa.github.io/posts/20260430_sampling_theorem/1/ — 標本化定理・ナイキスト・エイリアシング
- https://yuhi-sa.github.io/posts/20260225_moving_average/1/ — 移動平均で「離散時刻の畳み込み」を体験
- https://yuhi-sa.github.io/posts/20260430_signal_interpolation/1/ — sinc 補間に出会う
目安: 2〜4 週間。numpy.fft.fftfreq で周波数軸を引けるようになることがゴール。
Level 2 — 連続→離散の橋渡し(DTFT・DFT・Z変換を体系化)
目標: 連続時間 Fourier・Laplace と離散時間 DTFT・Z 変換の対応表を頭に入れる。
- https://yuhi-sa.github.io/posts/20260430_sampling_theorem/1/ — スペクトル複製の式 \((5)\)
- https://yuhi-sa.github.io/posts/20260505_dtft_dft_fft/1/ — DTFT は連続周波数表現、DFT はそれを離散化
- https://yuhi-sa.github.io/posts/20260430_z_transform/1/ — Z変換は DTFT を複素 z 平面に拡張したもの
- https://yuhi-sa.github.io/posts/20260228_fft_window_psd/1/ — 窓関数と PSD 推定
- https://yuhi-sa.github.io/posts/20260429_autocorrelation/1/ — Wiener-Khinchin 定理(ACF ↔ PSD)
目安: 4〜6 週間。
Level 3 — Python 実装重視(scipy・numpy の API を手で叩く)
目標: scipy.fft と numpy.fft の使い分け、リサンプリング、相関の高速計算を実装で理解する。
- https://yuhi-sa.github.io/posts/20260430_signal_interpolation/1/ —
scipy.signal.resample,resample_poly,decimate - https://yuhi-sa.github.io/posts/20260429_autocorrelation/1/ —
numpy.correlate, FFT ベース \(O(N\log N)\) - https://yuhi-sa.github.io/posts/20260430_dct/1/ —
scipy.fft.dct, MDCT, 2D DCT - https://yuhi-sa.github.io/posts/20260430_z_transform/1/ —
scipy.signal.tf2zpk,freqz - https://yuhi-sa.github.io/posts/20260505_dtft_dft_fft/1/ —
numpy.fft.fftとゼロパディング
目安: 6〜8 週間。
Level 4 — 応用志向(フィルタ設計・時間周波数・ML 前処理に進む)
目標: 離散DSPの基礎を フィルタ設計ハブ・時間周波数ハブ・ML 時系列ハブ につなぐ。
- https://yuhi-sa.github.io/posts/20260522_filter_design_guide/1/ — フィルタ設計指針ハブへ進む
- https://yuhi-sa.github.io/posts/20260524_time_frequency_guide/1/ — 時間周波数解析ハブへ進む
- https://yuhi-sa.github.io/posts/20260525_ml_timeseries_guide/1/ — ML 時系列ハブへ進む
- https://yuhi-sa.github.io/posts/20260528_dsp_ml_roadmap/1/ — DSP/ML 全体メタロードマップ
目安: 並行 8〜12 週間。
2. 連続信号 → 離散信号への橋渡し
連続時間信号 \(x(t)\) から離散時間列 \(x[n]\) への変換は、本シリーズの出発点である。
標本化定理(Nyquist–Shannon)
帯域制限信号 \(x(t)\) (\(|f| > f_{\max}\) で \(X(f) = 0\) )は、
\[f_s > 2 f_{\max}\]を満たすサンプリング周波数 \(f_s\) でサンプリングされれば、サンプル列 \(\{x[n]\}\) から完全に復元できる。詳細な証明・スペクトル複製式・実装例は https://yuhi-sa.github.io/posts/20260430_sampling_theorem/1/ を参照。
標本化前後のスペクトル
| 領域 | 表現 | 周期性 |
|---|---|---|
| 連続時間 | \(X(f)\) | 周期なし |
| 離散時間 | \(X(e^{j\omega})\) (DTFT) | \(2\pi\) 周期(→ 周波数軸が巻く) |
| 離散時間離散周波数 | \(X[k]\) (DFT) | 時間・周波数とも \(N\) 周期 |
DTFT → DFT の離散化と FFT による高速計算は https://yuhi-sa.github.io/posts/20260505_dtft_dft_fft/1/ で詳述している。
エイリアシング対策
サンプリング前のアナログ LPF(アンチエイリアシングフィルタ)の役割と、ダウンサンプリング前の AAF の設計は https://yuhi-sa.github.io/posts/20260430_sampling_theorem/1/ に加え、フィルタ設計の観点で https://yuhi-sa.github.io/posts/20260522_filter_design_guide/1/、https://yuhi-sa.github.io/posts/20260223_lowpass_filter/1/、https://yuhi-sa.github.io/posts/20260226_butterworth/1/ が参考になる。
3. 離散時間信号の周波数表現
DTFT・DFT・FFT の階層
3 つの関係を一行で整理すると次のようになる。
- DTFT:\(x[n]\) に対する連続な周波数表現(\(\omega \in [0, 2\pi)\) )
- DFT:DTFT を周波数軸で \(N\) 等分にサンプリングした有限版
- FFT:DFT を \(O(N \log N)\) で計算するアルゴリズム
詳細は https://yuhi-sa.github.io/posts/20260505_dtft_dft_fft/1/。
DTFT・DFT・FFT 比較表
| 軸 | DTFT | DFT | FFT |
|---|---|---|---|
| 時間軸 | 離散 \(n \in \mathbb{Z}\) | 離散 \(n = 0, \dots, N-1\) | 離散 \(n = 0, \dots, N-1\) |
| 周波数軸 | 連続 \(\omega \in [0,2\pi)\) | 離散 \(k = 0, \dots, N-1\) | 離散 \(k = 0, \dots, N-1\) |
| 計算量 | 解析的(閉形式) | \(O(N^2)\) | \(O(N \log N)\) |
| 主な用途 | 理論解析 | 数値スペクトル評価 | 実装上の標準 |
| 主要 API | (閉形式) | 直接計算 | numpy.fft.fft |
Z変換との関係
DTFT は Z変換 \(X(z)\) を単位円 \(z = e^{j\omega}\) に制限したもの。Z領域から極零点 → 周波数応答 → 安定性まで一気に見えるので、フィルタ設計の理論基盤になる。詳しくは https://yuhi-sa.github.io/posts/20260430_z_transform/1/。
DCT は DFT の偶対称版
実数信号で境界のギブス現象を回避し、エネルギーを低次に集中させたい場合に DCT が選ばれる。JPEG・MP3・H.264 などほぼすべての lossy 圧縮で使われる。詳細は https://yuhi-sa.github.io/posts/20260430_dct/1/。
4. 離散信号の数理操作
Z変換と伝達関数
差分方程式
\[\sum_{k=0}^{N} a_k\, y[n-k] = \sum_{k=0}^{M} b_k\, x[n-k]\]の両辺を Z変換すると、伝達関数
\[H(z) = \frac{Y(z)}{X(z)} = \frac{\sum_k b_k z^{-k}}{\sum_k a_k z^{-k}} = \frac{B(z)}{A(z)}\]が得られる。極が単位円内部にあれば BIBO 安定。詳しくは https://yuhi-sa.github.io/posts/20260430_z_transform/1/。安定性・周波数応答・群遅延の解析は https://yuhi-sa.github.io/posts/20260430_phase_group_delay/1/ と組み合わせて読むと立体的に理解できる。
自己相関・相互相関
自己相関関数(ACF)は信号の周期性検出に、相互相関関数(CCF)は遅延推定に使う。Wiener–Khinchin 定理により、ACF の Fourier 変換はパワースペクトル密度(PSD)に等しい:
\[S_{xx}(f) = \mathcal{F}\{R_{xx}(\tau)\}.\]FFT を使えば \(O(N \log N)\) で高速計算可能。詳しくは https://yuhi-sa.github.io/posts/20260429_autocorrelation/1/。
畳み込みと相関
畳み込み・相関・Wiener-Khinchin 定理の関係を整理した https://yuhi-sa.github.io/posts/20260502_convolution_correlation/1/ は、本節と相補的に読める。
5. 補間と再構成
サンプル列 \(x[n]\) から連続信号 \(x(t)\) を取り戻す再構成と、サンプリング率変換のための補間は、表裏一体の操作である。
主要な補間手法の比較
| 手法 | 周波数応答 | 計算量 | 主な用途 | API |
|---|---|---|---|---|
| sinc 補間(理想) | 理想 LPF | 無限長和(要打ち切り) | サンプリング定理の理論的再構成 | numpy.sinc |
| 線形補間 | \(\text{sinc}^2\) ロールオフ | \(O(N)\) | 軽量な可視化、低品質オーディオ | numpy.interp |
| キュービック補間 | より急峻なロールオフ | \(O(N)\) | 画像リサイズ | scipy.interpolate.interp1d |
| スプライン補間 | 滑らかな C2 連続性 | \(O(N)\) | 数値解析・物理シミュレーション | scipy.interpolate.CubicSpline |
| FFT リサンプル | FFT による等価sinc | \(O(N \log N)\) | 任意比リサンプリング | scipy.signal.resample |
| ポリフェーズ | アンチエイリアス内蔵 | \(O(N)\) | 高効率リサンプル | scipy.signal.resample_poly |
理論詳細・実装は https://yuhi-sa.github.io/posts/20260430_signal_interpolation/1/。
アップ/ダウンサンプリング
- デシメーション:AAF → \(M\)
サンプルに 1 つ保持。
scipy.signal.decimate - 補間:ゼロ挿入 → イメージ除去 LPF。
scipy.signal.resample_poly
LPF の設計に踏み込みたい場合は https://yuhi-sa.github.io/posts/20260223_lowpass_filter/1/、https://yuhi-sa.github.io/posts/20260226_butterworth/1/、https://yuhi-sa.github.io/posts/20260226_fir_iir/1/ に進む。
6. 応用 — 周辺ハブへの接続
A. フィルタ設計
離散信号の周波数応答を整形する操作はすべて「Z 領域の極零点配置」に帰着する。本ハブで Z 変換と DTFT を体得したあとは https://yuhi-sa.github.io/posts/20260522_filter_design_guide/1/ に進み、IIR/FIR・Butterworth/Chebyshev/Bessel・Notch/Bandpass の使い分けを学ぶとよい。具体的な記事:
- https://yuhi-sa.github.io/posts/20260226_butterworth/1/ — Butterworth
- https://yuhi-sa.github.io/posts/20260314_chebyshev_filter/1/ — Chebyshev
- https://yuhi-sa.github.io/posts/20260316_bessel_filter/1/ — Bessel
- https://yuhi-sa.github.io/posts/20260226_fir_iir/1/ — FIR と IIR
- https://yuhi-sa.github.io/posts/20260228_notch_filter/1/ — Notch
- https://yuhi-sa.github.io/posts/20260312_bandpass_filter/1/ — Bandpass
- https://yuhi-sa.github.io/posts/20260313_highpass_filter/1/ — Highpass
- https://yuhi-sa.github.io/posts/20260223_lowpass_filter/1/ — Lowpass
B. 時間周波数解析
DFT/FFT を時間方向にスライドして窓を切ると STFT、解像度を時間スケールに応じて変えると Wavelet になる。https://yuhi-sa.github.io/posts/20260524_time_frequency_guide/1/ がハブ。
- https://yuhi-sa.github.io/posts/20260429_stft/1/ — STFT
- https://yuhi-sa.github.io/posts/20260226_wavelet/1/ — Wavelet
- https://yuhi-sa.github.io/posts/20260318_hilbert_transform/1/ — Hilbert 変換
- https://yuhi-sa.github.io/posts/20260528_mode_decomposition/1/ — EMD/VMD/SSA
C. 機械学習の前処理
STFT 平均パワー・Wavelet エネルギー・自己相関ラグなどを特徴量として ML モデルに渡すパイプラインは、https://yuhi-sa.github.io/posts/20260525_ml_timeseries_guide/1/ で集約している。具体例:
- https://yuhi-sa.github.io/posts/20260228_timeseries_anomaly/1/ — 時系列異常検知
- https://yuhi-sa.github.io/posts/20260226_arima/1/ — ARIMA(ACF/PACF で次数決定)
- https://yuhi-sa.github.io/posts/20260317_lstm_timeseries/1/ — LSTM 時系列
D. メタロードマップへの巻き戻し
5 大ハブ + 本ハブを束ねるメタロードマップは https://yuhi-sa.github.io/posts/20260528_dsp_ml_roadmap/1/。Level 別の進路表に戻りたい場合の出発点になる。
7. 学習チェックリスト
連続→離散の橋渡しが身についているかを 14 項目で自己診断する。
標本化と補間
- ナイキスト周波数とナイキストレートの違いを言える
- スペクトル複製の式 \(X_s(f) = f_s \sum_k X(f - k f_s)\) を書ける
- エイリアス周波数 \(|f - \text{round}(f/f_s) \cdot f_s|\) を手で計算できる
- sinc 補間と線形補間の周波数応答の違い(\(\text{sinc}^2\) ロールオフ)を説明できる
scipy.signal.resampleとresample_polyの使い分けが言える
DTFT・DFT・FFT
- DTFT は連続周波数表現、DFT は離散版、FFT は DFT の高速計算と即答できる
numpy.fft.fftの出力長とfftfreqで周波数軸が引ける- ゼロパディングは情報を増やさず DTFT を密にサンプルするだけ、と言える
Z変換と伝達関数
- \(z^{-1}\) が 1 サンプル遅延に対応することを差分方程式で示せる
- 極が単位円内部にあれば BIBO 安定、を言える
- \(H(e^{j\omega})\) を極零点からの距離で幾何学的に解釈できる
自己相関と DCT
- ACF の Fourier 変換が PSD(Wiener-Khinchin 定理)と即答できる
- ACF と CCF の違い(遅延推定の用途)を言える
- DCT が DFT より圧縮で有利な理由(偶対称拡張 → ギブスなし)を 1 行で言える
8. よくある詰まりポイント Q&A
Q1. 標本化定理の直感的理解は?
「サンプル間隔より速く揺れる成分は、サンプルだけ見ても区別がつかない」が直感。周波数領域ではスペクトルが \(f_s\) ごとに無限に複製されるので、複製どうしが重ならない(= \(f_s > 2 f_{\max}\) )なら理想 LPF で 1 個取り出せる。式と図は https://yuhi-sa.github.io/posts/20260430_sampling_theorem/1/。
Q2. DTFT・DFT・FFT の違いは何か?
- DTFT:時間離散、周波数連続(理論用)
- DFT:時間離散、周波数も離散・有限(計算機用)
- FFT:DFT を高速に計算するアルゴリズム(出力は DFT と同一)
詳しくは https://yuhi-sa.github.io/posts/20260505_dtft_dft_fft/1/。
Q3. Z変換と Fourier 変換の関係は?
DTFT は Z変換 \(X(z)\) を単位円上 \(z = e^{j\omega}\) に制限したもの。逆に Z変換は DTFT を複素 z 平面に解析接続したもの、と理解すると安定性条件(極が単位円内)が自然に出てくる。詳しくは https://yuhi-sa.github.io/posts/20260430_z_transform/1/。
Q4. 自己相関と相互相関の違いは?
- ACF:1 つの信号と自分の遅延コピーの類似度 → 周期性検出
- CCF:2 つの異なる信号間の類似度 → 遅延推定
ACF の最大値は \(\tau=0\) 、CCF の最大値が出る \(\tau\) がそのまま遅延量に対応する。詳しくは https://yuhi-sa.github.io/posts/20260429_autocorrelation/1/。
Q5. DCT と DFT、どちらを使えばよい?
実数信号でエネルギーを低次に集中させたい(=圧縮したい)なら DCT、複素スペクトル・周波数応答が欲しいなら DFT/FFT。DCT は内部で偶対称拡張 + FFT で計算するので 高速計算性能は同じ \(O(N \log N)\) 。詳細は https://yuhi-sa.github.io/posts/20260430_dct/1/。
Q6. sinc 補間は実用できるのか?
理想 sinc は無限長和なので、有限長で打ち切る + 窓関数を掛けるのが実装の定石。打ち切り誤差と窓のサイドローブのトレードオフを取り、scipy.signal.resample(FFT 等価)か resample_poly(ポリフェーズ)で代用するのが実務的。詳しくは https://yuhi-sa.github.io/posts/20260430_signal_interpolation/1/。
Q7. FFT の周波数軸がいつも分からなくなる
np.fft.fftfreq(N, d=1/fs) か np.fft.rfftfreq(N, d=1/fs) を必ず使う。手で書くと符号や順序を間違える。窓関数・PSD の単位も含めて https://yuhi-sa.github.io/posts/20260228_fft_window_psd/1/ で整理されている。
9. 関連ハブ・記事まとめ
本ハブが束ねる 6 記事
- https://yuhi-sa.github.io/posts/20260430_sampling_theorem/1/ — 標本化定理
- https://yuhi-sa.github.io/posts/20260430_signal_interpolation/1/ — 信号補間
- https://yuhi-sa.github.io/posts/20260505_dtft_dft_fft/1/ — DTFT/DFT/FFT
- https://yuhi-sa.github.io/posts/20260430_z_transform/1/ — Z変換
- https://yuhi-sa.github.io/posts/20260429_autocorrelation/1/ — 自己相関
- https://yuhi-sa.github.io/posts/20260430_dct/1/ — DCT
接続先ハブ
- https://yuhi-sa.github.io/posts/20260522_filter_design_guide/1/ — フィルタ設計指針ハブ
- https://yuhi-sa.github.io/posts/20260524_time_frequency_guide/1/ — 時間周波数解析ハブ
- https://yuhi-sa.github.io/posts/20260525_ml_timeseries_guide/1/ — 機械学習時系列ハブ
- https://yuhi-sa.github.io/posts/20260528_dsp_ml_roadmap/1/ — DSP/ML メタロードマップ
補助記事
- https://yuhi-sa.github.io/posts/20260225_fft/1/ — FFT 入門
- https://yuhi-sa.github.io/posts/20260228_fft_window_psd/1/ — 窓関数と PSD
- https://yuhi-sa.github.io/posts/20260502_convolution_correlation/1/ — 畳み込みと相関
- https://yuhi-sa.github.io/posts/20260430_phase_group_delay/1/ — 位相と群遅延
- https://yuhi-sa.github.io/posts/20260225_moving_average/1/ — 移動平均
離散信号処理の基礎は、ここから先のフィルタ設計・時間周波数解析・機械学習時系列のすべての出発点になる。本ハブを起点として、自分の目的に合うレベルから読み進めてほしい。