Thanks to visit codestin.com
Credit goes to github.com

Skip to content

kics223w1/btl-ktmt

Repository files navigation

Bộ Lọc Wiener (Wiener Filter) - MIPS Assembly Implementation

Giới thiệu

Đây là bài tập lớn môn Kiến trúc Máy tính (CO2008) - Trường Đại học Bách Khoa TP.HCM.

Dự án này triển khai Bộ lọc Wiener bằng assembly MIPS để lọc và dự đoán tín hiệu. Bộ lọc Wiener là một kỹ thuật lọc thích nghi cổ điển được sử dụng trong xử lý tín hiệu để ước lượng tín hiệu mong muốn từ một quan sát bị nhiễu, nhằm tối thiểu hóa sai số bình phương trung bình (Mean Square Error - MSE).

Nội dung dự án

Tập tin chính

  • wiener_filter.asm - Chương trình MIPS assembly chính thực hiện bộ lọc Wiener
  • generate_testdata.py - Script Python để tạo dữ liệu test (tín hiệu gốc + nhiễu)
  • wiener_filter_verify.py - Script Python để xác minh kết quả và tính toán đầu ra mong đợi

Thư mục

  • testcases/ - Chứa các trường hợp kiểm thử
    • test1_white/ - Test case với nhiễu trắng (White Gaussian Noise)
    • test2_pink/ - Test case với nhiễu hồng (Pink Noise / 1/f noise)

Cấu trúc dữ liệu

Dữ liệu đầu vào

Mỗi test case bao gồm 3 tập tin:

  1. desired.txt - Tín hiệu mong muốn gốc (500 giá trị)
  2. noise.txt - Nhiễu (500 giá trị)
  3. input.txt - Tín hiệu đầu vào = desired + noise (500 giá trị)

Tất cả giá trị là số thực dấu phẩy động, được làm tròn đến 1 chữ số thập phân.

Dữ liệu đầu ra

output.txt - Chứa:

  • Dòng đầu: MMSE: <giá trị> - Giá trị sai số bình phương trung bình tối thiểu
  • Dòng trống
  • 500 dòng tiếp theo: Tín hiệu đầu ra đã được lọc (mỗi giá trị 1 dòng, 1 chữ số thập phân)

Lý thuyết

Công thức Wiener Filter

Đầu ra của bộ lọc FIR tuyến tính:

y(n) = Σ(k=0 to M-1) h_k * x(n-k)

Phương trình Wiener-Hopf (dạng ma trận):

R_M * h = γ_d

Trong đó:

  • R_M - Ma trận tự tương quan (autocorrelation) của tín hiệu đầu vào (M×M)
  • h - Vector hệ số bộ lọc tối ưu (M×1)
  • γ_d - Vector tương quan chéo (cross-correlation) giữa tín hiệu mong muốn và đầu vào (M×1)

Hệ số tối ưu:

h_opt = R_M^(-1) * γ_d

MMSE (Minimum Mean Square Error):

MMSE = σ²_d - γ_d^T * R_M^(-1) * γ_d

hoặc tính trực tiếp:

MMSE = (1/N) * Σ(n=0 to N-1) [d(n) - y(n)]²

Các biến bắt buộc trong MIPS

Theo yêu cầu đề bài, các biến sau phải được định nghĩa trong phần .data:

desired_signal:     .space 2000    # Tín hiệu mong muốn (500 floats)
noise:              .space 2000    # Nhiễu (500 floats)
input_signal:       .space 2000    # Tín hiệu đầu vào (500 floats)
optimize_coefficient: .space 80    # Hệ số bộ lọc tối ưu (20 floats)
MMSE:               .float 0.0     # Giá trị MMSE
out:                .space 2000    # Tín hiệu đầu ra (500 floats)

Thuật toán triển khai

1. Đọc dữ liệu từ file

  • Đọc desired.txt vào mảng desired_signal
  • Đọc input.txt vào mảng input_signal
  • Kiểm tra kích thước 2 file có khớp nhau không

2. Tính ma trận tự tương quan R_M

Với mỗi cặp (i, j) từ 0 đến M-1:

R[i][j] = (1/N) * Σ(n=0 to N-|i-j|-1) x[n] * x[n + |i-j|]

3. Tính vector tương quan chéo γ_d

Với mỗi i từ 0 đến M-1:

γ_d[i] = (1/N) * Σ(k=0 to N-i-1) d[i+k] * x[k]

4. Giải hệ phương trình tuyến tính

Giải R * h = γ_d để tìm hệ số tối ưu h

Lưu ý: Trong code MIPS, sử dụng phương pháp đơn giản hóa (diagonal approximation) do hạn chế của assembly. Trong thực tế nên dùng Gaussian elimination hoặc Cholesky decomposition.

5. Áp dụng bộ lọc FIR

Với mỗi n từ 0 đến N-1:

y[n] = Σ(k=0 to M-1) h[k] * x[n-k]  (nếu n-k >= 0)

6. Tính MMSE

MMSE = (1/N) * Σ(n=0 to N-1) [d[n] - y[n]]²

7. Ghi kết quả ra file

Ghi MMSE và mảng đầu ra vào output.txt

Hướng dẫn sử dụng

Yêu cầu hệ thống

  • MARS MIPS Simulator - Để chạy code assembly
  • Python 3.x với NumPy - Để tạo test data và verify

Bước 1: Tạo test data

# Tạo virtual environment (nếu cần)
python3 -m venv venv
source venv/bin/activate  # macOS/Linux
# hoặc: venv\Scripts\activate  # Windows

# Cài đặt numpy
pip install numpy

# Tạo test data
python3 generate_testdata.py

