8 / 24 · Travaux pratiques
TP : exécuter le contrat de quantification
Quantifiez −40 avec les mêmes paramètres uint8. Quels sont son code et sa valeur déquantifiée, et quelle assertion ajouteriez-vous ?
Les leçons sont gratuites. Inscrivez-vous pour enregistrer vos progrès.
Objectif et préparation
Exécutez la correspondance des codes, les égalités négatives, la saturation et un produit scalaire entier centré. Ce fichier nécessite Node.js et aucun paquet externe. Créez quantize-lab.mjs dans un nouveau dossier vide, copiez le code ci-dessous et exécutez node quantize-lab.mjs. Sans Node, complétez le tableau de prévision à la main. Si votre installation de Digital Design Studio propose un parcours pris en charge de création/ouverture pour ce type de fichier, vous pouvez y créer et examiner manuellement le même fichier. Ces instructions ne prétendent pas à une création automatique de projet ni à une exécution dans DDS.
Prévoir avant d’exécuter
À l’échelle 0.25 et au point zéro 128, −0.625 devient −2.5, s’arrondit à l’entier pair −2 et donne le code 126. L’entrée −0.375 donne aussi 126. Zéro donne 128 ; 0.375 et 0.625 donnent tous deux 130. L’entrée 40 donnerait 288 : la saturation uint8 la ramène donc à 255. Prévoyez [126, 126, 128, 130, 130, 255]. Ces cas distinguent les égalités négatives, les égalités positives, le zéro réel et l’écrêtage.
Centrez [130, 126] en [2, −2]. Avec les poids [3, −2], la somme vaut dix. L’échelle combinée 0.125 représente la valeur réelle 1.25 ; l’échelle de sortie 0.25 et le point zéro 128 donnent 133. Le code est un exercice de contrat numérique, et non un importateur de modèles ou un banc de mesure de précision.
Exécutez d’abord les assertions sans modification. Remplacez ensuite 0.625 par 0.875. Prévoyez l’arrondi de 3.5 à quatre et le code 132 avant de modifier la valeur attendue. Remplacez temporairement roundEven par Math.round et observez l’échec de l’assertion d’égalité négative, puis rétablissez-la. Un échec intentionnel démontre que le test observe le comportement requis.
Enfin, déquantifiez le code saturé 255 : il représente 31.75, soit une erreur de −8.25 par rapport à 40. C’est bien plus que la borne d’arrondi ordinaire d’un demi-pas. Choisir l’échelle implique un compromis entre plage et résolution ; mesurer la précision du modèle nécessite un modèle et un jeu de données distincts. Enregistrez vos prévisions, la sortie de commande et le raisonnement du cas modifié.
Fichier exécutable
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}));Essayez vous-même
Quantifiez −40 avec les mêmes paramètres uint8. Quels sont son code et sa valeur déquantifiée, et quelle assertion ajouteriez-vous ?
Lire l’explication
Le code sans borne vaut −32 : il est donc écrêté à zéro. La déquantification est (0−128)×0.25=−32. Ajoutez une assertion vérifiant que quantize(−40, 0.25, 128) vaut zéro pour couvrir la saturation négative.