Altifigence Academy

8 / 24 · Практика

Лабораторная работа: выполните спецификацию квантования

Квантуйте −40 с теми же параметрами uint8. Каковы код и деквантованное значение и какое утверждение вы добавите?

Цель и подготовка

Выполните отображение кодов, отрицательные половины, насыщение и центрированное целочисленное скалярное произведение. Файлу нужен Node.js без внешних пакетов. Создайте quantize-lab.mjs в новой пустой папке, скопируйте код ниже и выполните node quantize-lab.mjs. Без Node заполните таблицу предсказаний вручную. Если установленная Digital Design Studio предоставляет поддерживаемое создание/открытие файла этого типа, можно вручную создать и исследовать тот же файл там. Эти инструкции не заявляют об автоматическом создании проекта или выполнении внутри DDS.

Предскажите до запуска

При масштабе 0.25 и нулевой точке 128 значение −0.625 становится половиной −2.5, округляется до чётного −2 и даёт код 126. Вход −0.375 тоже даёт 126. Ноль даёт 128; 0.375 и 0.625 оба дают 130. Вход 40 дал бы 288, поэтому насыщение uint8 меняет его на 255. Предскажите [126,126,128,130,130,255]. Эти случаи различают отрицательные половины, положительные половины, действительный ноль и ограничение.

Центрируйте [130,126] до [2,−2]. С весами [3,−2] сумма равна десяти. Объединённый масштаб 0.125 представляет действительное 1.25; выходной масштаб 0.25 и нулевая точка 128 дают 133. Код — упражнение числовой спецификации, а не импортёр моделей или тест точности.

Сначала выполните неизменённые утверждения. Затем замените 0.625 на 0.875. Предскажите округление половины 3.5 до четырёх и код 132 до изменения ожидаемого значения. Временно замените roundEven на Math.round и наблюдайте провал утверждения отрицательной половины, затем восстановите. Намеренный провал показывает, что тест наблюдает требуемое поведение.

Наконец деквантуйте насыщенный код 255: он представляет 31.75, ошибку −8.25 относительно 40. Это гораздо больше обычной границы округления в половину шага. Выбор масштаба требует компромисса диапазона и разрешения; измерение точности требует отдельной модели и набора данных. Запишите предсказания, вывод команды и рассуждения об изменённом случае.

Исполняемый файл

javascript
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}));

Попробуйте сами

Квантуйте −40 с теми же параметрами uint8. Каковы код и деквантованное значение и какое утверждение вы добавите?

Прочитать объяснение

Неограниченный код равен −32, поэтому ограничивается до нуля. Деквантование: (0−128)×0.25=−32. Добавьте утверждение, что quantize(−40,0.25,128) равно нулю, для покрытия отрицательного насыщения.

Lesson files

quantize-lab.mjs ↓

Выбор действует в этом браузере. Его можно изменить внизу страницы.