Académique Documents
Professionnel Documents
Culture Documents
Projet final UE II
Rapport de projet
UE II
Auteurs : Encadrants :
30 Avril 2019
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
3 Partie Software 7
4 Pistes d’améliorations 14
0
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
1 Introduction
Ce projet final d’informatique industriel vise à utiliser nos connaisances acquises pour créer un module de
changement de voix sur la carte de développement STM32F746-DISCO. Cete carte utilise un microcontrôleur
STM32F746 muni d’un processeur ARM Cortex M7. Pour une utilisation plus pédagogique de la carte, une
extension avec différents connecteurs (potentiomètres, leds, boutons, connecteurs...) à été ajoutée (voir figure
3 et 4).
Notre objectif a été de créer un modificateur de voix temps réel, en modifiant soit le spectre du son
enregistré, soit ses caractéristiques temporelles. Le schéma de principe de la figure 1 illustre le fonctionnement
désiré du système final.
Figure 1 – Schéma de principe de l’utilisation de la carte pour la modification temps réel de la voix.
Ces difficultés ont été surmontées dans la mesure du possible, et dans la limite du temps imparti, grâce
à l’aide de nos camarades (partage de certains codes), mais également celles de M.Juton, M.Varoqui et
M.Rodet.
1
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
La carte ainsi que l’extension utilisé sont données sur les figures 3 et 4. Le micro utilisé est donné figure
5. [3].
2
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Le micro utilisé est présenté sur la figure 5, nous l’avons soudé au laboratoire à des pattes ainsi qu’a des
fils de connexions pour pouvoir l’associé à l’extension de la carte.
3
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Figure 5 – Micro utilisée pour l’acquisition de la voix. Adafruit Silicon MEMS Microphone Breakout -
SPW2430. Seuls les broches +3V , GND et la sortie AC (sortie du micro) ont été utilisées.
L’utilisation de chacun des périphériques est détaillé dans la suite. Plus précisément, nous aborderons le
fonctionnement de chacun des périphériques de la figure 6.
4
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Figure 6 – Diagramme de blocs - Hardware. Sont encadrés en rouge les périphérique utilisés pour le projet :
Un entrée GPIO pour le micro, une mémoire SDRAM, et un périphérique audio composée d’un CAN et d’un
amplificateur.
Mémoire SDRAM
La mémoire SDRAM utilisée (SDR SDRAM MT48LC4M32B2) est fabriqué par MICRON [4]. C’est une
mémoire 128 Mbits connecté à l’interface de la FMC (Flexible Memory Controller) du microcontrôleur.
Seulement les 16 bits de poids faibles (DQ0 à DQ15) sont utilisées pour communiquer avec l’interface FMC,
les 16 bits de poids fort sont mis à 0 par le biais de résistance de tirage Pull-down de 10k (il n’y a donc que
64 M-bits d’accessibles sur les 128 Mbits). C’est ce qui est illustré sur la figure 7.
5
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Périphérique AUDIO
Le périphérique audio WM8994ECS/R de CIRRUS [5] est composée de 4 DAC et 2 ADC. Nous n’avons
utilisé qu’un seul DAC communiquant avec le microcontroleur à l’aide d’une liaison série I2C via l’interface
SAI (Serial Audio Interface). La sortie du convertisseur est ensuite relié à un port stéréo Jack (CN10). Le
schéma électrique de ce périphérique est donnée sur la figure 8.
6
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Ecran LCD
Nous avons également utilisé l’écran LCD (bibliothèque LCD_DISCO_F746NG) pour afficher nos noms,
ainsi que les valeurs numériques en aval de l’ADC et en amont du DAC, et les fréquences de la FFT. Le
schéma électrique de l’écran LCD, relié au micro-contrôleur par le biais d’une liaison série I2C, et d’un
contrôleur LCD-TFT (24 bits pour le RGB, puis d’autres bits permettant de contrôler la synchronisation
verticale, horizontale etc...)
3 Partie Software
Acquisition du son
Pour effectuer des transformations sur le son, nous allons stocker ses valeur par "paquets". Ces "pa-
quets" sont stockés dans le buffer AUDIO_BUFFER_IN (uint16) de la mémoire SDRAM. Le buffer AU-
DIO_BUFFER_OUT contient quant à lui le "paquet" qui doit être envoyé au convertisseur DAC. C’est sur
ces "paquets" que nous effectuerons les opérations temporelles ou fréquentielles.
La structure de la mémoire est donéne sur la figure 10 dans la SDRAM.
7
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Figure 10 – Structure de la mémoire SDRAM utilisé, contenant les buffers AUDIO_BUFFER_IN et AU-
DIO_BUFFER_OUT.
Figure 11 – Définition des adresses mémoires correspondant aux différents buffers utilisés
La tension de sortie du micro est directement convertie sur 12 bits par l’ADC de la carte STM32F746 à
une fréquence d’échantillonnage de 30 Mhz [2] (Section 5.3.21). En pratique, pour réaliser l’acquisition de la
tension du micro, il faut indiquer dans le code que broche doit être sélectionnée pour réaliser la conversion.
Selon la documentation, le nom de la broche à indiquer dans le code est A2 (figure 12).
8
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
On réalise alors un code pour stocker les valeurs acquises par le micro dans le buffer d’entrée :
AnalogIn in ( A2 ) ;
while (1) {
for ( i =0; i < A U D I O _ B L O C K _ S I Z E ; i ++) {
(*( pinput + i ) ) = in . read () ; // a c q u i s i t i o n et r a n g e m e n t dans le buffer d ’ entr
ée
(*( poutput + i ) ) = in_value ; // envoie le son acquis au p é riph é rique AUDIO de sortie
}
}
Cependant, nous n’entendons rien en sortie. Nous avons tenté un affichage de la valeur du son acquis sur
l’écran LCD, mais la valeur renvoyée est toujours ‘0’. Nous avons donc opté pour une autre solution.
N’ayant pas réussi à faire fonctionner le micro externe, nous nous sommes rabattu sur le périphérique
AUDIO, plus simple d’utilisation. Il est initialisé comme suit.
A U D I O _ D I S C O _ F 7 4 6 N G audio ;
/* Start a c q u i s i t i o n */
audio . IN_Record (( uint16_t *) AUDIO_BUFFER_IN , A U D I O _ B L O C K _ S I ZE ) ;
/* Start e m i s s i o n */
audio . O U T _ S e t A u d i o F r a m e S l o t ( C O D E C _ A U D I O F R A M E _ S L O T _ 0 2 ) ;
audio . OUT_Play (( uint16_t *) AUDIO_BUFFER_OUT , A U D I O _ B L O C K _ S I ZE * 2) ;
9
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Pour multiplier par 2 la fréquence de la voix en temporel, on prend une valeurs acquise sur 2 dans le
buffer d’entrée, et on les recopie les unes à la suite des autres dans le buffer de sortie, mais qui sera donc à
moitié plein. On remplit alors l’autre moitié du buffer de sortie en recopiant sa première moitié. Cela a du
sens pour de petites tailles des buffers, au vu des redondances temporelles contenues dans la voix. Le code
associé est le suivant :
Les librairies arm_math.h et arm_const_structs.h nous ont permis de calculer les tranformée de Fourier
du son enregistré dans le buffer AUDIO_BUFFER_IN. Les caractéristiques du calcul de la FFT sont données
dans le code suivant :
10
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Disposant de la FFT du signal, nous avons essayé de modifier le spectre en effectuant une translation
de celui-ci. C’est-à-dire que l’on réalise cette opération :
fsignal de sortie = fsignal d’entrée + α (1)
Le code suivant illustre la manière de procéder pour faire cette transposition en fréquence.
/* On s ’ occupe d ’ abord des fr é quences pr é sentes dans le premier quart du bloc ’ fftOUT ’, qui
c o r r e s p o n d e n t à la partie r é elle du spectre */
11
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
permettent d’insérer du texte ou des formes géométrique sur l’écran aux positions désirées. On utilise ces
librairies pour représenter les spectres des différents signaux sur l’écran LCD :
On trace alors les spectres pour différentes valeurs du paramètre T ransposition sur les figures 21, 22, 23
et 24.
12
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Les spectres observés correspondent à l’opération voulue. Cependant, le résultat sonore est désagréable :
nous pensons que l’opération réalisée n’est pas correcte : il faudrait plutôt effectuer une multiplication de
la fréquence du signal plutôt qu’une translation.
On utilise de nouveau un T ransposition réglant le coefficient multiplicatif. Voici le code permettant de réaliser
cette multiplication :
// partie p o s i t i v e
*( fftOUT2 + j ) =*( fftOUT + i ) ;
// partie n é gative
*( fftOUT2 - j + A U DI O _ B L O C K _ S I Z E /4) =*( fftOUT - i + A U D I O _ B L O C K _ SI Z E /4) ;
/* Partie i m a g i n a i r e du spectre */
// partie p o s i t i v e
*( fftOUT2 + j + A U DI O _ B L O C K _ S I Z E /4) =*( fftOUT + i + A U D I O _ B L O C K _ SI Z E /4) ;
// partie n é gative
*( fftOUT2 - j + A U DI O _ B L O C K _ S I Z E /2) =*( fftOUT - i + A U D I O _ B L O C K _ SI Z E /2) ;
}
}
Les résultats sont exposés sur les figures 26, 27, 28 et 29.
13
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Le rendu est légèrement meilleur, notamment pour des transpositions en fréquence élevées (on distingue
mieux la voix lorsqu’elle est aiguë). Il reste des améliorations à concevoir.
4 Pistes d’améliorations
La qualité du son renvoyé par la carte est loin d’être satisfaisant. Pour corriger ces problèmes, on pourrait
envisager de :
— traiter le signal par fenêtre glissante plutôt que par paquets
— mettre au point des techniques de calcul plus efficaces (notamment ne pas avoir à attendre la fin de
toute la conversion pour commencer les calculs, ce qui rejoint le traitement par fenêtre glissante)
14
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Conclusion
Conclusion technique
Les principales difficultées rencontrées sont les suivantes :
1. LA conversion des uint16 en contenues dans le BUFFER_AUDIO_IN en float, afin de calculer la FFT
des échantillons à été une difficulté vite résolue puisqu’en C il est possible de convertir dirrectement
une variable lors de sa première allocation mémoire.
2. L’utilisation de la bibliothèque arm_math pour calculer la transformée de Fourrier des échantillons
du BUFFER_AUDIO_IN. en effet nous ne savions pas comment était stocké le résultat de la FFT,
et si le calcul de la FFT inverse donnait le bon résultat. Pour résoudre ce problème, nous avons affiché
la FFT sur l’écran LCD, et nous avons utilisés un son provenant d’un diapason avec une harmonique
à la fréquence 440Hz pour tester les différentes fonctions liées au calcul de la FFT.
3. Nous avons utilisé quelques bibliothèques ainsi que quelques parties de code tirés d’exemples fournis
par mbed, ce qui rend parfois compliqué la compréhension clair de la gestion de l’acquisition et de
la mémorisation des échantillons. Par exemple, la convertion analogique-numérique se fait en deux
parties initialement : on attendait que la moitié du BUFFER_AUDIO_IN soit remplie avant de le
copier dans BUFFER_AUDIO_OUT par exemple. Notre hypothèse pour expliquer ce phénomène est
la suivante : afin de ne pas "louper" l’acquisition de certains échantillons en entrée du convertisseur, il
ne faut pas attendre que la totalité du BUFFER_AUDIO_IN soit remplie avant de le copier dans le
BUFFER_AUDIO_OUT.
Conclusion professionnelle
1. Une bonne compréhension du hardware est indispensable avant de se lancer dans la programmation.
En effet, les types de connexions entre les périphériques et la carte, la gestion de la mémoire, les ca-
ractéristiques techniques de la carte (présence de certains périphériques, type d’informations échangés
...) conditionne la manière de programmer la carte. Une bonne lecture du manuel utilisateur [1] est
donc indispensable.
2. L’utilisation de mbed facilite énormément le travail de programation : la possibilité de partager son
code, l’accès à des exemples précis, et la rapidité avec laquelle le code est téléversé sur la carte permet
une évolution rapide du projet.
3. Parmi les connaissances et compétences acquises, nous pouvons citer la gestion physique de la mémoire
(SDRAM), l’utilisation des convertisseurs ADC et DAC pour le son, et le calcul de la FFT d’un son
en vu de sa modification.
4. Finalement, nous avons appris des exemples simple de modification de la voix en temporelle et en
fréquentielle.
15
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
16
ENS Paris-Saclay UE II Changement de voix
2018-2019 Projet final UE II
Références
[1] STMicroelectronics, User Manual pin connection, Discovery kit for STM32F7 Series with STM32F746NG
MCU https://www.st.com/content/ccc/resource/technical/document/user_manual/f0/14/
c1/b9/95/6d/40/4d/DM00190424.pdf/files/DM00190424.pdf/jcr:content/translations/en.
DM00190424.pdf
[2] STMicroelectronis, Datasheet STM32F746 https://www.st.com/resource/en/datasheet/
stm32f746ng.pdf
[3] Adafruit, Datasheet Adafruit-SPW2430-PCB https://github.com/adafruit/Adafruit-SPW2430-PCB
[4] MICRON, Datasheet SDR SDRAM MT48LC4M32B2 https://www.mouser.fr/datasheet/2/671/
128mb_x32_sdram-1282359.pdf
[5] CIRRUS LOGIC , Multi-channel Audio Hub CODEC for Smartphones https://www.mouser.fr/
datasheet/2/76/WM8994_v4.5-1141776.pdf
17