Why a Roadmap
Digital signal processing (DSP) and machine learning (ML) each contain a vast number of methods, and learners often stall on where to start. In practice the pipeline is “sensor data → preprocessing (filter) → features → ML model”, so you need a path that interleaves the two.
This blog has built five aggregation hubs over the past cycles:
- https://yuhi-sa.github.io/en/posts/20260521_bode_plot/1/ — Bode plot hub
- https://yuhi-sa.github.io/en/posts/20260522_monte_carlo_optimization/1/ — Monte Carlo optimization hub
- https://yuhi-sa.github.io/en/posts/20260522_filter_design_guide/1/ — Filter design guide hub
- https://yuhi-sa.github.io/en/posts/20260524_time_frequency_guide/1/ — Time-frequency analysis hub
- https://yuhi-sa.github.io/en/posts/20260525_ml_timeseries_guide/1/ — ML time-series hub
This article ties them together as a level- and goal-oriented learning roadmap.
1. Hub Overview
| Hub | Scope | Prerequisites | Key APIs |
|---|---|---|---|
| Bode plot | Frequency response, gain/phase, transfer function | Complex numbers, basic Laplace | scipy.signal.bode, scipy.signal.TransferFunction, numpy.angle |
| Monte Carlo Opt | CEM / SA / GA / MPPI, stochastic search | Probability, numpy | numpy.random, scipy.optimize |
| Filter Design | IIR/FIR, Butterworth/Chebyshev/Bessel, Notch/Bandpass | Frequency-domain intuition | scipy.signal.butter, firwin, iirnotch, freqz, lfilter |
| Time-Frequency | STFT/Wavelet/Hilbert/Mode decomposition | Filter design + Fourier | scipy.signal.stft, pywt.cwt, scipy.signal.hilbert, PyEMD.EMD, vmdpy.VMD |
| ML Time-Series | k-means/GMM/RF/GBDT/LSTM/Kalman/IsolationForest | numpy, basic probability | sklearn.cluster.KMeans, RandomForestClassifier, keras.layers.LSTM, IsolationForest |
2. Learning Path Diagram
[Basic Math]
│ complex numbers, linear algebra, probability
↓
[Fourier Analysis] ── FFT intro ──┐
│ │
↓ ↓
[Bode Plot Hub] [Filter Design Hub]
│ │
└──────────┬─────────────────────┘
↓
[Time-Frequency Hub]
│
↓
[ML Time-Series Hub] ← [Monte Carlo Opt Hub]
│ (hyperparameter tuning)
↓
[Applications]
3. Level-Based Tracks
Level 1: Complete Beginner
Goal: get comfortable with Python, numpy, matplotlib.
- https://yuhi-sa.github.io/en/posts/20260223_matplotlib_tips/1/ — matplotlib essentials
- https://yuhi-sa.github.io/en/posts/20210514_py_print/1/ — Python
printoverwriting - https://yuhi-sa.github.io/en/posts/20260225_fft/1/ — FFT introduction
- https://yuhi-sa.github.io/en/posts/20260225_moving_average/1/ — moving averages
- https://yuhi-sa.github.io/en/posts/20220206_ema/1/ — EMA frequency response
Estimated 2–4 weeks.
Level 2: With Math Basics
Goal: build intuition for frequency response and filter design.
- https://yuhi-sa.github.io/en/posts/20260521_bode_plot/1/
- https://yuhi-sa.github.io/en/posts/20260223_lowpass_filter/1/
- https://yuhi-sa.github.io/en/posts/20260226_butterworth/1/
- https://yuhi-sa.github.io/en/posts/20260314_chebyshev_filter/1/
- https://yuhi-sa.github.io/en/posts/20260316_bessel_filter/1/
- https://yuhi-sa.github.io/en/posts/20260226_fir_iir/1/
- https://yuhi-sa.github.io/en/posts/20260522_filter_design_guide/1/
Estimated 4–8 weeks.
Level 3: Python-Comfortable
Goal: master time-frequency analysis for non-stationary signals.
- https://yuhi-sa.github.io/en/posts/20260429_stft/1/
- https://yuhi-sa.github.io/en/posts/20260226_wavelet/1/
- https://yuhi-sa.github.io/en/posts/20260522_wavelet_packet/1/
- https://yuhi-sa.github.io/en/posts/20260318_hilbert_transform/1/
- https://yuhi-sa.github.io/en/posts/20260528_mode_decomposition/1/
- https://yuhi-sa.github.io/en/posts/20260524_time_frequency_guide/1/
Estimated 8–12 weeks.
Level 4: Applied Practitioner
Goal: combine ML and stochastic optimization with DSP.
- https://yuhi-sa.github.io/en/posts/20260228_timeseries_anomaly/1/
- https://yuhi-sa.github.io/en/posts/20260226_kmeans_gmm/1/
- https://yuhi-sa.github.io/en/posts/20260226_ensemble_learning/1/
- https://yuhi-sa.github.io/en/posts/20260317_lstm_timeseries/1/
- https://yuhi-sa.github.io/en/posts/20260525_ml_timeseries_guide/1/
- https://yuhi-sa.github.io/en/posts/20260223_bayesian_optimization/1/
- https://yuhi-sa.github.io/en/posts/20210329_cem/1/
- https://yuhi-sa.github.io/en/posts/20260226_genetic_algorithm/1/
- https://yuhi-sa.github.io/en/posts/20260215_mppi/1/
- https://yuhi-sa.github.io/en/posts/20260522_monte_carlo_optimization/1/
Estimated 12–20 weeks.
4. Field-Specific Depth Order
- A. Frequency response → filter design:
scipy.signal.TransferFunction→bode→butter→cheby1/2→bessel→iirnotch. - B. Fourier → Time-frequency:
numpy.fft.fft→scipy.signal.windows→welch→stft→pywt.cwt→hilbert→PyEMD.EMD/vmdpy.VMD. - C. State estimation: Kalman → EKF → UKF → Particle filter → RTS smoother.
- D. ML time-series:
KMeans→GaussianMixture→RandomForestClassifier→GradientBoostingClassifier→keras.layers.LSTM→IsolationForest. - E. Stochastic optimization:
numpy.random→scipy.optimize.minimize→ CEM → SA → GA → MPPI → Bayesian optimization (scikit-optimize).
5. Cross-Cutting Topics
- Feature engineering: STFT band-power, Wavelet energy, HHT instantaneous frequency as feature vectors for RandomForest classification.
- Anomaly detection: Notch + STFT preprocessing → IsolationForest scoring.
- Forecasting: SSA trend removal → LSTM short-term prediction.
- Hyperparameter tuning: Bayesian optimization for filter cutoff or LSTM hidden size.
See each hub’s “Applications” section and the integrated evaluation code in https://yuhi-sa.github.io/en/posts/20260525_ml_timeseries_guide/1/.
6. Learning Checklist (40 items)
Math basics
- Physical meaning of \(e^{j\omega t}\)
- Relation between Laplace and Fourier transforms
- Transfer function of an LTI system
- Parseval’s identity
- Nyquist theorem
Bode / Filter design
- Define cutoff at \(-3\) dB
- Compare Butterworth and Chebyshev passband/stopband
- Why Bessel has flat group delay
- Chain
scipy.signal.butter→lfilter - IIR vs FIR stability and linear phase
- Notch \(Q\) vs bandwidth
- Role of bilinear z-transform
Fourier / Time-frequency
- Output length and frequency axis of
numpy.fft.fft - Window functions vs spectral leakage
- Units of PSD (V²/Hz)
- Choose STFT frame and hop length
- CWT vs DWT
- Why Wavelet Packet has higher resolution than CWT
- Hilbert transform and analytic signal
- Mode mixing in EMD vs VMD
- Choose \(L\) in SSA from period
ML time-series
- K-means K selection (elbow / silhouette)
- EM updates for GMM
- RandomForest vs GBDT
- LSTM gates (input/forget/output)
- IsolationForest scoring
- Avoid leakage in time-series train/val/test split
- Kalman filter prediction / update
- EKF vs UKF Jacobian-free advantage
Stochastic optimization
- CEM elite rate
- SA temperature schedule
- GA crossover / mutation
- MPPI as weighted CEM
- BO acquisition functions (EI / PI / UCB)
Integration
- Sensor → filter → feature → classifier pipeline
- STFT features → IsolationForest
- SSA trend removal then LSTM
- Hyperparameter BO implementation
- Multi-subplot visualization with matplotlib
- Reproducibility with
numpy.random.seed
7. Common Stumbling Blocks Q&A
Q1. FFT frequency axis is confusing. Use np.fft.fftfreq(N, d=1/fs) or np.fft.rfftfreq.
Q2. The filter rings. scipy.signal.butter expects normalized frequency relative to fs/2; pass Wn=cutoff/(fs/2) or use fs=fs kwarg.
Q3. LSTM does not learn. Most often due to missing scaling — apply StandardScaler first.
Q4. Cannot pick STFT window length. Aim for 5–10 periods of the target frequency: nperseg = int(5 / target_freq * fs).
Q5. EMD or VMD? VMD when mode count is known; EMD (EEMD) for adaptive exploration. See https://yuhi-sa.github.io/en/posts/20260528_mode_decomposition/1/.
Q6. Anomaly detection has false positives. Use Hilbert envelope, Wavelet energy, or STFT band averages so features reflect locality. Tune contamination of IsolationForest.
Q7. BO budget runs out. Switch acquisition from EI to UCB after 50 trials with no progress.
8. Related Articles
Five hubs:
- https://yuhi-sa.github.io/en/posts/20260521_bode_plot/1/
- https://yuhi-sa.github.io/en/posts/20260522_monte_carlo_optimization/1/
- https://yuhi-sa.github.io/en/posts/20260522_filter_design_guide/1/
- https://yuhi-sa.github.io/en/posts/20260524_time_frequency_guide/1/
- https://yuhi-sa.github.io/en/posts/20260525_ml_timeseries_guide/1/
Component articles:
- https://yuhi-sa.github.io/en/posts/20260225_fft/1/ / https://yuhi-sa.github.io/en/posts/20260228_fft_window_psd/1/ / https://yuhi-sa.github.io/en/posts/20260429_stft/1/
- https://yuhi-sa.github.io/en/posts/20260226_wavelet/1/ / https://yuhi-sa.github.io/en/posts/20260522_wavelet_packet/1/ / https://yuhi-sa.github.io/en/posts/20260318_hilbert_transform/1/ / https://yuhi-sa.github.io/en/posts/20260528_mode_decomposition/1/
- https://yuhi-sa.github.io/en/posts/20260226_butterworth/1/ / https://yuhi-sa.github.io/en/posts/20260314_chebyshev_filter/1/ / https://yuhi-sa.github.io/en/posts/20260316_bessel_filter/1/ / https://yuhi-sa.github.io/en/posts/20260226_fir_iir/1/
- https://yuhi-sa.github.io/en/posts/20260228_notch_filter/1/ / https://yuhi-sa.github.io/en/posts/20260312_bandpass_filter/1/ / https://yuhi-sa.github.io/en/posts/20260313_highpass_filter/1/ / https://yuhi-sa.github.io/en/posts/20260223_lowpass_filter/1/
- https://yuhi-sa.github.io/en/posts/20260224_kalman_filter/1/ / https://yuhi-sa.github.io/en/posts/20260224_ekf/1/ / https://yuhi-sa.github.io/en/posts/20260226_ukf/1/ / https://yuhi-sa.github.io/en/posts/20260223_particle_filter/1/ / https://yuhi-sa.github.io/en/posts/20260223_rts_smoother/1/
- https://yuhi-sa.github.io/en/posts/20260226_kmeans_gmm/1/ / https://yuhi-sa.github.io/en/posts/20260226_ensemble_learning/1/ / https://yuhi-sa.github.io/en/posts/20260317_lstm_timeseries/1/ / https://yuhi-sa.github.io/en/posts/20260228_timeseries_anomaly/1/
- https://yuhi-sa.github.io/en/posts/20260223_bayesian_optimization/1/ / https://yuhi-sa.github.io/en/posts/20210329_cem/1/ / https://yuhi-sa.github.io/en/posts/20260226_simulated_annealing/1/ / https://yuhi-sa.github.io/en/posts/20260226_genetic_algorithm/1/ / https://yuhi-sa.github.io/en/posts/20260215_mppi/1/