8 / 24 · Thực hành
Thực hành: chạy quy ước lượng tử hóa
Lượng tử hóa −40 với cùng thiết lập uint8. Mã và giá trị giải lượng tử hóa là gì, và bạn sẽ thêm assertion nào?
Bài học miễn phí. Đăng ký để lưu tiến độ học tập.
Mục tiêu và chuẩn bị
Thực thi ánh xạ mã, trường hợp giữa âm, bão hòa và tích vô hướng số nguyên đã trừ điểm 0. Tệp cần Node.js, không có gói ngoài. Tạo quantize-lab.mjs trong thư mục trống mới, sao chép mã dưới và chạy node quantize-lab.mjs. Không có Node thì hoàn thành bảng dự đoán bằng tay. Nếu Digital Design Studio đã cài có quy trình tạo/mở tệp hỗ trợ kiểu này, có thể tạo thủ công và xem cùng tệp ở đó. Hướng dẫn không khẳng định tạo dự án tự động hay thực thi trong DDS.
Dự đoán trước khi chạy
Tại thang 0.25 và điểm 0 128, −0.625 thành trường hợp giữa −2.5, làm tròn thành số chẵn −2 và cho mã 126. Đầu vào −0.375 cũng cho 126. Số 0 cho 128; 0.375 và 0.625 đều cho 130. Đầu vào 40 sẽ cho 288, nên bão hòa uint8 đổi nó thành 255. Dự đoán [126,126,128,130,130,255]. Các trường hợp này phân biệt giữa âm, giữa dương, số 0 thực và cắt.
Trừ điểm 0 của [130,126] để được [2,−2]. Với trọng số [3,−2], tổng là mười. Thang kết hợp 0.125 biểu diễn thực 1.25; thang đầu ra 0.25 và điểm 0 128 cho 133. Mã là bài tập quy ước số, không phải bộ nhập mô hình hay phép đo độ chính xác.
Chạy assertion gốc trước. Rồi thay 0.625 bằng 0.875. Dự đoán giữa 3.5 làm tròn thành bốn và mã 132 trước khi đổi giá trị kỳ vọng. Tạm thay roundEven bằng Math.round, quan sát assertion giữa âm thất bại, rồi khôi phục. Thất bại có chủ ý chứng minh kiểm tra quan sát hành vi cần thiết.
Cuối cùng giải lượng tử hóa mã bão hòa 255: nó biểu diễn 31.75, sai số −8.25 so với 40. Sai số lớn hơn nhiều giới hạn làm tròn nửa bước thông thường. Chọn thang đánh đổi phạm vi với độ phân giải; đo độ chính xác mô hình cần mô hình và tập dữ liệu riêng. Ghi dự đoán, đầu ra lệnh và lập luận cho trường hợp đã đổi.
Tệp có thể chạy
import assert from 'node:assert/strict';
// An exact tie is handled with nearest-even, including negative input.
export function roundEven(v) {
const f = Math.floor(v), d = v - f;
return d < 0.5 ? f : d > 0.5 ? f + 1 : f % 2 === 0 ? f : f + 1;
}
export const quantize = (x, s, z) => Math.min(255, Math.max(0, roundEven(x / s) + z));
const values = [-0.625, -0.375, 0, 0.375, 0.625, 40];
const codes = values.map(x => quantize(x, 0.25, 128));
assert.deepEqual(codes, [126, 126, 128, 130, 130, 255]);
assert.equal(roundEven(-1.5), -2);
assert.equal(roundEven(-2.5), -2);
const xq = [130, 126], wq = [3, -2];
const acc = xq.reduce((sum, x, i) => sum + (x - 128) * wq[i], 0);
assert.equal(acc, 10);
assert.equal(acc * 0.25 * 0.5, 1.25);
assert.equal(quantize(1.25, 0.25, 128), 133);
console.log(JSON.stringify({codes, acc, real: 1.25, output: 133}));Tự thử
Lượng tử hóa −40 với cùng thiết lập uint8. Mã và giá trị giải lượng tử hóa là gì, và bạn sẽ thêm assertion nào?
Đọc giải thích
Mã chưa giới hạn là −32, nên bị cắt về 0. Giải lượng tử hóa là (0−128)×0.25=−32. Thêm assertion rằng quantize(−40,0.25,128) bằng 0 để bao quát bão hòa âm.