Procesador de audio con STM32
STMicroelectronics (ST) acaba de lanzar una nueva entrada en su línea ARM Cortex-M7 de alto rendimiento, el STM32H735, disponible exclusivamente a través de DigiKey en el transcurso de 30 días a partir de su lanzamiento. Cuando llegan nuevos lanzamientos como este a mi escritorio, me gusta incluirlos en un pequeño proyecto que incorpore múltiples características. Para este blog, elegí investigar los distintos periféricos de audio y mostrar los resultados usando el kit de descubrimiento STM32H735G-DK. Para obtener una breve descripción general del kit y una demostración inmediata, vea el video de uno de mis colegas a continuación.
Captura de sonido
El STM32H735G tiene dos SAI (interfaz de audio en serie) dedicadas que ofrecen mucha flexibilidad. Cada SAI tiene dos subbloques que se pueden configurar de forma independiente como maestro o secundario y como transmisor o receptor para comunicación de tipo I2S. Alternativamente, pueden proporcionar un reloj para micrófonos PDM y convertir la salida a PCM.
Otros periféricos del dispositivo también pueden utilizarse para audio. Se pueden configurar cuatro de las interfaces SPI del dispositivo para I2S. El filtro sigma-delta integrado (DFSDM) también puede manejar la conversión para micrófonos PDM en lugar de las SAI.
En el kit de descubrimiento, se pueden ver en acción las dos configuraciones de SAI mencionadas anteriormente. Una de las SAI está conectada a través de I2S a un códec Cirrus Logic WM8994. Con el códec, el audio se recibe a través del puerto de entrada de línea y se reproduce a través del jack de auriculares o las salidas de los altavoces amplificados. La segunda SAI funciona en modo PDM y está conectada directamente al micrófono integrado.
ST proporciona un proyecto de muestra BSP en el marco STM32CubeMX para iniciar los desarrollos con estos periféricos de audio rápidamente. El proyecto contiene controladores de bajo nivel para los periféricos y controladores de nivel superior para las características del kit de descubrimiento, como el códec de audio. Por ejemplo, configurar la entrada de audio desde el conector de línea de entrada utilizando los controladores BSP es muy sencillo:
Copiar
#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);
Uso de ARM CMSIS-DSP
Si ya realizó desarrollos con ARM, lo más probable es que conozca el CMSIS (estándar de interfaz de software de microcontrolador Cortex). De lo contrario, es una capa de abstracción de hardware con código que es consistente en diferentes implementaciones de ARM Cortex. En este caso, estoy interesado en la biblioteca CMSIS-DSP, que contiene funciones comunes de procesamiento de señales que están optimizadas para la arquitectura ARM.
Para mí, la forma más sencilla de incorporar las bibliotecas CMSIS fue directamente desde la fuente. El repositorio CMSIS completo se puede clonar desde GitHub de ARM, pero solo los directorios CMSIS/DSP/Include y CMSIS/DSP/Include deben agregarse a su proyecto ST para comenzar. Generalmente, estos deben copiarse en el directorio Drivers/CMSIS en la estructura predeterminada del proyecto.
Hay dos ajustes rápidos del proyecto que hacer antes de compilar. Primero, agregue el nuevo directorio CMSIS/DSP/Include en las rutas de inclusión del proyecto. El encabezado arm_math.h que se encuentra allí es lo que incluirá en su aplicación para acceder a las funciones de DSP.
En segundo lugar, hay dos #definiciones que utiliza la biblioteca DSP para obtener información sobre la arquitectura del hardware: __FPU_PRESENT y ARM_MATH_CM7. Encontré que la forma más fácil de asegurarme de que se encuentren es agregarlos a los símbolos globales del proyecto como se muestra a continuación.
Figura 1. Definiciones de símbolos del proyecto.
Después de eso, calcular una FFT solo toma unas pocas líneas:
Copiar
#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);
Reunir todo
Con la FFT calculada, es bueno ver los resultados gráficamente. La siguiente función combina funciones de los controladores ST BSP y la biblioteca CMSIS-DSP para dibujar un gráfico minimalista de estilo visualizador en la pantalla del kit de descubrimiento.
Figura 2. Visualizador mostrado en el kit de descubrimiento.
Copiar
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);
}
}
Conclusión
El STM32H735 es un potente microcontrolador con un montón de funciones integradas, especialmente para aplicaciones multimedia y de procesamiento de señales. DigiKey es el distribuidor exclusivo del producto hasta fin de mes, así que revise nuestro sitio web si le parece adecuado para su próximo proyecto.
Have questions or comments? Continue the conversation on TechForum, Digi-Key's online community and technical resource.
Visit TechForum


Taylor Roorda, ingeniero de aplicaciones asociado de DigiKey, se unió a la organización en 2015 y sus principales áreas de interés son los sistemas integrados, la lógica programable y el procesamiento de señales. Tiene una licenciatura en Ingeniería Eléctrica de la Universidad Estatal de Dakota del Norte y pasa su tiempo libre tocando la guitarra y escribiendo música.