Script sẽ tạo 2 test cases:

  • test1_white - Với nhiễu trắng (White Gaussian Noise)
  • test2_pink - Với nhiễu hồng (Pink/1f Noise)

Bước 2: Chạy script Python để verify

python3 wiener_filter_verify.py

Script này sẽ:

  • Tính toán kết quả mong đợi bằng Python
  • Tạo file output.txt trong mỗi test case
  • Hiển thị thống kê (MMSE, improvement, v.v.)

Bước 3: Chạy MIPS assembly

  1. Mở MARS MIPS Simulator
  2. Load file wiener_filter.asm
  3. Copy các file test vào thư mục làm việc:
    testcases/test1_white/desired.txt  -> desired.txt
    testcases/test1_white/input.txt    -> input.txt
    
  4. Assemble và run chương trình
  5. Kiểm tra file output.txt được tạo ra
  6. So sánh với kết quả từ Python script

Bước 4: Kiểm tra kết quả

So sánh file output.txt từ MIPS với file từ Python:

# Ví dụ cho test case 1
diff output.txt testcases/test1_white/output.txt

Kết quả test

Test Case 1: White Noise

  • Filter order: 20
  • MMSE: ~0.69
  • Input MSE: ~3.84
  • Output MSE: ~0.69
  • Improvement: ~82%

Test Case 2: Pink Noise

  • Filter order: 20
  • MMSE: ~0.97
  • Input MSE: ~4.01
  • Output MSE: ~0.97
  • Improvement: ~76%

Cấu trúc code MIPS

Các hàm chính

  1. main - Hàm chính, điều khiển luồng chương trình
  2. read_signal_file - Đọc tín hiệu từ file
  3. parse_float - Parse chuỗi thành số float
  4. apply_wiener_filter - Áp dụng bộ lọc Wiener
  5. compute_autocorrelation_matrix - Tính ma trận R_M
  6. compute_autocorrelation - Tính tự tương quan cho 1 lag
  7. compute_cross_correlation - Tính vector γ_d
  8. solve_linear_system - Giải hệ phương trình tuyến tính
  9. apply_fir_filter - Áp dụng bộ lọc FIR
  10. compute_mse - Tính Mean Square Error
  11. write_output_file - Ghi kết quả ra file
  12. float_to_string - Chuyển float thành chuỗi
  13. int_to_string - Chuyển integer thành chuỗi

Tổ chức bộ nhớ

.data segment:
  - Signal arrays (500 elements × 4 bytes = 2000 bytes each)
  - Autocorrelation matrix (20×20 × 4 bytes = 1600 bytes)
  - Cross-correlation vector (20 × 4 bytes = 80 bytes)
  - Filter coefficients (20 × 4 bytes = 80 bytes)
  - Buffers and constants

Hạn chế và lưu ý

Hạn chế của implementation

  1. Giải hệ phương trình: Do độ phức tạp, code MIPS sử dụng phương pháp đơn giản hóa (diagonal approximation) thay vì Gaussian elimination đầy đủ. Điều này có thể làm giảm độ chính xác.

  2. File I/O: MARS MIPS có hạn chế về file I/O. Đảm bảo các file input nằm đúng thư mục làm việc.

  3. Floating-point precision: MIPS single-precision float có thể có sai số làm tròn nhỏ so với Python double-precision.

  4. Memory limits: MARS có giới hạn bộ nhớ. Code này đã được tối ưu cho tín hiệu 500 mẫu và filter order 20.

Lưu ý khi chạy

  • Đảm bảo file input.txtdesired.txt có cùng số dòng
  • Mỗi dòng trong file chỉ chứa 1 số với 1 chữ số thập phân
  • Không có dòng trống hoặc ký tự lạ trong file input
  • File paths phải chính xác (tương đối với working directory của MARS)

Tham khảo

Lý thuyết

  • Digital Signal Processing - Proakis & Manolakis
  • Adaptive Filter Theory - Simon Haykin
  • Course materials: Computer Architecture Lab (CO2008)

Công cụ

Tác giả

Bài tập được thực hiện cho môn Kiến trúc Máy tính (CO2008)
Khoa Khoa học và Kỹ thuật Máy tính
Trường Đại học Bách Khoa TP.HCM
Năm học 2025-2026

License

Dự án này được tạo ra cho mục đích học tập.


Troubleshooting

Vấn đề: "Error: size not match"

Nguyên nhân: File desired.txtinput.txt có số dòng khác nhau.

Giải pháp: Kiểm tra lại 2 file, đảm bảo cùng có 500 dòng.

Vấn đề: "Error: Cannot open file"

Nguyên nhân: MARS không tìm thấy file input.

Giải pháp:

  • Copy file vào thư mục làm việc của MARS
  • Hoặc đổi đường dẫn trong code assembly

Vấn đề: Kết quả MIPS khác Python

Nguyên nhân:

  • Sai số làm tròn floating-point
  • Phương pháp giải hệ phương trình đơn giản hóa

Giải pháp:

  • Chấp nhận sai số nhỏ (< 5%)
  • Để có kết quả chính xác hơn, cần implement Gaussian elimination đầy đủ

Vấn đề: MARS chạy rất chậm

Nguyên nhân: Thuật toán có độ phức tạp O(N²M²) với N=500, M=20.

Giải pháp:

  • Giảm filter order M (ví dụ: M=10)
  • Giảm số lượng sample N
  • Chạy trên máy tính mạnh hơn
  • Sử dụng SPIM thay vì MARS (nhanh hơn nhưng ít UI hơn)

Chúc các bạn làm bài tốt! 🎓

btl-ktmt

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published