procesamiento digital de señales

15 jul. 2016 - hardware abierto del microcontrolador STM32 F4. 3 ACTIVIDADES. Figura 1. Sistema para digitalización del sonido y cálculo de su tono.
2MB Größe 117 Downloads 247 vistas
15 de julio del 2016

PROCESAMIENTO DIGITAL DE SEÑALES

DETECCIÓN DEL TONO FUNDAMENTAL MEDIANTE DFT NRC: 2687

CHICAIZA ANTHONY GANCINO KATHERYNE

PROCESAMIENTO DIGITAL DE SEÑALES

1 INTRODUCCIÓN En el presente trabajo se ejecutan los procedimientos y operaciones aprendidos con anterioridad para la detección del tono fundamental de una señal de audio mediante plataformas de hardware, es decir que debe implementarse en un microcontrolador de hardware abierto que en este caso específico es el STM32 F4.

2 OBJETIVO Familiarizar al estudiante con la utilización de la DFT y su aplicación en la detección del tono fundamental de una señal de audio mediante plataformas de hardware incrustadas como es el caso de la plataforma de hardware abierto del microcontrolador STM32 F4.

3 ACTIVIDADES

Figura 1. Sistema para digitalización del sonido y cálculo de su tono. El micrófono está conectado a través de un pre-amplificador a la entrada del conversor A/D (i.e., a cualquier entrada analógica del microcontrolador STM32 F4). Note que dicho pre-amplificador normalmente requiere la incorporación de un filtro pasa-bajos. La tarjeta STM32 F4 debe parametrizar el muestreo de la señal de voz a frecuencias configurables por software. Incluir la parametrización necesaria para frecuencias de muestreo entre 2 y 20 KHz, con pasos de 2 KHz al menos. La señal de voz muestreada deberá ser convertida a su representación en el dominio de la frecuencia utilizando una DFT de tamaño adecuado y determinar cuál es su componente principal la cual en forma simplificada puede ser asociada al tono fundamental de la señal de entrada. El valor del tono fundamental de la señal debe ser enviada al computador usando comunicación serial para su visualización correspondiente. Una variación interesante sería la visualización del valor del tono en un display LCD. Buscar programas en Matlab que permitan determinar el tono fundamental de una señal de voz y compararlo con el calculado a través de la implementación en el microcontrolador.

Página 2

PROCESAMIENTO DIGITAL DE SEÑALES

4 MATERIALES, EQUIPOS Y CIRCUITOS    

Microcontrolador STM32 F4 Discovery Modulo micrófono para el microcontroador Display LCD Potenciómetro



Cables para conexión

5 DESCRIPCIÓN TEÓRICA DE LOS EQUIPOS Y CIRCUITOS

5.1

MÓDULO MICRÓFONO

Las ondas de sonido son pequeños cambios en la presión del aire. Un micrófono es el transductor encargado de convertir esa onda en una señal eléctrica medible, análoga a el sonido que se quiere medir. Sin embargo, la señal obtenida del micrófono debemos amplificarla, para eso usualmente esta función se implementa mediante un amplificador operacional, en nuestro caso utilizaremos un módulo de micrófono que ya incluye dicho amplificador. Como se indica en la fig.2.

Figura 2. Diagrama del módulo de micrófono En este módulo se obtiene una señal que es representación de la señal de audio medida por el micrófono, pero, como indicamos arriba con niveles de voltaje apropiados para ser capturados por el microcontrolador.

Página 3

PROCESAMIENTO DIGITAL DE SEÑALES

5.2

Microcontrolador STM32 F4 Discovery

Figura 3. Microcontrolador STM32F4DISCOVERY El kit STM32F4DISCOVERY descubrimiento permite a los usuarios desarrollar fácilmente aplicaciones con los microcontroladores STM32F407 de alto rendimiento con ARM Cortex -M4 núcleo de 32 bits. Incluye todo lo necesario, ya sea para principiantes o para los usuarios experimentados para obtener rápidamente resultados óptimos.

