Mô phỏng tương tác định lý Nyquist–Shannon, ba phương pháp khôi phục, phân tích phổ FFT và đánh giá MSE / SNR
Khi tần số lấy mẫu thỏa fs > 2·fmax và tín hiệu băng tần hữu hạn, định lý Nyquist–Shannon đảm bảo x̂(t) ≡ x(t) với phương pháp nội suy sinc, dẫn đến |X̂(f)| ≡ |X(f)|. Việc hai phổ chồng khít chính là biểu hiện đúng đắn của định lý, không phải lỗi tính toán.
💡 Hãy thử bấm Aliasing hoặc đổi sang sóng vuông để thấy phổ sai số "nổi gai" rõ rệt.
| Phương pháp | MSE | RMSE | SNR (dB) | Đặc điểm |
|---|
Trang này hiển thị từng bước tính toán dựa trên giá trị bạn đang chỉnh ở bảng điều khiển bên kia. Mỗi mục có ba dòng theo thứ tự: công thức tổng quát, thay số cụ thể và kết quả. Khi bạn kéo bất kỳ thanh trượt nào, các con số ở đây sẽ tự động cập nhật.
Lấy mẫu là quá trình chuyển một tín hiệu từ liên tục theo thời gian sang rời rạc để có thể xử lý bằng máy tính. Khôi phục là chiều ngược lại: từ chuỗi mẫu rời rạc dựng lại tín hiệu liên tục. Toàn bộ lý thuyết của quá trình này được đặt nền móng bởi định lý lấy mẫu Nyquist–Shannon, một trong những kết quả quan trọng nhất của xử lý tín hiệu.
Tín hiệu liên tục x(t) tồn tại tại mọi thời điểm t ∈ ℝ. Đây là dạng tự nhiên của hầu hết các đại lượng vật lý trong thực tế: âm thanh, ánh sáng, điện áp cảm biến, nhịp tim…
Tín hiệu rời rạc x[n] chỉ được xác định tại các thời điểm rời rạc n = 0, 1, 2, …, thường là kết quả của việc lấy mẫu một tín hiệu liên tục với chu kỳ Ts:
Định nghĩa trên trục thời gian thực, có thể có vô hạn giá trị trong bất kỳ khoảng hữu hạn nào.
x(t) = A·sin(2πft)
Là chuỗi giá trị x[0], x[1], x[2]… lấy tại các điểm thời gian cách đều Ts.
x[n] = x(nT_s), n ∈ ℤ
Mục tiêu của xử lý số tín hiệu là làm việc với tín hiệu rời rạc nhưng vẫn giữ được càng nhiều thông tin càng tốt từ tín hiệu liên tục gốc.
Về mặt toán học, lấy mẫu lý tưởng được mô tả bằng phép nhân tín hiệu liên tục với một chuỗi xung Dirac (Dirac comb) tại các thời điểm nTs:
Tín hiệu sau lấy mẫu là chuỗi xung có biên độ bằng giá trị tức thời của x(t):
Trong đó Ts = 1/fs là chu kỳ lấy mẫu và fs là tần số lấy mẫu. Mô hình này là lý tưởng — trong thực tế, các bộ ADC sử dụng mạch sample-and-hold để lưu giữ giá trị mẫu trong một chu kỳ.
Phát biểu kinh điển của định lý:
Tần số 2·fmax được gọi là tần số Nyquist. Một số tài liệu định nghĩa "tần số Nyquist" là fs/2 — nghĩa là tần số cao nhất mà một hệ thống lấy mẫu với fs có thể biểu diễn được không bị aliasing.
| Trường hợp | Điều kiện | Kết quả |
|---|---|---|
| Đạt Nyquist | fs > 2·fmax | Khôi phục được chính xác (lý thuyết) |
| Tại ngưỡng | fs = 2·fmax | Trên lý thuyết khôi phục được, thực tế dễ hỏng do pha |
| Aliasing | fs < 2·fmax | Mất thông tin, các tần số cao bị "gập" về dải thấp |
Trong định lý có dấu "lớn hơn hoặc bằng" — nhưng chính đẳng thức fs = 2·fmax lại chứa một lỗ hổng nguy hiểm phụ thuộc vào pha của tín hiệu.
Xét hai tín hiệu cùng tần số 10 Hz, lấy mẫu ở đúng fs = 20 Hz:
| Tín hiệu | Pha | Các mẫu tại t = 0, 0.05, 0.10, 0.15 s | Khôi phục |
|---|---|---|---|
| cos(2π·10·t) | 90° | [1, −1, 1, −1, …] | Đúng dạng sóng |
| sin(2π·10·t) | 0° | [0, 0, 0, 0, …] | Mất sạch tín hiệu |
Cùng tần số, cùng tần số lấy mẫu, nhưng chỉ vì pha lệch 90° mà một tín hiệu khôi phục được, một tín hiệu biến mất hoàn toàn. Lý do: ở pha 0°, các điểm lấy mẫu rơi đúng vào những điểm cắt 0 của sin, ADC ghi nhận tất cả là "im lặng".
Trong app, bạn có thể tự kiểm chứng bằng nút Bẫy pha 90° tại ngưỡng Nyquist ở panel Mô phỏng: khi đặt sin 10 Hz, fs = 20 Hz và đổi pha φ₁ giữa 0° và 90°, dạng sóng khôi phục sẽ chuyển từ "phẳng lì = 0" sang "có dạng cos" — minh họa trực quan vì sao không nên đặt fs đúng bằng 2·fmax.
Theo lý thuyết Fourier, lấy mẫu trong miền thời gian tương đương với tích chập với chuỗi xung Dirac trong miền tần số. Điều này khiến phổ của tín hiệu sau lấy mẫu bị lặp lại tuần hoàn với chu kỳ fs:
Khi fs > 2·fmax, các bản sao phổ tách rời nhau, ta có thể lọc lấy lại bản gốc bằng bộ lọc thông thấp. Khi fs < 2·fmax, các bản sao chồng lấn — đây chính là aliasing.
Một thành phần tần số f0 nằm ngoài dải Nyquist sẽ xuất hiện ở vị trí "gập" trong dải thấp:
Đây là lý do tại sao một sóng sin 60 Hz lấy mẫu ở 80 Hz lại "trông giống" sóng 20 Hz — bằng đúng |60 − 80| = 20. Hiệu ứng cánh quạt máy bay quay ngược chiều trên video chính là aliasing trong miền không gian/thời gian.
Trong mọi hệ thống số thực tế, trước khi đưa tín hiệu vào ADC ta phải dùng một bộ lọc thông thấp (LPF) với tần số cắt nhỏ hơn fs/2 để loại bỏ các thành phần có thể gây aliasing.
Bộ lọc anti-aliasing thường dùng:
Định lý Nyquist khẳng định có thể khôi phục, công thức Whittaker–Shannon cho biết khôi phục bằng cách nào:
Ý nghĩa: thay mỗi xung lấy mẫu bằng một hàm sinc có biên độ bằng giá trị mẫu, rồi cộng tất cả lại. Hàm sinc(x) = sin(πx)/(πx) là đáp ứng xung của bộ lọc thông thấp lý tưởng với tần số cắt fs/2.
Đây là phương pháp khôi phục lý tưởng, nhưng không thực hiện được trong phần cứng vì:
Vì vậy thực tế dùng các xấp xỉ: ZOH, nội suy tuyến tính, spline, sinc cửa sổ hữu hạn (sinc truncated, Lanczos)...
Giữ nguyên giá trị mẫu cuối cùng cho tới khi có mẫu mới:
Đáp ứng tần số:
Nối hai mẫu liên tiếp bằng đoạn thẳng:
Áp dụng trực tiếp công thức Whittaker–Shannon ở mục 6.
| Phương pháp | Độ phức tạp | Sai số | Hiện thực phần cứng |
|---|---|---|---|
| ZOH | O(1) mỗi điểm | Lớn | Rất dễ — DAC bậc 0 |
| Linear | O(1) mỗi điểm | Trung bình | Dễ — DAC bậc 1 / FPGA |
| Sinc | O(N) mỗi điểm | Nhỏ nhất | Không — phải xấp xỉ bằng FIR cửa sổ |
Để đánh giá định lượng độ chính xác của tín hiệu khôi phục, dùng các chỉ số:
MSE càng nhỏ thì x̂(t) càng gần với x(t). Đơn vị là bình phương biên độ tín hiệu.
Cùng đơn vị với biên độ tín hiệu, dễ so sánh trực quan với mức tín hiệu.
Đơn vị decibel (dB). Trong app này, công suất nhiễu chính là MSE, công suất tín hiệu là (1/N)·Σx²(t).
Fast Fourier Transform (FFT) là thuật toán tính nhanh biến đổi Fourier rời rạc (DFT) với độ phức tạp O(N log N). Trong app này, FFT được hiện thực bằng giải thuật Cooley–Tukey radix-2:
FFT giúp ta quan sát ba bước của hệ thống lấy mẫu trong miền tần số:
Lấy mẫu và khôi phục là nền tảng cho hầu hết các hệ thống điện tử số hiện đại. Một số ví dụ:
Có thể tải dữ liệu mô phỏng dạng JSON để dùng lại trong MATLAB qua jsondecode(fileread('file.json')), hoặc tải PNG đồ thị để chèn vào báo cáo.
Đề tài Mô phỏng Lấy mẫu & Khôi phục Tín hiệu được thực hiện bởi Nhóm 8 — Lớp L03, gồm 4 sinh viên khóa 2023, Khoa Điện - Điện tử, Đại học Bách Khoa TP.HCM.
| Thành viên | Công việc chính | Sản phẩm cần làm |
|---|---|---|
| Võ Phúc Thịnh 2313317 |
Lý thuyết lấy mẫu | Viết phần cơ sở lý thuyết: tín hiệu liên tục, tín hiệu rời rạc, lấy mẫu, định lý Nyquist, hiện tượng aliasing |
| Hà Toàn Phú 2312647 |
Code tạo tín hiệu và lấy mẫu | Viết chương trình tạo tín hiệu gốc (sin, tổng sin, vuông, tam giác), chọn tần số lấy mẫu, lấy mẫu tín hiệu |
| Nguyễn Xuân Quyết 2312889 |
Code khôi phục và tính sai số | Hiện thực ba phương pháp khôi phục ZOH, Linear, Sinc; tính MSE / SNR; so sánh kết quả |
| Hồ Minh Thao 2313092 |
Giao diện, báo cáo, slide, demo | Làm giao diện ứng dụng, tổng hợp báo cáo, làm PowerPoint và chuẩn bị kịch bản thuyết trình |