Electronique > Réalisations > Générateurs > Générateur audio 021x - Pro

Dernière mise à jour : 17/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). 
   
gene_audio_021x_pcb_3d_front
   
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.
   
gene_audio_021x
   
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 :
gene_audio_021x_graph_par-16b_ser-16b_001a
   

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

Inconvénients


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).
   
gene_audio_021x_disp_001a gene_audio_021x_disp_001b gene_audio_021x_disp_001c gene_audio_021x_disp_001d

3 modes d'affichage sont proposés :

gene_audio_021x_disp_003z gene_audio_021x_disp_003y gene_audio_021x_disp_003x
gene_audio_021x_disp_003a gene_audio_021x_disp_003b gene_audio_021x_disp_003c

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.

Remarques
- la réduction par palier de -6 dB permet de moins déteriorer le signal qu'un procédé de "normalisation" qui chercherait à placer le niveau crête max au plus proche du 0 dBFS.
- 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).
   
gene_audio_021x_disp_002a gene_audio_021x_disp_002b gene_audio_021x_disp_002c
   
L'utilisateur qui est conscient des risques peut au besoin désactiver cette fonction automatique grâce au cavalier JP1. Si le niveau général dépasse le plafond de 0 dBFS et que le système de régulation automatique du niveau est désactivé, la LED OVL (Overload) s'allume.
   
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 :
gene_audio_021x_graph_50k_42v_c

   

Fs = 50 kHz, 2 générateurs (fondamentale 100 Hz et harmonique H03) 
Fondamentale amplitude 0.9 + harmonique impaire H03 d'amplitude 0.2 :
gene_audio_021x_graph_50k_2v

   

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²) :
gene_audio_021x_graph_50k_42v_b

   

Fs = 50 kHz, 20 générateurs (100 Hz + H2..H20, harmoniques paires et impaires
Fondamentale, harmoniques paires et impaires d'amplitude égale :
gene_audio_021x_graph_50k_20v

   

Fs = 50 kHz, 41 générateurs (100 Hz + H2..H41, harmoniques paires et impaires
Fondamentale, harmoniques paires et impaires d'amplitude égale :
gene_audio_021x_graph_50k_41v

   

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 :
gene_audio_021x_graph_50k_17v

   

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) :
gene_audio_021x_graph_50k_42v

   

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). 
   
gene_audio_021x_oled_001a gene_audio_021x_oled_001b gene_audio_021x_oled_001c gene_audio_021x_oled_001d
   
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é.

Affichage sous forme temporelle (oscilloscope)
La visualisation de la forme de l'onde se fait avec une faible résolution à cause du format adopté pour l'écran OLED, seuls 32 pixels sont utilisés pour la pleine échelle verticale. Si le rendu 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.
 
gene_audio_021x_oled_002aa gene_audio_021x_oled_002ab gene_audio_021x_oled_002ba gene_audio_021x_oled_002bb
 
L'utilisateur peut choisir si la largeur de l'écran doit contenir une ou deux périodes du signal.

Affichage sous forme spectrale
L'amplitude des raies spectrales se fait sur une échelle log (dB), sans indication numérique (cause manque de place). L'utilisateur peut choisir la plage dynamique des raies : 32 dB, 64 dB ou 96 dB. 
 
gene_audio_021x_oled_003aa gene_audio_021x_oled_003ab gene_audio_021x_oled_003ac
 
Bien sur, avec aussi peu de pixels à disposition pour la résolution verticale, on ne peut pas faire de miracle. Là encore, il s'agit juste de donner une idée grossière du contenu spectral.

   

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 :
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.

gene_audio_021x_disp_004a gene_audio_021x_disp_004b

La sélection du numéro de preset s'effectue avec les boutons SelUp ou SelDown. La pression du bouton ENTER engendre la sauvegarde (Save) des valeurs en cours dans le preset actuellement sélectionné. La pression du bouton EXIT provoque le rappel (Load) des valeurs enregistrées dans le preset actuellement sélectionné (les valeurs d'amplitude en cours sont remplacées/perdues).

Dans la version actuelle, 5 presets seulement sont implémentés :
- Preset 0 - accessible en écriture et lecture depuis la page principale et depuis les pages de réglage d'amplitude des raies
- Presets 1 à 4 - uniquement accessibles en écriture et lecture depuis les menus dédiés "Preset".

Afin de limiter le risque de sauvegarde ou de rappel accidentel d'un preset, la durée de la pression sur les boutons ENTER (Save) et Rappel (Load) doit être plus longue que pour les autres fonctions (durée minimale de 1 seconde). Une pression brève du bouton EXIT permet à tout moment de revenir au menu principal.

Un clavier externe comportant 16 touches peut également être raccordé sur le PORT E du PIC, pour rappel instantané des presets ou pour autre usage futur (extension non prévue actuellement). Actuellement, seul le rappel des 5 presets déjà implémentés est possible avec ce clavier additionnel.

   

Autres fréquences possibles ?

Si le présent générateur a été initialement conçu pour une fréquence fondamentale fixe de 100 Hz, il lui est possible de travailler à une fréquence fondamentale de 50 Hz, 64 Hz, 80 Hz, 100 Hz, 125 Hz, 128 Hz, 160 Hz ou 200 Hz avec des performances similaires. A 200 Hz, la 41è harmonique passe à 8,2 kHz, ce qui reste tout à fait correct avec une fréquence de restitution des échantillons de 50 kHz. 

En conservant le principe de fonctionnement utilisé, d'autres fréquences intermédiaires comprises entre 50 Hz et 200 Hz sont également utilisables, à condition d'accepter une baisse de la précision et de la stabilité de fréquence. Par exemple, en acceptant une précision de 1% au lieu de 0,01%, les fréquences suivantes peuvent être utilisées : 54 Hz, 55 Hz, 56 Hz, 58 Hz, 59 Hz, 63 Hz, 66 Hz, 67 Hz, 68 Hz, 72 Hz, 73 Hz, 76 Hz, 83 Hz, 84 Hz, 85 Hz, 93 Hz, 96 Hz, 98 Hz, 99 Hz, 104 Hz, 108 Hz, 109 Hz, 112 Hz, 113 Hz, 116 Hz, 117 Hz, 118 Hz, 124 Hz, 126 Hz, 177 Hz, 181 Hz, 199 Hz. 

   

Prototype

Aucun prototype physique 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

17/08/2026
- Ajout clavier 16 touches pour rappel rapide de presets et pour saisie directe des valeurs d'amplitude des raies.
- Ajout sortie Trigger pour synchro ou comptage externe.
- Ajout LED OVL (Overload). Cette LED s'allume si un dépassement du 0 dBFS est détecté et que la fonction de réduction automatique du niveau général est désactivée.
- Ajout choix affichage de une ou deux périodes dans la zone oscilloscope de l'écran OLED.
- Ajout choix affichage de la plage dynamique des raies spectrales sur l'écran OLED.
- Désormais, les niveaux d'amplitude saisis pour les diverses raies conservent leur valeur initiale quand une réduction automatique de niveau à lieu (pas de changement sur les valeurs affichées sur l'écran LCD).
- Correction bug sauvegarde Preset n°4 (les données n'étaient pas stockées au bon endroit dans l'EEprom).

09/08/2026
- Ajout écran OLED pour affichage forme d'onde (vue temporelle/oscilloscope et composition spectrale).
- Ajout sauvegarde configuration utilisateur (presets) dans mémoire externe 1 Mb (EEprom 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.