Expand description
§sigmoid-q15
Fonction d’activation Sigmoid en virgule fixe Q15 pour systèmes embarqués.
§Caractéristiques
#![no_std]: aucune dépendance à la bibliothèque standard.- Arithmétique entière pure : pas de flottants, pas de
libm. - Compatible RP2040 (Cortex-M0+) et RP2350 (Cortex-M33).
- Utilise
embedded-exppour le calcul dee^x. - Temps d’exécution constant (déterministe) : idéal pour les noyaux temps réel.
- Zéro allocation dynamique : traitement in-place possible.
§Format Q15
En Q15, un i16 représente un nombre réel dans [-1.0, 1.0[ :
valeur_réelle = valeur_i16 / 32768.0§Algorithme
sigmoid(x) = 1 / (1 + e^(-x))
Le problème : embedded-exp ne fonctionne que sur le domaine négatif.
On exploite la symétrie de sigmoid pour toujours rester sur ce domaine :
sigmoid(x) = 1 / (1 + e^(-x)) si x <= 0 → -x >= 0... nonPlus précisément :
- Si
x <= 0:-x >= 0, maise^(-x)avec-x >= 0saturerait. On utilise doncsigmoid(x) = 1 - sigmoid(-x)pour ramener le calcul sur le domaine négatif. - Si
x > 0:-x < 0→exp_q15(-x)calcule normalement. - Si
x = 0:sigmoid(0) = 0.5→16384en Q15.
Propriété exploitée :
sigmoid(-x) = 1 - sigmoid(x)On calcule toujours exp_q15 sur une valeur négative ou nulle,
ce qui est exactement le domaine valide de embedded-exp.
§Exemple
use sigmoid_q15::{sigmoid_q15, sigmoid_slice_q15};
// sigmoid(0) = 0.5 → 16384 en Q15
assert_eq!(sigmoid_q15(0), 16384);
// sigmoid(-1.0) ≈ 0.2689 → ≈ 8808 en Q15
let res = sigmoid_q15(-32768);
assert!((res as i32 - 8808).abs() < 20);
// sigmoid(x) est toujours dans ]0.0, 1.0[ → toujours positif
assert!(sigmoid_q15(i16::MIN) > 0);
assert!(sigmoid_q15(i16::MAX) > 0);
// Traitement in-place
let mut buf = [-32768i16, 0, 32767];
sigmoid_slice_q15(&mut buf);
assert!(buf[0] > 0);
assert_eq!(buf[1], 16384);
assert!(buf[2] > 16384);Functions§
- sigmoid_
q15 - Calcule la fonction d’activation Sigmoid pour un nombre en virgule fixe Q15.
- sigmoid_
slice_ q15 - Applique Sigmoid sur un slice de données en virgule fixe Q15, in-place.