Traitement audio avec STM32
STMicroelectronics (ST) vient d'ajouter un nouveau produit à sa gamme ARM Cortex-M7 hautes performances : le STM32H735, disponible exclusivement chez DigiKey pendant les 30 premiers jours de son lancement. Lorsque je reçois ce genre de nouveautés, j'aime bien les utiliser dans un petit projet qui intègre de multiples fonctionnalités. Dans le cadre de ce blog, j'ai choisi d'étudier les différents périphériques audio et d'afficher les résultats à l'aide du kit de découverte STM32H735G-DK. Pour voir une brève présentation du kit et une démonstration d'utilisation, regardez la vidéo de l'un de mes collègues ci-dessous.
Capture du son
Le STM32H735G est doté de deux interfaces audio série (SAI) dédiées qui offrent une grande flexibilité. Chaque SAI dispose de deux sous-blocs qui peuvent être configurés indépendamment comme maître ou esclave et comme émetteur ou récepteur pour la communication de type I2S. Ils peuvent également fournir une horloge pour les microphones PDM et convertir la sortie en PCM.
Les autres périphériques du dispositif peuvent aussi être reconfigurés pour l'audio. Quatre des interfaces SPI du dispositif peuvent être configurées pour I2S. Le filtre Sigma-Delta (DFSDM) embarqué peut aussi gérer la conversion des microphones PDM à la place des SAI.
Dans le kit de découverte, les deux configurations SAI mentionnées ci-dessus peuvent être observées en action. L'une des interfaces SAI est connectée via I2S à un codec WM8994 de Cirrus Logic. Grâce au codec, le son est reçu via le port Line In et restitué via le jack de casque ou les sorties haut-parleurs amplifiées. La deuxième SAI fonctionne en mode PDM et est connectée directement au microphone embarqué.
ST fournit un projet d'exemple BSP dans la structure STM32CubeMX pour commencer rapidement le développement avec ces périphériques audio. Le projet contient des pilotes de bas niveau pour les périphériques et des pilotes de niveau supérieur pour les fonctionnalités du kit de découverte comme le codec audio. Par exemple, la configuration de l'entrée audio à partir du connecteur Line In à l'aide des pilotes BSP est très simple :
Copier
#define BUFFER_SIZE 2048
int16_t audio_buffer[BUFFER_SIZE]
BSP_AUDIO_Init_t AudioInInit;
/* Initialize audio interface to use line in port for input */
AudioInInit.Device = AUDIO_IN_DEVICE_ANALOG_LINE1;
AudioInInit.ChannelsNbr = 2;
AudioInInit.SampleRate = 44100;
AudioInInit.BitsPerSample = AUDIO_RESOLUTION_16B;
AudioInInit.Volume = 80;
/* Initialize audio in on Instance 0 (SAI I2S) */
BSP_AUDIO_IN_Init(0, &AudioInInit);
/* Start DMA recording into buffer */
BSP_AUDIO_IN_Record(0, (uint8_t *) audio_buffer, 2* BUFFER_SIZE);
Utilisation d'ARM CMSIS-DSP
Si vous avez déjà développé avec ARM, vous connaissez probablement la norme CMSIS (Cortex Microcontroller Software Interface Standard). Dans le cas contraire, il s'agit d'une couche d'abstraction matérielle dont le code est commun aux différentes implémentations ARM Cortex. Dans le cas présent, je m'intéresse à la bibliothèque CMSIS-DSP qui contient des fonctions de traitement des signaux courantes optimisées pour l'architecture ARM.
Pour moi, la manière la plus simple d'incorporer les bibliothèques CMSIS était de le faire directement à la source. Le référentiel CMSIS complet peut être cloné à partir de la plateforme GitHub d'ARM, mais seuls les répertoires CMSIS/DSP/Include et CMSIS/DSP/Include doivent être ajoutés à votre projet ST pour démarrer. Généralement, il faut les copier dans le répertoire Drivers/CMSIS de la structure du projet par défaut.
Il y a deux ajustements rapides à faire avant la compilation. Tout d'abord, vous devez ajouter le nouveau répertoire CMSIS/DSP/Include dans les chemins d'inclusion du projet. L'en-tête arm_math.h présent est ce que vous allez inclure dans votre application afin d'accéder aux fonctions DSP.
Ensuite, la bibliothèque DSP utilise deux éléments #defines pour les informations relatives à l'architecture matérielle : __FPU_PRESENT et ARM_MATH_CM7. Le moyen le plus simple pour s'assurer qu'ils sont accessibles consiste à les ajouter aux symboles du projet global comme indiqué ci-dessous.
Figure 1 : Définitions des symboles du projet.
Après cela, il suffit de quelques lignes supplémentaires pour calculer une FFT :
Copier
#include “arm_math.h”
#define FFT_SIZE 256
arm_rfft_fast_instance_f32 fft_inst;
float32_t fft_in[FFT_SIZE], fft_out[FFT_SIZE];
float32_t fft_mag[FFT_SIZE>>1];
/* Initialize ARM FFT instance with num points */
arm_rfft_fast_init_f32(&fft_inst, FFT_SIZE);
/* Fill the fft_in buffer from Line In or Microphone input */
/* Perform forward direction 32-bit FFT */
arm_rfft_fast_f32(&fft_inst, fft_in, fft_out, 0);
/* Calculate magnitude (buffer size is half because real + imag parts are merged) */
arm_cmplx_mag_f32(fft_out, fft_mag, FFT_SIZE >> 1);
Mise en application
Avec la FFT calculée, vous pouvez voir les résultats sous forme graphique. La fonction ci-dessous combine les pilotes BSP de ST et la bibliothèque CMSIS-DSP pour dessiner un graphique minimaliste de type visualiseur sur l'écran du kit de découverte.
Figure 2 : Visualiseur affiché sur le kit de découverte.
Copier
static void Display_FFT(float32_t *fft_mag)
{
uint8_t i;
float32_t max_val;
uint32_t max_idx;
uint32_t box_height;
uint8_t box_width = 2;
/* Draw horizontal axis */
UTIL_LCD_FillRect(10, 135, 460, 2, UTIL_LCD_COLOR_WHITE);
/* Use max value in the results for scale */
arm_max_f32(fft_mag, FFT_SIZE >> 1, &max_val, &max_idx);
/* Draw frequency bins */
for(i = 0; i < 230; i++)
{
box_height = 100 * (fft_mag[i] / max_val);
UTIL_LCD_FillRect(10 + box_width*i, 135, box_width, box_height, UTIL_LCD_COLOR_WHITE);
}
}
Conclusion
Le STM32H735 est un puissant microcontrôleur doté de nombreuses fonctionnalités intégrées, notamment pour les applications multimédias et de traitement des signaux. DigiKey est le distributeur exclusif de ce produit jusqu'à la fin du mois, alors consultez sans attendre notre site Web pour savoir s'il convient à votre prochain projet.

Have questions or comments? Continue the conversation on TechForum, DigiKey's online community and technical resource.
Visit TechForum