Dernière mise à jour :
09/08/2026
Présentation
Ce générateur audio basé sur un microcontrôleur permet de produire un
signal sinus de
fréquence fondamentale
définie
au moment de la programmation du microcontrôleur et non modifiable,
avec 1 à
40 harmoniques correspondantes
(raies H2 à H41) dont les amplitudes sont ajustables indépendement les
unes des autres en utilisation (après programmation).
La fréquence de la fondamentale est fixée ici à 100 Hz. La
première
harmonique H2 se situe donc à 200 Hz et l'harmonique H41 se situe à
4,1 kHz. La fréquence de restitution des échantillons
est fixée à 50 kHz, ce qui facilite le filtrage au-delà de 10 kHz
(valeur au-delà de laquelle on ne souhaite pas avoir trop de
résidus).
Ce générateur a été étudié sur une base de PIC 16
bits 24FJ64GA108, mais le logiciel pourrait tout à fait être
adapté à un autre type de microcontrôleur (PIC32 ou ESP32 par exemple).
La conversion numérique analogique se fait avec une résolution de 16
bits, à l'aide d'un DAC parallèle 16-bits ou d'un DAC
série 16-bits.
Avertissements
Logiciel écrit, simulé avec succès avec PIC24FJ64GA108 et
PIC24FJ32GA002 (sans écran LCD pour le PIC24FJ32GA002 cause nombre de
broches insuffisant), mais
pas encore testé sur prototype réel.
Schéma 021x
Générateur audio construit autour d'un PIC24, même base matérielle que
le
générateur
audio 021a.
Résolution verticale et résolution temporelle
La résolution
temporelle (fréquence de restitution des échantillons) a été fixée à 50
kHz, valeur suffisament éloignée de la dernière raie harmonique à
produire (H41 à 4,1 kHz). La résolution verticale est
de 16 bits, que le
DAC employé soit
de type parallèle ou série.
En haut, DAC 16 bits parallèle - En bas, DAC 16 bits série :
La répartition des raies fondamentale et
harmoniques se
fait de la même manière dans les deux cas (parallèle et série), mais la
répartition spectrale du bruit de fond
dépend du type de convertisseur et du filtre passe-bas employé
en
aval (pour l'exemple, j'ai placé un filtre d'ordre 4 pour le DAC
parallèle et un filtre d'ordre 1 pour le DAC série - c'est forcément
moins bien pour ce dernier).
Le
temps requis pour transmettre chaque échantillon au DAC dépend de son
type et de ses caractéristiques intrinsèques. D'une manière
générale, les DAC de type parallèle requièrent plus de broches de
liaison, mais sont plus rapides que les DAC de type série. Dans le cas
qui nous concerne ici avec les DAC sélectionnés, le temps
requis est
de 0,2 us en mode parallèle et de 7 us en mode série (horloge
série 4 MHz). On peut donc en théorie pousser un peu la fréquence de
restitution des échantillons au-delà de 50 kHz, au moins à 100 kHz pour
le DAC parallèle.
Principe de fonctionnement
Contrairement au principe de fonctionnement qui
repose sur la
synthèse
numérique directe (DDS) utilisée dans mon générateur
audio 021, une méthode beaucoup plus simple a pu être mise en
oeuvre ici, parce que la fréquence fondamentale est fixe et ne
peut pas être modifiée. Comme il fallait tout de même pouvoir modifier
l'amplitude de chacune des raies fondamentale et harmoniques, il était
exclu de faire appel à une simple et unique table d'échantillons (lookup table) codée
en dur. Pour cette raison, un tableau dynamique a été implémenté et ce
tableau est automatique reconstruit à chaque modification de
l'amplitude de la fréquence fondamentale ou de celle
d'une raie
harmonique.
Avantages
:
- Nombre de raies harmoniques pouvant être activées beaucoup
plus élevé
qu'avec la méthode par DDS.
Inconvénients
:
- Impossibilité de modifier la fréquence de la fondamentale
et des harmoniques en temps réel (après programmation)
- Plusieurs secondes sont nécessaires pour la reconstruction
du
tableau quand
le nombre de raies harmoniques activées est élevé (2 sec pour 4
raies actives, 9 sec pour 20 raies actives).
Remarque :
durant la
reconstruction du tableau, le signal de sortie délivré par le
générateur est stoppé sur la sortie DAC série mais perdure sur
la sortie DAC parallèle. Une LED (Buzy) s'allume tant que les calculs
de reconstruction de
l'onde ne sont pas terminés et que la forme d'onde délivrée n'est pas
définitivement mise à jour.
Nombre maximal de raies et amplitude des raies
Le nombre maximal de générateurs a été fixé ici à
41 (1 fondamentale + 40 harmoniques). L'amplitude de chacun de
ces générateurs peut être ajustée
individuellement entre 0.000000 (-inf) et 1.000000 (0 dBFS).
3 modes d'affichage sont proposés :
- valeur modifiable en niveau absolu, par pas de 0,000001
(valeur maximale = 1.000000)
- valeur modifiable en dB relatifs (par rapport au maximum 0
dBFS), par pas de 0,1 dB
- valeur modifiable en dB relatifs (par rapport au maximum 0
dBFS), par pas de 1 dB
Il
convient dans la mesure du possible d'adopter des valeurs
d'amplitude des
raies telles que leur somme n'occasionne pas de dépassement du
0 dBFS. En effet, dans le cas où deux générateurs sont activés
et
que tous deux sont réglés à la valeur 1.000 (0 dBFS), le
signal de
sortie pourra présenter une crête à +6 dBFS. Comme il peut
être
fastidieux de définir manuellement les niveaux à adopter pour
ne
pas subir ce dépassement du 0 dBFS (surtout avec un nombre
élevé de raies activées), une fonction de contrôle
automatique du niveau global a été prévue. Ce réglage automatique
permet de travailler sur des niveaux initiaux qui dépassent la valeur
de 0 dBFS sans provoquer de saturation sur le signal final
délivré
par le générateur audio. La marge de sécurité est de plusieurs dizaines
de dB.
Valeurs remarquables
Les valeurs d'amplitude suivantes peuvent servir de point de départ :
| 1.000000 |
0.0 dBFS |
Niveau maximal |
| 0.500000 |
-6 dBFS |
1/2 du niveau maximal |
| 0.250000 |
-12 dBFS |
1/4 du niveau maximal |
| 0.100000 |
-20 dBFS |
1/10 du niveau maximal |
| 0.050000 |
-26 dBFS |
1/20 du niveau maximal |
| 0.010000 |
-40 dBFS |
1/100 du niveau maximal |
| 0.001000 |
-60 dBFS |
1/1000 du niveau maximal |
| 0.000100 |
-80 dBFS |
1/10000 du niveau maximal |
| 0.000000 |
-inf |
rien |
Remarque :
bien que des valeurs de 0.000010 (-100 dBFS) ou
0.000001 (-120 dBFS) puissent être choisies, le
niveau effectif correspondant dans la réalité sera noyé dans le bruit
de fond après la troncature des bits de poids faible requise pour
passer de la résolution interne de 32 bits à une résolution finale de
16 bits. Il faut considérer ici que programmer une valeur
inférieure à -80 dBFS n'est ni "raisonnable" ni pertinent pour
une sortie en 16 bits (alors que cela le serait peut-être pour
une sortie en 24 bits).
Contrôle automatique du niveau global
Comme
le nombre de raies pouvant être activées simultanément est élevée et
que l'amplitude maximale de chacune
correspond à 1.000 pour 0 dBFS, il peut arriver que la somme de
toutes les raies occasionne des crêtes dépassant la valeur de 0 dBFS,
ce qui à coup sûr occasionne une distorsion plus ou moins élevée du signal de sortie.
Pour éviter ce risque, un mécanisme de réduction automatique du
niveau est activé si les amplitudes cumulées de la fondamentale et des
harmoniques
dépasse les capacités du système. Cet ajustement automatique
opère
en réduisant l'amplitude du signal par paliers
successifs de -6 dB, jusqu'à ce que le signal final
tienne dans la plage numérique 0-65535 (16 bits) et ne dépasse donc pas
la valeur de 0 dBFS.
Bien entendu, cela n'est possible qu'en effectuant
un mixage des différentes raies avec une résolution supérieure
à 16 bits, ce qui est le cas ici puisque le moteur de mélange travaille
sur 32 bits.
Remarque
: le mélange étant effectué en 32 bits alors
que
le microcontrôleur est un modèle 16 bits explique en grande partie le
temps requis pour les calculs - un microcontrôleur 32 bits serait bien
entendu plus approprié.
L'exemple
suivant montre un cas de figure où le signal crête atteint
(après mixage des raies) la valeur de +6,4 dB.
Une réduction
automatique de -6 dB s'avère insuffisante et donc une seconde
réduction automatique de
-6
dB est opérée à la suite de la première (réduction totale de
-12
dB).
L'utilisateur qui est conscient des risques peut au besoin désactiver
cette fonction automatique grâce au cavalier JP1.
Quelques exemples de configurations...
Dans les graphes qui
suivent (matériel PIC24 et DAC parallèle 16 bits) et pour une fréquence
de
restitution
des échantillons de 50 kHz, on voit que la fréquence
fondamentale est de
100 Hz et que
les harmoniques peuvent monter jusqu'au 41è rang (de H2 à 200
Hz
jusqu'à H41 à 4,1 kHz). La sortie
analogique est filtrée avec un passe-bas d'ordre 4 (24 dB/oct). En
fonction des besoins, un filtre de pente plus raide peut bien sûr être
adopté.
Fs = 50 kHz, 1 générateur (fondamentale 100 Hz, aucune
harmonique)
Fondamentale seule, harmoniques paires et impaires
d'amplitude 0.0 :
Fs = 50 kHz, 2 générateurs (fondamentale 100 Hz et
harmonique H03)
Fondamentale amplitude 0.9
+ harmonique impaire H03 d'amplitude 0.2 :
Fs = 50 kHz, 42 générateurs (100 Hz + H3..H41, harmoniques
impaires seulement)
Fondamentale, harmoniques paires d'amplitude 0.0,
harmoniques impaires d'amplitude décroissante en 1/(n²) :
Fs = 50 kHz, 20 générateurs (100 Hz + H2..H20, harmoniques paires et impaires)
Fondamentale, harmoniques paires et impaires d'amplitude
égale :
Fs = 50 kHz, 41 générateurs (100 Hz + H2..H41, harmoniques paires et impaires)
Fondamentale, harmoniques paires et impaires d'amplitude
égale :
Fs = 50 kHz, 17 générateurs (100 Hz + H2..H17, harmoniques paires et impaires)
Fondamentale,
harmoniques paires et impaires d'amplitude décroissante de -6 dB en -6
dB :
Fs = 50 kHz, 21 générateurs (100 Hz + H3..H41, harmoniques
impaires seulement)
Fondamentale, harmoniques paires d'amplitude 0.0,
harmoniques impaires d'amplitude décroissante en 1/(n*Pi) :
Affichage OLED
Un écran OLED, pilotable par une liaison série I2C (dans le cas présent
I2C2), permet d'avoir un aperçu de
l'onde sous sa forme temporelle (oscilloscope) et spectrale (raies
fondamentale et harmoniques).
Ici, j'ai choisi un écran OLED équipé d'un
contrôleur SSD1306
et de dimensions modestes (128x64 pixels) très répendu et bon marché.
Si le rendu de cet écran est assez grossier, il permet néanmoins
d'avoir une bonne idée de l'onde actuellement délivrée par le
générateur. L'amplitude des raies spectrales se fait sur une échelle log (dB), sans
indication numérique (cause manque de place).
Sauvegarde des données utilisateur
Les
valeurs d'amplitude données aux diverses raies peuvent être
sauvegardées dans une EEprom externe et être rappelées à tout moment.
Trois méthodes de sauvegarde sont possibles :
- sauvegarde
valeur en dB (de -inf à 0 dBFS, par pas de 1 dB)
occupation mémoire EEprom : 1 octet requis pour chaque raie, soit 40
octets (320 bits) pour les 40 raies
nombre de presets possibles : 128000 / 64 = 2000 (Nota 1)
- sauvegarde
valeur en dizièmes de dB (de -inf à 0 dBFS, par
pas de 0,1 dB)
occupation mémoire EEprom : 2 octets requis pour chaque raie, soit 80
octets (640 bits) pour les 40 raies
nombre de presets possibles : 128000 / 128 = 1000 (Nota 1)
- sauvegarde
valeur en taux linéaire (entre 0.000000
et 1.000000)
occupation mémoire EEprom : 4 octets requis pour chaque raie, soit 160
octets (1280 bits) pour les 40 raies
nombre de presets possibles : 128000 / 256 = 500 (Nota 1)
Nota 1
- La mémoire utilisée ici est une 25AA1024 de 1024 kb (128 kO) et
l'enregistrement des données s'effectue par paquets (par pages) de
64,128 ou 256 octets.
La
sélection du numéro de preset s'effectue avec les boutons SelUp ou
SelDown. La pression du bouton ENTER engendre la sauvegarde des valeurs
en cours dans le preset actuellement sélectionné. La pression du bouton
EXIT provoque le rappel des valeurs enregistrées dans le preset
actuellement sélectionné (les valeurs d'amplitude en cours
sont
remplacées/perdues).
Dans la version actuelle, seuls 4 presets ont été prévus.
Prototype(s)
Aucun prototype réalisé à ce jour par mes soins.
Circuit imprimé (PCB)
Non réalisé par mes soins. Vue 3D uniquement pour aperçu des composants
utilisés.
Historique
09/08/2026
- Ajout écran OLED pour affichage forme d'onde (oscilloscope et
composition spectrale).
- Ajout sauvegarde configuration utilisateur (presets) dans mémoire
externe 1 Mb (25AA1024).
-
Désormais, il est possible de désactiver le système d'ajustement
automatique du niveau de sortie général (au risque bien sûr de voir
apparaître une éventuelle distorsion).
- Désormais, le convertisseur 16 bits parallèle et le convertisseur 16
bits série peuvent être tous deux utilisés simultanément.
-
Désormais, le générateur continue de délivrer un signal durant la
période de reconstruction du tableau de valeur de l'amplitude de chaque
raie, et on peut voir l'évolution de la forme d'onde au fil de l'eau
(sur la sortie DAC parallèle uniquement).
02/08/2026
- Première mise à disposition.