Mọi thuật toán tự viết — không hộp đen nào cả
Hầu hết tài liệu DSP dừng lại ở công thức và để bạn gọi
AnalyserNode.getFloatFrequencyData() coi như "đã hiểu FFT". Series này đi ngược lại:
mọi thuật toán — DFT ngây thơ, FFT radix-2, hàm cửa sổ, thiết kế FIR, biquad IIR — đều được tự viết
bằng JavaScript thuần, có self-test verify bằng số thật, và chỉ dùng AnalyserNode đúng MỘT lần để đối chiếu kết
quả FFT tự viết có khớp không. Bạn sẽ biết CHÍNH XÁC vì sao spectrogram trông như vậy, không chỉ biết cách
gọi hàm ra nó.
Điểm khác biệt lớn nhất: toán ↔ đồ thị ↔ âm thanh luôn cập nhật đồng thời. Kéo một pole lại gần vòng tròn đơn vị và NGHE tiếng cộng hưởng rít lên trên nhạc thật; đổi bit depth và NGHE nhạc vỡ dần theo đúng công thức SQNR; kéo tần số qua ngưỡng Nyquist và NGHE tiếng gập phổ (aliasing) xảy ra ngay trước tai bạn.
Về Series này
Xương sống của series là DSPJS — thư viện DSP mini tự xây dần qua từng bài
(blog/dsp/dsp-core.js): bộ sinh tín hiệu (Bài 1) → tích chập (Bài 4) → DFT/FFT (Bài 5–6)
→ cửa sổ (Bài 7) → thiết kế FIR (Bài 9) → biquad IIR (Bài 11) → resampling (Bài 12). Cột mốc trung tâm
là Pole–Zero Filter Lab (Bài 10): kéo-thả pole/zero trên mặt phẳng z, nghe filter đổi
tính cách tức thì qua AudioWorklet thời gian thực.
Trước khi bắt đầu
Bảng thuật ngữ nền tảng (Glossary)
| Thuật ngữ | Dịch nghĩa | Định nghĩa ngắn gọn |
|---|---|---|
| x[n] | Tín hiệu rời rạc | Tín hiệu chỉ tồn tại tại các chỉ số mẫu nguyên n, khác x(t) liên tục. |
| Aliasing | Gập phổ | Hiện tượng tần số cao "giả trang" thành tần số thấp khi lấy mẫu không đủ nhanh. |
| Lượng tử hoá | Quantization | Làm tròn biên độ liên tục về một số hữu hạn mức rời rạc, sinh ra sai số lượng tử. |
| LTI | Hệ tuyến tính bất biến thời gian | Hệ thỏa cả tính tuyến tính lẫn bất biến theo thời gian — đặc trưng hoá trọn vẹn bởi đáp ứng xung. |
| Tích chập | Convolution | Phép toán "lật-dịch-nhân-cộng" mô tả đầu ra của mọi hệ LTI theo đáp ứng xung của nó. |
| DFT / FFT | Biến đổi Fourier rời rạc / nhanh | Chuyển tín hiệu từ miền thời gian sang miền tần số; FFT là thuật toán O(N log N) tính DFT. |
| Rò rỉ phổ | Spectral leakage | Năng lượng "lem" sang các bin tần số lân cận khi khung tín hiệu không chứa số nguyên chu kỳ. |
| Spectrogram | Phổ theo thời gian | Biểu diễn năng lượng tần số thay đổi theo thời gian, dựng từ nhiều khung STFT chồng lấp. |
| FIR / IIR | Filter đáp ứng xung hữu hạn / vô hạn | FIR không hồi tiếp (luôn ổn định, có thể linear phase); IIR hồi tiếp (hiệu quả hơn, có thể mất ổn định). |
| Pole / Zero | Điểm cực / điểm không | Vị trí trên mặt phẳng z quyết định hình dạng đáp ứng tần số và tính ổn định của filter. |
| Biquad | Filter bậc 2 | Khối filter IIR 2 cực/2 không, đơn vị xây dựng cơ bản của mọi EQ số hiện đại. |
| Resampling | Đổi tần số lấy mẫu | Chuyển tín hiệu từ tần số lấy mẫu này sang tần số khác bằng decimation/interpolation có lọc. |
Danh sách 15 bài học trong lộ trình
Lộ trình chia 4 chặng: tín hiệu & nền tảng → miền tần số → filter & đa tốc độ → thực chiến & capstone. Các bài sẽ được mở khoá dần khi xuất bản.
Tín hiệu là gì: từ liên tục đến số
x(t) vs x[n], tín hiệu cơ bản (xung, bậc thang, sine, chirp, nhiễu), năng lượng vs công suất, chu kỳ rời rạc. Demo: Signal Generator Playground — chọn/ghép tín hiệu, vẽ + nghe ngay.
Lấy mẫu, Nyquist & Aliasing
Định lý Nyquist–Shannon, phổ gương, tần số gập, aliasing đời thực. Demo: Aliasing Stroboscope kéo tần số qua Nyquist thấy + nghe alias gập xuống.
Lượng tử hoá & dải động
Bit depth, LSB, sai số lượng tử, quy tắc ~6dB/bit, SNR, dithering. Demo: kéo bit depth 16→8→4→2 nghe nhạc vỡ dần.
Hệ LTI, tích chập & đáp ứng xung
Tuyến tính + bất biến thời gian, tích chập y[n]=x[n]*h[n], đáp ứng xung đặc trưng hoá hệ LTI. Demo: convolution từng bước + reverb bằng impulse response phòng thật.
DFT: cửa sổ nhìn sang miền tần số
DFT như phép "so khớp" sinusoid, bins, độ phân giải fs/N, đối xứng liên hợp. Demo: DFT Explorer — vẽ tín hiệu tuỳ ý, click 1 bin thấy đúng sinusoid nó đại diện.
FFT: thuật toán thay đổi thế giới
Radix-2 decimation-in-time, butterfly, bit-reversal, O(N log N). Demo: butterfly diagram tương tác + benchmark tốc độ DFT vs FFT thật.
Rò rỉ phổ & hàm cửa sổ
Vì sao chu kỳ không nguyên gây leakage; cửa sổ rect/Hann/Hamming/Blackman. Demo: hai tone sát nhau — đổi cửa sổ thấy tách được/không.
STFT & Spectrogram
Đánh đổi thời gian–tần số, khung chồng lấp, hop size. Demo: spectrogram 3 tông nối tiếp — kéo kích thước khung thấy trade-off thời gian/tần số sống.
Filter FIR: từ trung bình trượt đến windowed-sinc
FIR = tích chập với h[n] hữu hạn, sinc lý tưởng cắt bằng cửa sổ, linear phase. Demo: FIR Designer — kéo cutoff & số tap, thấy h[n] và đáp ứng tần số đổi trực tiếp.
Z-transform & mặt phẳng z
Hàm truyền H(z), pole/zero, ổn định ⟺ pole trong vòng tròn đơn vị. Ra mắt flagship: Pole–Zero Filter Lab — kéo pole/zero, nghe filter đổi tính cách tức thì.
Filter IIR & Biquad
Biquad Direct Form II Transposed, RBJ cookbook 7 loại filter, cascade & pitfall lượng tử hệ số. Demo: Biquad Cookbook Playground — kéo f0/Q/gain, pole/zero di chuyển live, nghe lọc nhiễu trắng.
Resampling & xử lý đa tốc độ
Decimation/interpolation lọc đúng cách, tỉ lệ hữu tỉ 44,1↔48kHz=160/147, ý tưởng polyphase. Demo: Resampler A/B — nghe và soi phổ đường "ngây thơ" (aliasing) vs "chuẩn" song song.
Phát hiện cao độ: autocorrelation & tuner
Vì sao đỉnh FFT to nhất không phải pitch, autocorrelation qua FFT, YIN né octave error, nội suy parabol. Demo: Guitar/Voice Tuner chạy bằng mic thật, kim chỉ nốt + cent realtime.
DSP thời gian thực & trên phần cứng nhúng
Ngân sách thời gian thực, pitfall reset state gây click, fixed-point Q15 (mul/sat). Demo: A/B Float vs Q15 nghe + đo SNR thật, kéo block size xem latency đổi.
Capstone: Trạm Âm Thanh DSP hoàn chỉnh
Ghép noise gate → EQ 5 băng → soft-limiter thành 1 dây chuyền hoàn chỉnh — dự án tổng kết cả series. Demo: DSP Station — bật/tắt từng khối, chọn preset, nghe qua tín hiệu test hoặc mic thật.
Bình luận