Altifigence Academy

8 / 24 · Prática

Laboratório: execute o contrato de quantização

Quantize −40 com as mesmas configurações uint8. Quais são seu código e valor desquantizado, e qual asserção você acrescentaria?

Objetivo e preparação

Execute o mapeamento de códigos, empates negativos, saturação e um produto escalar de inteiros centralizados. Este arquivo precisa de Node.js e de nenhum pacote externo. Crie quantize-lab.mjs em uma pasta nova e vazia, copie o código abaixo e execute node quantize-lab.mjs. Sem Node, complete a tabela de previsões manualmente. Se seu Digital Design Studio instalado oferecer um fluxo suportado de criação/abertura de arquivos desse tipo, você poderá criar e inspecionar manualmente o mesmo arquivo nele. Estas instruções não afirmam criação automática de projeto nem execução dentro do DDS.

Faça previsões antes de executar

Na escala 0.25 e ponto zero 128, −0.625 torna-se o empate −2.5, arredonda para o par −2 e dá o código 126. A entrada −0.375 também dá 126. Zero dá 128; 0.375 e 0.625 dão ambos 130. A entrada 40 daria 288, portanto a saturação uint8 a altera para 255. Preveja [126,126,128,130,130,255]. Esses casos distinguem empates negativos, empates positivos, zero real e limitação.

Centralize [130,126] para [2,−2]. Com os pesos [3,−2], a soma é dez. A escala combinada 0.125 representa o valor real 1.25; a escala de saída 0.25 e o ponto zero 128 dão 133. O código é um exercício de contrato numérico, e não um importador de modelos ou um teste de acurácia.

Primeiro, execute as asserções sem modificações. Depois, substitua 0.625 por 0.875. Preveja o empate 3.5 arredondando para quatro e o código 132 antes de mudar o valor esperado. Substitua temporariamente roundEven por Math.round e observe a asserção de empate negativo falhar; depois, restaure-a. Uma falha intencional demonstra que o teste observa o comportamento exigido.

Por fim, desquantize o código saturado 255: ele representa 31.75, um erro de −8.25 em relação a 40. Isso é muito maior que o limite comum de arredondamento de meio passo. Escolher a escala envolve um compromisso entre faixa e resolução; medir a acurácia exige um modelo e um conjunto de dados separados. Registre suas previsões, a saída do comando e o raciocínio sobre o caso alterado.

Arquivo executável

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

Experimente

Quantize −40 com as mesmas configurações uint8. Quais são seu código e valor desquantizado, e qual asserção você acrescentaria?

Ler a explicação

O código sem limite é −32, portanto ele é limitado a zero. A desquantização é (0−128)×0.25=−32. Acrescente uma asserção de que quantize(−40,0.25,128) é igual a zero para cobrir a saturação negativa.

Lesson files

quantize-lab.mjs ↓

Sua escolha vale neste navegador. Altere-a a qualquer momento no rodapé.