なぜ「離散信号処理の基礎」を束ねるのか
連続時間の信号処理から離散時間の信号処理に踏み込むと、標本化定理 → 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 本に外周のフィルタ設計・時間周波数解析・メタロードマップを接続し、離散信号処理の最初の数ヶ月をどう進むかを一枚図にすることを目的とする。
下図は、この 6 トピックが数学的にどう繋がっているかを示したものである。標本化定理を起点に、時間領域では補間・再構成へ、周波数領域ではDTFTへと分岐し、DTFTがZ変換(複素 \(z\) 平面への拡張)とDFT/FFT(周波数軸の離散化)に枝分かれする。DFT/FFTはさらにDCT(偶対称拡張)と、Wiener-Khinchin定理を介して自己相関に接続する。

すでに上位のロードマップを読んだ方は、メタロードマップ 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/ で詳述している。
なぜ超えると区別がつかなくなるのか(エイリアス周波数の導出)
標本化定理が「\(f_s\) が \(2f_{\max}\) を超えること」を要求する理由は、単一正弦波を例に取ると具体的に導出できる。周波数 \(f_0\) の正弦波を周波数 \(f_s\) でサンプリングした列は
\( x[n] = \cos\!\left(2\pi \dfrac{f_0}{f_s}\, n\right) \)
と書ける。任意の整数 \(k\) に対して \(e^{j2\pi k n} = 1\) なので
\( x[n] = \cos\!\left(2\pi \dfrac{f_0 - k f_s}{f_s}\, n\right) \)
がすべての整数 \(k\) で成り立つ。つまりサンプル列だけを見る限り、周波数 \(f_0\) の正弦波と、周波数
\( f_0 - k f_s \)
(\(k\) は任意の整数)の正弦波は完全に同一である。観測周波数を主値区間 \([0, f_s/2]\) に収めるよう \(k\) を選ぶと、
\( f_{\text{alias}} = \left\lvert f_0 - \mathrm{round}\!\left(\dfrac{f_0}{f_s}\right) f_s \right\rvert \)
というエイリアス周波数の式が得られる(詳細な証明とスペクトル複製式は https://yuhi-sa.github.io/posts/20260430_sampling_theorem/1/ を参照、第7節チェックリスト項目3で自己診断する式そのものである)。この式が実際のFFTピーク位置と一致することを、4つの周波数で確認する。
import numpy as np
fs = 100.0 # サンプリング周波数 [Hz]
N = 200
t = np.arange(N) / fs
for f_true in [10.0, 45.0, 65.0, 110.0]:
x = np.cos(2 * np.pi * f_true * t)
X = np.fft.rfft(x)
freqs = np.fft.rfftfreq(N, d=1 / fs)
f_observed = freqs[np.argmax(np.abs(X))]
f_alias_pred = abs(f_true - round(f_true / fs) * fs)
print(f"f_true={f_true:6.1f} Hz observed_peak={f_observed:6.2f} Hz predicted_alias={f_alias_pred:6.2f} Hz")
出力(Python 3.14.6 / NumPy 2.4.2):
f_true= 10.0 Hz observed_peak= 10.00 Hz predicted_alias= 10.00 Hz
f_true= 45.0 Hz observed_peak= 45.00 Hz predicted_alias= 45.00 Hz
f_true= 65.0 Hz observed_peak= 35.00 Hz predicted_alias= 35.00 Hz
f_true= 110.0 Hz observed_peak= 10.00 Hz predicted_alias= 10.00 Hz
\(f_s = 100\,\text{Hz}\) なのでナイキスト周波数は \(50\,\text{Hz}\) 。65 Hz と 110 Hz はこれを超えているため、観測されるピークは導出式どおり 35 Hz・10 Hz にエイリアシングし、FFTピーク位置が予測値と完全に一致する。証明と数値検証の両方から、本ハブが標本化定理を最初に学ぶ理由——後続のDTFT/DFT/Z変換がすべて「ナイキスト周波数以下」を前提に組み立てられている——が裏付けられる。
エイリアシング対策
サンプリング前のアナログ 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 |
DFT が「DTFT の N 点サンプル」であることの導出
有限長 \(N\) の信号 \(x[n]\) (\(n=0,\dots,N-1\) )のDTFTは
\[X(e^{j\omega}) = \sum_{n=0}^{N-1} x[n]\, e^{-j\omega n}\]で定義される(\(\omega\) は連続値を取れる)。この式で \(\omega\) を \(N\) 等分した点 \(\omega_k = 2\pi k / N\) (\(k=0,\dots,N-1\) )に制限すると
\( X[k] = X(e^{j\omega_k}) = \sum_{n=0}^{N-1} x[n]\, e^{-j2\pi kn/N} \)
となり、これがまさにDFTの定義式である(https://yuhi-sa.github.io/posts/20260505_dtft_dft_fft/1/ でも述べられている関係だが、ここでは実際に数値で確認する)。つまり DFTは新しい変換ではなく、DTFTを \(N\) 個の等間隔な周波数点でサンプリングしたものに過ぎない。ゼロパディングで \(N\) を増やしても信号の実体(非ゼロサンプル数)は変わらないため、これは「同じDTFTをより密にサンプリングする」操作でしかなく、情報は増えない(第7節チェックリスト項目8)。
import numpy as np
np.random.seed(1)
x = np.random.randn(8)
N = len(x)
k = np.arange(N)
n = np.arange(N)
W = np.exp(-2j * np.pi * np.outer(k, n) / N) # DTFTをomega_k=2*pi*k/Nでサンプリング
X_manual = W @ x
X_fft = np.fft.fft(x)
print("max |X_manual - X_fft| =", np.max(np.abs(X_manual - X_fft)))
出力:
max |X_manual - X_fft| = 6.575670183899638e-15
誤差は倍精度浮動小数点の丸め誤差(\(10^{-15}\)
オーダー)に過ぎず、DFTの定義式どおりの直接和と np.fft.fft が理論的に完全に一致することが数値的にも確認できる。
Z変換との関係
DTFT は Z変換 \(X(z)\) を単位円 \(z = e^{j\omega}\) に制限したもの。厳密には、Z変換 \(X(z) = \sum_n x[n] z^{-n}\) の収束域が単位円を含むとき
\( X(z)\Big|_{z=e^{j\omega}} = \sum_{n} x[n]\, e^{-j\omega n} = X(e^{j\omega}) \)
が成り立ち、これがDTFTとの一致を示す。Z領域から極零点 → 周波数応答 → 安定性まで一気に見えるので、フィルタ設計の理論基盤になる。詳しくは https://yuhi-sa.github.io/posts/20260430_z_transform/1/。
この単位円上の評価は scipy.signal.freqz が内部で行っている計算そのものであり、伝達関数 \(H(z)\)
から周波数応答 \(H(e^{j\omega})\)
を得る操作に直結する。定義どおりの手計算と freqz の出力を比較すると:
import numpy as np
from scipy import signal
b, a = [1.0], [1.0, -0.5] # H(z) = 1 / (1 - 0.5 z^-1)
w, H_freqz = signal.freqz(b, a, worN=8)
H_manual = 1.0 / (1.0 - 0.5 * np.exp(-1j * w))
print("max |H_freqz - H_manual| =", np.max(np.abs(H_freqz - H_manual)))
出力:
max |H_freqz - H_manual| = 0.0
freqz が返す周波数応答は、Z変換の定義式を単位円上で直接評価した値と誤差 0 で完全に一致する。
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/ と組み合わせて読むと立体的に理解できる。
\(z^{-1}\) が「1サンプル遅延」に対応することは、Z変換の定義から直接示せる。\(y[n] = x[n-k]\) のZ変換は
\( \mathcal{Z}\{x[n-k]\} = \sum_{n} x[n-k]\, z^{-n} = \sum_{m} x[m]\, z^{-(m+k)} = z^{-k} \sum_{m} x[m]\, z^{-m} = z^{-k} X(z) \)
(\(m = n-k\) と置換)となる。このシフト定理を差分方程式の各項に適用すると、上の伝達関数の式がそのまま導かれる——\(y[n-k]\) の変換が \(z^{-k}Y(z)\) 、\(x[n-k]\) の変換が \(z^{-k}X(z)\) になることから、両辺を \(X(z)\) で割るだけで \(H(z) = B(z)/A(z)\) が得られる(第7節チェックリスト項目9)。
最新研究動向:本ハブが扱う「連続→離散の橋渡し」は過去の理論に留まらない。2023年に発表されたMamba(Gu & Dao, “Mamba: Linear-Time Sequence Modeling with Selective State Spaces,” arXiv:2312.00752 )は、連続時間の状態空間モデル \(\dot h(t) = Ah(t) + Bx(t)\) をゼロ次ホールド(ZOH)で離散化し、離散再帰
\( h_t = \bar{A}h_{t-1} + \bar{B}x_t \)
に変換することで、Transformerに匹敵する系列モデリング性能を線形時間で達成している。ここで使われる離散化の数学的構造は、上で導出した \(z^{-1}\) による1サンプル遅延の議論と本質的に同一であり、離散DSPの基礎は最新の系列モデリング研究を読む上でも直接役立つ。
自己相関・相互相関
自己相関関数(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/。
なぜPSDとACFがFourier変換で結ばれるのか(Wiener-Khinchin定理の導出):https://yuhi-sa.github.io/posts/20260502_convolution_correlation/1/ でも触れられているが、天下り的に提示されがちなので、ここで定義から導出する。長さ \(N\) の信号の周期グラム(PSD推定値)は \(S[k] = |X[k]|^2/N\) で定義される。これを展開すると
\( S[k] = \frac{1}{N}\left(\sum_{n} x[n]\, e^{-j2\pi kn/N}\right)\left(\sum_{m} x[m]\, e^{+j2\pi km/N}\right) = \frac{1}{N}\sum_{n}\sum_{m} x[n]x[m]\, e^{-j2\pi k(n-m)/N} \)
\(l = n - m \bmod N\) (循環シフト)と置いて和を取り直すと
\( S[k] = \sum_{l} \left(\frac{1}{N}\sum_{n} x[n]\, x[(n-l) \bmod N]\right) e^{-j2\pi kl/N} = \sum_l R[l]\, e^{-j2\pi kl/N} = \mathrm{DFT}\{R\}[k] \)
となり、周期グラム \(S[k]\) が循環自己相関 \(R[l]\) のDFTに一致する——これがWiener-Khinchin定理の離散版である。逆に \(R = \mathrm{IDFT}\{S\}\) でも自己相関が得られる。数値的に確認すると:
import numpy as np
np.random.seed(2)
N = 4096
x = np.random.randn(N)
# 循環自己相関を定義どおり直接計算
R_direct = np.array([np.dot(x, np.roll(x, -m)) / N for m in range(6)])
print("R_direct[0..5] =", np.round(R_direct, 4))
# Wiener-Khinchin: 循環自己相関 = IFFT(周期グラム)
S_periodogram = np.abs(np.fft.fft(x)) ** 2 / N
R_from_fft = np.fft.ifft(S_periodogram).real
print("R_from_fft[0..5] =", np.round(R_from_fft[:6], 4))
print("max |R_direct - R_from_fft[:6]| =", np.max(np.abs(R_direct - R_from_fft[:6])))
出力:
R_direct[0..5] = [ 1.0247 0.0087 -0.011 -0.0112 -0.0136 0.0067]
R_from_fft[0..5] = [ 1.0247 0.0087 -0.011 -0.0112 -0.0136 0.0067]
max |R_direct - R_from_fft[:6]| = 2.220446049250313e-16
2つの独立な計算経路(時間領域の直接和とFFT経由)が丸め誤差レベル(\(2.22\times10^{-16}\) 、machine epsilon)で一致し、定理が数値的にも確認できる。
畳み込みと相関
畳み込み・相関・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/。
線形補間がなぜ \(\text{sinc}^2\) ロールオフになるのか
https://yuhi-sa.github.io/posts/20260430_signal_interpolation/1/ では「三角関数のFourier変換は \(\text{sinc}^2\) 」という事実が示されているが、ここでは畳み込み定理からその理由を導出する。線形補間のカーネル(三角形、tent function)は、幅 \(T\) の矩形(ゼロ次ホールド)カーネルを自分自身と畳み込んだものに等しい:
\( \mathrm{tri}_T(t) = \mathrm{rect}_T(t) * \mathrm{rect}_T(t) \)
畳み込み定理(畳み込みのFourier変換は各々のFourier変換の積)より
\( \mathcal{F}\{\mathrm{tri}_T\}(f) = \mathcal{F}\{\mathrm{rect}_T\}(f) \cdot \mathcal{F}\{\mathrm{rect}_T\}(f) = \big[\mathcal{F}\{\mathrm{rect}_T\}(f)\big]^2 \)
であり、\(\mathcal{F}\{\mathrm{rect}_T\}(f) = T\,\text{sinc}(fT)\) (\(\text{sinc}(x) = \sin(\pi x)/(\pi x)\) )なので
\( \mathcal{F}\{\mathrm{tri}_T\}(f) = T^2\, \text{sinc}^2(fT) \)
が導かれる。これが表の「\(\text{sinc}^2\) ロールオフ」の正体であり、天下り的な事実ではなく畳み込み定理から直接導出される。理想sinc補間は逆に周波数領域で矩形(理想LPF)を使うカーネルなのでロールオフを持たないが、その代償として時間領域では無限長になる——この対比が表の「周波数応答」列の違いの数学的根拠である。
畳み込み定理そのものを離散信号で数値的に確認すると:
import numpy as np
Npad = 2048
M = 8 # 矩形(ゼロ次ホールド)カーネルの幅
rect = np.zeros(Npad)
rect[:M] = 1.0
tri_conv = np.convolve(rect, rect)[:Npad] # 三角カーネル = 矩形 * 矩形(畳み込み)
R = np.fft.fft(rect, n=Npad)
T_direct = np.fft.fft(tri_conv, n=Npad)
T_from_R2 = R**2
print("max |FFT(rect (*) rect) - FFT(rect)^2| =", np.max(np.abs(T_direct - T_from_R2)))
print("max |FFT(rect)| (参照スケール) =", np.max(np.abs(R)))
出力:
max |FFT(rect (*) rect) - FFT(rect)^2| = 2.3832327871173822e-14
max |FFT(rect)| (参照スケール) = 8.0
畳み込みの直接計算とFFTスペクトルの二乗が、丸め誤差レベル(参照スケール 8.0 に対して相対誤差 \(3\times10^{-15}\)
程度)で一致し、線形補間の \(\text{sinc}^2\)
ロールオフが畳み込み定理の直接的な帰結であることが数値的にも裏付けられる。
アップ/ダウンサンプリング
- デシメーション:AAF → \(M\)
サンプルに 1 つ保持。
scipy.signal.decimate - 補間:ゼロ挿入 → イメージ除去 LPF。
scipy.signal.resample_poly
デシメーション・補間・有理数比 L/M 変換・ポリフェーズ分解の理論と実装を体系的にまとめた https://yuhi-sa.github.io/posts/20260702_multirate_signal_processing/1/ で本節を深掘りできる。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/ — 移動平均
接続先(離散数学・整数アルゴリズム経由)
- https://yuhi-sa.github.io/posts/20260614_cryptography_roadmap/1/ — 暗号ロードマップハブ。離散 DSP の数学的基盤(複素指数 \(e^{j\omega n}\) 、繰り返し二乗法、巡回構造)は、\(\mathbb{Z}/N\mathbb{Z}\) 上の整数演算として暗号アルゴリズム群(RSA・DH・ElGamal)と直接接続する。FFT 系の高速計算で多用される \(O(\log N)\) 二進指数法は、まさに暗号の核となる \(a^k \bmod p\) の高速計算と同一の手筋であり、離散 DSP の基礎を理解した直後の自然な発展先として位置づけられる。
離散信号処理の基礎は、ここから先のフィルタ設計・時間周波数解析・機械学習時系列のすべての出発点になる。本ハブを起点として、自分の目的に合うレベルから読み進めてほしい。
おすすめ書籍
標本化定理からDFT、Z変換までを簡潔にまとめた入門書です。本記事で扱う各トピックの数式的な背景を、コンパクトに復習したい場合におすすめです。
※ 上記は Amazon アソシエイトのリンクです。