Situatie
Am asigurat echivalența matematică dintre calculul spectrogramei mel din Python și cel de pe microcontroler prin mai multe strategii concrete:
1. Parametri identici
Am pornit de la aceiași parametri exacti în ambele medii: rată de eșantionare de 16kHz, FFT de 512 puncte, fereastră de 30ms (480 eșantioane), hop de 10ms (160 eșantioane) și 40 de benzi mel.
2. Filterbank-ul mel — exportat direct din Python
În loc să reimplementez manual formulele de calcul al benzilor mel pe microcontroler (unde orice diferență mică de rotunjire ar fi alterat rezultatele), am generat filterbank-ul direct în Python folosind librosa, cu setările sale implicite. Rezultatul — o matrice de 40×257 valori — l-am salvat cu 8 zecimale de precizie într-un format pe care microcontrolerul îl poate citi direct. Astfel, dispozitivul folosește exact aceiași coeficienți numerici ca Python, fără nicio aproximare.
3. Fereastra Hann — aceeași formulă
Am replicat pe microcontroler aceeași formulă matematică de fereastră Hann simetrică pe care o folosește librosa, cu același divisor, producând valori identice.
4. FFT și spectrul de putere — aceeași secvență de operații
Pe microcontroler, pentru fiecare cadru: aplic fereastra Hann, completez cu zerouri, rulez transformata Fourier, apoi calculez spectrul de putere ca suma pătratelor părților reale și imaginare. În Python, am configurat librosa să facă exact același lucru, inclusiv dezactivarea padding-ului simetric la capetele semnalului — un detaliu critic, pentru că altfel Python ar fi generat cadre decalate și un număr diferit de frame-uri.
5. Conversia în decibeli și normalizarea — aceeași formulă, aceleași praguri
Atât pe microcontroler cât și în Python, aplic aceeași secvență: convertesc puterea în decibeli cu același epsilon mic pentru a preveni logaritmul din zero, limitez valorile la intervalul de la -80 la 0 decibeli, apoi normalizez totul în intervalul 0–1 prin aceeași formulă liniară.
6. Verificare pas cu pas
Am scris un script Python care reproduce pas cu pas exact ce face microcontrolerul: încarcă audio, convertește la virgulă mobilă, calculează volumul, aplică filtrul de liniște, calculează spectrograma cadru cu cadru prin aceeași buclă manuală. Fiecare pas intermediar este afișat în același format ca pe dispozitiv, astfel încât pot compara linie cu linie valorile și identifica orice divergență.
7. Antrenarea modelului pe date procesate identic
Ca să mă asigur că modelul AI a fost antrenat pe aceleași tipuri de spectrograme pe care le va primi pe dispozitiv, am preprocesat toate datele de antrenare în Python cu exact aceiași parametri și aceeași formulă de conversie și normalizare. Astfel, modelul a „văzut” în antrenare exact același tip de reprezentare pe care o primește și pe dispozitiv.
Pe scurt: nu am reimplementat independent matematica pe microcontroler, ci am exportat componentele critice direct din Python, am replicat doar operațiile aritmetice simple cu aceleași formule și constante, și am construit un sistem de verificare care compară valoare cu valoare rezultatele intermediare dintre cele două medii.
Leave A Comment?