sigmoid-q15
Fonction d'activation Sigmoid (1 / (1 + e^-x)) en virgule fixe Q15 pour systèmes embarqués no_std, testé sur pico 2040 zero.
Utilise embedded-exp pour le calcul de e^x.
Caractéristiques
#![no_std]: aucune dépendance à la bibliothèque standard.#![forbid(unsafe_code)]: safety garantie par Rust.- Arithmétique entière pure : pas de flottants, pas de
libm. - Compatible RP2040 (Cortex-M0+) et RP2350 (Cortex-M33).
- Temps d'exécution constant (déterministe) : idéal pour les noyaux temps réel.
- Zéro allocation dynamique : traitement in-place.
Format Q15
En Q15, un i16 représente un réel dans [-1.0, 1.0[ :
valeur_réelle = valeur_i16 / 32768.0
i16 |
Valeur réelle |
|---|---|
-32768 |
-1.0 |
0 |
0.0 |
16384 |
0.5 |
32767 |
≈ 1.0 |
Algorithme
La sigmoid exploite une propriété de symétrie pour toujours rester dans le domaine valide de embedded-exp (valeurs négatives uniquement) :
sigmoid(x) = 1 / (1 + e^(-x)) si x > 0 → -x < 0 ✓
sigmoid(0) = 0.5 exact
sigmoid(x) = 1 - sigmoid(-x) si x < 0 → symétrie ✓
Utilisation
[]
= "0.1.0"
use ;
// sigmoid(0) = 0.5 → 16384 en Q15
assert_eq!;
// Valeurs négatives → sortie < 0.5
assert!;
// Valeurs positives → sortie > 0.5
assert!;
// In-place sur un slice (économise la RAM du MCU)
let mut buf = ;
sigmoid_slice_q15;
assert!;
assert_eq!;
assert!;
Cas limites garantis
| Entrée | Sortie Q15 | Valeur réelle | Raison |
|---|---|---|---|
i16::MIN |
≈ 8808 | ≈ 0.2689 | sigmoid(-1.0) |
-1 |
< 16384 | < 0.5 | négatif → en dessous de 0.5 |
0 |
16384 | = 0.5 exact | sigmoid(0) = 0.5 |
1 |
> 16384 | > 0.5 | positif → au dessus de 0.5 |
i16::MAX |
≈ 23960 | ≈ 0.7311 | sigmoid(≈1.0) |
La sortie est toujours dans [1, 32767] jamais zéro, jamais négatif.
Ecosystème
Cette crate fait partie d'un écosystème d'activation Q15 pour MCU :
| Crate | Fonction |
|---|---|
embedded-exp |
e^x en Q15 (dépendance) |
relu-q15 |
ReLU en Q15 |
sigmoid-q15 |
Sigmoid en Q15 |
Exemple Sur pico 2040 zero Embassy
Affichage avec la Oled : Utilise embassy-ssd1306
use cortex_m_rt as _;
use Spawner;
use ;
use Timer;
use ;
use Ssd1306;
use NoopRawMutex;
use Mutex;
use I2cDevice;
use bind_interrupts;
use I2C0;
use rp2040_linker as _;
// IMPORT DE LA NOUVELLE CRATE
use sigmoid_q15;
bind_interrupts!;
async
async
Licence
GPL-2.0-or-later : voir LICENSE.
🦅 À propos
Développé et testé par Jorge Andre Castro