Skip to main content

Crate sigmoid_q15

Crate sigmoid_q15 

Source
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-exp pour le calcul de e^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... non

Plus précisément :

  • Si x <= 0 : -x >= 0, mais e^(-x) avec -x >= 0 saturerait. On utilise donc sigmoid(x) = 1 - sigmoid(-x) pour ramener le calcul sur le domaine négatif.
  • Si x > 0 : -x < 0exp_q15(-x) calcule normalement.
  • Si x = 0 : sigmoid(0) = 0.516384 en 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.