Página 4

PROCESAMIENTO DIGITAL DE SEÑALES

Sobre la base de la STM32F407VGT6, incluye un ST-LINK / V2 o ST LINK-/ V2 A-herramienta incrustada de depuración, dos acelerómetros digitales ST MEMS, un micrófono digital, un DAC de audio con la clase integrada conductor D altavoz, LEDs y botones y un conector micro-USB OTG AB.

Características principales                     

Microcontrolador STM32F407VGT6 que ofrece 32 bits ARM Cortex ® -M4 con núcleo de FPU, 1 Mbyte de memoria flash, memoria RAM de 192 Kbytes en un paquete LQFP100 A bordo ST-LINK / V2 en STM32F4DISCOVERY o ST-LINK / V2-A en STM32F407G-DISC1 ARM ® ™ habilitado para mbed (http://mbed.org) con ST-Link sólo V2-A / ST-LINK USB con capacidad de re-enumeración y tres interfaces diferentes: puerto com virtual (con ST-LINK / V2-A) almacenamiento masivo (con ST-LINK / V2-A) puerto de depuración alimentación de la tarjeta: a través del bus USB o desde una tensión externa de alimentación de 5 V aplicación externa de energía de suministro: 3 V y 5 V LIS302DL o LIS3DSH ST MEMS acelerómetro de 3 ejes MP45DT02 ST MEMS sensor de audio de micrófono digital omnidireccional DAC de audio con CS43L22 integrado de clase D controlador del altavoz Ocho LEDs: LD1 (rojo / verde) para la comunicación USB LD2 (rojo) de 3,3 V de encendido Cuatro LED de usuario, LD3 (naranja), LD4 (verde), LD5 (rojo) y LD6 (azul) 2 USB OTG LED LD7 (verde) VBUS y LD8 (rojo) sobrecorriente Dos pulsadores (usuario y reset) FS USB OTG con micro-AB conector Cabecera de extensión para todos LQFP100 E / S para la conexión rápida de placa de prototipo y fácil de sondeo Software libre integral que incluye una variedad de ejemplos, parte del paquete STM32CubeF4 o STSWSTM32068 para el uso de las bibliotecas estándar legado

Página 5

PROCESAMIENTO DIGITAL DE SEÑALES

6 IMPLEMENTACIÓN Y DESARROLLO

6.1

DESARROLLO DEL SOFTWARE

Una vez instalado el software de Keil uVision5, que es el indicado para programar y ejecutar los comando para el microprocesador STM32F4DISCOVERY es necesario implementar un el código para realizar el programa, el cual se lo indica a continuación:

/** * Keil project example for FFT and LCD * * Before you start, select your target, on the right of the "Load" button * * @ide

Keil uVision 5

* @conf PLL parameters are set in "Options for Target" -> "C/C++" -> "Defines" * @packs STM32F4xx/STM32F7xx Keil packs are requred with HAL driver support * @stdperiph STM32F4xx/STM32F7xx HAL drivers required * *

Notes:

* - Under "Options for target" > "C/C++" > "Define" you must add 2 defines (I've already add them): *

- ARM_MATH_CM4 or ARM_MATH_CM7

*

- __FPU_PRESENT=1

*/ /* Include core modules */ #include "stm32fxxx_hal.h" /* Include my libraries here */ #include "defines.h" #include "tm_stm32_disco.h" #include "tm_stm32_delay.h" #include "tm_stm32_fft.h" #include "tm_stm32_adc.h" #include "tm_stm32_hd44780.h" #include "tm_stm32_usart.h" /* Rectangle for custom character */ /* xxx means doesn't care, lower 5 bits are important for LCD */ uint8_t customChar[] = { 0x1F, /*

xxx 11111 */

0x11, /*

xxx 10001 */

Página 6

PROCESAMIENTO DE SEÑALES 0x11, /* xxx 10001DIGITAL */ 0x11, /*

xxx 10001 */

0x11, /*

xxx 10001 */

0x11, /*

xxx 10001 */

0x11, /*

xxx 10001 */

0x1F

xxx 11111 */

/*

}; /* Include arm_math.h mathematic functions */ #include "arm_math.h" /* FFT settings */ #define SAMPLES party and 256 imaginary parts */

(512)

/* 256 real

#define FFT_SIZE (SAMPLES / 2) /* FFT size is always the same size as we have samples, so 256 in our case */ //#define FFT_BAR_MAX_HEIGHT LCD */

120

/* 120 px on the

/* Global variables */ float32_t Input[SAMPLES]; FFT_SIZE */

/*!< Input buffer is always 2 *

float32_t Output[FFT_SIZE]; /*!< Output buffer is always FFT_SIZE */ /*!< FFT structure */ TM_FFT_F32_t FFT; /* Temporary sinus value */ float32_t sin_val; /* Result value */ uint16_t result; uint16_t result2; /* Array for string */ char str[50]; int main(void) { uint32_t i = 0, freq = 0; /* Init system clock for maximum system speed */ TM_RCC_InitSystem(); /* Init HAL layer */ HAL_Init();

Página 7

/*PROCESAMIENTO Delay init */

DIGITAL DE SEÑALES

TM_DELAY_Init(); /* Init ADC1 channel 1 = PA1 */ TM_ADC_Init(ADC1, TM_ADC_Channel_1); /* Initialize LCD 16 cols x 2 rows */ TM_HD44780_Init(16, 2); /* Save custom character on location 0 in LCD */ TM_HD44780_CreateChar(0, customChar); /* Put string to LCD */ TM_HD44780_Puts(0, 0, "STM32F4 "); TM_HD44780_Puts(2, 1, "20x4 HD4478"); /* Init FFT, FFT_SIZE define is used for FFT_SIZE, samples count is FFT_SIZE * 2, don't use malloc for memory allocation */ TM_FFT_Init_F32(&FFT, FFT_SIZE, 0); /* We didn't used malloc for allocation, so we have to set pointers ourself */ /* Input buffer must be 2 * FFT_SIZE in length because of real and imaginary part */ /* Output buffer must be FFT_SIZE in length */ TM_FFT_SetBuffers_F32(&FFT, Input, Output); /* Reset counter */ TM_DELAY_SetTime(0); /* Init USART, TX: PC6, RX: PC7, 921600 bauds */ TM_USART_Init(USART2, TM_USART_PinsPack_1, 115200); /* Put test string */ TM_USART_Puts(USART2, "Hello world\n"); while (1) { /* Let's fake sinus signal with 5, 15 and 30Hz frequencies */ do { /* Read values from ADC, 12 bit result is returned */ result = TM_ADC_Read(ADC1, TM_ADC_Channel_1); sin_val = result; //

Delay(80); Delay(200); i++; } while (!TM_FFT_AddToBuffer(&FFT, sin_val));

Página 8

PROCESAMIENTO DE SEÑALES /* Do FFT on DIGITAL signal, values at each bin and calculate max value and index where max value happened */ TM_FFT_Process_F32(&FFT); //

result = 12500/256*TM_FFT_GetMaxIndex(&FFT); result = 5000/FFT_SIZE*TM_FFT_GetMaxIndex(&FFT); /* Format string */ sprintf(str, "F= %5d Hz\n\r", result); /* Put test string */ TM_USART_Puts(USART2, str);

/* Clear LCD */

TM_HD44780_Clear(); TM_HD44780_Puts(0, 0, str); /* Increase frequency */ freq++; /* Check value */ if (freq > 100) { freq = 0; } /* Little delay */ Delayms(1000); } }

Página 9

PROCESAMIENTO DIGITAL DE SEÑALES

7 VERIFICACIÓN MEDIANTE MATLAB DEL TONO FUNDAMENTAL DE UNA SEÑAL DE AUDIO MEDIANTE EL MICROCONTROLADOR

En este proyecto se usará el audio de las notas musicales como las señales de audio, a continuación, se dará a conocer una tabla con las notas musicales y sus respectivas frecuencias:

Figura 4. Tabla de las frecuencias de las notas musicales

Para este procedimiento que consta en calcular la frecuencia fundamental de las notas musicales mediante el software Matlab, hay que usar audios de las notas musicales en formato “.wav” que permite Matlab, a continuación, se menciona el código que se usó en Matlab para determinar las frecuencias fundamentales de cada nota musical: [y fs]=wavread('DO_S.wav'); sound (y,fs); figure(1) plot(y) Fs=fs/2 L=length (y)/2 NFFT = 2^nextpow2(L);

Página 10

PROCESAMIENTO DIGITAL DE SEÑALES

Y = fft(y,NFFT)/L; f = Fs/2*linspace(0,1,NFFT/2+1); figure (2) plot(f,2*abs(Y(1:NFFT/2+1))) xlim([150 560]) title('Single-Sided Amplitude Spectrum of y(t)') xlabel('Frequency (Hz)') ylabel('Y(f)')

Además, se tiene cada nota musical en formato “.wav” que se la llamará en cada programa de Matlab:

Figura 5. Notas musicales en archivo “.wav”

Figura 6. Determinación del tono fundamental de la nota musical DO en Matlab Página 11

PROCESAMIENTO DIGITAL DE SEÑALES

Figura 7. Determinación del tono fundamental de la nota musical RE en Matlab

Figura 8. Determinación del tono fundamental de la nota musical MI en Matlab

Página 12

PROCESAMIENTO DIGITAL DE SEÑALES

Figura 9. Determinación del tono fundamental de la nota musical FA en Matlab

Figura 10. Determinación del tono fundamental de la nota musical SOL en Matlab

Página 13

PROCESAMIENTO DIGITAL DE SEÑALES

Figura 11. Determinación del tono fundamental de la nota musical LA en Matlab

Figura 12. Determinación del tono fundamental de la nota musical SI en Matlab

Página 14

PROCESAMIENTO DIGITAL DE SEÑALES

Figura 12. Determinación del tono fundamental de la nota musical DO sostenido en Matlab

8 RESULTADOS Adecuando todas especificaciones planteadas y mejorando ciertas consideraciones no tomadas en cuenta, se obtuvo; de una señal con ruido inicial a una señal con la menor cantidad de ruido al inicio, se pudo determinar la frecuencia fundamental tanto en MATLAB, como en el microcontrolador representado en un LCD 16x2 en donde se puede evidenciar el valor del pitch (frecuencia fundamental).

Página 15

PROCESAMIENTO DIGITAL DE SEÑALES

Figura 13. Determinación del tono fundamental de una musical indicada en el display LCD

9 CONCLUSIONES



La etapa de filtrado inicial es importante para desaparecer frecuencias bajas que son causantes de ruido y distorsión en la codificación del programa.



El amplificar la señal permite que el microcontrolador la capte con toda su resolución y realice el trabajo especificado dentro de la aplicación Matlab es una herramienta muy ´útil puesto que nos permite procesar las señales y modificarlas de acuerdo a nuestro criterio o a los fines específicos que se tenga.



La frecuencia de muestreo siempre debe ser mínimo 2 veces la frecuencia original.



Es difícil observar las componentes de frecuencia al ver la señal original, la conversión al dominio se frecuencia, la transformada de Fourier discreta de la señal de ruido se encuentra con la transformada rápida de Fourier.

Página 16

PROCESAMIENTO DIGITAL DE SEÑALES

10

REFERENCIAS

[1] DIGI-KEY (2009), Hoja de Datos de ATMEGA,http://www.digikey.com/productdetail/es/ATMEGA16U2-AU/ATMEGA16U2-AU-ND/2050947 [2]WIKIPEDIA (2012), modulación de ancho http://es.wikipedia.org/wiki/Modulaci%C3%B3n_por_ancho_de_pulsos.

11

ANEXOS

Página 17

de

pulsos

PROCESAMIENTO DIGITAL DE SEÑALES

Página 18