Вы находитесь на странице: 1из 141

Tabla de Contenidos

Portada
Página de Título
Derecho de Autor
Dedicación
Prefacio
Capítulo 1: ARM ® CORTEX ® -M4 Sistemas de Desarrollo
1.1 Introducción
Referencia
Capítulo 2: Entrada y Salida Análoga
2.1 Introducción
2.2. TLV320AIC3104 (AIC3104) Códec de Estéreo para Entrada y Salida de Audio
2.3 WM5102 Códec de Audio Hub para Entrada y Salida de Audio
2.4 Ejemplos de Programación
2.5 Entrada y Salida en Tiempo Real Utilizando Polling, Interrupciones y Acceso Directo a Memoria (DMA)
2.6 Generación de Forma de Onda en Tiempo Real
2.7 Identificando la Respuesta de la Frecuencia de un DAC Utilizando Ruido Pseudo aleatorio
2.8 Aliasing
2.9 Identificando la Respuesta de la Frecuencia de un DAC Utilizando un Filtro Adaptivo
2.10 Salida Análoga Utilzando el de STM32F407 DAC de 12-BIT
Referencias
Capítulo 3: Filtros de Respuesta Finita Impulsiva
3.1 Introducción a los Filtros Digitales
3.2 Clasificaciones de Respuesta de Filtro Ideal: LP, HP, BP, BS
3.3. Ejemplos de Programación
Capítulo 4: Filtros de Respuesta Infinita Impulsiva
4.1 Introducción
4.2 Estructuras de Filtro IIR
4.3 Invariancia Impulsiva
4.4 TRANSFORMACIÓN BILINEAR
4.5 Ejemplos de Programación
Referencia
Capítulo 5: Transformada de Fast Fourier
5.1 Introducción
5.2 Desarrollo del Algoritmo FFT con BASE-2
5.3 Diezmación en Frecuencia de Algoritmo FFT con BASE -2
5.4 Diezmación en Tiempo de Algoritmo FFT con BASE -2
5.5 Diezmación en Frecuencia de Algoritmo FFT con BASE -4
5.6 Transformada Inversa de Fast Fourier
5.7 Ejemplos de Programación
5.8 Programación Basada en Cuadro o Bloque
5.9 Convolución Rápida
Referencia

Capítulo 6: Filtros Adaptativos


6.1 Introducción
6.2 Configuraciones de Filtro Adaptativo
6.3 Función de Rendimiento
6.4 Buscando el Mínimo
6.5 Algoritmo de Cuadrados Mínimos
6.6 Ejemplos de Programación
índice
Acuerdo de Usuario Final

Lista de Ilustraciones

Capítulo 1: ARM ® CORTEX ® -M4 Sistemas de Desarrollo


Figura 1.1 Texas Instruments TM4C123 LaunchPad.
Figura 1.2 STMicroelectronics STM32F407 Descubrimiento.
Figura 1.3 Amplificador de Audio AIC3104.
Figura 1.4 Tarjeta de Audio Wolfson Pi

Capítulo 2: Entrada y
Salida Análoga
Figura 2.1 Sistema Básico del Procesamiento de Señal Digital
Figura 2.2 Representación Simplificada de diagrama de bloque del lado de la entrada del
Figura 2.3 Representación Simplificada de diagrama de bloque del lado de la salida del códec AIC3104 mostrando bloques seleccionados
y trayectos de señal por ejemplos de programas en este libro (únicamente canal izquierdo).
Figura 2.4 Conexiones de entrada y salida en el amplificador de audio AIC3104.
Figura 2.5 Conexiones de entrada y salida en la tarjeta de audio Wolfson.
Figura 2.6 Pulso en la salida en GPIO pin PE2 por el programa tm4c123_loop_dma.c.
Figura 2.7 Retraso presentado por el uso del DMA-basado e/s en el programa tm4c123_loop_dma.c. El trazo superior muestra un
pulso rectangular con duración de 1 ms aplicada en EN LÍNEA, el trazo inferior muestra la salida desde FUERA DE LÍNEA, BUFSIZE = 256,
frecuencia de muestreo de 48 kHz.
Figura 2.8 Retraso presentado por el uso del interrupción-basada e/s en el programa tm4c123_loop_intr.c. El trazo superior muestra
un pulso rectangular con duración de 1 ms aplicada en EN LÍNEA, el trazo inferior muestra la salida desde FUERA DE LÍNEA, frecuencia
de muestreo de 48 kHz.
Figura 2.9 Retraso presentado por el uso del DMA-basado e/s en el programa stm32f4_loop_dma.c. El trazo superior muestra un pulso
rectangular con duración de 1 ms aplicada en EN LÍNEA, el trazo inferior muestra la salida desde FUERA DE LÍNEA, BUFSIZE = 256,
frecuencia de muestreo de 48 kHz.
Figura 2.10 Retraso presentado por el uso del interrupción-basada e/s en el programa stm32f4_loop_intr.c. El trazo superior muestra
un pulso rectangular con duración de 1 ms aplicada en EN LÍNEA, el trazo inferior muestra la salida desde FUERA DE LÍNEA, frecuencia
de muestreo de 48 kHz.
Figura 2.11 Representación de bloque de diagrama del programa tm4c123_delay_intr. c.
Figura 2.12 Representación de bloque de diagrama del programa tm4c123_echo_intr. c.
Figura 2.13 Representación de bloque de diagrama del programa tm4c123_flanger_intr. c.
Figura 2.14 (a) Respuesta impulsiva y (b) respuesta de frecuencia de magnitud de un flanger implementado utilizando el programa
tm4c123_flanger_intr. c en un instante cuando el retraso T es igual 104.2 us. Las muescas en la respuesta de frecuencia de magnitud
son en frecuencias 4800 y 14,400 Hz.
Figura 2.15 (a) Respuesta impulsiva y (b) respuesta de frecuencia de magnitud de un flanger modificado e implementado utilizando el
programa tm4c123_flanger_intr. c en un instante cuando el retraso T es igual 208.3 us. Las muescas en la respuesta de frecuencia de
magnitud son en frecuencias 0, 4800, 9600, 14,400 y 19,200 Hz.
Figura 2.16 Forma de onda en la salida producida utilizando el programa tm4c123_flanger_dimpulse_intr. c en instante
cuando el retraso T es igual a aproximadamente 400 us.
Figura 2.21 Pulso rectangular en la salida en GPIO pin PD15 por el programa stm32f4_sine_intr. c
Figura 2.17 Especto y espectrograma del flanger de la salida para un ruido pseudo aleatorio en la entrada. En el espectrograma, la x-
axis representa el tiempo en segundos y la y-axis representa la frecuencia en Hz.
Figura 2.18 Valores de muestreo almacenados en formación lbuffer por el programa stm32f4_loop_buf_intr. c trazados utilizando la
función MATLAB stm32f4_logftt (). La frecuencia de señal de entrada fue de 350 Hz.
Figura 2.19 (a) 1-kHz sinusoide generado utilizando el programa tm4c123_sine48_intr. c vistos utilizando el osciloscopio Rigol
DS1052E conectado al (negro) FUERA DE LÍNEA, conexión en el amplificador de audio. (b) Magnitud de FFT de señal trazada utilizando
MATLAB.
Figura 2.20 (a) 1-kHz sinusoide generado utilizando el programa tm4c123_sine48_intr. c vistos utilizando el osciloscopio Rigol
DS1052E conectado al gancho de alcance en el amplificador de audio. (b) Magnitud de FFT de señal trazada utilizando MATLAB.
Figura 2.22 Salida desde el programa tm4c123_sineDTMF_intr. c visto utilizando el osciloscopio Rigol DS1052.
Figura 2.23 Salida desde el programa stm32f4__square_Intr. c visto utilizando el osciloscopio Rigol DS1052.
Figura 2.24 Salida desde el programa stm32f4__square_Intr. c visto en ambos, dominancia de tiempo y frecuencia utilizando el
osciloscopio Rigol DS1052.
Figura 2.25 Salida desde el programa tm4c123_square_intr. c visto utilizando el osciloscopio Rigol DS1052.
Figura 2.26 Salida desde el programa tm4c123__square_Intr. c visto en ambos, dominancia de tiempo y frecuencia utilizando el
osciloscopio Rigol DS1052.
Figura 2.27 Salida desde el programa tm4c123_square_1khz_intr. c utilizando el osciloscopio Rigol DS1052.
Figura 2.28 Salida desde el programa stm32f4__dimpulse_Intr. c visto en ambos, dominancia de tiempo y frecuencia utilizando el
osciloscopio Rigol DS1052.
Figura 2.29 Salida desde el programa tm4c123__dimpulse_ Intr. c utilizando el osciloscopio Rigol DS1052.
Figura 2.30 Forma de onda de salida generada por el programa tm4c123_ramp_intr. c.
Figura 2.31 Forma de onda de salida generada por el programa tm4c123_am_intr. c.
Figura 2.32 Salida desde el programa tm4c123__prbs_ Intr. c utilizando el osciloscopio Rigol DS1052 y Goldware.
Figura 2.33 Salida desde el programa tm4c123__prbs_deemph_ Intr. c utilizando el osciloscopio Rigol DS1052 y Goldware.
Figura 2.34 Salida desde el programa tm4c123__prbs_hpf_ Intr. c utilizando el osciloscopio Rigol DS1052 y Goldware.
Figura 2.35 Salida desde el programa tm4c123__prbs_biquad_ Intr. c utilizando el osciloscopio Rigol DS1052 y Goldware.
Figura 2.36 Salida desde el programa tm4c123__prandom_ Intr. c utilizando el osciloscopio Rigol DS1052.
Figura 2.38 Valores de muestreo leídos desde el WM5102 ADC y almacenados en formación lbuffer por el programa
stm32f4_loop_buf_intr. c.
Figura 2.37 Señal de entrada en onda cuadrada utilizando el programa stm32f4_loop_buf_intr. c.
Figura 2.39 Valores de muestreo leídos desde el WM5102 ADC y almacenados en formación lbuffer por el programa
tm4c123_loop_buf_intr. c.
Figura 2.40 Valores de muestreo leídos desde el AIC3104 ADC y almacenados en formación lbuffer por el programa
tm4c123_sine48_loop_intr. c.
Figura 2.41 Conexión del diagrama por el programa tm4c123_sysid_CMSIS_intr. c.
Figura 2.42 La repuesta impulsiva y la frecuencia de magnitud identificadas utilizando el programa tm4c123_sysid_CMSIS_intr. c con
conexiones como se muestra en la Figura 2.41, demostradas utilizando la función MATLAB tm4c123_logfft (). Frecuencia de muestreo
8000 Hz, 128-filtro adaptativo de coeficiente.
Figura 2.43 La repuesta impulsiva y la frecuencia de magnitud identificadas utilizando el programa tm4c123_sysid_CMSIS_intr. c con
primera orden, paso bajo de filtro análogo conectado entre las conexiones EN LÍNEA y FUERA DE LÍNEA, demostradas utilizando la
función MATLAB tm4c123_logfft (). Frecuencia de muestreo 8000 Hz, 128-filtro adaptativo de coeficiente.
Figura 2.44 La repuesta impulsiva y la frecuencia de magnitud identificadas utilizando el programa tm4c123_sysid_CMSIS_intr. c con
conexiones como se muestran en la Figura 2.41 y desactivadas, demostradas utilizando la función MATLAB tm4c123_logfft (). Frecuencia
de muestreo 8000 Hz, 128-filtro adaptativo de coeficiente.
Figura 2.45 La repuesta impulsiva y la frecuencia de magnitud identificadas utilizando el programa stm32f4_sysid_CMSIS_intr. c con
FUERA DE LÍNEA conectadas directamente con FUERA DE LÍNEA, demostradas utilizando la función MATLAB stm32f4_logfft ().
Frecuencia de muestreo 8000 Hz, 128-filtro adaptativo de coeficiente.
Figura 2.46 Conexión de diagrama para el programa tm4c123_sysid_CMSIS_intr. c
Figura 2.47 La repuesta impulsiva y la frecuencia de magnitud identificadas utilizando el programa stm32f4_sysid_CMSIS_intr. c con
conexiones como se muestran en la Figura 2.46, demostradas utilizando la función MATLAB stm32f4_logfft (). Frecuencia de muestreo
16,000 Hz, 192-filtro adaptativo de coeficiente.
Figura 2.48 Pulso en la salida en GPIO pin PE2 por el programa tm4c123_sysid_CMSIS_intr. c ejecutandose en la frecuencia de
muestreo de 16 kHz y utilizando 192 coeficientes de filtro adaptativo.
Figura 2.49 Salida desde el programa stm32f4__sine8_ dac12_Intr. c utilizando el osciloscopio Rigol DS1052.
Figura 2.50 Salida desde el programa stm32f4__square_ dac12_Intr. c utilizando el osciloscopio Rigol DS1052.
Figura 2.51 Salida desde el programa stm32f4__dimpulse_ dac12_Intr. c utilizando el osciloscopio Rigol DS1052.
Figura 2.52 Salida desde el programa stm32f4__prbs_ dac12_Intr. c utilizando el osciloscopio Rigol DS1052.
Capítulo 3: Filtros de Respuesta Finita Impulsiva
Figura 3.1 Representación del bloque de diagrama de un filtro FIR genérico.
Figura 3.2 Polos y ceros y región de convergencia para una secuencia causal x (n) = an u (n), X (z) = z / (z-a), trazadas en el
plano z.
Figura 3.3 Polos y ceros y región de convergencia para una secuencia anticausal x (n) = -anu (-n -1), X (z) = z/ (z-a), trazados en el
plano z.
Figura 3.4 Posible región de convergencia, trazada en el plano z, correspondiente a la secuencia causal en el lado derecho x (n)
para un sistema con dos polos de real valor.
Figura 3.6 Posible región de convergencia, trazada en el plano z, correspondiente a la secuencia no causal de ambos lados x (n)
para un sistema con dos polos de real valor.
Figura 3.7 Polos y ceros y región de convergencia para X (z) = z/ (z-a) trazados en el plano z, para /a/ < 1, correspondiente a la
secuencia x (n) a u (n) la cual es causal y estable.
Figura 3.9 Polos y ceros y región de convergencia para X (z) = z/ (z-a) trazados en el plano z, para /a/ > 1, correspondiente a la
secuencia x (n) a u (n) la cual es causal y estable.
Figura 3.10 Polos y ceros y región de convergencia para X (z) = z/ (z-a) trazados en el plano z, para /a/ < 1, correspondiente a la
secuencia x (n) -a u (-n -1) la cual es anticausal y estable.
Figura 3.12 Polos y ceros y región de convergencia para X (z) = z/ (z-a) trazados en el plano z, para /a/ > 1, correspondiente a la
secuencia x (n) -a u (-n -1) la cual es anticausal y estable.
Figura 3.13 Dominio de tiempo y dominio z con representaciones de bloque de diagrama en tiempo discreto sistema LTI.
Figura 3.14 Mapeo desde el plano s al plano z.
Figura 3.15 Respuestas de frecuencia de magnitud de filtro ideal. (a) Paso bajo (LP). (b) Paso alto (HP). ( c ) Paso de banda (BP). (d)
Paro de banda (BS).
Figura 3.16 Respuesta de frecuencia de paso bajo ideal definida por el rango de frecuencia normalizada [ecuación].
Figura 3.17 Sesenta y uno del número infinito de valores en respuesta impulsiva en tiempo discreto obtenida al tomar la inversa
DTFT de la respuesta de frecuencia de paso bajo ideal de la Figura 3.16.
Figura 3.18 Respuesta impulsiva en tiempo discreto de la Figura 3.17 truncada a N = 33 valores.
Figura 3.19 La respuesta de frecuencia de magnitud continua y periódica obtenida al tomar el DTFT de una respuesta impulsiva truncada,
tal como se muestra en la Figura 3.18 (trazada contra la frecuencia normalizada [símbolo]).
Figura 3.20 Una ventana Hanning de 33 puntos.
Figura 3.21 La respuesta de frecuencia de magnitud correspondiente a los coeficientes de filtro de la Figura 3.22 (trazados en
contra de la frecuencia normalizada [símbolo]).
Figura 3.22 Los coeficientes de filtro de la Figura 3.17 multiplicados por la ventana Hanning de la Figura 3.20.
Figura 3.23 Las respuestas de frecuencia de magnitud de la Figura 3.19 y 3.21 trazadas en una escala algoritmica, en contra de
la frecuencia normalizada [símbolo]).
Figura 3.24 Respuesta de frecuencia de magnitud de un filtro de paso alto ideal.
Figura 3.25 Respuesta de frecuencia de magnitud de un filtro de paso de banda ideal.
Figura 3.26 Respuesta de frecuencia de magnitud de un filtro de paro de banda ideal.
Figura 3.27 Respuesta de frecuencia de magnitud teórica de cinco puntos moviendo filtro promedio (frecuencia de muestreo 8
kHz).
Figura 3.28 Respuesta de frecuencia de magnitud de cinco puntos moviendo un filtro promedio demostrado utilizando el programa
stm32f4_average_prbs_intr. c y demostrado utilizando (a) osciloscopio Rigol DS1052E (trazo inferior) y (b) Goldware.
Figura 3.29 Conexión del diagrama para el uso del programa tm4c123_sysid_CMSIS_intr. c para identificar las características de un
filtro promedio en movimiento implementado utilizando dos sets de hardware.
Figura 3.30 Respuesta impulsiva de cinco puntos en movimiento de filtro promedio identificado utilizando dos launchpas y
amplificadores de audio y programas tm4c123_sysid_CMSIS_intr. c y tm4c123_average_intr. c
Figura 3.31 Respuesta de frecuencia de magnitud de cinco puntos en movimiento de filtro promedio identificado utilizando dos sets de
hardware y programas tm4c123_sysid_CMSIS_intr. c y tm4c123_average_intr. c.
Figura 3.32 Conexión del diagrama para el programa tm4c123_sysid_average_CMSIS_intr. c.
Figura 3.33 Respuesta de frecuencia de magnitud de once puntos en movimiento de filtro promedio implementado utilizando el
programa tm4c123_average_prbs_intr. c y demostrado utilizando Goldwave.
Figura 3.34 Respuesta de frecuencia de magnitud de cinco puntos en movimiento de filtro promedio con una ventana Hanning
utilizando el programa stm32f4_average_prbs_intr. c y demostrado utilizando Goldwave.
Figura 3.35 Ventana fdatool con MATLAB correspondiente al diseño de el y filtro de paro de banda FIR centrado a 2700 Hz.
Figura 3.36 Ventana fdatool con MATLAB correspondiente al diseño de el y filtro de paso de banda FIR centrado a 1750 Hz.
Figura 3.37 Salida generada utilizando el programa tm4c123_fir_prbs_intr. c y archivo de coeficiente bs2700.h demostrado
utilizando (a) osciloscopio Rigol DS1052E y (b) Goldwave.
Figura 3.38 Salida generada utilizando el programa tm4c123_fir_prbs_intr. c utilizando los archivos de coeficiente (a) pass2b.h y
(b) hp55.h.
Figura 3.39 Magnitud del FFT de la salida del programa stm32f4_fir_prbs_buf_intr. c utilizando la cabecera del archivo del coeficiente
bp1750.h.
Figura 3.40 Coeficientes de filtro utilizados en el programa stm32f4_fir_prbs_buf_intr. c (bp1750.h).
Figura 3.41 Magnitud de FFT de los coeficientes de filtro utilizados en el programa stm32f4_fir_prbs_buf_intr. c.
Figura 3.42 Una onda de cuadrado de 200 Hz pasada a través de tres diferentes filtros de paso bajo implementados utilizando
el programa tm4c123_fir3lp_intr. c.
Figura 3.43 Salida generada utilizando el programa tm4c123_fir_4types_intr. c.
Figura 3.44 Ruido Pseudo aleatorio filtrado utilizando el programa tm4c123_notch2_intr. c.
Figura 3.45 Representación del bloque de diagrama de codificador implementado utilizando el programa
tm4c123_scrambler_intr. c.
Figura 3.46 Pulsos en la salida en GPIO pin PE2 por los programas tm4c123_fir_prbs_intr. c y tm4c123_fir_prbs_dma. c.
Capítulo 4: Filtros de Respuesta Infinita Impulsiva
Figura 4.1 Estructura de filtro IIR de forma directa I
Figura 4.2 Estructura de filtro IIR de forma directa II
Figura 4.3 Estructura de filtro IIR de transponer de forma directa II
Figura 4.4 Estructura de filtro IIR de forma cascada
Figura 4.5 Filtro IIR de cuarta orden con dos formas directas en secciones de cascadas II.
Figura 4.6 Estructura de filtro IIR de forma paralela.
Figura 4.7 Filtro IIR de cuarta orden con dos formas directas en secciones paralelas II.
Figura 4.8 Relación entre frecuencias análogas y digitales, [símbolo] (A) y [símbolo] (D), debido a una frecuencia de
deformación en la transformada bilinear.
Figura 4.9 (a) Respuesta de frecuencia de magnitud de filtro H (s), (b) fase de repuesta del filtro H (s).
Figura 4.10 Respuestas impulsivas h (t) (escaladas por el período de muestreo ts) y h (n) de filtro en tiempo continuo H (s) y su
implementación digital invariante impulso.
Figura 4.11 Salida desde el programa tm4c123_iirsos_prbs_intr. c utilizando el archivo de coeficiente impinv.h visto utilizando
la función FFT de un osciloscopio Rigol DS1052E.
Figura 4.12 Salida desde el programa tm4c123_iirsos_prbs_intr. c utilizando el archivo de coeficiente impinv.h visto utilizando
Goldwave.
Figura 4.13 Salida desde el programa tm4c123_iirsos_delta_intr. c utilizando el archivo de coeficiente impinv.h visto utilizando
la función FFT de un osciloscopio Rigol DS1052E.
Figura 4.14 La respuesta de la frecuencia de la magnitud del filtro implementado por el programa tm4c123_iirsos_delta_intr. c
utilizando el archivo de coeficiente impinv.h trazado utilizando la función MATLAB tm4c123_logfft ().
Figura 4.15 Salida desde el programa tm4c123_iirsos_prbs_intr. c utilizando el archivo de coeficiente bilinear.h visto utilizando
la función FFT de un osciloscopio Rigol DS1052E.
Figura 4.18 La respuesta de la frecuencia de la magnitud del filtro implementado por el programa tm4c123_iirsos_delta_intr. c
utilizando el archivo del coeficiente bilinear.h, trazado utilizando la función MATLAB tm4c123_logfft ().
Figura 4.19 El efecto de la transformada bilinear en la respuesta de frecuencia de magnitud del filtro de ejemplo.
Figura 4.20 Ventana fdatool con MATLAB mostrando la respuesta de frecuencia de magnitud de un filtro de cuarta orden
elíptica de paso bajo.
Figura 4.21 Ventana fdatool con MATLAB mostrando la respuesta de frecuencia de magnitud de un filtro de segunda orden Chebyshev
de paso bajo.
Figura 4.16 Salida desde el programa tm4c123_iirsos_prbs_intr. c utilizando el archivo de coeficiente bilinear.h visto utilizando
Goldwave.
Figura 4.22 Respuesta impulsiva y respuesta de frecuencia de magnitud del filtro implementado por el programa
tm4c123_iirsos_delta_intr. c, utilizando el archivo de coeficiente elíptico.h, trazado utilizando la función MATLAB tm4c123_logfft
().
Figura 4.23 Salida desde el programa tm4c123_iirsos_delta_intr. c utilizando el archivo de coeficiente elliptic.h visto utilizando
un osciloscopio Rigol DS1052E.
Figura 4.24 Ventana fdatool con MATLAB mostrando la respuesta de frecuencia de magnitud de un filtro de 18 orden de paso de
banda centrado en 2000 Hz.
Figura 4.25 Salida desde el programa tm4c123_iirsos_prbs_intr. c utilizando el archivo de coeficiente bp2000.h visto utilizando
un osciloscopio Rigol DS1052E.
Figura 4.26 Salida desde el programa tm4c123_iirsos_prbs_intr. c utilizando el archivo de coeficiente bp2000.h visto utilizando
Goldwave.
Figura 4.27 Conexión del diagrama para el programa tm4c123_sysid_biquad_intr. c.
Figura 4.28 Respuesta de frecuencia de la trayectoria de señal a través de DAC, conectando un cable, y ADC mostados en la
Figura 4.27 con filtros biquad desabilitados.
Figura 4.29 Respuesta de frecuencia de la trayectoria de señal a través de DAC, conectando un cable, y ADC mostados en la
Figura 4.27 con filtros biquad programados como cuarta orden elíptica de filtro de paso bajo y desabilitado.
Figura 4.30 fdatool utilizado para diseñar un filtro de cuarta orden elíptica y paso bajo.
Figura 4.31 Respuesta de frecuencia de la trayectoria de señal a través de DAC, conectando un cable, y ADC mostados en la
Figura 4.27 con filtros biquad programados como cuarta orden elíptica de filtro de paso de banda y desabilitado.
Figura 4.32 Representación de bloque de diagrama de la Ecuación (4.53).
Figura 4.33 Representación de bloque de diagrama de la Ecuación (4.54).
Figura 4.34 Muestras de salida generadas por el programa stm32f4_sinegenDTMF_intr. c trazado utilizando la función MATLAB
stm32f4_logfft ().
Figura 4.35 Muestras de salida generadas por el programa stm32f4_sinegenDTMF_intr. c visto utilizando un osciloscopio Rigol
DS1052E.
Figura 4.36 Mapa de cero polo para el filtro de muesca descrito por la Ecuación (4.56) para r = 0.8 y [Ecuación].
Figura 4.37 Respuesta de frecuencia para el filtro de muesca descrito por la Ecuación (4.56) para r = 0.8 y [Ecuación].
Figura 4.38 Ruido pseudo aleatorio filtrado por el programa tmc123_iirsos_prbs_intr. c utilizando un archivo de cabecera
iir_notch_coeffs_h.
Capítulo 5:
Transformada
de Fast Fourier
Figura 5.1 Factores de rotación [símbolo] para N = 8 representados como vectores en el plano complejo.
Figura 5.2 Descomposición de 8 puntos DFT en dos 4 puntos de DFT utilizando diezmación en frecuencia con base-2.
Figura 5.3 Descomposición de 4 puntos DFT en dos 2 puntos de DFT utilizando diezmación en frecuencia con base-2.
Figura 5.4 2 puntos FFT de estructura mariposa.
Figura 5.5 Representación de bloque de diagrama de 8 puntos FFT utilizando diezmación en frecuencia base-2.
Figura 5.6 Descomposición de 8 puntos DFT en dos 4 puntos de DFT utilizando diezmación en frecuencia con base-2.
Figura 5.7 Descomposición de 4 puntos DFT en dos 2 puntos de DFT utilizando diezmación en frecuencia con base-2.
Figura 5.8 Representación de bloque de diagrama de 8 puntos FFT utilizando diezmación en tiempo con base-2.
Figura 5.9 Contenidos complejos en formación muestras (TESTFREQ = 800.0) antes llamada función dft (), vistos en una
ventana Memoria en el debugger MDK-ARM.
Figura 5.10 Contenidos complejos en formación muestras (TESTFREQ = 800.0) antes llamada función dft (), trazados utilizando
la función MATLAB stm32f4_plot_complex ().
Figura 5.11 Contenidos complejos en formación muestras (TESTFREQ = 800.0) antes llamada función dft (), trazados utilizando
la función MATLAB stm32f4_plot_complex ().
Figura 5.12 Contenidos complejos en formación muestras (TESTFREQ = 900.0) antes llamada función dft (), trazados utilizando
la función MATLAB stm32f4_plot_complex ().
Figura 5.13 Registro MDK-ARM ventana mostrando articulo Sec.
Figura 5.14 Señal de salida desde el programa tm4c123_dft128_dma. c vista utilizando un osciloscopio.
Figura 5.15 Señal de salida desde el programa stm32f4_dft128_dma. c vista utilizando un osciloscopio.
Figura 5.16 Contenidos parciales en formación outbuffer, trazados utilizando la función MATLAB tm4c123_plot_real (), para
entrada sinusoide de frecuencia 1750 Hz.
Figura 5.17 Detalle de la señal de salida desde el programa tm4c123_dft128_dma. c, para entrada sinusoide de frecuencia
1781 Hz.
Figura 5.18 Detalle de la señal de salida desde el programa tm4c123_dft128_dma. c, para entrada sinusoide de frecuencia
1750 Hz.
Figura 5.19 Contenidos parciales en formación outbuffer, trazados utilizando la función MATLAB tm4c123_plot_real (), para
entrada sinusoide de frecuencia 1781 Hz.
Figura 5.20 Detalle de la señal de salida desde el programa tm4c123_dft128_dma. c, modificado para aplicar la ventana Hamming a
bloques de muestras de entrada, para entrada sinusoide de frecuencia 1750 Hz.
Figura 5.21 Detalle de la señal de salida desde el programa tm4c123_dft128_dma. c, modificado para aplicar la ventana Hamming a
bloques de muestras de entrada, para entrada sinusoide de frecuencia 1781 Hz.
Figura 5.22 Contenidos parciales en formación outbuffer, trazados utilizando la función MATLAB tm4c123_plot_real (), para entrada
sinusoide de frecuencia 1750 Hz. (ventana Hamming aplicada a bloques de muestras de entrada).
Figura 5.23 Contenidos parciales en formación outbuffer, trazados utilizando la función MATLAB tm4c123_plot_real (), para entrada
sinusoide de frecuencia 1781 Hz. (ventana Hamming aplicada a bloques de muestras de entrada).
Figura 5.24 Señal de salida generada por el programa tm4c123_fft128_sinetable_dma. c mostrado utilizando un osciloscopio
Rigol DS1052E.
Figura 5.25 Señal de salida desde el programa tm4c123_graphicEQ_CMSIS_dma. c demostrada utilizando Goldwave, para una señal de
entrada con ruido pseaudo aleatorio, bass_gain = 0.1, mid_gain = 0.1, treble_gain = 0.25.
Capítulo 6:
Filtros
Adaptativos
Figura 6.1 Estructura de filtro adaptado básico.
Figura 6.2 Diagrama de bloque simplificado de la estructura de filtro adaptado básico.
Figura 6.3 Estructura de filtro adaptado básico configurado por predicción.
Figura 6.4 Estructura de filtro adaptado básico configurado por una identificación del sistema.
Figura 6.5 Estructura de filtro adaptado básico configurado por una cancelación de ruido.
Figura 6.6 Representación alternativa de una estructura de filtro adaptado básico configurado por la cancelación de ruido,
enfatizando la diferencia H (z) en trayectorias desde un recurso de ruido singular a sensores primarios y de referencia.
Figura 6.7 Estructura de filtro adaptado básico configurado por ecualización.
Figura 6.8 Representación de bloque de diagrama de filtro FIR.
Figura 6.9 Función de rendimiento para un solo caso de peso.
Figura 6.10 Algoritmo de descenso más rápido ilustrado para un solo caso de peso.
Figura 6.11 Trazos de (a) deseados en la salida, (b) salida de filtro adaptado, y © error generado utilizando el programa
stm32f4_adaptive. C y demostrado utilizando la función MATLAB stm32f4_plot_real ().
Figura 6.12 Representación de bloque de diagrama del programa tm4c123_adaptnoise_intr. c.
Figura 6.13 Representación de bloque de diagrama del programa tm4c123_noise_cancellation_intr. c.
Figura 6.14 Respuesta impulsiva y respuesta de frecuencia magnitud del filtro IIR identificado por un filtro adaptado en el programa
tm4c123_noise_cancellation_intr. c y trazado utilizando la función MATLAB tm4c123_logfft ().
Figura 6.15 Representación de bloque de diagrama del programa tm4c123_adaptIDFIR_CMSIS_intr. c.
Figura 6.16 Salida desde el programa stm32f4_adaptIDFIF_CMSIS_intr. c utilizando el archivo de cabecera de coeficiente
bs55.h visto utilizando el osciloscopio Rigol DS1052E.
Figura 6.17 Salida desde un filtro adaptado en el programa tm4c123_adaptIDFIR_CMSIS_init_intr. c.
Figura 6.18 Representación de bloque de diagrama del programa tm4c123_iirsosadapt_CMSIS_intr. c.
Figura 6.19 Salida desde el filtro adaptado en el programa tm4c123_iirsosadapt_CMSIS_intr. c visto utilizando un osciloscopio
Rigol DS1052E.
Figura 6.20 Coeficientes del filtro adaptado desde el programa tm4c123_iirsosadapt_CMSIS_intr. c trazado utilizando la función
MATLAB tm4c123_logfft ().
Figura 6.21 Conexión del diagrama para el programa tm4c123_sysid_CMSIS_intr. c en el Ejemplo 6.14.
Figura 6.22 Coeficientes del filtro adaptado desde el programa tm4c123_sysid_CMSIS_intr. c trazado utilizando la función MATLAB
tm4c123_logfft ().
Figura 6.23 Coeficientes del filtro adaptado desde el programa tm4c123_sysid_CMSIS_dma. c trazado utilizando la función
MATLAB tm4c123_logfft (). (a) BUFSIZE = 32 (b) BUFSIZE = 64.

Capítulo 2:
Entrada y Salida
Análoga
Tabla 2.1 Resúmen de las Estructuras de Control DMA Utilizadas y los Indicadores Fijaron uas Rutinas de Servicio de Interrupción
SSI0IntHandler () y SSI1IHandler () en el Programa tm4c123_loop_dma. c
Capítulo 5:
Transformada
de Fast Fourier
Tabla 5.1 Tiempos de Ejecución para Funciones dft (), dftw (), fft () y arm_cfft_f32 ()
PROCESAMIENTO DE SEÑALES DIGITALES
UTILIZANDO EL ARM ® CORTEX® R – M4

DONALD S. REAY
Heriot-Watt University

WILEY
A Reiko
Prefacio
Este libro continua las series creadas en 1990, Procesamiento de Señales Digitales con
TMS320C25 por Rulph Chassaing y Darrell Horning, el cual rastreó el desarrollo de generaciones
sucesivas de los procesadores de señales digitales por Texas Instruments. De manera más
específica, cada libro en las series ha complementado hasta ahora un diferente kit de desarrollo
DSP (procesamiento de señales digitales por sus siglas en inglés), el cual es barato; promovido
para propósitos de enseñanza por el Programa Universitario de Texas Instruments. Un tema
consistente en los libros ha sido la provisión de un gran número de ejemplos simples de
programas, ilustrando conceptos DSP en tiempo real, en un entorno con laboratorio de ingeniería
eléctrica.

Era la creencia de Rulph Chassaing, y este autor continúa creyendo, que las manos en la
enseñanza de DSP, utilizando kits de desarrollo Hardware y equipo de prueba de laboratorio para
procesar señales de frecuencia de audio analógico, es una manera efectiva y valiosa para
reforzar la teoría enseñada en exposiciones.

Los contenidos de estos libros, en cuanto a ellos conciernen conceptos fundamentales de


procesamiento de señales digitales tales como analógica digital y conversión digital analógica,
así como también respuesta finita al impulso (FIR por sus siglas en inglés) y filtros de respuesta
infinita al impulso (IIR por sus siglas en inglés), la transformada de Fourier, y el filtrado
adaptativo han cambiado un poco. Cada libro académico trae una cohorte de estudiantes
deseando estudiar este material. Sin embargo, cada libro ha diseñado un kit de desarrollo DSP
diferente.

En 2013, Robert Owen me sugirió que las manos en la enseñanza DSP, podría ser implementada
utilizando un microcontrolador ARM ® Cortex-M4 ® barato. Indiqué que el procesador C674x de
Texas Instruments fue significativamente más poderoso computacionalmente que un ARM Cortex-
M4. Pero fui y compré un Stellaris LaunchPad de Texas Instruments. Construí una interface de
audio utilizando códec Wolfson WM8731 y exitosamente porté los ejemplos del programa de mi
libro previo a esa plataforma hardware.

Este libro está dirigido a estudiantes de último año y graduados de ingeniería eléctrica quienes
tienen conocimiento en cuanto a programación C y teoría de sistemas lineales, pero está
dirigido, y se espera, que pueda servir como un recurso útil a cualquiera involucrado en enseñar
o aprender DSP y como un punto de comienzo para enseñar o aprender más.

Estoy agradecido con Robert Owen, primeramente por hacerme conciencia del ARM Cortex-M4; a
Khaled Benkrid en la ARM University Program y a la Royal Academy of Engineering por hacer
posible una Comisión de Servicio Industrial de ARM por seis meses durante la cual fueron
desarrollados materiales para la plataforma STM32f01; a Gordon McLeod y Scott Hendry en
Wolfosn Microelectronics por su ayuda en la obtención de la tarjeta de audio Wolfson Pi con la
STM32f01 Descubrimiento; a Sean Hong, Karthik Shivashankar, y Robert Iannello en ARM por su
ayuda; a Joan Teixidor Buixeda por su ayuda en depurar los ejemplos del programa; a Cathy
Wicks en la TI University Program y Hieu Duong en CircuitCo por desarrollar el booster de audio;
y a Kari Capone y Brett Kurzman en Wiley por su paciencia. Pero en primer lugar agradezco a
Rulph Chassing por inspirarme en involucrarme en la enseñanza DSP.

Donald S. Reay

Edinburgh

2015
Chapter 1

ARM ® Cortex® R – M4 Sistemas de Desarrollo

1.1 Introducción

Tradicionalmente, el procesamiento de señales digitales (DSP) en tiempo real ha sido


implementado utilizando hardware especializado y relativamente barato, por ejemplo,
procesadores de señales digitales o programable en campo arrays de puertas (FPGAs). El
procesador ARM ® Cortex® R – M4 hace posible procesar audio en tiempo real (para propósitos
de enseñanza, al menos) utilizando significantemente microcontroladores más baratos y más
simples.

El ARM Cortex-M4 es un 32-bit microcontrolador. Esencialmente, es un microcontrolador ARM


Cortex-M3 que ha sido mejorado por la adición de DSP y por la instrucción singular de datos
múltiples (SIMD) y (opcionalmente) una unidad de punto flotante de hardware (FPU). Aunque su
poder computacional es una fracción de ello de un procesador de señales digitales de punto
flotante, por ejemplo, el C674x de Texas Instruments, es un tanto capaz de implementar
algoritmos DSP, por ejemplo, filtros y transformaciones rápidas de Fourier FIR y IIR por señales
de audio en tiempo real.

Un número de fabricantes de semiconductores han desarrollado microcontroladores que están


basados en un procesador ARM Cortex-M4 y han incorporado interfaces periféricas propietarias y
otros bloques IP. Muchos de estos fabricantes de semiconductores, hacen disponible juntas de
evaluación a un precio bajo para sus microcontroladores ARM Cortex-M4. Implementar ejemplos
de programas en cuanto a audiofrecuencia en tiempo real en estas plataformas, más que en kits
de desarrollo DSP más convencionales, constituye una reducción de una orden de magnitud en el
costo del hardware de la implementación de manos en la enseñanza DSP. Por primera vez, los
estudiantes de forma realista podrán esperar poseer una plataforma hardware que es útil, no
solamente para actividades de programación e interfaz para
microcontroladores/microprocesadores generales pero también para implementación de DSP en
tiempo real.

1.1.1 Interfaces de Audio

Al tiempo que los ejemplos del programa presentados en este libro fueron creados,
comercialmente no había juntas de desarrollo ARM Cortex-M4 disponibles a bajo precio que
incorporasen entradas y salidas de audio en alta calidad. Los detalles de la STM32f407
Descubrimiento de STMicroelectronics con audio de alta calidad y conversión digital analógica
(DAC) pero no una conversión analógica digital (ADC). Muchos dispositivos ARM Cortex-M4,
incluyendo ambos STMicroelectronics STM32F407 y Texas Instruments TM4C123, ofrecen una
calidad de instrumentación con multicanales ADCs. Pero sin más circuitos externos adicionales,
estos no son adecuados para las aplicaciones discutidas en este libro.

Los ejemplos en este libro requieren la adición (de una tarjeta de desarrollo barata ARM Cortex-
M4) de una audiofrecuencia (barata).
En el caso del STM32F407 Descubrimiento de STMicroelectronics y en los Texas Instruments
TM4C123 LaunchPad, las interfaces de audio compatibles y baratas son proveídas por la tarjeta
de audio de Wolfson Pi y el audio booster pack de CircuitCo, respectivamente. Los detalles de
interconexión de nivel bajo y las características del rendimiento preciso y las características
extra de las interferencias con dos audio son sutilmente diferentes. Sin embargo, cada
instalación, la entrada y salida de señales con alta calidad de audio del procesador ARM Cortex-
M4, en el cual algoritmos DSP puedan ser implementados.

La mayoría de los ejemplos de los programas presentados en los capítulos del libro que a
continuación se presentan, son proveídos, en una manera ligeramente diferente, para ambos la
STM32F407 Descubrimiento y la TM4C123 LaunchPad, en el sitio web de socios

http: / / www.wiley.com /go / Reay / ARMcortexM4.

Sin embargo, en la mayoría de casos, los ejemplos de los programas son descritos
detalladamente, y los programas listados son presentados, solamente para una u otra plataforma
de hardware. Excepciones notables se encuentran en el Capítulo 2, mecanismos de bajo nivel de
entrada y salida (implementados ligeramente de manera distinta en dos dispositivos) son
descritos detalladamente para ambas plataformas de hardware, y se encuentran ejemplos de
programas útiles para utilizar las características únicas para un u otro procesador/interferencia
de audio.

Este libro no describe la arquitectura interna o las características del procesador ARM Cortex-M4
detalladamente. Un excelente texto en tal tema, incluyendo detalles de sus capacidades
relacionadas con DSP, es The Definitive Guide TO ARM® Cortex® R – M3 Y Cortex®-M4
Procesadores por Yiu [1].

1.1.2 Texas InstrumentsTM4C123 LaunchPad y Kits de Desarrollo de la STM32F407


Descubrimiento

Texas Instruments y las tarjetas procesadoras STMicroelectronics ARM Cortex-M4 utilizadas en


este libro, son mostradas en las Figuras 1.1 y 1.2. Los ejemplos de los programas presentados en
este libro adoptan el uso del entorno de desarrollo Keil MDK-ARM, el cual es compatible con
ambos kits de desarrollo. Un entorno de desarrollo alternativo, el Code Composer Studio de
Texas Instruments, está disponible para la TM4C123 LaunchPad y los ejemplos de los programas
han testeado la utilización de estos. Las versiones de los ejemplos de los programas compatibles
con el Code Composer Studio versión 6 son proveídos en el sito web de los socios.

http: / / www.wiley.com /go / Reay / ARMcortexM4.


[En este espacio se encuentra la imagen de la figura 1]

Figura 1.1 Texas Instruments TM4C123 LaunchPad

[En este espacio se encuentra la imagen de la figura 2]

Figura 1.2 STM32F407 Descubrimiento de STMicroelectronics

El booster de audio de CircuitCo (para la TM4C123 LaunchPad) y la tarjeta de audio Wolfson Pi


(para la STM32F407 Descubrimiento) son mostrados en las Figuras 1.2 y 1.4. El booster de audio y
la launchpad conectados conjuntamente, mientras la tarjeta de audio Wolfson, la cual fue
diseñada para utilizarla con una computadora Raspberry Pi, debe ser conectada con la de
Descubrimiento, utilizando un cable de cinta personalizada (disponible por el distribuidor
Farnell).

[En este espacio se encuentra la imagen de la figura 3]

Figura 1.3 AIC3104 booster audio

[En este espacio se encuentra la imagen de la figura 4]

Figura 1.4 tarjeta de audio Wolfson Pi

Más que presentar en detalle las instrucciones aquí presentadas, las cuales pueden ser obsoletas,
lo más pronto cuando la siguiente versión de MD-ARM sea lanzada, el lector se dirige a la guía
“iniciando” en el sitio web de socios http: / / www.wiley.com /go / Reay / ARMcortexM4. Y
antes de seguir con el siguiente capítulo de este libro, necesitará instalar MDK-ARM, incluyendo
la biblioteca CMSIS DSP, descargar los ejemplos de los programas desde el sitio web, y
familiarizarse con cómo abrir el proyecto en MDK-ARM, agrega y quitar archivos de un proyecto,
construir un proyecto, empezar y detener una sesión de depuración, y hacer correr y detener un
programa en ejecución en el procesador ARM Cortex-M4.

Algunos de los programas de ejemplo implementan algoritmos DSP directamente, y con una
vista de transparencia y entendimiento más que una eficiencia o elegancia computacional. En
varios casos, las funciones en la biblioteca de ARM CMSIS DSP son utilizadas. Estas están
disponibles para ambos procesadores STMicroelectronics y Texas Instruments, como parte del
entorno de desarrollo MDK-ARM. En situaciones apropiadas, estas funciones de biblioteca son
particularmente computacionalmente eficientes. Esto es útil para algunos de los ejemplos del
programa, en donde las demandas de correr en tiempo real a la aproximación de los límites de lo
que se puede lograr con la ARM Cortex-M4. Una diferencia entre los dos dispositivos utilizados en
este libro es que la STM32F407 utiliza un procesador con velocidad de reloj de 168 MHz, mientras
que la TM4C123 utiliza un procesador con velocidad de reloj de 84 MHz. Como se presenta en el
libro, todos los ejemplos del programa correrán en tiempo real en cualquier dispositivo. Sin
embargo, si los valores de los parámetros utilizados son cambiados, por ejemplo, si el número de
coeficientes en un filtro FIR aumenta, es posible que los límites del dispositivo más lento, llegará
más fácil que aquellos rápidos.

Todos los ejemplos del programa, han sido testeados utilizando una versión MDK-ARM gratis, con
códigos limitados. El objetivo de la enseñanza DSP y la intención de este libro, no es enseñar
acerca de la arquitectura ARM Cortex-M4. El dispositivo es utilizado porque provee una
plataforma competente y barata. Ni es el objetivo de la enseñanza DSP, o la intención de este
libro, el enseñar acerca del uso de MDK-ARM. El objetivo de la enseñanza DSP es reforzar la
teoría DSP enseñada en clases, a través el uso de ejemplos ilustrativos involucrando el
procesamiento de señales de audio en tiempo real en un ambiente de laboratorio de ingeniería
eléctrica. Quiere decir, lugar en donde testeos de equipamiento como osciloscopios,
generadores de señal, y la conexión de cables están disponibles.

1.1.3 Herramientas de Hardware y Software

Para poder realizar experimentos descritos en este libro, se requiere un gran número de recursos
de hardware y software.

1. Una tarjeta de desarrollo ARM Cortex-M4 y una interface de audio. Ya sea una TM4C123
LaunchPad de Texas Instruments y un amplificador de audio CircuitCo o una tarjeta STM32F407
Descubrimiento de STMicroelectronics y una tarjeta de audio de Wolfson Microelectronics Pi son
plataformas de hardware adecuadas.

2. Una PC host que ejecuta un entorno de desarrollo integrado (IDE por sus siglas en inglés) y con
una conexión disponible de USB. Los ejemplos del programa descritos en este libro, fueron
llevados a cabo y testeados utilizando el entorno de desarrollo Keil MDK-ARM. Sin embargo,
versiones de los ejemplos del programa para la TM4C123 LaunchPad y archivos del proyecto
compatibles con el Code Composer Studio IDE de Texas Instruments son proveídos en el sitio web
de socios

http: / / www.wiley.com /go / Reay / ARMcortexM4.

3. Las tarjetas TM4C123 LaunchPad y STM32F407 Descubrimiento utilizan ligeramente diferentes


cables de USB para conectar para la PC host. La launchpad es suministrada con un cable USB,
mientras que la de Descubrimento STM32F407 no lo es.

4. Mientras que el amplificador de audio y la launchpad se conectan juntas, la tarjeta de audio


de Wolfson Pi no se conecta con la tarjeta de STM32F407 Descubrimiento. Las conexiones entre
las dos pueden realizarse al utilizar un cable de cinta personalizado, disponible por distribuidor
Farnell.

5. Un osciloscopio, un generador de señal, un micrófono, audífonos, y varios cables conectores.


Varios de estos artículos pueden ser adquiridos en la mayoría de laboratorios de ingeniería
eléctrica. Si estas utilizando la STM32F407 Descubrimiento y la tarjeta de audio Wolfson Pi,
entonces un micrófono no es necesario. La tarjeta de audio ha creado en digital micrófonos
MEMS. La tarjeta de audio Wolfson Pi también es compatible con audífonos combinando
micrófono y auricular (incluyendo aquellos proveídos por Apple y los smartphones Samsung).
Cables stereo 3.5 mm Jack plug de 3.5 mm Jack plug a (dos) RC (phono) plugs y RCA a BNC
adaptores son los cables específicos que se requieren.

6. Proyecto y archivos con ejemplos del programa desde el sitio web de socios

http: / / www.wiley.com /go / Reay / ARMcortexM4.

Referencia

1. Yiu, J., “The Definitive Guide to ARM ® Cortex®.M3 y Cortex®-M4 Processors”, Tercera
Edición, Elsevier Inc., 2014. R – M4
Capítulo 2

Entrada y Salida Analógicas

2.1 Introducción

Un sistema básico DSP, adecuado para procesar señales de audiofrecuencia, constando un


procesador de señal digital (DSP) e interfaces analógicas son mostradas en la Figura 2.1. la
TM4C123 LaunchPad y el amplificador de audio proveen tal sistema, utilizando una TM4C123
ARM® Cortex®-M4 processor y un códec TLV320AIC3104 (AIC3104) [1]. La STM32F407
Descubrimiento y la tarjeta de audio Wolfson Pi proveen tal sistema, utilizando una STM32404
ARM® Cortex®-M4 processor y un códec WM5102 [2]. El término códec se refiere a la
codificación de formas de ondas analógicas como señales digitales y la decodificación de señales
digitales como formas de ondas analógicas. Los códec AIC3104 y WM5102 llevan a cabo funciones
de conversor de señal analógica a digital y funciones de conversor de señal digital a analógica,
las cuales se muestran en la Figura 2.1.

[En esta parte se encuentra un diagrama del sistema básico de procesador de señal digital]

Señal de entrada analógica

ADC

Procesador de señal digital

DAC

Señal de entrada analógica

Figura 2.1 sistema básico de procesador de señal digital

Ambos códec AIC3104 y WM5102 se comunican con sus procesadores asociados (TM4C123 y
STM32F407) utilizando I2C bus para control (escribiéndole a los registros de control de los códec)
y I2s para (audio) la transferencia de datos.

2.1.1. Muestreo, Reconstrucción y Aliasing

Dentro de los DSPs, las señales son presentadas en secuencias de valores discretos de la muestra,
y en donde quiera que las señales son mostradas, la posibilidad de aliasing incrementa. Más
adelante en este capítulo, el fenómeno de aliasing es explorado con más detalle. Basta decir
hasta aquí que la aliasing no es un factor deseable y puede ser evitada al utilizar un filtro
antialiasing puesto en la entrada del sistema mostrada en la Figura 2.1 y por un diseño adecuado
para el DAC. En un sistema de paso bajo, un filtro efectivo para la antialiasing será aquel que
permitirá los componentes de frecuencia en frecuencias por debajo de la mitad de las muestras
de la frecuencia para que pasen, pero esto atenúa grandemente, o para los componentes de
frecuencia en frecuencias mejores que o iguales a la mitad de las muestras de la frecuencia. Un
DAC adecuado para un sistema de peso bajo es ser el mismo un filtro de peso bajo, el cual tenga
características similares al filtro antialiasing anteriormente mencionado. El término DAC
comúnmente se refiere al dispositivo electrónico que convierte los valores discretos de la
muestra representados en el hardware digital en una señal eléctrica analógica continúa. Cuando
se ve esto puramente desde una perspectiva de procesamiento de señales, el DAC actúa como un
filtro de reconstrucción. Aunque estos pueden diferir en un número de aspectos, ambos códec
AIC3104 y WM5102, contienen filtros de antialiasing y reconstrucción, ambos digitales y análogos
y por lo tanto, no requieren filtros adicionales y externos.

2.2 TLV320AIC3104 (AIC3104) Códec de estéreo para Entrada y Salida de Audio

El amplificador de audio hace uso de un códec TLV320AIC3104 (AIC3104) para entrada y salida
análoga (observe las Figuras 2.2 y 2.3). El AIC3104 es un códec de audio estéreo con potencia
baja, basado en tecnología sigma-delta, y diseñada para el uso en aplicaciones portables de
batería cargada. Cuenta con un número de micrófonos y una entrada de niveles de línea,
configurados con un solo extremo terminado o con una conexión diferencial. En su lado de
salida, un número diferencial y salidas de alto voltaje son proveídos. Las salidas de alto voltaje
son capaces de manejar los auriculares. Un número de diferentes tasas de muestras que varían
de 8 a 96 kHz es apoyado por el dispositivo. El conversor de señal analógica a digital (ADC), o
descifrador, parte del códec que reconstruye una señal de salida análoga desde una secuencia de
(16-bit, 24-bit, o 32 bit entero con signo) valores de muestra que han sido procesados por el DSP
y escritos por el DAC.

[En esta parte se encuentra un diagrama de la representación de diagrama]

Lado análogo

LINE1L

Entrada de línea analógica

MIC2L

Otro mezclador que las entradas no muestran

Registro 19

Registro 17

(mute o 0 dB a -12 dB)

PGA

Registro 15

ADC_L PGA ganancia de control 0 dB a 59.5 dB)

ADC
HPF

Lado digital

Registro 12

(seleccionar/activar)

Registro 107

(defecto o coeficientes de filtro programables)

DOUTL

Datos en serie a TM4C123

PGA_L al lado DAC

LINE1LP

Figura 2.2 Representación del diagrama de bloques simplificado del lado de la salida del códec
AIC3104 mostrando los bloques seleccionados y trayectos de señales utilizados por el ejemplo de
los programas en este libro (solamente el canal izquierdo).

[En esta parte se encuentra un diagrama del sistema básico de procesador de señal digital 2]

Lado digital

DINL

Datos en serie desde TM4C123

Efectos digitales programables y énfasis

Registro 12

(control de filtro digital del códec de audio)

DAC_ATTEN

Registro 43

(digital DSC_L

Volumen

0 dB a -63.5 dB)

DAC_L

DAC_L

Lado análogo

Otro mezclador en donde la entrada no se muestra


Registro 82

Registro 81

(Control de volumen y mezcla

0 dB a-78.3 dB)

Registro 86

(DAC

ganancia de salida

0 dB a 9 dB)

IZQUIERDO:LOPM

Salida analógica lineal

HPLOUT

Salida analógica de auricular

Registro 51

(DAC ganancia de salida 0 dB a 9 dB)

Registro 47

Registro 46

(control del volumen y mezcla

0 dB a – 78.3 dB)

PGA_L

PGA_L

Desde el lado ADC

Registro 108

Señales análogas pasivas by-pass durante la desconexión

LINE1LP

Figura 2.3 Representación del diagrama de bloques simplificado del lado de la salida del códec
AIC3104 mostrando los bloques seleccionados y trayectos de señales utilizados por el ejemplo de
los programas en este libro (solamente el canal izquierdo).

También en el dispositivo se contienen filtros digitales programables y bloques de ganancia. El


códec es configurado utilizando un número de control de registros , ofreciendo muchas opciones
que van más allá del alcance de este texto para describirlos completamente. Sin embargo, las
opciones de la frecuencia de muestra, la conexión de entrada, y las ganancias ADC PGA se
hicieron disponibles en el ejemplo del programa a través de los parámetros pasados a función
tm4c123_aic3104_init (). Además, es posible escribir en cualquiera de los registros del control
códec utilizando la función I2CRegWrite ().

Más adelante en este capítulo, los ejemplos que posibilitan algunos de los bloques de filtro
digital interno de los registros de control de AIC3104 son descritos. En el Capítulo 4, las
características de los filtros digitales programables dentro del AIC3104 son examinados con
mayor detalle.

Los datos son pasados a y desde vía AIC3104, su interfaz de serie I2S. Las conexiones ENTRADA
DE MICRÓFONO (rosado), EN LINEA (azul), SALIDA DE LÍNEA (verde) y HP FUERA DE LÍNEA (negro)
se encuentran disponibles vía cuatro 3.5 mm tomas de enchufe en el amplificador de audio, y
estos son conectados al AIC3104, tal como se muestra en la Figura 2.4. Además, por razones, las
cuales se explicarán con detalle más adelante, saltadores J6 y J7 en el amplificador de audio
permite la conexión de filtros bajos de primer orden y testeo de puntos en cuanto a gancho de
alcance TP2 y TP3 para SALIDA DE LÍNEA en el AIC3104.

[En esta parte se encuentra un diagrama de las conexiones de entrada y salida análogas]

ROSADO
VERDE
AZUL
NEGRO

Figura 2.4 Las conexiones de entrada y salida análogas en el amplificador de audio AIC3104.

2.3 WM5102 CÓDEC AUDIO HUB para Entrada y Salida

La tarjeta de audio Wolfson hace uso de un audio hub para entrada y salida análogas. El WM5102
presenta un códec de audio de baja potencia y alto rendimiento.

Los datos son pasados a y desde vía WM5102, su interfaz de serie I2S, y el dispositivo es
configurado al escribirle a sus registros de control vía interface I2C. Además del número de
filtros configurables y bloques de ganancia, el códec WM5102 contiene un DSP programable. Sin
embargo, el uso de esta propiedad DSP se encuentra más allá del alcance de este libro.

Las conexiones ENTRADA DE LÍNEA (rosado), SALIDA DE LÍNEA (verde) y la ENTRADA DE


MICRÓFONO y el SALIDA DE LÍNEA HP combinados (negro) se encuentran disponibles vía tres 3.5
tomas de enchufe de la tarjeta de audio Wolfson.
2.4 Ejemplos de Programación

Los siguientes ejemplos ilustran la entrada y salida análoga utilizando, ya sea la TM4C123
LaunchPad y el amplificador de audio o la STM32F407 Descubrimiento y la tarjeta de audio
Wolfson. Los ejemplos de los programas se encuentran disponibles en su plataforma, aunque en
varios casos, solamente una plataforma se menciona por ejemplo. A un número pequeño de
ejemplos de programas en este capítulo le conciernen los filtros digitales internos de la
programación en el códec AIC3104 y por lo tanto, se aplica solamente en la plataforma hardware
de Texas Instruments. A un número pequeño de programas le concierne el uso del 12-bit DAC
construido en el procesador STM32F407 y por lo tanto, se aplica solamente en la plataforma
hardware de STMicroelectronics.

Los ejemplos de los programas demuestran algunos conceptos importantes asociados con
conversor de señal analógica a digital y con conversor de señal digital a analógica, incluyendo el
muestreo, reconstrucción, y el aliasing. Además, estos ilustran el uso de polling-, interrupción-,
y un DMA (memoria de acceso directo)- basado en e/s para implementar aplicaciones en tiempo
real. Varios de estos conceptos y técnicas descritas en este capítulo son visitados en capítulos
subsecuentes.

2.5 Entrada y Salida en Tiempo Real Utilizando Polling-, Interrupción, y una Memoria de
Acceso Directo (DMA)

Tres formas básicas en tiempo real e/s son demostradas en los siguientes ejemplos. Los métodos
polling- e interrupción-basado e/s en los métodos de trabajo en muestra por muestra, y el
procesamiento consiste en ejecutar un grupo similar de declaraciones de programas en cada
instante de muestra. DMA-basado en e/s lidia con bloques, o cuadros, de muestras de entrada y
salida y es inherentemente más eficiente en términos de requisitos en cuanto al procesamiento
de una computadora. El procesamiento consiste en ejecutar un grupo de declaraciones de
programas similares después de cada transferencia DMA. Bloque- o cuadro- basados en el
procesamiento es unido cercanamente al, pero no restringido al, uso del dominio de
procesamiento de frecuencia (utilizando el FFT) tal como se describe en el Capítulo 5.

Los siguientes ejemplos ilustran el uso de los tres diferentes mecanismos e/s para poder
implementar una función simple a través de conversación. A lo largo del resto de este libro, el
uso se creó básicamente de métodos de interrupción- y DMA- basados. A comparación de los
métodos polling- e interrupción-basados, existe un gran retraso del tiempo entre la señal que
entra al sistema de procesamiento de señal digital y lo deja introducido por el método DMA-
basado. Es posible hacer uso del mecanismo DMA con un tamaño de cuadro de una sola muestra,
pero esto hace derrotar al propósito del uso DMA-basado e/s.
[Cuadro de fórmulas]: Ejemplo 2.1 Entrada y Salida Básica Utilizando Polling

Listado 2.1 Programa

El código fuente de lenguaje C para programas, tm4c123_loop_poll.c, el cual simplemente copia


muestras de entrada leídas desde un ADC códec AIC3104 a un DAC códec AIC3104 como muestras
de salida, esto se muestra en el Listado 21. Efectivamente, la ENTRADA DE MICRÓFONO de
enchufe de entrada es conectada directamente a través de enchufes de salida SALIDA DE LÍNEA y
SALIDA DE LÍNEA HP en un amplificador de audio vía códec AIC3104 y procesador TM4C123. La
función tm4c123_aic3104_init(), llamada por programa tm4c123_loop_poll.com, está definida
como archivo de soporte tm4c123_aic3104_init.c. De esta manera, el archivo de soporte C
tm4c123_loop_poll.c se mantiene lo más corto posible y el detalle de baja potencia que distrae
de forma potencial, se esconde. Los detalles de implementación de la función
tm4c123_aic3104_init () y otras funciones definidas en tm4c123_aic3104_init.c no necesitan ser
estudiadas en detalle para poder utilizar ejemplos presentados en este libro.

2.5.1 Emulación I2S en el TM4C123

El procesador TM4C123 no presenta una interface I2S. En vez de esto, dos Interfaces de serie
síncrona (SSI, por sus siglas en inglés) interfaces, SSI0 y SSI1, son utilizadas para emular un
estéreo bidireccional de interfaz I2S y para pasar datos de audio de y desde el códec AIC3104.
Una interfaz SSI maneja el canal izquierdo y la otra maneja el canal derecho. Los detalles de la
emulación I2S están descritos en la nota de aplicación [3].

2.5.2 Programa de operación

Siguiendo con el llamado de la función tm4c123_aic3104_init(), programa tm4c123_loop_poll.c


entra un bucle sin fin y repetidamente copia los valores de la muestra de los canales de entrada
derecha e izquierda en variables input_left e input_right, utilizando la función SSIDataGet(),
antes de escribir estos valores de muestra a AIC3104 DAC, utilizando la función SSIDataPut(). La
función SSIDataGet() espera hasta que existan datos en el recibimiento FIFO del periférico
especifico SSI, SSI0_BASE o SSI1_BASE, y función SSIDataPut() espera hasta que exista espacio
disponible en la transmisión FIFO del periférico especifico SSI. En esta forma, las operaciones en
tiempo real del programa es controlado por el tiempo de la interface I2S, la cual, en turno, está
determinado por el códec AIC3104 (actuando como maestro I2S). Las funciones SSIDataGet() y
SSIDataPut() están definidas en el paquete de familia de dispositivos TM4C123 (DFP) instalados
como parte del entorno de desarrollo MDK-ARM. Aunque el AIC3104 se encuentra configurado
para utilizar valores de muestra 16-bit, la función SSIDataGet() retorna al valor 32-bit y la
función SSIDataPut() son pasados al valor 32-bit.

La función SSI:interrupt_routine() no es utilizada por el programa tm4c123_loop_poll.c pero ha


sido definida por una trampa por inesperadas interrupciones SSI periféricas.
En este simple ejemplo, no es necesariamente estricto el convertir los valores de muestra 16-bit
leídos desde el ADC AIC3104 por función SSIDataGet() a 32-bit en cuanto a valores de puntos
flotantes. Sin embargo, en ejemplos de programas subsecuentes, los algoritmos DSP son
implementados utilizando aritmética de puntos flotantes y los valores de muestra de entrada son
convertidos en tipo float32_t. El procesamiento de los valores de muestra de puntos flotantes
podrían ser implementados agregando declaraciones entre

input_right= (float32_t) (simple_data.bit16[0]);

sample_data.bit32= ((int16_t) (inpt_left));

2.5.3 La Ejecución del Programa

Conectar el micrófono en la en el enchufe de ENTRADA DE MICRÓFONO (rosada) en la tarjeta de


la amplificación de audio y auriculares en el enchufe de SALIDA DE LINEA HP (verde). Ejecutar el
programa y verificar que la entrada del micrófono puede ser escuchada en los auriculares.

2.5.6 Cambiar la Conexión de Entrada de LÍNEA

Cambiar la declaración del programa

para leer

Reconstruir el proyecto y ejecutar el programa una vez más utilizando una señal desde la tarjeta
de sonido, un generador de señal, o un reproductor de mp3 conectado al enchufe ENTRADA DE
LÍNEA (azul) como entrada.

2.5.5 Cambiar la Frecuencia de Muestreo

Cambia la frecuencia de muestreo utilizada por pasar valor de parámetro FS:8000_HZ en vez de
FS_48000_HZ a la función de inicialización del códec, esto se da, por cambiar la declaración del
programa

Tm4c123_aic3104_init(FS_48000_HZ,
AIC3104_LINE_IN,
I0_METHOD_POLL,
PGA_GAIN_6_DB);
Para leer
Tm4c123_aic3104_init(FS_8000_HZ,
AIC3104_LINE_IN,
I0_METHOD_POLL,
PGA_GAIN_6_DB);
Reconstruir el proyecto y ejecutar el programa de nuevo. Las señales que pasan a través del
sistema deberían sonar menos brillante que el previo, debido a la menor frecuencia de muestreo
y al sistema reducido correspondiente al ancho de banda.

Los valores de los parámetros validos (constantes) que pueden pasar a la función
tm4c123_AIC3104_init() son

FS_48000_HZ
FS_44100_HZ
FS_32000_HZ
FS_24000_HZ
FS_22050_HZ
FS_16000_HZ
FS_11025_HZ
FS_8000_HZ

Los cuales establecen la frecuencia de muestreo,

I0_METHOD_POLL
I0_METHOD_INTR
I0_METHOD_DMA

Los cuales establecen el método e/s,

AIC3104_MIC_IN
AIC3104_LINE_IN

Los cuales establecen la conexión de entrada utilizada, y

PGA_GAIN_0_DB
PGA_GAIN_1_DB
PGA_GAIN_2_DB
PGA_GAIN_3_DB
PGA_GAIN_4_DB
PGA_GAIN_5_DB
PGA_GAIN_6_DB
PGA_GAIN_7_DB
PGA_GAIN_8_DB
PGA_GAIN_9_DB
PGA_GAIN_10_DB
PGA_GAIN_11_DB
PGA_GAIN_12_DB

Los cuales establecen la ganancia del PGA que precede al ADC (se muestra en la Figura 2.2). El
valor del parámetro PGA_GAIN_6_DB es utilizado por defecto para poder compensar los circuitos
potenciales que se dividen entre el enchufe ENTRADA DE LÍNEA en el amplificador de audio y
LINEIN_L y LINEIN_R en el AIC3104 (tal como se muestra en la Figura 2.4) .

Ejemplo 2.2
Entrada y Salida Básica Utilizando Polling (stm32f4_loop_poll.c).

Programa stm32f4_loop_poll.c, mostrado en la Lista 2.4, funcionalmente es equivalente al


programa tm4c123_loop_poll.c pero se ejecuta en la STM32F407 Descubrimiento. La
comunicación dúplex completa I2S entre el códec WM5102 y el procesador STM32F407 se
implementa en la STM32F407 utilizando dos instancias I2S, SPI/I2S2 y I2S2_ext. SPI/I2S2 se
configuran como un receptor y I2S2_ext como un transmisor. El códec WM5102, el cual opera de
modo maestro, el cual genera la palabra I2S y señales de reloj de bits (WCLK y BCLK) y la
periférica STM32F407 I2S opera de modo esclavo.

Después de la llamada a la función stm32f4_wm5102_init(), programa stm32f4_loop_poll.c entra


un bucle sin fin.

El indicador de estado SPI_I2S_FLAG_RXNE en SPI/I2S2 repetidamente es testeado utilizando la


función SPI_I2S_GetFlagStatus() hasta que se establece, indicando que el amplificador receptor
SPI/I2S2 no se encuentra vacío. Luego, el indicador de estado I2S_FLAG_CHSIDE es testeado. Esto
indica cómo los datos recibidos corresponden al canal izquierdo o derecho.

Si el valor de I2S_FLAG_CHSIDE indica que el valor de muestreo del canal izquierdo ha sido
recibido, y la función SPI_I2S_ReceiveData() se utiliza para leer tal forma de muestreo SPI/I2S2
en int16_tvarialbe input_left, y luego de esperar por el indicador de estado SPI_I2S_FLAG_TXE
para que éste se establezca, el valor de la variable input_left se escribe en I2S2_ext.

Si el valor de I2S_FLAG_CHSIDE indica que el valor de muestreo del canal derecho ha sido
recibido, y la función SPI_I2S_ReceiveData() se utiliza para leer tal forma de muestreo SPI/I2S2
en int16_tvarialbe input_right, y luego de esperar por el indicador de estado SPI_I2S_FLAG_TXE
para que éste se establezca, el valor de la variable input_right se escribe en I2S2_ext.
El bucle sin fin luego retorna para testear el indicador de estado SPI_I2S_FLAG_RXNE en SPI/IS2S.
De esta forma, la operación en tiempo real del programa se controla por el tiempo de la interfaz
I2S, la cual, en su turno, se determina por el códec WM5102 (actuando como el maestro I2S).

En esta discusión simple en cuanto al ejemplo, no es estrictamente necesario testear si las


muestras recibidas corresponden al canal izquierdo o derecho. Sin embargo, el programa ha sido
escrito para que el procesamiento de señales, ya sea en cualquiera de los dos o ambos canales,
fácilmente pudieran ser añadidos entre, por ejemplo, las declaraciones del programa.

left_in_sample = SPI_I2S_ReceiveData(I2Sx) ;

while(SPI_I2S_GetFlagStatus(I2Sxext,

[Cuadro de fórmulas]: Lista 2.2 Programa stm32f4_loop_poll. c

Los valores de los parámetros validos (constantes) que pueden pasar a la función
stm32_wm5102_init() son

FS_48000_HZ
FS_44100_HZ
FS_32000_HZ
FS_24000_HZ
FS_22050_HZ
FS_16000_HZ
FS_11025_HZ
FS_8000_HZ

Los cuales establecen la frecuencia de muestreo,

I0_METHOD_POLL
I0_METHOD_INTR
I0_METHOD_DMA

Los cuales establecen el método e/s, y

WM5102_MIC_IN
WM5102_DMIC_IN
WM5102_LINE_IN
Los cuales se establecen en la conexión de entrada utilizada.

2.5.6 Utilizando el Micrófono Digital MEMS en la Tarjeta de Audio Wolfson

A diferencia del amplificador de audio para la TM4C123 LaunchPad, el cual separa los enchufes
ENTRADA DE MICRÓFONO y la SALIDA DE LÍNEA HP, la tarjeta de audio de Wolfson posee un
enchufe individual de AUDIFONO (como se muestra en la Figura 2.5) que puede ser utilizado para
un micrófono combinado y cascos auriculares, audífonos de estéreo convencional, un micrófono
electret que utiliza cuatro polos (TRRS) 3.5 mm jack plug. Además, la tarjeta de audio de
Wolfson presenta micrófonos digitales MEMS con un estéreo con alta calidad que pueden ser
seleccionados por un valor de parámetro pasajero WM5102_DMIC_IN para la función
stm32_wm5102_init().

[En esta parte se encuentra un diagrama de las conexiones de entrada y salida análogas]

EN LÍNEA

Ferrite (EMI) Cuenta de supresión 60ohm @ 100MHz

ESD0402V05C05 (ESD) diodo de protección contra sobretensiones

Supresor transitorio de cerámica de voltaje CA04F2FT5AUD010G

AURICULAR

Supresor transitorio de cerámica de voltaje CA04F2FT5AUD010G

FUERA DE LÍNEA

Figura 2.5 Conexiones de entrada y salida análogas en la tarjeta de audio Wolfson.

2.5.7 La Ejecución del Programa

Como se estableció, el programa stm32f4_loop_poll.c acepta la entrada desde los micrófonos


digitales MEMS en la tarjeta de audio y dirige esto a los enchufes (verde) SALIDA DE LINEA y
(negro) AURICULARES. Si deseas utilizar la tarjeta de sonido, el generador de señal, o el
reproductor de MP3 para suministrar una señal de entrada con nivel de línea al enchufe (rosado)
ENTRADA DE LINEA, cambia la declaración del programa.

stm32f4_wm5102_init ( FS_48000_HZ,
WM5102_DMIC_IN,
I0_METHOD_INTR ) ;

Para leer

stm32f4_wm5102_init ( FS_48000_HZ,
WM5102_LINE_IN,
I0_METHOD_INTR ) ;

El polling basado en la e/s no es computacionalmente eficiente y se utiliza en muy pocos


ejemplos del programa en este libro.

Ejemplo 2.3
Entrada y Salida Básica Utilizando Interrupciones ( tm4c123_loop_intr. c ).

Como se vio en términos de señales de entrada y salida análogas, el programa


tm4c123_loop_intr . c, mostradas en la Lista 2.6, funcionalmente es equivalente al programa
tm4c123_loop_poll. C pero utiliza una interrupción basada en e/s.

[Cuadro de fórmulas] Lista 2.3 Programa tm4c123_loop_intr. c

Este programa simple es importante porque muchos de los ejemplos de los programas en este
libro, los cuales utilizan la interrupción basada en e/s y son estructuradas similarmente. En lugar
de simplemente copiar la secuencia de los valores de la muestra leídas de ADC a DAC, una
operación de filtro digital podría ser llevada a cabo cada vez que una nueva muestra de entrada
se recibe, eso es, un algoritmo de procesamiento de muestra por muestra, el cual podría ser
insertado entre las declaraciones de programa.

input_right = ( float32_t ) ( sample_dat.bit16 [ 0 ] ) ;

sample_dat.bit16 [ 0 ] = ( int16_t ) ( input_left ) ;

Por esta razón, vale la pena hacer el tiempo para asegurar que entiendes cómo un programa
tm4c123_loop_intr . c trabaja.

Estrictamente hablando, no es buena práctica llevar a cabo operaciones de procesamiento de


señales digitales dentro de una rutina de servicio de interrupción hardware, por ejemplo, la
función SSI_interrupt_routine (). Sin embargo, en los ejemplos del programa en este libro, no se
encuentran otras tareas llevadas a cabo por un procesador, y , en la mayoría de casos, los
algoritmos que son demostrados han sido puestos dentro de la función (es) de la rutina de
servicio de interrupción.

En función principal (), el valor del parámetro I0_METHOD_INTR se pasa a la inicialización de la


función tm4c123_aic3104_init (). Esto selecciona el uso, por el programa, de interrupción basada
en e/s.

tm4c123_aic3104_init ( FS_48000_HZ,
AIC3104_MIC_IN,
I0_METHOD_INTR,
PGA_GAIN_6_DB ) ;

Siguiendo a la inicialización, la función principal () ingresa un bucle sin fin y vacío,


efectivamente no realiza nada más que esperar por las interrupciones.

La SSI0 recibe las interrupciones FIFO (SSI_RXFF), las cuales ocurren en la frecuencia de
muestreo (48 kHz), son manejadas por una función de rutina de servicio de interrupción
SSI_interrupt_routine (). En esta función, el canal izquierdo y derecho de valores de muestreo
con 16-bit, son leídos desde SSI1 y SSI0, que reciben FIFOs respectivamente. Esos se convierten
en valores float32_t, input_left e input_right. Estrictamente hablando, el tipo de conversiones
son innecesarias en este programa de discusión simple desde que los valores de input_left e
input_right son subsecuentemente convertidos como eran al tipo int16_t y son escritos a
transmisión SSI1 y SSI0 FIFOs, respectivamente.

2.5.8 La Ejecución del Programa

Como se estableció, el programa tm4c123_loop_intr . a acepta la entrada desde los enchufes


desde la tarjeta de amplificador de audio y dirige los enchufes (negro) SALIDA DE LINEA y (verde)
SALIDA DE LINEA HP. Si deseas utilizar una tarjeta de sonido, el generador de señal, o el
reproductor de MP3 para suministrar una señal de entrada con nivel de línea a una señal de
entrada, cambia la declaración del programa.

tm4c123_aic3104_init ( FS_48000_HZ,
AIC3104_MIC_IN,
I0_METHOD_INTR,
PGA_GAIN_6_DB ) ;
Para leer

tm4c123_aic3104_init ( FS_48000_HZ,
AIC3104_MIC_IN,
I0_METHOD_INTR,
PGA_GAIN_6_DB ) ;

El GPIO pin PE2 se establece alto en el arranque, y se resetea lento cerca del final, de la función
SSI_interrupt_routine (). Esta señal es accesible vía el conector J3 en la TM4C123 LaunchPad.

Ejemplo 2.4
Entrada y Salida Básica Utilizando Interrupciones (stm32f4_loop_intr . c).

El programa stm32f4_loop_intr . c se muestra en la Lista 2.8. En términos de señales de entrada


y salida análoga, es funcionalmente equivalente al programa tm4c123_loop_intr. c pero se
encuentra escrito para la STM32F407 Descubrimiento y la tarjeta de audio de Wolfson. Porque
los códecs WM5012 y AIC3104 difieren y ya que, a diferencia del procesador TM4C123, la
STM32F407 presenta una interface I2S, se encuentran diferencias sutiles entre programas
stm32f4_loop_intr . c y tm4c123_loop_intr . c.

[Cuadro de fórmulas] Lista 2.4 Programa stm32f4_loop_intr. c

Siguiendo una llamada a la inicialización, la función stm32_wm5102_init (), la función principal


() ingresa un bucle sin fin y vacío, efectivamente no realiza nada más que esperar por las
interrupciones.

La periférica I2S en el procesador STM32F407 es configurado por el modo esclavo full dúplex,
utilizando el protocolo de audio estándar PCM, con 16-bit empacado en 32-bit cuadros. Las
interrupciones del amplificador receptor que no se encuentra vacío (RXNE) son generados por IS2
instancia SPI/I2S2 cuando los datos son recibidos desde el códec WM5102. Estas interrupciones,
las cuales se llevan a cabo en la frecuencia de muestreo (48 kHz) para ambas muestras en los
canales izquierdos y derechos, son manejadas por la función SPI2_IRQHandler (). Esto testea el
indicador de estado CHSIDE para poder determinar cómo la muestra del canal izquierdo o
derecho ha sido recibida.

Si la muestra del canal izquierdo ha sido recibida (CHSIDE 1), entonces el valor se lee desde
SPI/I2S2 dentro de la variable input_left por la función SPI_I2S_ReceiveData (I2Sx). Luego pues,
es copiado a la variable output_left y escrito en I2S2_ext utilizando la función SPI_I2S_SendData
(). Finalmente, el GPIO pin PD15 es cambiado. Este pin es accesible vía J2 en la STM32F407
Descubrimiento y puede ser monitoreado utilizando osciloscopio. En la STM32F407
Descubrimiento, el GPIO pin PD15 maneja un LED azul, y, por lo tanto, su ciclo laboral es
discernible desde un brillo aparente en el LED azul. En este ejemplo del programa, desde que la
interrupción ocurre dos veces por periodo de muestra (una por cada canal, izquierdo y derecho),
el GPIO pin PD15 debiese hacer salir una onda cuadrada 48-kHz y el LED azul debiese emitir luz
con intensidad mediana.

Ejemplo 2.5
Entrada y Salida Básica Utilizando DMA (tm4c123_loop_dma. c).

En términos de señales de entrada y salida análogas, el programa tm4c123_loop_dma. c, tal


como se muestra en la Lista 2.10, funcionalmente es equivalente en los ejemplos del programa
que se han mostrado anteriormente, pero hace uso de acceso directo a memoria (DMA). EL DMA
basado e/a mueve bloques o cuadros de datos (muestra) entre códec y memoria del procesador
sin un la participación de un CPU, permitiendo al CPU llevar a cabo otras labores al mismo
tiempo, y por consiguiente, es computacionalmente más eficiente que los métodos de polling o
interrupciones basadas e/s.

[Cuadro de fórmulas] Lista 2.5 Programa tm4c123_loop_intr. c

2.5.9 El DMA en el Procesador TM4C123

El regulador TM4C123 DMA posee 32 canales, cada uno de los cuales pueden ser asignados a uno
de las cinco periféricas diferentes (cada dispositivo periférico en el procesador TM4C123 se
asocia con un canal controlador DMA especifico). Cada canal puede operar en modo básico de
ping-pong o dispersión-recolección. Los transmisores de DMA están creados de elementos 1024 x
8-, 16-, o 32-bit. Una interface I2S es emulada en el TM4C123 utilizando dos periféricas SSI
separadas (SSI0 y SSI1), SSI1 para el canal izquierdo y SSI0 para el canal derecho. La periférica
SSI0 se configura para activar a la orilla positiva del reloj de marco I2S, WCLK (generado por el
códec AIC3104), y la periférica SSI2 se configura para activar a la orilla negativa del reloj de
marco I2S (estrictamente hablando, la orilla positiva del reloj de marco I2S, el cual se encuentra
invertido). El códec AIC3104 en el amplificador de audio actúa como maestro I2S y suministra el
marco y señales de reloj de bits (WCLK y BCLK).

El control del canal DMA es implementado al utilizar una tabla (alineada en un límite de 1024-
byte en la memoria) de estructuras de control. Se encuentran dos estructuras de control
asociadas con cada canal (primario (PRI) y alternativo (ALT)) y ambos de estos son utilizados en
modo ping-pong.

Cada estructura de control incluye un puntero de dirección de origen (SRC por sus siglas en
inglés), un destino de puntero de dirección (DST), y un control de palabra especificando tamaño
de elementos de datos SRC y DST, la dirección de SRC y DST incrementa, el número total de
elementos a transferir, y el modo de transmisión (básico, ping-pong, o dispersión-recolección).
Los puntero de dirección SRC y DST en control con la tabla deben ser iniciados antes que la
transmisión de DMA comience, y según la dirección de SRC y DST incremente, estos son
actualizados como progresos transferidos.

En el modo ping-pong, tan pronto como la transmisión de DMA sea completada, otra
transferencia (ALT o PRI) en el mismo canal, comienza. Cuando una transferencia DMA es
completada, una interrupción puede ser generada y esto manda la señal de una oportunidad, en
modo ping-pong, no solamente para procesar el block de los datos de entrada, los cuales son los
más transferidos recientemente, pero también reinicializar la estructura de control inactiva
presente (PRI o ALT).

En los ejemplos del programa en este libro, el protocolo bidireccional de transferencia de datos
estéreo I2S hace uso de cuatro canales DMA unidireccionales, los cuales son asociados con
SSI0TX, SSI0RX, SSI1TX, Y SSI1RX.

Las transferencias especificas por la estructura de control (desde la formación RpingOUT a la


SSI0 transmisión FIFO) primaria SSI0TX (PRI), alternan con aquellos especificados por la
estructura de control (ALT) alternativa SSI0TX (desde la formación RpongOUT a la SSI0
transmisión FIFO). Cada vez que estas transferencias se completa, una interrupción se genera y
es manejada por la función SSI0IntHandler (). Siguiendo una terminación de una transferencia
SSI0TX PRI DMA (desde la formación RpingOUT a la SSI0), la rutina de servicio de interrupción
SSI0 debe reinicializar la estructura de control SSI0TX PRI (principalmente al reestablecer las
direcciones SRC y DST). En ese momento, la transferencia SSI0TX ALT DMA (desde la formación
RpingOUT a la SSI0) debe estar en progreso.

Las transferencias SSI0TX DMA (PRI desde el SSI0 receptor FIFO desde la formación RpingIN y ALT
desde el SSI0 receptor FIFO a la formación RLpongIN) toman lugar en paralelo con las
transferencias SSI0TX, y la terminación de cualquiera de estas transferencias, genera
interrupciones también manejadas por SSI0IntHandler().

La rutina de servicio de interrupción SSI0IntHandler() debe por lo tanto determinad cuál de las
cuatro posible diferentes transferencias DMA, ha completado y reinicializado la estructura de
control correspondiente. Esto se resume en la Tabla 2.1. La función SSI0IntHandler() se muestra
en la Lista 2.11. Sus funciones son

1. determinar cuál de las cuatro posibles transferencias DMA ha completado (y generado una
interrupción SSI0IRQ).

2. Reinicializar la estructura de control correspondiente, reestableciendo los indicadores


directorios SRC o DST (memoria).
3. Establecer el valor de la bandera RprocBuffer a cualquier de estos PING o PONG.

4. Si la transferencia completa desde la memoria a la SSI0 transmisión FIFO, se estable la


bandera RTxcomplete.

5. Si la transferencia completa se llevó a cabo desde el SSI0 receptor FIFO a la memoria, se


establece la bandera RRxcomplete.

Tabla 2.1 Resumen de las Estructuras de Control DMA Utilizadas y Banderas Establecidas en las
Rutinas de Servicio de Interrupción SSI0IntHandler() y SSI1IntHandler() en Programa
tm4c123_loop_dma.c

[Aquí se encuentra la tabla 2.1]

Canal
Opción
SRC
DST
Establecimiento de las Banderas

En paralelo con estas transferencias DMA, un establecimiento correspondiente de transferencias


DMA toma lugar entre la memoria y la periférica SSI1. Estas lidian con el canal izquierdo de los
datos de audio.

En función main(), un bucle sin fin while() espera hasta que ambas RTxcomplete y RRxcomplete
son establecidas antes que la llamada función RprocessBuffer() Esta función utiliza el valor de
RprocBuffer para decidir cómo se procesan los contenido en formación RpingIN o RpongIN.
También resetea las banderas RTxcomplete y RRxcomplete.

Así pues, la función main() espera hasta que ambas LTxcomplete y LRxcomplete son establecidas
antes de la llamada función LprocessBuffer().

Las interrupciones generadas en terminación de transferencias son manejadas por las rutinas de
servicio de interrupción, asociadas con la periférica involucrada, la cual es, ya sea
SSI0IntHandler() o SSI1IntHandler(), y estas son definidas en el archivo tm4c123_aic3104_init.c.

Cada transferencia DMA es de BUFSIZE 16-bit valores de muestra, correspondientes a BUFSIZA


sampling instants. El valor de la constante BUFSIZE es definida en el archivo de encabezado
tm4c123_aic3104_init.h. La función SSI_interrupt_routine () no se utiliza por el programa
tm4c123_loop_dma.c pero ha sido definida aquí como un interceptor para interrupciones
periféricas SSI inesperadas.
[Cuadro de fórmulas]: Listado 2.6 Función SSI0IntHandler(), definida en el archivo
tm4c123_aic3104_init.c

2.5.10 Ejecución del Programa

Construye y ejecuta el programa tm4c123_loop_dma.c y verifica su operación. Como se proveyó,


el programa utiliza la conexión (azul) ENTRADA DE LÍNEA para la entrada. Si deseas utilizar un
micrófono conectado a la conexión (rosada) ENTRADA DE MICRÓFONO como dispositivo de
entrada, tendrás que cambiar los parámetros pasados a la función tm4c123_aic3104_init() a

tm4c123_aic3104_init ( FS_48000_HZ,
AIC3104_MIC_IN,
I0_METHOD_DMA
PGA_GAIN_6_DB ) ;

2.5.11 Monitoreando la Ejecución del Programa

GPIO pin PE2 se establece justo antes, y resetea justo después, de la llamada función
Lprocessbuffer. Por lo tanto, la señal en ese pin es un pulso rectangular, la duración de la cual
indica el tiempo tomado por la función ejecutora Lprocessbuffer. En este ejemplo, la duración
del pulso es muy corta ya que ningún procesamiento significante toma lugar en la función. El
pulso rectangular se repite con un periodo igual al del tiempo entre las transferencias DMA
consecutivas, eso es, BUFSIZE periodos de muestra. Un ejemplo del pulso de salida en GPIO pin
PE2 por el programa tm4c123_loop_dma.c se muestra en la Figura 2.6. En este caso, el valor de
la constante BUFSIZE es 256, la frecuencia de muestreo es 48kHz, y por lo tanto, el tiempo entre
los pulsos consecutivos equivale al de 256/48,000=5.33 ms.

[En este espacio se encuentra la imagen de la figura 2.6]

Figura 2.6 Pulso en la salida en GPIO pin PE2 por el programa tm4c123_loop_dma.c.

2.5.12 Midiendo el Retraso Presentado por DMA-Basado E/S

El retraso extra entre la entrada y salida análoga, de 2*BUFSIZE de periodos de muestreo,


presentados por DMA-basado E/S o utilizando amplificadores ping-pong como se implementaron
en la TM4C123, puede ser medido utilizando un generador de señal y un osciloscopio.

Conectar la salida del generador de señal a ambos canales izquierdos del enchufe (azul)
ENTRADA DE LINEA en el amplificador de audio y un canal en el osciloscopio, y conectar una
sonda de osciloscopio desde otro canal en el osciloscopio en el gancho del alcance del canal
izquierdo (TP2, por sus siglas en inglés) en el amplificador de audio. El alcance selector saltarín
J6 debe encajar. La Figura 2.7 muestra el retraso de aproximadamente 11.7 ms, presentado por
el programa al pulso rectangular de duración 1.0 ms, como se muestra en la Figura 2.8. El
retraso adicional presentado por el uso de DMA-basado e/s es equivalente a aproximadamente
10.7ms. En una frecuencia de muestreo de 48 kHz, modo ping-pong con transferencias DMA de
BUFSIZE = 256 muestras, corresponde al retraso de 2 * 256/48,000=10.67 mx. El valor de la
constante BUFSIZE se define en el archivo tm4c123_aic3104_init.h.

[En este espacio se encuentra la imagen de la figura 2.7]

Figura 2.7 El retraso presentado por el uso de DMA –basado e/s en el programa
tm4c123_loop_dma.c. El rastro superior muestra el pulso rectangular de duración 1 ms aplicado
a la ENTRADA DE LINEA, el rastro inferior muestra la salida desde la SALIDA DE LINEA. BUFSIZE =
256, frecuencia de muestreo 48 kHz.

[En este espacio se encuentra la imagen de la figura 2.8]

Figura 2.8 El retraso presentado por el uso de interrupción-basado e/s en el programa


tm4c123_loop_intr.c. El rastro superior muestra el pulso rectangular de duración 1 ms aplicado a
la ENTRADA DE LINEA, el rastro inferior muestra la salida desde la SALIDA DE LINEA. BUFSIZE =
256, frecuencia de muestreo 48 kHz.

Ejemplo 2.6
Entrada y Salida Básica Utilizando DMA (stm32f4_loop_dma.c).

Los procesadores ARM Cortex-M4 de diferentes fabricantes, los cuales implementan DMA
ligeramente diferente (aunque los principios subyacentes son similares). El programa
stm32f4_loop_dma.c, mostrado en la Lista 2.13, funcionalmente es equivalente al programa
tm4c123_loop_dma.c pero difiere ligeramente porque las diferencias entre las periféricas DMA
en los procesadores TM4C123 y STM32F407.

[Cuadro de fórmulas]: Lista 2.7 Programa stm32f4_loop_dma.c

2.5.13 El DMA en el Procesador stm32f407

El DMA en el procesador STM32F407 se encuentra organizado en corrientes unidireccionales. Dos


controladores DMA poseen ocho corrientes cada uno, y las corrientes son subdivididas en ocho
canales. Los canales individuales se encuentran asociados con dispositivos periféricos
específicos. La bidireccional I2S en el STM32F407 es implementada utilizando los dispositivos
periféricos SPI/I2S2 y I2Sext. El programa stm32f4_loop_dma.c hace uso del modo ping-pong que
no ha sido incorporado del buffering posible en el STM32F407. El DMA-basado e/s se selecciona
por un pasante valor del parámetro I0_METHOD_DMA a la función stm32_wm5102_init ().
En función stm32_wm5102_init (), corriente 3 canal#0 es configurada para crear transferencias
DMA entre la periférica I2S y amplificadores de entrada (formaciones) en la memoria
(alternativamente pingIN y pongIN). Esto genera una interrupción cuando una transferencia de
BUFSIZE 16-bit muestras son completas. (Aquellas 16-bit muestras, corresponden
alternativamente a L y R canales de audio y así, una transferencia de muestras BUFSIZE
corresponden a BUFSIZE/2 instantes de muestra.) Dos rutinas de servicio de interrupción
separadas, son utilizadas; una para cada de los procesos DMA anteriormente mencionados. Las
acciones llevadas a cabo en estas rutinas son simplemente asignadas a las variables
rx_proc_buffer y tx_proc_buffer los valores PING o PONG y para establecer banderas
RX_buffer_full y TX_buffer_empty. Estas variables son utilizadas en la función process_buffer ().

Cambiando entre amplificadores pingIN, pongIN, pingOUT, y pongOUT son manejados de manera
automática por el mecanismo STM32F4 DMA. Si, por ejemplo, la rx_proc_buffer es igual a PING,
esta indica que la corriente recientemente más completa 3 DMA transferencia ha llenado el
amplificador pingIN y estos datos son disponibles para ser procesados. Si tx_proc_buffer es igual
a PING, este indica que la corriente recientemente más completa 4 DMA transferencia ha escrito
los contenidos del amplificador pingOUT a la periférica I2S y este amplificador se encuentra
disponible para llenarlo con nuevos datos.

La función main() simplemente espera hasta que ambas banderas RX_buffer_full y


TX_buffer_empty establecidas, eso es, hasta que ambas transferencias DMA han completado
antes la llamada función process_buffer().

En el programa stm32f4_loop_dma.c, la función process_buffer() simplemente copia los


contenidos del amplificador de entrada más lleno recientemente (pingIN o pongIN) al
amplificador de salida vaciado de forma muy reciente (pingOUT o pongOUT), según los valores
de las variables rx_proc_buffer y tx_proc_buffer.

El procesamiento basado en marcos puede ser llevado a cabo en función process_buffer ()


utilizando los contenidos del amplificador de entrada llenado muy recientemente como salida y
escritura de salida de valores de muestreo al amplificador de salida vaciado de forma muy
reciente. Las transferencias DMA completarán, y la función proc_buffer() pasará a ser llamada,
cada BUFSIZE/2 instantes de muestreo y por lo tanto cualquier proceso debe ser completo dentro
de los segundos BUFSIZE/ (2*fs) (o, más estrictamente hablando, antes de la próxima
terminación de transferencia DMA).

2.5.14 Ejecución del Programa

Haz la ejecución stm32f4_loop_dma.c y verifica su operación utilizando el origen de la señal y


osciloscopio o auriculares. Como se proveyó, el programa lee la salida desde el enchufe (verde)
ENTRADA DE LINEA en la tarjeta de audio y salidas en (rosado) SALIDA DE LINEA y (negro)
conexiones de AURICULARES.
2.5.15 Midiendo el Retraso por DMA-Basado E/S

El retraso extra entre la entrada y salida análoga, de BUFSIZE de periodos de muestreo,


presentados por DMA-basado E/S como se implementó en la STM32F407, puede ser medido
utilizando un generador de señal y un osciloscopio.

Conectar la salida del generador de señal a ambos canales izquierdos del enchufe (verde)
ENTRADA DE LINEA en la tarjeta de audio Wolfson y un canal en el osciloscopio, y conectar otro
canal en el osciloscopio al canal izquierdo del enchufe (rosado) SALIDA DE LINEA en la tarjeta de
audio Wolfson. La Figura 2.9 muestra un retraso de aproximadamente 5.9 ms presentado por el
programa al pulso rectangular de duración 1.0 ms. En contraste, el programa
stm32f4_loop_intr.c presenta un retraso de aproximadamente 560us, como se muestra en la
Figura 2.10. El retraso adicional presentado por el uso de DMA-basado e/s es equivalente a
aproximadamente 5.3 ms. En una frecuencia de muestreo de 48 kHz, modo ping-pong con
transferencias DMA de BUFSIZE = 256 muestras (128 muestras por canal), corresponde al retraso
256/48,000=5.33 ms. El valor de la constante BUFSIZE se define en el archivo
stm32f4_aic3104_init.h.

[En este espacio se encuentra la imagen de la figura 2.9]

Figura 2.9 El retraso presentado por el uso de DMA –basado e/s en el programa
stm32f4_loop_dma.c. El rastro superior muestra el pulso rectangular de duración 1 ms aplicado a
la ENTRADA DE LINEA, el rastro inferior muestra la salida desde la SALIDA DE LINEA. BUFSIZE =
256, frecuencia de muestreo 48 kHz.

[En este espacio se encuentra la imagen de la figura 2.10]

Figura 2.10 El retraso presentado por el uso de interrupción-basado e/s en el programa


stm32f4_loop_intr.c. El rastro superior muestra el pulso rectangular de duración 1 ms aplicado a
la ENTRADA DE LINEA, el rastro inferior muestra la salida desde la SALIDA DE LINEA. BUFSIZE =
256, frecuencia de muestreo 48 kHz.

Ejemplo 2.7
Modificando el Programa tm4c123_loop_intr.c para crear el retraso (tm4c123_delay_intr. c).

Algunos efectos simples y sorprendentes pueden ser alcanzados simplemente al retrasar los
valores de muestreo como tales van pasando desde entrada a salida. El programa
tm4c123_delay_intr.c, como se muestra en la Lista 2.15, demuestra esto.
[Cuadro de fórmulas]: Lista 2.8 Programa tm4c123_delay_intr.c

Una línea de retraso es implementada utilizando la formación buffer para almacenar muestras
como están leídas desde el ADC. Una vez, la formación se encuentra completa, el programa
escribe de nuevo la muestra de entrada almacenada más antigua con la muestra de entrada
actual o la más nueva. Justo antes de volver a escribir de nuevo la muestra de entrada
almacenada más antigua en buffer, el valor de la muestra es mejorada, agregada a la muestra
de entrada actual y escrita en el DAC. La Figura 2.11 muestra una representación del diagrama
de bloque de la operación del programa tm4c123_dealy_intr.c en el cual el bloque marcada T
representa un retraso de T segundos. El valor T es igual al número de muestras almacenadas en
buffer, multiplicado por el periodo de muestreo. La ejecución del programa
tm4c123_delay_intr . c, utilizando un micrófono conectado al enchufe (rosado) ENTRADA DE
MICROFONO en el amplificador de audio como un dispositivo de entrada.

[En esta parte se encuentra un diagrama de la figura 2.11]

Entrada
Salida

Figura 2.11 Representación del diagrama de bloque del programa tm4c123_delay_intr. c.

Ejemplo 2.8
Modificando el Programa tm4c123_loop_intr. c para crear una repetición
(tm4c123_echo_intr. c).

Al alimentar nuevamente una fracción de salida de la línea de retraso a su entrada, un efecto


repetitivo algo desvanecido, puede ser llevado a cabo. El programa tm4c123_echo_intr. c, tal
como se muestra en la Lista 2.17 y se representa en forma de diagrama de bloque en la Figura
2.12, realiza esto.

[En esta parte se encuentra un diagrama de la figura 2.12]

Entrada
Salida
Ganancia

Figura 2.12 Representación del diagrama de bloque del programa tm4c123_echo_intr. c.


[Cuadro de fórmulas]: Lista 2.9 Programa tm4c123_echo_intr. c.

El valor de la constante BUFFER_SIZE en el programa tm4c123_echo_intr. c, determina el


número de muestras almacenadas en la formación buffer y por lo tanto, la duración del retraso
es implementada. El valor de la constante GAIN determina la fracción de la salida que ha sido
alimentada de nuevo en la línea de retraso, y por lo tanto, la frecuencia por la cual el efecto de
repetición desvanece. Estableciendo el valor de GAIN es igual a, más que, 1 causará
inestabilidad. Construir y ejecutar este programa. Los experimentos con los valores diferentes de
GAIN (entre 0.0 y 1.0) y BUFFER_SIZE (entre 100 y 8000). Archivo de origen tm4c123_echo_intr. c
debe ser editado y el proyecto reconstruido para poder crear estos cambios.

Ejemplo 2.9
Modificando el Programa tm4c123_loop_intr. c para crear una repetición
(tm4c123_flanger_intr. c).

El flanging es un efecto de audio utilizado en estudios de grabación (y actuaciones en vivo) eso,


depende del establecimiento de sus parámetros, esto puede agregar un sonido chillón, no a
diferencia de un avión de reacción que pasa uno oye por casualidad. Es un efecto de retraso
basado y puede por lo tanto, ser implementado como una extensión de los dos ejemplos previos.
El efecto flanging se muestra en la forma de diagrama de bloque en Figura 2.13. La adición de
una versión de retraso y atenuada de la señal de entrada a sí misma, crea una respuesta con
frecuencia como peine. Si la frecuencia de la señal de entrada es como un entero múltiple de su
periodo, el cual es igual al retraso T, agregando la señal de entrada retrasada, la cual cancelará
la señal de entrada y esto corresponde a una muesca en la respuesta de la frecuencia. Las
muescas en la respuesta de la frecuencia de magnitud serán, por lo tanto, espaciada en
intervalos regulares en frecuencia igual a 1/T Hz con la primera muesca localizada en la
frecuencia 1/2T Hz. Si la longitud del retraso se varía lentamente, entonces las posiciones de las
muescas en la magnitud de la respuesta de frecuencia, variarán según para producir un efecto
flanging. Como se implementó en el programa tm4c123_flanger_intr . c (Lista 2.19), el retraso T
varía sinusoidalmente entre 200 y 1800 us, en una frecuencia de 0.1 Hz. Aplicado al contenido de
frecuencia alta de contenido musical significativo (por ejemplo, sonido de los tambores), la
característica “avión de reacción que pasa uno oye por casualidad” tipo de sonido puede ser
escuchado. Aumentando la frecuencia de cambio de retraso a, por ejemplo, 3 Hz que da un
efecto más cercano al llevado a cabo por Leslie altavoz giratorio.

[En esta parte se encuentra un diagrama de la figura 2.13]

Entrada
Salida
Alfa
Figura 2.13 Representación del diagrama de bloque del programa tm4c123_flanger_intr. c.

[Cuadro de fórmulas]: Lista 2.10 Programa tm4c123_flanger_intr. c.

Si la señal retrasada es substraída desde, en lugar de ser agregada a, la señal de entrada,


entonces la primera muesca en la magnitud de respuesta de frecuencia será localizada en 0 Hz,
otorgando elevación a un efecto global de paso alto (respuesta de bajo muy pequeña). Para
substraer, más que agregar, la señal retrasada, cambia la declaración en programa
tm4c123_flanger_intr. c que lee

Lyn = Lxn + buffer [out_ptr]*ALPHA ;

para leer

Lyn = Lxn - buffer [out_ptr]*ALPHA ;

Las Figuras 2.14 y 2.15 muestran ejemplos experimentalmente medidos de respuestas de


frecuencia de magnitud e impulse instantáneo en el programa flanger para los dos casos
descritos. Los detalles de cómo estos resultados fueron obtenidos, son otorgados más adelante
en este capítulo.

[En esta parte se encuentra dos diagramas de la figura 2.14]

Valor de muestra
Tiempo
Magnitud (dB)
Frecuencia (Hz)

Figura 2.14 (a) respuesta del impulso y (b) magnitud de respuesta de frecuencia del flanger
implementado utilizando el programa tm4c123_flanger_intr. c en un instante en donde el retraso
T es equivalente a 104.2 us. Las muescas en la magnitud de respuesta de frecuencia son
frecuencias 4800 y 14,000 Hz.

[En esta parte se encuentra dos diagramas de la figura 2.15]

Valor de muestra
Tiempo
Magnitud (dB)
Frecuencia (Hz)
Figura 2.15 (a) respuesta del impulso y (b) magnitud de respuesta de frecuencia del flanger
implementado utilizando el programa tm4c123_flanger_intr. c en un instante en donde el retraso
T es equivalente a 208.3 us. Las muescas en la magnitud de respuesta de frecuencia son
frecuencias 0, 4800, 9600, 14,400 y 19,200 Hz.

El retraso que varía con el tiempo, implementado por el flanger puede ser ilustrado utilizando el
programa tm4c123_flanger_dimpulse_intr. c y un osciloscopio. En este programa, las muestras
de entrada son generadas dentro del programa en vez de ser leídas por el ADC. La secuencia de
las muestras de entrada utilizadas en un valor distinto de cero seguido por 2047 valores de cero,
y esta secuencia es periódicamente repetida. El efecto es provocar al flanger con secuencia de
tiempo discreto que impulsa separadamente por 2048 periodos de muestra o 42.67 ms. La salida
desde el programa tm4c123_flanger_dimpulse_intr. c comprende la entrada (en la cual pasa a
través directamente) más una versión retrasada y atenuada de la entrada. Figura 2.16 muestra
un ejemplo de la salida desde el programa, capturada utilizada un osciloscopio Rigol DS1052E. El
pulso en el centro de la pantalla corresponde al pulso de la entrada y al pulso de la derecha, el
cual corresponde al pulso retrasado. En el instante de la captura mostrada en la Figura 2.21, el
retraso es igual a aproximadamente 400 us. Cuando el programa está siendo ejecutado, deberías
observar el retraso entre pulsos que varían lentamente. La forma de los pulsos en la Figura 2.21
se explica en el Ejemplo 2.31.

[En este espacio se encuentra la imagen de la figura 2.16]

Figura 2.16 Forma de onda de la salida producida utilizando el programa


tm4c123_flanger_dimpulse_intr. c en un instante cuando el retraso T es igual a
aproximadamente 400 us.

La respuesta de la frecuencia de magnitud, la cual varía con el tiempo, del flanger se encuentra
ilustrado en la Figura 2.17, la cual muestra la salida del programa tm4c123_flanger_intr . c,
modificado para que la señal de la salida sea una secuencia binaria pseudoaleatoria, mostrada
como espectrograma (frecuencia vs. tiempo) utilizando Goldware. Las bandas oscuras en el
espectrograma corresponden a las muescas en las respuestas de la frecuencia en la magnitud.
Una alternativa efectiva de un sonido pseudoaleatorio como señal de entrada es soplar
suavemente en el micrófono.

[En este espacio se encuentra la imagen de la figura 2.17]

Figura 2.17 Espectro y espectrograma del flanger de salida por un sonido pseudoaleatroio en la
entrada. En el espectrograma, la x-axis representa el tiempo en segundos y la y-axis representa
la frecuencia en Hz.
Ejemplo 2.10
El programa de bucle con Datos Almacenados en la Entrada dentro del Amplificador
(stm32f4_loop_buf_intr. c).

El programa stm32f4_loop_buf_intr. c, muestra la Lista 2.21, es similar al programa


stm32f4_loop_intr. c, excepto que implementa amplificadores circulares en formación 1buffer y
rbuffer, cada uno contiene el BUFFER_SIZE más reciente de valores de muestra de la entrada en
uno u otro canal. Seguidamente, es posible examinar estos datos después de la detención del
programa.

[Cuadro de fórmulas]: Lista 2.11 Programa stm32f4_loop_buf_intr. c

2.5.16 Ejecución del Programa

Construir y ejecutar el programa. Utilizar un generador de señal conectado al enchufe (rosado)


ENTRADA DE LÍNEA, en la tarjeta de audio Wolfson para entrar una señal sinusoidal con
frecuencia entre 100 y 3500 Hz. Detener el programa luego de un cierto periodo corto de tiempo
y guarda los contenidos de la formación rbuffer o 1buffer al archivo de datos mientras se escribe

Sabe <filename> <start address>, <start address + 0x400>

en la línea Command en el debugger MDK-ARM, en donde start address es la dirección en


formación rbuffer o 1buffer (y la cual puede determinar utilizando la funciones Watch y Memory
en el debugger MDK-ARM.

Los contenidos del archivo de datos pueden ser trazados utilizando MATLAB ® function
stm32f4_logfft(). La Figura 2.18 muestra un ejemplo de los contenidos en formación 1buffer
cuando la frecuencia de la señal de la entrada era 350 Hz. La discontinuidad en la forma de onda
en tiempo t=16ms corresponde al valor del índice 1bufptr en formación cuando el programa en
ejecución fue detenido. Hay que recordar que la formación 1buffer se utiliza como un
amplificador circular en el cual los valores de muestra más viejos son escritos nueva y
continuamente por nuevos. El programa stm32f4_loop_buf_intr. c se utiliza de nuevo más tarde
en este capítulo para poder enfatizar las características del filtro antialiasing del códec.

[En esta parte se encuentra dos diagramas de la figura 2.18]

Valor de muestra
Tiempo
Magnitud (dB)
Frecuencia (Hz)
Figura 2.8 los valores de la muestra almacenados en formación 1buffer por el programa
stm32f4_loop_buf_intr. c , rastrados utilizando MATLAB función stm32f4_logfftt(). La señal de
entrada de la frecuencia fue 350 Hz.

2.6 Generación de la Forma de Onda en Tiempo Real

Los siguientes ejemplos tratan con una generación de variedad de diferentes formas de ondas de
salidas análogas, incluyendo sinusodes de diferentes frecuencias, al escribir secuencias
diferentes de valores de muestreo del DACs en los códec WM5102 Y AIC3104. De esta forma, las
características detalladas del DACs son reveladas y los conceptos de muestreo, reconstrucción y
aliasing son ilustrados. Además, el uso de la aplicación shareware Goldwave es presentada. Este
instrumento virtual es una alternativa útil para un analizador de osciloscopio o espectro y se
utiliza otra vez en este capítulo más adelante.

Ejemplo 2.11
La Generación Onda Sinusoidal Utilizando una Tabla de Búsqueda (stm32f4_sine48_intr. c).

El programa stm32f4_sine48_intr. c, tal como se muestra en la Lista 2.23, genera una señal de
salida sinusoidal utilizando una interrupción-basada e/s y un método de tabla de búsqueda
(Figura 2.18). Su operación es lleva a cabo de la siguiente forma. Una tabla de búsqueda de 48-
point es inicializada en formación sine_tabla tal como el valor sine_table[i] es igual a

10,000sin(2pii/48), para i=0,1,2 …, 47. 2.1

La formación sine_table por lo tanto, contiene 48 muestras de exactamente un ciclo de


sinusoide. En este ejemplo, una frecuencia de muestreo de 48 Hz se utiliza, y por lo tanto, las
interrupciones ocurrirán cada 20.833 us. Dentro de la rutina de servicio de interrupción
SPI2_IRQHandler(), las declaraciones de programa más importantes, son ejecutadas. Cada 20.833
us, un valor de muestreo leído desde la formación since_tale es escrito al DAC y la variable del
índice since_ptr se incrementa al punto del valor que sigue en formación. Si el valor
incrementado de sine_ptr es mejor que, o igual que, al número de valores de muestreo en la
tabla (LOOPLENGTH), se resetea a cero. La frecuencia kHz de la señal de salida sinusoidal
corresponde a las 48 muestras por ciclo de la salida en una frecuencia de 48 kHz .

[Cuadro de fórmulas]: Lista 2.12 Programa stm32f4__sine48_intr. c

El DAC en el códec Wm5102 reconstruye una señal de salid análoga sinusoidal desde los valores
de muestreo de salida.
2.6.1 La ejecución del Programa

Construir y ejecutar el programa y verificar un tono de 1 Hz en la salida en las conexiones


(verde) SALIDA DE LINEA y (negro) AURICULAR en la tarjeta de audio Wolfson.

El programa stm32f4_sine8_intr . c es similar al programa stm32f4_sine48_intr. c , en el cual


genera una forma de onda de salida análoga sinusoidal con frecuencia de 1 Hz desde una tabla
de búsqueda de valores de muestreo. Sin embargo, utiliza una frecuencia de muestreo de 8 kHz
y una tabla de búsqueda, la cual contiene solamente ocho valores de muestreo, los cuales son,

#define LOOPLENGTH 8
int16_t sine_table[LOOPLENGTH] = {
0, 7071, 10000, 7071, 0, -7071, -10000, -7071} ;

2.6.2 Ruido fuera de banda en la Salida del Códec AIC3104


(tm4c123_sine48_intr. c)

Mientras se llevan a cabo esencialmente las funciones similares, los códec utilizados en las dos
plataformas de hardware diferentes, difieren sutilmente en sus características de manera
funcional. Si estas utilizando la TM4C123 LaunchPad y el amplificador de audio AIC3104, más que
la STM32F407 Descubrimiento y la tarjeta de audio Wolfson, conecta un osciloscopio al enchufe
(negro) ENTRADA DE LINEA en el amplificador de audio. Ejecuta el programa
tm4c123_sine48_intr. c y deberías observar una forma de onda similar como se muestra en la
Figura 2.19. Se encuentra un nivel significante de ruido superpuesto en la onda sinusoidal 1-kHz,
y esto revela algo acerca de las características del DAC AIC3104. Es un sobre muestreo sigma
delta DAC, el cual deliberadamente hace que salga un ruido del (audio) de banda de frecuencia.
El ruido fuera de banda presente en la salida DAC puede ser observado en la frecuencia
dominante, utilizando un espectro analizador o una función FFT en un osciloscopio digital.

[En esta parte se encuentra dos diagramas de la figura 2.19]

Magnitud (dB)
Frecuencia (Hz)

Figura 2.19 (a) sinusoide 1-kHz generada utiliza el programa tm4c123_sine48_intr. c vista
utilizando el osciloscopio Rigol DS1052E conectado a la conexión en el amplificador de audio
(negro) ENTRADA DE SALIDA. (b) Magnitud de FFT de la señal rastreada utilizada MATLAB.

El rastreo mostrado en la Figura 2.19 fue obtenida utilizando un osciloscopio digital Rigol
DS1052E para poder capturar la forma de onda en la salida y luego la magnitud de FFT de los
datos fueron rastreados utilizando MATLAB. Esto muestra claramente ambos tonos 1-kHz y el
ruido fuera de banda arriba 100 kHz. El ruido fuera de banda no es un problema para escuchar
las señales de audio porque los auriculares o las bocinas usualmente no tendrán respuestas de
frecuencias que se extienden tan altas y tampoco el oído humano. Sin embargo, para poder
observar claramente la banda en detalle de señales de audio generadas por un códec AIC3104
utilizando un osciloscopio, es útil agregar un filtro de primer pedido y paso bajo, el cual
comprende un condensador y un resistidor en el camino de la señal SALIDA DE LINEA. Esto puede
llevarse a cabo un puente de encaje J6 o J7 y al observar las señales de salida en los ganchos de
alcance, TP2 y TP3, en el amplificador de audio. La Figura 2.20 muestra la señal de salida
filtrada desde el programa en ambos, el dominio de tiempo y frecuencia para su comparación
con la Figura 2.19.

[En esta parte se encuentra dos diagramas de la figura 2.20]

Magnitud (dB)
Frecuencia (Hz)

Figura 2.20 (a) sinusoide 1-kHz generada utiliza el programa tm4c123_sine48_intr. c vista
utilizando el osciloscopio Rigol DS1052E conectado al gancho de alcance en el amplificador de
audio. (b) Magnitud de FFT de la señal rastreada utilizada MATLAB.

[En este espacio se encuentra la imagen de la figura 2.21]

Figura 2.21 Pulso rectangular de salida en el GPIO pin PD15 por el programa stm32f4_sine_intr.
c.

En cualquiera de los ejemplos en este libro, en el cual un osciloscopio es utilizado para observar
una señal de salida desde el códec AIC3104, se recomienda que la sonda del osciloscopio se
encuentre conectada a uno de los ganchos de alcance en el amplificador de audio (TP2 o TP3) y
que los puentes de encaje J6 y J7 encajen de manera correcta.

En contraste, las señales análogas de salida por el códec WM5102 vía la conexión SALIDA DE
LINEA en la tarjeta de audio Wolfson no contiene un ruido fuera de banda como se describe aquí
y las conexiones pueden ser llevadas a cabo directamente desde la conexión (verde) SALIDA DE
LINEA en la tarjeta de audio Wolfson a un osciloscopio (utilizando un 3.5mm Jack plug a RCA
cable plug y un RCA y BNC adaptador).

Ejemplo 2.12
Generación de onda sinusoidal utilizando sinf() llamada función (stm32f4_sine_intr. c).
Las ondas sinusoidales de diferentes frecuencias pueden ser generadas utilizando un método que
involucre una tabla de búsqueda empleada por los programas stm32ff4_sine48_intr. c y
stm32f4_sine8_intr. c. Por ejemplo, una onda sinusoidal de 3-kHz puede ser generada utilizando
el programa stm32f4_sine8_intr. c al cambiar la declaración del programa que se lee

int16_t sine_table[LOOPLENGTH] = {
0, 7071, 10000, 7071, 0, -7071, -10000, -7071} ;

para leer

int16_t sine_table[LOOPLENGTH] = {
0, 7071, 10000, 7071, 0, -7071, -10000, -7071} ;

Sin embargo, el cambiar los contenidos y/o tamaños de la tabla de búsqueda particularmente no
es una forma flexible de generar sinusoides de frecuencias arbitrarias (El ejemplo 2.26
demuestra cómo los diferentes sinusoides de frecuencia pueden ser generados desde una tabla
de búsqueda arreglada).

El programa stm32f4_sine_intr. c, muestra en la Lista 2.25, toma un diferente enfoque. En cada


instante de muestreo, lo que significa, en función SPI2_IRQHandler (), un nuevo valor de
muestreo de salida se calcula utilizando una llamada a la función biblioteca de matemáticas
sinf(). El parámetro de punto flotante, theta, pasado a tal función se incrementa en cada
instante de muestreo por el valor theta_increment = 2*PI*frecuency/SAMPLING_FREQ, y cuando
el valor de theta excede 2pi, el valor 2pi es sustraído desde ese.

[Cuadro de fórmulas]: Lista 2.13 Programa stm32f4_sine_intr. c

Mientras que el programa stm32f4_sine_intr. c tiene la ventaja de la flexibilidad, también tiene


la desventaja, relativa al programa stm32f4_sine48_intr. c, el cual requiere un esfuerzo
computacional mayor. Esta es una consideración importante en las aplicaciones de tiempo real.

2.6.3 Ejecución del Programa

Construir y ejecutar el programa y experimentar por el cambio del valor asignado a la frecuencia
variable en el rango desde 100.0-3800.0 (editando el programa y reconstruyendo el proyecto
cada vez). La frecuencia de muestreo utilizada en por este programa es 8 kHz. El programa
stm32f4_sine_intr.c utiliza el GPIO pin PD15 para indicar el tiempo tomada para ejecutar la
rutina de servicio de interrupción SPI2_IRQHandler (). El GPIO pin PD15 se establece alto por la
declaración del programa

GPI0_SetBits (GPI0D, GPI0_Pin_15) ;


Al comienzo de la rutina de servicio de interrupción SPI2_IRQHandler () y resetea bajo por la
declaración del programa

GPI0_ResetBits (GPI0D, GPI0_Pin_15) ;

Al final de la rutina de servicio de interrupción SPI2_IRQHandler (). En otras palabras, hace salir
un pulso rectangular en cada PD15 125 ux y la duración de tal pulso es indicativa del tiempo
tomado para computar cada nuevo valor de muestra de salida. Tal tiempo es determinado
primariamente por el tiempo tomado para ejecutar la declaración de programa

Left_out_sample = ( int16_t ) ( amplitude*sinf( ( theta ) ) ;

La Figura 2.21 muestra la onda de forma de salida en el GPIO pin PD15. La duración de los pulsos
es de aproximadamente 680 ns. La función sinf () se utiliza porque la función sin ()
computacionalmente es muy cara para ser utilizada en este aplicación. Una alternativa
ligeramente más eficiente es proveída por la función arm_sin_f32 (), definida en la biblioteca
CMSIS DSP. Edita el programa, reemplaza la declaración del programa

Left_out_sample = (int16_t) (amplitude*sinf (theta ) ) ;

con

Left_out_sample = (int16_t) (amplitude*arm_sin_f32 (theta ) ) ;

y deberías encontrar que la duración del pulso de salida en PD15 se reduce aproximadamente a
400 ms. En general, las llamadas funciones trigonométricas definidas en bibliotecas de
matemáticas estándar, deberían ser evitadas en aplicaciones DSP en tiempo real.

Ejemplo 2.13
Sinusoide Buscado Utilizando la Tabla con 8000 Puntos (stm32f4_sweep_intr. c).

Este ejemplo ilustra el uso de una tabla de valores de muestreo arreglada de búsqueda para
poder generar forma de ondas de salida análoga con frecuencia arbitraria ( sin cambiar la
frecuencia de muestreo). La Lista 2.27 es del programa stm32f4_sweep_intr. c, el cual genera
una señal con frecuencia sinusoidal de búsqueda, utilizando una tabla de búsqueda, la cual
contiene 8000 valores de muestreo. Este es un método de la generación de forma de ondas
comúnmente utilizadas en los laboratorios generadores de señal. El título del archivo
sine8000_table . h, generado por utilizar el comando MATLAB

>> x = 1000*sin ( 2* pi* [0 : 7999 ] / 8000 ) ;


contiene 8000 valores de muestreo, los cuales representan exactamente un ciclo de una onda
sinusoidal. La Lista 2.28 es una lista parcial del archivo sine8000_tabla. h.

[Cuadro de fórmulas]: Lista 2.14 Programa stm32f4_sweep_intr. c

[Cuadro de fórmulas]: Lista 2.15 Lista parcial del título del archivo sine8000_table. H

En cada instante de muestreo, el programa stm32f4_sweep_intr . c lee un valor de muestreo de


salida desde la formación sine8000, utilizando el float32_t valor de la variable float_index,
convertido al tipo int16_t, como un índice, e incrementa el valor float_index por el valor
float_incr. Con puntos N en la tabla de búsqueda, representando un ciclo de un sinusoide, la
frecuencia de la forma de onda de salida es igual a SAMPLING_FREQ*float_incr/N. Un valor de
float_incr resultaría en una frecuencia de salida arreglada. En el programa stm32f4_sweep_intr .
c, el valor de float_incr sí mismo, es incrementado en cada instante de muestreo por el valor
DELTA_INCR y por lo tanto, la frecuencia de la forma de onda de salida, incrementa
gradualmente desde START_FREQ a STOP_FREQ. La forma de onda de salida generada por el
programa, puede ser alterada al cambiar los valores de las constantes START_FREQ, STOP_FREQ,
y SWEEPTIME, desde las cuales el valor de DELTA_INCR es calculado. Construir y ejecutar este
programa. Verificar la salida que será sinusoide, tomando segundos SWEEPTIME para incrementar
la frecuencia desde START_FREQ a STOP_FREQ.

Ejemplo 2.14
La Generación de los Tonos DTMF Utilizando una Tabla de Búsqueda
(tm4c123_sineDTMF_intr . c).

El programa tm4c123_sineDTMF_intr . c, presentado en la Lista 2.30, utiliza una tabla de


búsqueda, la cual contiene 512 muestras de un solo ciclo de un sinusoide junto con dos
indicadores independientes para generar forma de ondas multifrecuentes de doble tono (DTMF).
Las formas de onda DTMF, las cuales comprenden la suma de dos sinusoides de diferentes
frecuencias, son utilizadas en las redes de teléfonos para indicar las pulsaciones de teclas. Un
total de 16 diferentes combinaciones de frecuencias, cada una comprendiendo a la otra de
cuatro componentes con frecuencia baja (697, 770, 852, o 941 Hz) y uno de los cuatro
componentes con frecuencia alta (1209, 1336, 1477 o 1633 Hz) son utilizadas. El programa
tm4c123_sineDTMF_intr . c, utiliza dos indicadores independientes de una tabla de búsqueda
singular, cada uno actualizado en la misma frecuencia (16 kHz) pero cada paso se lleva a cabo a
través de los valores en la tabla, utilizando diferentes tamaños de pasos.

[Cuadro de fórmulas]: Lista 2.16

Un indicador que se ha escalonado a través de cada una de las muestras TABLESIZE singulares,
almacenadas en una tabla de búsqueda en una frecuencia de muestreo de 16 kHz generaría un
tono sinusoidal con igual frecuencia a ( 16000/TABLESIZE ). Un indicador que se ha escalonado a
través de muestras almacenadas en la tabla de búsqueda, incrementadas por el valor STEP,
generaría un tono sinusoidal con igual frecuencia a ( 16000 * STEP/TABLESIZE ). Desde esto, es
posible calcular el tamaño del paso requerido para cualquier frecuencia deseada. Por ejemplo,
para poder generar un sinusoide con frecuencia 770 Hz, el tamaño del paso requerido es STEP =
TABLESIZE * 770/16000 = 24.64. En otras palabras, en cada instante de muestreo, el indicador en
la tabla de búsqueda, debería ser incrementado por 24.60. El valor del indicador, o índice, en la
tabla de búsqueda debe ser un valor entero ( ( int16_t ) ( loopindexlow) ) pero un valor de
indicador con punto flotante, o índice ( loopindexlow ) se mantiene por el programa y es
incrementado por 24.64 en cada instante de muestreo y envuelto aproximadamente a 0.0 cuando
su valor excede de 512.0 utilizando las declaraciones

Loopindexlow + = 24.64 ;
if ( loopindexlow> (float32_t) TABLESIZE ) loopindexlow - = (float32_t ) TABLESIZE ;

En el programa tm4c123_sineDTMF_intr. c, los valores de punto flotante por los cuales, la tabla
de búsqueda indica que son aumentados, son predefinidos utilizando, por ejemplo,

#define STEP_770 ( float32_t ) ( 770 * TABLESIZE ) / SAMPLING_FREQ

Para poder cambiar el tono DTMF, generado y similar diferentes teclazos, edita el programa
tm4c123_sineDTMF_intr . c y cambia las declaraciones del programa.

Loopindexlow + = STEP_697 ;
Loopindexhi + = STEP_1477 ;

a , por ejemplo

Loopindexlow + = STEP_770 ;
Loopindexhi + = STEP_1209 ;

Un ejemplo de la salida generada por el programa tm4c123_sineDTMF_intr . c se muestra en la


Figura 2.22.

[En esta parte se encuentra un diagrama de la figura 2.22]

Figura 2.22 Salida desde el programa tm4c123_sineDTMF_intr . c vista utilizando el osciloscopio


Rigol DS1052.

Ejemplo 2.15
Reconstrucción de Señal, Aliasing, y las Propiedades del Códec WM5102 (stm32f4_sine_intr .
c).

El generar señales de salida análogas utilizando, por ejemplo, el programa stm32f4_sine_intr . c


es un medio útil para investigar las características del códec WM5102. Si estas utilizando la
TM4C123 LaunchPad y el amplificador de audio AIC3104, el programa tm4c123_sine_intr. c y
otros medios son útiles para investigar las diferentes características ligeras del códec AIC3104.

Cambia el valor de la frecuencia variable en el programa stm32f4_sine_intr . c a un valor


arbitrario entre 100.0 y 3500.0, y deberías encontrar que una onda sinusoidal de tal frecuencia
(en Hz) es generada. Cambia el valor de la frecuencia variable a 7000.0, sin embargo,
encontrarás que una onda sinusoidal de 1000 Hz es generada. Los mismo va si el valor de la
frecuencia se cambia a 9000.0 o 15000.0. El valor de la frecuencia de 5000.0 resultará en una
forma de onda de salida con una frecuencia de 3000 Hz. Estos efectos se relacionan con el
fenómeno de aliasing. Ya que el proceso de reconstrucción (DAC), el cual crea una forma de
onda análoga en tiempo continuo, desde muestras en tiempo discreto que es un filtro de paso
bajo, sigue que el ancho de banda de las señales de salida por el códec es ilimitada (a menos de
la mitad de la frecuencia de muestreo). Esto puede ser demostrado en un número de diferentes
formas.

Por ejemplo, ejecuta el programa stm32f4_sine_intr . c con el valor de la frecuencia variable,


establecida en 3500.0 y verifica que la forma de onda en la salida, la cual ha sido generada,
tenga una frecuencia de 3500 Hz. Cambia el valor de la frecuencia variable a 4500.0. La
frecuencia de la forma de onda de salida debe ser de nuevo igual a 3500 Hz. Intenta con
cualquier valor de la frecuencia variable. Encontrarás imposible generar una forma de onda de
salida análoga con una frecuencia mayor a o igual a 4000 Hz (asumiendo una frecuencia de
muestreo de 8000 Hz). Esto es consistente con ver el DAC como un filtro de paso bajo con una
frecuencia de corte igual a ligeramente menos que la mitad de su frecuencia de muestreo.

Los siguientes ejemplos demuestran un número de enfoques alternativos para observar


características de bajo paso del DAC.

Ejemplo 2.16
Generación onda cuadrada utilizando una tabla de búsqueda (stm32f4_square_intr . c).

El programa stm32f4_square_intr . c, mostrado en la Lista 2.33, difiere con el programa


stm32f4_sine8_intr . c, solamente en este utiliza una tabla de búsqueda, la cual contiene 64
muestras de un ciclo de onda cuadrada con frecuencia 125 Hz, más que 48 muestras de un ciclo
de onda cuadrada con frecuencia 1 kHz.

[Cuadro de fórmulas]: Lista 2.17 Programa stm32f4_square_intr . c


2.6.4 Ejecución del Programa

Construir y ejecutar el programa, y utilizar un osciloscopio conectado al enchufe (verde) SALIDA


DE LINEA en la tarjeta de audio, deberías observar una forma de onda de salida similar a la cual
se muestra en la Figura 2.23. Esta forma de onda es equivalente a la onda cuadrada
(representada por las muestras en la tabla de búsqueda) pasada a través del filtro bajo paso (el
DAC). El zumbido que sigue a cada transición en la forma de onda, es indicativa de las
características específicas del filtro de reconstrucción implementado por el WM5102 DAC. La
característica de bajo paso de la reconstrucción del filtro puede más adelante enfatizarse al
observar el contenido de la frecuencia de la forma de onda en la salida. Mientras la
representación de las series Fourier de la onda cuadrada es la suma de series infinitas de
componentes harmónicos, solamente componentes harmónicos con frecuencias debajo de 3.8
kHz son introducidas en la forma de onda en la salida análoga, tal como se muestra en el trazo
inferior en la Figura 2.24.

[En esta parte se encuentra un diagrama de la figura 2.23]

Figura 2.23 Salida del programa stm32f4_square_intr . c, observado utilizando el osciloscopio


Rigol DS1052.

[En esta parte se encuentra un diagrama de la figura 2.24]

Figura 2.24 Salida del programa stm32f4_square_intr . c, observado, en ambos, tiempo y


dominancia de frecuencia, utilizando el osciloscopio Rigol DS1052.

Ejemplo 2.17
Generación onda cuadrada utilizando una tabla de búsqueda (tm4c123_square_intr . c).

El programa tm4c123_square_intr . c es equivalente (a stm32f4_square_intr .c), programa que se


ejecuta en la TM4C123 LaunchPad. La forma de onda en la salida, tal como aparece en las
conexiones con gancho de alcance en el amplificador de audio, como aparece en la Figura 2.25,
sutilmente diferente a la cual se muestra en la Figura 2.23. En este caso, el zumbido precede
igualmente como las siguientes transiciones en la forma de onda. Esto sugiere fuertemente que
el filtro de reconstrucción en el AIC3104 DAC sea implementado como un filtro FIR digital (a una
frecuencia de muestro más alta que la cual de los valores de tal muestra, sean escritos en el DAC
por el programa tm4c123_square_intr . c). observando en la dominancia de frecuencia, (Figura
2.26), se presume que una vez más la forma de onda en la salida análoga, contiene solamente
los componentes harmonicos de 125 Hz de ondas cuadradas en frecuencias más bajas que 3.8
kHz.
[En esta parte se encuentra un diagrama de la figura 2.25]

Figura 2.25 Salida del programa stm32f4_square_intr . c, observado utilizando el osciloscopio


Rigol DS1052.

[En esta parte se encuentra un diagrama de la figura 2.26]

Figura 2.26 Salida del programa tm4c123_square_intr . c, observado, en ambos, tiempo y


dominancia de frecuencia, utilizando el osciloscopio Rigol DS1052.

Una demostración de la características de bajo paso del filtro de reconstrucción, es otorgada por
el programa tm4c123_square_1khz_intr . c. Aquí, la secuencia de los valores de muestra escritos
en el DAC a una frecuencia de muestre de 8 kHz es otorgada por

#define LOOPLENGTH 8
Int16_t square_table [ LOOPLENGHT ] = {
10000, 10000, 10000, 10000,
-10000, -10000, -10000, -10000 } ;

Aparentemente, estos valores de muestreo representan solamente un ciclo de un 1-kHz onda


cuadrada. Sin embargo, la forma de onda en la salida, la cual ha sido generada, contiene
solamente los primeros dos componentes harmónicos de un 1-kHz onda cuadrada (an 1 y 3 kHz),
esto es, solamente los componentes harmónicos de un 1-kHz onda cuadrada con frecuencias más
bajas que 3.8 kHz, la frecuencia de corte del DAC. La forma de onda en salida análoga se
muestra en la Figura 2.27 y claramente no es una onda cuadrada.

[En esta parte se encuentra un diagrama de la figura 2.27]

Figura 2.27 Salida del programa tm4c123_square_1khz_intr . c, observado utilizando el


osciloscopio Rigol DS1052.

Ejemplo 2.18
Respuesta Impulsiva del Filtro de Reconstrucción WM5102 DAC (stm32f4_dimpulse_intr .c).

Cada transición en la forma de onda generada por el programa stm32f4_square_intr . c puede ser
considerada como representativa del paso de la respuesta del filtro de reconstrucción en el
WM5102 DAC. Desde esto, la respuesta impulsiva del filtro puede ser conjeturado.

Tal respuesta impulsiva se convierte en un interés desde, según con la teoría de sistemas
lineales, caracteriza al filtro. Específicamente, la respuesta impulsiva del WM5102 DAC es igual
al tiempo derivativo de su respuesta de paso, y por inspección de la Figura 2.23, se aparenta que
la respuesta impulsiva tendrá la forma de una (relativamente) oscilación en descomposición
(exponencialmente) lenta. La respuesta impulsiva puede ser ilustrada de forma más directa por
el programa en ejecución stm32f4_dimpulse_intr . c. Este programa reemplaza las muestras de
la onda cuadrada en la tabla de búsqueda utilizada por el programa stm32f4_square_intr . c con
una secuencia discreta de impulso. La Figura 2.28 muestra la forma de onda de salida, generada
por stm32f4_dimpulse_intr. c y su magnitud FFT calculada utilizando un osciloscopio Rigol
DS1052E. La transformación de la respuesta impulsiva de un sistema de tiempo invariante es
igual a su respuesta de frecuencia.

[En esta parte se encuentra un diagrama de la figura 2.28]

Figura 2.28 Salida del programa stm32f4_dimpulse_intr . c, observado, en ambos, tiempo y


dominancia de frecuencia, utilizando el osciloscopio Rigol DS1052.

Ejemplo 2.19
Respuesta Impulsiva del Filtro de Reconstrucción AIC3104 DAC (tm4c123_dimpulse_intr .c).

Este programa ilustra la respuesta impulsiva del AIC3104 DAC. Como se ha sugerido por la forma
de onda en salida generada utilizando el programa tm4c123_square_intr . c en el ejemplo
previo, la respuesta impulsiva correspondiente es sutilmente diferente desde aquella del
WM5102 DAC. Las dos respuestas impulsivas diferentes, cada una de la cual corresponde a una
respuesta de frecuencia de bajo paso casi ideal, son representativas de aquellas encontradas en
la mayoría de los códec de audio. A la del WM5102, se le denomina respuesta baja latencia.
Quizá sea tentador observar la respuesta del impulso del códec AIC3104 como no causante y
pensar en el pico central del pulso mostrado en la Figura 2.29 como se corresponde al mismo
tiempo de ese, del impulso que lo está llevando a cabo. Esto, claro, es imposible en la práctica.
Sin saber los trabajos en detalle, del AIC3104 DAC, en todo caso, se aparenta que el impulso, el
cual causa la respuesta mostrada en la Figura 2.29, debe ocurrir antes que cualquier evidencia
de ondulaciones en el pulso y por lo tanto, aproximadamente 1 ms antes su pico. En contraste,
el impulso que causa la respuesta impulsiva del WM5102 DAC, mostrado en la Figura 2.28,
probablemente ocurrida aproximadamente 300 us antes el pico.

[En esta parte se encuentra un diagrama de la figura 2.29]

Figura 2.29 Salida del programa tm4c123_dimpulse_intr . c, observado utilizando el osciloscopio


Rigol DS1052.

Ejemplo 2.20
Generación de Rampa (tm4c123_ramp_intr . c).

La lista 2.38 es del programa tm4c123_ramp_intr . c, el cual genera una rampa, o un diente de
sierra en la forma de onda en la salida. El valor de la muestra de la salida output_left se
incrementa por 2000 cada instante de muestreo hasta que llega al valor 30,000, en el cual el
punto se resesta al valor – 30,000. Construir y ejecutar este programa. La Figura 2.30 muestra la
forma de onda de la salida análoga capturada utilizando un osciloscopio. La salida comprende
componentes harmónicos en frecuencias menos que 4 kHz.

[En esta parte se encuentra un diagrama de la figura 2.30]

Figura 2.30 Forma de onda de salida generada por el programa tm4c123_ramp_intr . c.

[Cuadro de fórmulas]: Lista 2.18 Programa tm4c123_ramp_intr . c.

Ejemplo 2.21
Modulación de Amplitud (tm4c123_am_poll. c).

Este ejemplo ilustra los principios básicos de la modulación de amplitud (AM). La lista 2.40 es
del programa tm4c123_am_poll. c, la cual genera una señal AM. La formación baseband sostiene
20 muestras de un ciclo de un coseno de forma de onda con frecuencia de fs/20 = 400 Hz
(frecuencia de muestreo, fs = 8000 Hz). La formación carrier sostiene 20 muestras de cinco ciclos
de una señal del portador sinusoidal con una frecuencia de 5fs/20 = 2000 Hz. Los valores de
muestreo de salida, son calculados al multiplicar la señal de banda base baseband por la señal
portadora carrier. De esta forma, la señal de banda base, modula a la señal portadora. La
variable amp se utiliza para establecer el índice de la modulación.

[Cuadro de fórmulas]: Lista 2.19 Programa tm4c123_am_poll. c

2.6.5 Ejecución del Programa

Construir y ejecutar este programa. Verificar que la salida consista de 2-kHz portador de señal y
dos señales de banda lateral, tal como se muestra en la Figura 2.31. Las señales de banda lateral
se encuentran en la frecuencia de la señal portadora, +/= la frecuencia de una señal portadora,
o a 1600 y 2400 Hz. La magnitud de la banda lateral relativa a la señal portadora puede ser
alterada por cambiar el valor de la variable amp en el archivo de origen. El proyecto necesitará
ser reconstruido para tal cambio para obtener el efecto.

[En esta parte se encuentra un diagrama de la figura 2.31]

Figura 2.31 Forma de onda de salida generada por el programa tm4c123_am_intr . c.

2.7 Identificar la Respuesta de la Frecuencia del DAC Utilizando el Ruido Pseudoaleatorio

Ejemplo 2.22
La Respuesta de la Frecuencia del AIC3104 DAC Filtro de Reconstrucción Utilizando una
Secuencia Binaria Pseudoaleatoria (tm4c123_prbs_intr . c).
El programa tm4c123_prbs_intr . c, tal como se muestra en la Lista 2.42, genera una secuencia
binaria pseudoaleatoria (PRBS) y escribe esto al AIC3104 DAC. La función prbs (), definida en el
archivo tm4c123_aic3104_init . c, tal como se muestra en la Lista 2.43, utiliza un registro de
desplazamiento con retroalimentación lineal de 16-bit (LFSR) para generar una secuencia binaria
pseudoaleatoria una longitud máxima. El bit significante más menor del registro es utilizado para
determinar cómo una función prbs () retorna como el valor noise_level o el valor –noise_level, en
donde noise_level es un valor entero de 16-bit, el cual es pasado a la función. El valor del LFSR
(lfsr) es inicializado a 0x0001. Cada tiempo la función prbs () se llama, un valor de
retroalimentación (fb) se forma por el modulo – 2 suma de bits 15,14, 3, y 1 en lfsr. Los
contenidos del LFSR son cambiados a la izquierda por un bit y el valor de bit 0 es asignado al
valor del feedback fb. Si el valor de fb es igual a cero, entonces la función retorna el valor –
noise_level. De otro modo, retorna el valor noise_level.

[Cuadro de fórmulas]: Lista 2.20 Programa tm4c123_prbs_intr .c

Lista 2.21 Definición de la función prbs (), definida en el archivo tm4c123_aic3104_init . c

[En esta parte se encuentra dos diagramas de la figura 2.32]

La Figura 2.32 muestra la señal de la salida análoga, generada por el programa mostrado
utilizando un osciloscopio y utilizando Goldware. La densidad espectral del poder teórico del
PRBS es constante a través de todas las frecuencias. Cuando un PRBS es escrito al DAC, el
contenido espectral de la señal de salida por el DAC es indicativo de la respuesta de frecuencia
de magnitud del DAC. En este caso, la respuesta de frecuencia de magnitud es plano, o
constante, en frecuencias de frecuencia de corte del filtro de reconstrucción del DAC, justo
debajo de la mitad de la frecuencia de muestreo.

Figura 2.32 Salida del programa tm4c123_prbs_intr . c, observado utilizando el osciloscopio Rigol
DS1052 y Goldware.

2.7.1 De-Énfasis Programable en el Códec AIC3104

El códec AIC3104 presenta un filtro de-énfasis de primera orden programable que puede ser
cambiado opcionalmente en el camino de la señal justo antes del DAC. El programa
tm4c123_prbs_deemph_intr . c, demuestra su uso (observa la Figura 2.33). El cambio del usuario
SW1 en la TM4C123 LaunchPad puede ser utilizado para habilitar o deshabilitar la función de-
énfasis. Los filtros de-énfasis son habilitando y deshabilitados por escribir a bits 0 (canal
derecho) y 2 (canal izquierdo) en página 0 registro de control 12 (Audio Codec Digital Filter
Control Register) utilizando la función I2CRegWrite ().
[En esta parte se encuentra dos diagramas de la figura 2.33]

Figura 2.33 Salida del programa tm4c123_prbs_deemph_intr . c, observado utilizando el


osciloscopio Rigol DS1052 y Goldware.
Los coeficientes del filtro de de-énfasis pueden ser reprogramados para poder implementar un
filtro IIR diferente, de primera orden. En el programa tm4c123_prbs_hpf_intr . c, un filtro de
paso alto, ha sido implementado y sus características son aparentes en la Figura 2.34.

[En esta parte se encuentra dos diagramas de la figura 2.34]

Figura 2.34 Salida del programa tm4c123_prbs_hpf_intr . c, observado utilizando el osciloscopio


Rigol DS1052 y Goldware.

2.7.2 Filtros de Efectos Digitales Programables en el AIC3104 Códec

El códec AIC3104 también presenta dos filtros IIR de cuarta orden que pueden ser cambiados
opcionalmente en el camino de señales en el canal izquierdo y derecho, justo antes del DAC. El
programa tm4c123_prbs_biquad_intr . c demuestra cómo las características de estos filtros
pueden ser programados por escribir los coeficientes de los filtros en AIC314 página 1 control de
registros 1 a través de 20 (canal izquierdo) y 27 a través de 46 (canal derecho). En este ejemplo,
un filtro de bajo paso elíptico de cuarta orden, es implementado. La Figura 2.35 muestra al PRBS
filtrado en cuanto a señales vistas utilizando un osciloscopio y utilizando Goldwave. Los filtros IIR
son habilitados y deshabilites por escribir a bits 1 (canal derecho) y 3 (canal izquierdo) en página
0 control de registro 12 (Audio Codec Digital Filter Control Register). Las características de estos
filtros y cómo programarlos están descritas con mayor detalle en el Capítulo 4.

[En esta parte se encuentra dos diagramas de la figura 2.35]

Figura 2.35 Salida del programa tm4c123_prbs_biquad_intr . c, observado utilizando el


osciloscopio Rigol DS1052 y Goldware.

Ejemplo 2.23
La Respuesta de la Frecuencia del DAC Filtro de Reconstrucción Utilizando una Ruido
Pseudoaleatorio (tm4c123_prandom_intr . c).

El programa tm4c123_prandom_intr . c, es similar al programa tm4c123_prbs_intr . c excepto


que utiliza un algoritmo Parks-Miller para generar una secuencia de ruido pseudoaleatoria. Esto
puede ser utilizado como una alternativa de PRBS en algunas aplicaciones. La función prand ()
(Lista 2.45) es definido en el archivo tm4c123_aic3104_init . c y retorna como los valores
pseudoaleatorios en el rango +/- noise_level, en donde el noise_level es un valor entero de 16-
bit, pasado a la función. La Figura 2.36 muestra una forma de onda de salida por el programa
tm4c123_prandom_intr . c mostrado, utilizando un osciloscopio. Compara esto con la forma de
onda de salida generada, por el programa tm4c123_prbs_intr . c, mostrada en la Figura 2.32.

[En esta parte se encuentra dos diagramas de la figura 2.36]

Figura 2.36 Salida del programa tm4c123_prandom_intr . c, observado utilizando el osciloscopio


Rigol DS1052.

En general, el uso del ruido pseudoaleatorio como señal en la entrada es una técnica simple y
útil para evaluar la respuesta de la frecuencia de magnitud de un sistema.

[Cuadro de fórmulas]: Lista 2.22 Definición de la Función prand (), definida en el archivo
tm4c123_aic3104_init . c

2.8 Aliasing

Los ejemplos precedentes, demuestran que ningún códec, ya fuese el AIC3104 o el WM5102,
pueden generar los componentes de la señal que poseen frecuencias mayores a la mitad de la
frecuencia de muestreo. Sigue que inaconsejable permitir los componentes con señal de entrada
análoga, los cuales tienen frecuencias mayores a la mitad de la frecuencia de muestreo para ser
mostrada en la entrada del sistema DSP. Esto puede ser prevenido al pasar las señales de
entrada análoga a través del filtro antialiasing de bajo paso prior al muestreo. Los filtros de
antialiasing con características similares a aquellas de los filtros de reconstrucción DAC de los
códec AIC3104 y WM5102, los cuales son establecidos en tales dispositivos.

Ejemplo 2.24
Respuesta de paso del filtro antialiasing del códec WM5102 (stm32f4_loop_buf_intr . c).

Para poder investigar la respuesta del paso del filtro antialiasing en el WM5102, conecta un
generador de señal en el enchufe del canal izquierdo (rosado) en ENTRADA DE LINEA en la
tarjeta de audio Wolfson. Ajusta el generador de señal para proporcionar una onda cuadrada en
la salida con frecuencia 270 Hz y con una amplitud de 500 mV. Construye y ejecuta el programa
stm32f4_loop_buf_intr . c, pausa el programa después de pocos segundos. Observa los valores de
muestreo más recientes en la entrada al guardar los contenidos en formación 1buffer al archivo
de datos mientras se escribe

save <filename> <start address>, <start address + 0x400>

en la línea de Command en el MDK-ARM debugger, en donde start address es la dirección en


formación 1buffer, y se trazan los contenidos del archivo de datos, utilizando la función MATLAB
stm32f4_plot_real (). Deberías observar algo similar como lo que se muestra en la Figura 2.38. La
Figura 2.37 muestra la señal de la entrada con la onda cuadrada, la cual corresponde a los
valores del muestreo mostrado en la Figura 2.38. El zumbido que sigue luego de cada transición
en la forma de onda representada por las muestras es debido al filtro de antialiasing. La Figura
2.39 muestra el resultado correspondiente obtenido utilizando el programa
tm4c123_loop_buf_intr . c. Los filtros antialiasing en cada uno de los códec, poseen
características similares a aquellas de sus filtros de reconstrucción correspondientes. Compara
las Figuras 2.37 y 2.39 con las Figuras 2.23 y 2.25. El acoplamiento de las conexiones de la
ENTRADA DE LINEA en ambos, la tarjeta de audio de Wolfson y el amplificador de audio, es
evidente desde la caída del nivel de la señal entre las transiciones en las Figuras 2.37 y 2.39.

[En esta parte se encuentra un diagrama de la figura 2.38]

Figura 2.38 Los valores de muestreo leías desde el WM5102 ADC y almacenadas en la formación
1buffer por el programa stm32f4_loop_buf_intr . c.

[En esta parte se encuentra un diagrama de la figura 2.37]

Figura 2.37 La onda cuadrada en la señal de entrada con el programa stm32f4_loop_buf_intr. c.

[En esta parte se encuentra un diagrama de la figura 2.39]

Figura 2.39 Los valores de muestreo leías desde el WM5102 ADC y almacenadas en la formación
1buffer por el programa stm32f4_loop_buf_intr . c.

Ejemplo 2.25
Demostración de las Características del Códec AIC3104 del Filtro Antialiasing
(tm4c123_sine48_loop_intr . c).

El programa tm4c123_sine48_loop_intr . c es similar al del programa tm4c123_sine48_intr


. c, el cual genera una onda sinusoidal utilizando los valores de muestreo leídos desde la tabla
de búsqueda. Esto difiera con lo que se lee de las muestras de entrada desde el ADC y almacena
los 128 más recientes en formación buffer. Conecta la conexión (negra) SALIDA DE LINEA en el
amplificador de audio a la conexión (azul) ENTRADA DE LINEA utilizando un cable 3.5-mm Jack
plug a 3.5-mm Jack plug y ejecuta el programa por un período corto de tiempo. Para el
programa y guarda los contenidos en formación buffer al archivo de datos al escribir

save <filename> <start address>, <start address + 0x200>

en la línea de Command en el MDK-ARM debugger, en donde start address es la dirección en


formación buffer. Traza los contenidos del archivo de datos, utilizando la función MATLAB
tm4c123_plot_real (). Deberías observar algo similar como lo que se muestra en la Figura 2.40.
La discontinuidad del tiempo t = 5.8 ms corresponde al valor de la variable índice bufptr cuando
el programa fue detenido. A primera vista, esta figura puede parecer que no tiene ningún tipo
de complicación. Sin embargo, cuando consideras que la salida análoga de la forma de onda por
el códec AIC3104 contiene un ruido fuera de banda (fácilmente visible en un osciloscopio, tal
como se muestra en la Figura 2.19), se hace aparentar que las muestras almacenadas en
formación buffer son de una versión de un filtro de bajo paso de esa señal. Esa operación de
filtro de bajo paso ha sido llevada a cabo por el filtro de antialiasing en el códec.

[En esta parte se encuentra un diagrama de la figura 2.40]

Valor de Muestreo
Tiempo (s)

Figura 2.40 Los valores de muestreo leías desde el AIC3104 ADC y almacenadas en la formación
buffer por el programa tm4c123_sine48_loop_intr . c.

Ejemplo 2.26
Demostración de Aliasing (tm4c123_aliasing_intr . c).

Los filtros de antialiasing tanto análogos como digitales, en los códec AIC3104 y WM5120 no
pueden ser desviados o deshabilitados. Sin embargo, el aliasing puede ser demostrado dentro de
un programa por el muestreo de una señal digital sin tomar como propias las medidas
antialiasing. El programa tm4c123_aliasing_intr . c, se muestra en la Lista 2.49, utiliza una
frecuencia de muestreo de 16 kHz para el códec pero luego testea la secuencia de las muestras
producidas por el ADC en la frecuencia más baja de 8 kHz (muestreo). La secuencia de las
muestras generadas en una frecuencia de 16 kHz por el ADC puede contener componentes de
frecuencia en frecuencias mayores a 4 kHz, y por lo tanto, si esa secuencia de esa muestra es
una muestra en una frecuencia de 8 kHz al simplemente descartar cada muestra de segundo, la
aliasing puede llevarse a cabo.

Para evitar la aliasing, la secuencia de muestreo de la salida a 16 kHz por el ADC puede pasar a
través de un filtro antialiasing digital antes del muestreo. El programa tm4c123_aliasing_intr . c,
utiliza un filtro FIR con 65 coeficientes definidos en el título del archivo lp6545 . h para su
deber. Para propósitos de este ejemplo, es innecesario entender la operación del filtro FIR. Es
suficiente considerar simplemente que el programa demuestra el efecto de muestreo en la
frecuencia de 8 kHz con y sin utilizar un filtro antialiasing.

[Cuadro de fórmulas]: Lista 2.23 Programa tm4c123_aliasing_intr . c


2.8.1 Ejecución del Programa

Construir, cargar y ejecutar el programa tm4c123_aliasing_intr . c. Conecta el generador de


señal al enchufe (azul) ENTRADA DE LINEA en el amplificador de audio y conecta, ya sea el
osciloscopio a uno de los ganchos de alcance en el amplificador de audio o utiliza GoldWave vía
el enchufe (negro) SALIDA DE LINEA. Varía la frecuencia de una señal de entrada sinusoidal entre
0 y 8 kHz. Presiona el cambio del usuario SW1 en la TM4C123 LaunchPad para cambiar el filtro
antialiasing implementado por el programa encendido y apagado.

Con el filtro antialiasing habilitado, las señales con mayores frecuencias que 4 kHz no pasan de
ENTRADA DE LINEA y SALIDA DE LINEA. Pero con el filtro de antialiasing inhabilitado, y al variar
la frecuencia de la señal de entrada, la deberías habilitar para verificar que los sinusoides con
frecuencias entre 4 y 8 kHz son “dobladas hacia atrás” dentro de un rago 0-4 kHz.

2.9 Identificando la Respuesta de la Frecuencia del DAC Utilizando un Filtro Adaptivo

Ejemplo 2.27
Identificación del códec AIC3104 de ancho de banda utilizando un filtro adaptativo
(tm4c123_syside_CMSIS_intr. c).

Otra forma de observar el ancho de banda del códec es medir su magnitud de la respuesta de la
frecuencia utilizando el programa tm4c123_sysid_CMSIS_intr . c. Este programa, mostrado en la
Lista 2.51 utiliza un filtro FIR adaptativo y se describe en más detalle en el Capítulo 6. Sin
embargo, no necesitas saber exactamente cómo funciona el programa tm4c123_sysid_CMSIS_intr
. c, para poder utilizarlo. Efectivamente, identifica las características del camino entre salida en
tiempo discreto y entrada en tiempo discreto (puntos A y B en la Figura 2.41).

[En esta parte se encuentra un diagrama de la figura 2.41]

TM4C123 launchpad y amplificador de audio


ENTRADA DE LINEA
ADC Filtro adaptativo
- SALIDA DE LINEA
- Cable 3.5 mm Jack a 3.5 mm Jack
- Programa

Figura 2.41 Conexión del diagram para el programa tm4c123_sysid_CMSIS_intr . c.


[Cuadro de fórmulas]: Lista 2.24 Programa tm4c123_sysid_CMSIS_intr . c

2.9.1 Ejecución del Programa

Conectar el enchufe (negro) SALIDA DE LINEA en el amplificador de audio al enchufe (azul)


ENTRADA DE LINEA de la entrada, utilizando un cable 3.5 mm Jack plug a 3.5 mm Jack plug, tal
como se muestra en la Figura 2.41. El camino de la señal, el cual será identificado por el
programa que comprende la combinación de series del DAC y ADC y los circuitos ac-acoplamiento
entre los convertidores y las conexiones de enchufe de Jack en el amplificador de audio. Ejecuta
el programa por pocos segundos y luego páralo y rastrea los valores de los pesos del filtro
adaptativo (la respuesta de impulso identificada del camino de la señal) al guardar los
coeficientes de filtros adaptativos 128, almacenados en formación firCoeffs32, y utilizando la
función MATLAB tm4c123_logfft ().

Escribe

save <filename> <start address>, <start address + 0x200>

en la línea de Command en el MDK-ARM debugger, en donde start address es la dirección en


formación firCoeffs32 y traza utilizando la función MATLAB tm4c123_logfft ().

Los coeficientes de filtros adaptativos utilizados por la función CMSIS arm_lms_f32 () son
almacenados en memoria en orden de reversa relativa al sentido por el cual representan la
respuesta de impulso del filtro, y por lo tanto, cuando se utiliza la función MATLAB
stm32f4_logfft (), responde al inmediato

forward ( 0 ) o reverso ( 1 ) order of time- domain samples ?

al entrar el valor 1.

El roll-off de la respuesta de frecuencia en las frecuencias más bajas, evidentes en la Figura


2.42, se debe al ac acoplamiento entre el códec y los enchufes Jack 3.5 mm de ENTRADA DE
LINEA y SALIDA DE LINEA. El roll-off de la respuesta de la frecuencia en frecuencias mayores que
3200 Hz se debe al antialiasing y los filtros de reconstrucción en el AIC3014 ADC y DAC. Una
ganancia de aproximadamente – 6 dB debido al dividendo potencial comprendiendo dos 5k6 ohm
resistores (mostrados en la Figura 2.04) entre el enchufe (azul) ENTRADA DE LINEA y LINEIN_L el
códec es compensado por la ganancia de +6 dB programada en el PGA, que precede
inmediatamente al ADC en el AIC3014 (al pasar el valor del parámetro PGA_GAIN_6_DB a la
función tm4c123_aic3104_init ()).
[En esta parte se encuentra dos diagramas de la figura 2.42]

Valor de muestreo
Tiempo (s)

Magnitud (dB)
Frecuencia (Hz)

Figura 2.42 La respuesta del impulso y la frecuencia de la magnitud identificadas utilizando el


programa tm4c123_sysid_CMSIS_intr . c con conexiones como se muestran en la Figura 2.41,
mostrada utilizando la función MATLAB tm4c123_logfft (). La frecuencia de muestreo 8000 Hz,
filtro adaptativo 128-coeficiente.

El programa tm4c123_sysid_CMSIS_intr . c puede ser utilizado para identificar las características


de otro sistema (como se opuso a solamente un cable conector) conectadas entre SALIDA DE
LINEA y ENTRADA DE LINEA en el amplificador de audio. La Figura 2.43 muestra el resultado
cuando un filtro análogo de primera orden y bajo paso que comprende un capacitador y un
resistor fueron utilizados.

[En esta parte se encuentra dos diagramas de la figura 2.43]

Valor de muestreo
Tiempo (s)

Magnitud (dB)
Frecuencia (Hz)

Figura 2.43 La respuesta de impulso y la frecuencia de la magnitud identificadas utilizando el


programa tm4c123_sysid_CMSIS_intr . c con un filtro análogo de primera orden y bajo paso que
comprende conectado entre los enchufes ENTRADA DE LINEA y SALIDA DE LINEA, mostrados
utilizando la función MATLAB tm4c123_logfft (). La frecuencia de muestreo 8000 Hz, filtro
adaptativo 128-coeficiente.

El programa tm4c123_sysid_deemph_CMSIS_intr . es similar al tm4c123_sysid_CMSIS_intr . c pero


inhabilita el filtro de-énfasis digital, ubicado justo antes del DAC en el AIC3104, tal como
aparece en el ejemplo 2.45. La Figura 2.44 muestra el resultado de la ejecución del programa.
Compara esto con la Figura 2.33.
[En esta parte se encuentra dos diagramas de la figura 2.44]

Valor de muestreo
Tiempo (s)

Magnitud (dB)
Frecuencia (Hz)

Figura 2.44 La respuesta de impulso y la frecuencia de la magnitud identificadas utilizando el


programa tm4c123_sysid_CMSIS_intr . c con conexiones como se muestran en la Figura 2.41, y el
de-énfasis inhabilitado, mostrado utilizando la función MATLAB tm4c123_logfft (). La frecuencia
de muestreo 8000 Hz, filtro adaptativo 128-coeficiente.

La Figura 2.45 muestra el resultado del programa en ejecución stm32f4_sysid_CMSIS_intr . c en


la STM32F407 Descubrimiento con la frecuencia de muestreo a 8 kHz.

[En esta parte se encuentra dos diagramas de la figura 2.45]

Valor de muestreo
Tiempo (s)

Magnitud (dB)
Frecuencia (Hz)

Figura 2.45 La respuesta de impulso y la frecuencia de la magnitud identificadas utilizando el


programa stm32f4_sysid_CMSIS_intr . c con SALIDA DE LINEA conectado directamente con SALIDA
DE LINEA, mostradas utilizando la función MATLAB stm32f4_logfft (). La frecuencia de muestreo
8000 Hz, filtro adaptativo 128-coeficiente.

Los rastros que ilustran los ejemplos de la respuesta de frecuencia instantánea del programa
tm4c123_flanger_intr . c en el Ejemplo 2.18, fueron obtenidos utilizando el programa
tm4c123_sysid_flanger_intr . c, una versión sutil modificada del programa
tm4c123_sysid_flanger_intr . c, que incluye un flanger (Figura 2.13) con un retraso arreglado en
el camino de la señal identificada.
Ejemplo 2.28
Identificación del Ancho de banda del Códec AIC3104 Utilizando Dos Amplificadores de Audio
(tm4c123_sysid_CMSIS_intr . c).

El programa tm4c123_sysid_CMSIS_intr . c puede identificar las características de la respuesta de


frecuencia en el rango 0 a la mitad de su frecuencia de muestreo (en el previo ejemplo, la
frecuencia muestreo fue igual a 8 kHz) pero el antialiasing y los filtros de reconstrucción en el
códec tienen un ancho de banda únicamente menos sutil que ésta. Por lo tanto, la Figura 2.42 a
través de la 2.45, solamente las bandas de paso de esos filtros, son mostradas. El siguiente
ejemplo utiliza dos sets de STM4C123 LaunchPads y amplificadores de audio, un programa en
ejecución tm4c123_loop_intr . c con la frecuencia de muestreo de 8kHz y otro programa en
ejecución tm4c123_sysid_CMSIS_intr . c utilizando una frecuencia de muestreo de 16 kHz. Esto
ayuda a identificar las características de la respuesta de la frecuencia en un rango 0-8 kHz y
para dar una idea mejor de la banda de paso, banda de parada y banda de transición del
antialiasing y los filtros de reconstrucción en el sistema de muestro de 8 kHz. Para poder
establecer la frecuencia de muestreo en el programa tm4c123_sysid_CMSIS_intr . c al 16 kHz,
cambia la declaración del programa, la cual lee

Tm4c123_aic3104_init ( FS_8000_HZ,
AIC3104_LINE_IN,
IO_METHOD_INTR
PGA_GAIN_6_DB ) ;

a leer

Tm4c123_aic3104_init ( FS_16000_HZ,
AIC3104_LINE_IN,
IO_METHOD_INTR
PGA_GAIN_6_DB ) ;

Además, cambia el número de coeficientes de filtros adaptivos utilizados desde 256 a 192 por
cambiar la declaración del programa que lee

#define NUM_TAPS 128

a leer

#define NUM_TAPS 192

Esto es necesario debido al retraso a través de dos sistemas. Conecta los dos amplificadores de
audio juntos, tal como se muestra en la Figura 2.46. Asegúrate de que el programa
tm4c123_loop_intr . c esté siendo ejecutado en una lauchpad antes de que el programa en
ejecución tm4c123_sysid_CMSIS_intr . c por un periodo corto de tiempo en el otro. También,
asegúrate de que el programa tm4c123_loop_intr . c esté utilizando LINEA DE ENTRADA (como se
no se encuentra MICROFONO DE ENTRADA) como su entrada. Luego de hacer ejecutar el
programa y parar este mismo, guarda los coeficientes de los filtros adaptivos 192, firCoeffs32
utilizados por el programa tm4c123_sysid_CMSIS_intr . c para el archivo de datos al escribir

save filename <start address>, <start address + 0x300>

en la línea Command en el MDK-ARM debugger, en donde start address es la dirección en


formación firCoeffs32, y rastreando utilizando la función MATLAB tm4c123_logfft (). Deberías
observar algo similar a los rastreos mostrados en la Figura 2.47.

TM4C123 Launchpad y amplificador de audio

ENTRADA DE LINEA
SALIDA DE LINEA

3.5 mm jack a 3.5 mm jack cable


Filtro adaptivo

ENTRADA DE LINEA
SALIDA DE LINEA
TM4C123 Launchpad y amplificador de audio

3.5 mm jack a 3.5 mm jack cable

Programa
tm4c123_loop_intr . c

Programa
Tm4c123_sysid_CMSIS_intr . c

[En esta parte se encuentra un diagrama de la figura 2.46]

Figura 2.46 Conexión del diagrama para el programa tm4c123_sysid_CMSIS_intr . c.

Valor de muestreo
Tiempo (s)

Magnitud (dB)
Frecuencia (Hz)
[En esta parte se encuentra dos diagramas de la figura 2.47]

Figura 2.47
La respuesta del impulso y la frecuencia de magnitud identificadas utilizando el programa
tm4c123_sysid_CMSIS_intr . c con conexiones, tal como se muestran en la Figura 2.46, mostradas
utilizando la función MATLAB tm4c123_logfft (). La frecuencia de muestreo 16,000 Hz, 192
coeficiente de filtro adaptivo.

El retraso en el camino de la señal identificada (9 ms) es mayor a la de la Figura 2.42 (6 ms). Eso
es consistente con el retraso observado utilizando el programa tm4c123_loop_intr . c en el
Ejemplo 2.6. Al utilizar los coeficientes de filtro 192, el filtro adaptivo se encuentra disponible
para identificar una respuesta con impulso de 192/16,000 = 12 ms de largo. El implementar un
coeficiente 192 de filtro adaptivo en una frecuencia de muestreo de 16 kHz solamente es posible
utilizando un procesador TM4C123 con una frecuencia de reloj de 84 MHz. Esto es evidente
desde que el trazo del osciloscopio mostrado en la Figura 2.48, el cual muestra el pulso
rectangular en la entrada GPIO pin PE2 por el programa tm4c123_sysid_CMSIS_intr . c. El GPIO
pin PE2 es mantenido altamente durante la función de la rutina de servicio de interrupción
SSI_interrupt_routine ():

[En esta parte se encuentra un diagrama de la figura 2.48]

Figura 2.48 Pulso en la salida en GPIO pin PE2 por el programa tm4c123_sysid_CMSIS_intr . c
ejecutando una frecuencia de muestreo de 16 kHz y utilizando coeficientes de filtro adaptivo
192.

2.10 Salida Análoga Utilizando el DAC de 12-BIT de STM32F407

Ejemplo 2.29
Generación de Forma de Onda Análoga de Instrumentación DAC de 12-Bit
(stm32f4_sine8_DAC12_intr . c).

El procesador STM32F407 presenta dos DAC de 12-bit, los cuales permiten la comparación que
será hecha con el DAC en el audio de los códec AIC3104 y WM5102. La salida análoga desde uno
de los 12-bit del DAC es enrutado al GPIO pin PA5 en la STM32F407 Descubrimiento.

Los programas stm32f4_sine8_DAC12_intr . c, stm32f4_dimpulse_DAC12_intr . c,


stm32f4_prbs_DAC12_intr . c, y stm32f4_square_DAC12_intr . c son funcionalmente equivalentes
a los programas stm32f4_sine8_intr . c, stm32f4_dimpulse_intr . c, stm32f4_prbs_intr . c, y
stm32f4_square_intr . c, excepto que estos utilizan el DAC de 12-bit de la STM32F407 en lugar de
eso en el códec WM5102. Las formas de onda resultantes en la salida, son mostradas en las
Figuras 2.49 a través de la 2.50. La Figura 2.49 muestra la señal de la salida análoga generada
por el programa stm32f4_sine8_DAC12_intr.c (Lista 2.54) escribiendo ocho valores de muestreo
representando un ciclo de un sinusoide de DAC 12-bit. La frecuencia dominante claramente
muestra los componentes de la frecuencia a 1 kHz, 7 kHz, 9 kHz, 15 kHz, 23 kHz, y 25 kHz.
Las magnitudes de estos componentes son modulados por una función sinc con nulos en los
múltiplos enteros de 8 kHz, correspondientes a 125 us duración, respuesta impulsiva rectangular
del DAC. Observa que la representación de frecuencia dominante de un 1 kHz sinusoide de
muestra en una frecuencia de 8 kHz es una secuencia infinita de componentes de igual
magnitudes en frecuencias (8n = 1) kHz, en donde n es un entero - ∞ < n < ∞.

[En esta parte se encuentra un diagrama de la figura 2.49]

Figura 2.49 Salida desde el programa stm32f4_sine8_dac12_intr . c visto utilizando el


osciloscopio Rigol DS1052.

[En esta parte se encuentra un diagrama de la figura 2.50]

Figura 2.50 Salida desde el programa stm32f4_dimpulse_dac12_intr . c visto utilizando el


osciloscopio Rigol DS1052.

La función sinc, la cual modula las magnitudes de los componentes de frecuencia discreta, en la
Figura 2.49, se ilustra claramente en las Figuras 2.51 y 2.52. Compara la respuesta de impulso
mostrada en la Figura 2.50 con la de la Figura 2.28 y la señal pseudorandoma mostrada en la
Figura 2.51 con la de la Figura 2.32. Ambos, el DAC en el códec WM5102 y el DAC en el códec
AIC3104 son cercanos para los filtros de bajo paso ideales con las frecuencias cortantes de fs/2
(4 kHz). Las características de bajo paso de DAC 12-bit en la STM32F407 significantemente son
menos pronunciada. Finalmente, compara la forma de onda de salida, mostrada en la Figura 2.52
con la de la Figura 2.24. Para la comparación, los valores de muestreo escritos en el DAC 12-bit
son escritos también en el códec WM5102. Su salida análoga puede ser observada al conectar un
osciloscopio al enchufe (verde) SALIDA DE LINEA en la tarjeta de audio.

[En esta parte se encuentra un diagrama de la figura 2.51]

Figura 2.51 Salida desde el programa stm32f4_prbs_dac12_intr . c visto utilizando el osciloscopio


Rigol DS1052.

[En esta parte se encuentra un diagrama de la figura 2.52]

Figura 2.52 Salida desde el programa stm32f4_square_dac12_intr . c visto utilizando el


osciloscopio Rigol DS1052.
[Cuadro de fórmulas]: Lista 2.25 Programa stm32f4_sine8_DAC12bit_intr . c

Referencias
1. Texas Instruments, Inc., “TLV320AIC3104 Low-Power Stereo Audio Codec for Portable Audio
and Telephony”, Literature no. SLAS510D, 2014.

2. Wolfson Microelectronics plc., “Audio Hub Codec with Voice Processor DSP”, 2013.

3. Texas Instruments, Inc., “Dual-SPI Emulating I2S on Tiva TM TM4C123xMCUs”, Literature no.
SPMA042B, 2013.

Capítulo 3

Filtros de Respuesta Finita al Impulso

3.1 Introducción a Filtros Digitales

Los filtros son fundamentales para el procesamiento de señal digital. Comúnmente, esto se
refiere a procesar una secuencia de muestras, las cuales representan una señal en dominio de
tiempo para que se alteren las características del dominio de la frecuencia, y a menudo esto
consiste en atenuar o hacer filtrar componentes de frecuencia seleccionada. Los filtros digitales
son clasificados según su estructura, ya sea no recursiva, filtros de respuesta finita al impulso
(FIR), o como recursiva, filtros de respuesta infinita al impulso (IIR, según sus siglas en inglés).
Este capítulo trata con filtros FIR. Los filtros IIR se encuentran descritos en el Capítulo 4.

3.1.1 El Filtro FIR

Un filtro genérico FIR se muestra en la forma de bloque de diagrama en la Figura 3.1 Las partes
componentes del filtro son:

1. una línea de retraso, o amplificador, en donde un número de muestras de entrada previas x(n-
k) se encuentran almacenadas. En cada instante de muestreo, los contenidos de línea retrasada
son actualizados que las muestras son cambiadas en una posición (para la derecha del diagrama)
y una nueva muestra de entrada x(n) es presentada en el comienzo de la línea de retraso.

2. Un número de bloques (multiplicadores), los cuales multiplican las muestras almacenadas en


la línea de retraso por un conjunto de coeficientes de filtro, h (k).

3. una junción que suma las salidas de los multiplicadores para formar la presente muestra de
filtro en la salida y(n).
Sea multiplicado por cero valores de muestreo desde la línea de retraso y no contribuirá en nada
con la salida en el instante de muestreo. Por lo tanto, la secuencia de salida y(n) (la unidad de
respuesta de impulso del filtro) comprenderá los coeficientes del filtro h(n).

3.1.1.2 Ventajas y Desventajas de Filtros FIR

Aunque es posible para los filtros FIR, aproximarse a las características de filtros análogos en
tiempo continuo, una de sus desventajas es que estos pueden ser utilizados para implementar
características de filtros arbitrarios, las cuales son imposibles de implementar utilizando
circuitos análogos. Por esta razón, y a diferencia de los filtros IIR descritos en el Capítulo 4, su
diseño no se encuentra basado en la teoría de los filtros análogos. Una desventaja de los filtros
FIR es que su implementación puede ser computacionalmente cara. El obtener una característica
de filtro arbitrario para una precisión requerida, puede requerir un gran número de coeficientes
de filtro.

3.1.1.3 Implementación del Filtro FIR

La estructura y la operación de un filtro FIR son simples (y son una parte fundamental para
muchas aplicaciones DSP). Típicamente, la arquitectura interna de un procesador de señal digital
es optimizada (sola instrucción de unidades de ciclo multiplicar-acumular) para computación
eficiente de una suma de productos o una suma de circunvolución. Para la suma de
circunvolución de la Ecuación (3.1) para ser directamente computarizada, un DSP debe tener
suficiente memoria para almacenar N muestras de entrada previa y N coeficientes de filtro y
tener suficiente poder computacional para ejecutar el número requerido de multiplicaciones y
adiciones dentro de un periodo de muestreo. Para N grande, el uso de FFT-basado circunvolución
rápida (descrito en el Capítulo 5) es computacionalmente más eficiente.

3.1.2 Introducción a la Transformada z

La Transformada z es una herramienta importante en el diseño y análisis de filtros digitales. Es


la contrapartida en tiempo discreto de la transformada Laplace. En sentido que la transformada
Laplace es una generalización de una transformada Fourier en tiempo continuo, la transformada
z es una generalización de una transformada Fourier en tiempo discreto (DTFT).
La transformada Laplace se utiliza para resolver tiempo continuo, ecuaciones diferenciales
lineales representándolas como expresiones algebraicas en la variable compleja Laplace s, y para
representar tiempo continuo LTY sistemas como funciones de transferencia s. La variable
Laplace, s, también puede ser vista como un operador, representando la diferenciación con
respecto al tiempo.

La transformada z se utiliza para resolver diferencia de ecuaciones en tiempo discreto,


representándolas como expresiones algebraicas en una variable compleja z, y para representar
sistemas LTI en tiempo discreto como funciones de transformada z. La variable z puede ser
también vista como un operador, representando un cambio de una posición simple en una
secuencia.

3.1.3 Definición de la Transformada z

La transformada z x (z) de una secuencia x(n) (en tiempo discreto) se define como

3.2
[Ecuación]

en donde la z es una variable compleja. Esta fórmula de la transformada z, aplicable a dos


secuencias de dos lados (no causal), y por lo tanto, también a secuencias de lado izquierdo (anti
causal) y otras de lado derecho (causal), se les refiere como transformada z de dos lados o
bilateral.

La X (z) es una serie de poder en z, la cual contiene varios términos como valores de muestreo
las hay en la secuencia z (n). Para cada término en X (z), el coeficiente que corresponde a
es igual al valor de muestreo nth en la secuencia x (n). En un sistema de tiempo discreto,
corresponde al tiempo t = nT, en donde T es el periodo de muestreo. La X (z) existe únicamente
para valores de z para que las series de poder converjan, esto es, valores de z para

3.1.3.1 Relación de la Transformada Fourier en Tiempo Discreto


La DTFT (por sus siglas en inglés) es la fórmula del análisis Fourier aplicable en una secuencia de
tiempo discreto x (n), esto es aperiódico y por lo cual . La representación periódica
continua de aquella señal en dominio de frecuencia es dada por

[Ecuación]
3.3
A veces, [Ecuación] se representa como [Ecuación], enfatizando que se evalúa por valores
diferentes de la cantidad compleja [Ecuación] , en donde [Ecuación] .

Representando la variable compleja z en forma polar [Ecuación] , en donde [Ecuación] y


[Ecuación], y sustituyendo la z en Ecuación (3.2)

3.4

Se aparenta que [Ecuación] es la DTFT de [Ecuación] . Si [Ecuación] (correspondiente


al círculo unitario en el plano z), luego, la transformada z de x (n) es equivalente a la DTFT de x
(n).
También se hace aparente que la existencia, o convergencia, de X (z) es dependiente del valor
de [Ecuación] , esto es, la magnitud de z. Si X(z) converge por un valor particular de z,
también converge para todos los otros valores de z, los cuales se encuentran en el radio del
círculo [Ecuación] en el complejo plano z.

Ejemplo 3.1
La Finita Secuencia de la Transformada z x (n) = {3,2,7, -4}
Desde la definicón de la transformada z, la transformada z de la secuencia de lado derecho
(causal).

La x (n) = {3,2,7, -4} es


[Ecuación]

X (z) existe (converge) para todos los valores de z excepto z = 0.

3.5
Ejemplo 3.2
La Finita Secuencia de la Transformada z x (n) = {3,2,7, -4}

Desde la definición de la transformada z, la transformada z de la secuencia de dos lados (no


causal)

La x (n) = {3,2,7, -4} es


[Ecuación]

3.6
X (z) existe (converge) para todos los valores de z excepto z = 0 y z = ∞.

Ejemplo 3.3
Secuencia de Impulso Discreta de la Transformada z [Ecuación]

La transformada z del lado derecho (causal) secuencia de delta de Kronecker [Ecuación] es

[Ecuación]

X (z) existe (converge) para todos los valores de z.


3.7
Ejemplo 3.4
Secuencia de Impulso Discreta de la Transformada z en Tiempo Cambiado [Ecuación]

La secuencia de tiempo cambiado de la secuencia de delta de Kronocker se encuentra descrita


por
[Ecuación]

3.8
Esta es una secuencia de lado izquierdo (anti causal). Desde la definición de la transformada z

[Ecuación]
3.9
X (z) existe (converge) para todos los valores de z excepto z = ∞

Ejemplo 3.5
La Función Exponencial de la Transformada z [Ecuación]

La transformada z del lado derecho (causal) de la secuencia [Ecuación] , en donde u (n) es la


secuencia de paso unitario, es
[Ecuación]

3.10

Comparando esto con la suma de las series de poder

[Ecuación]
3.11

La ecuación (3.10) puede ser escrita como

[Ecuación]

3.12
La desigualdad [Ecuación] describe el rango de los valores de z, para la cual X (z) existe, esto
es, su región de convergencia (ROC). En este caso en particular, [Ecuación] describe la parte
del plano z, la cual se encuentra afuera del radio del círculo a . X (z) existe (converge) para
[Ecuación] .
Ejemplo 3.6
La Función Exponencial de la Transformada z

Esta secuencia en el lado izquierdo (anti causal) puede aparecer siendo el interés académico
únicamente pero se incluye para realizar un punto importante. En este caso,

[Ecuación]
3.13

Dejando m = -n

[Ecuación]
3.14

La desigualdad [Ecuación] describe el rango de los valores de z, para la cual X (z) existe,
esto es, su (ROC). En este caso en particular, [Ecuación] describe la parte del plano z, la
cual se encuentra dentro del radio del círculo a . X (z) existe (converge) para .

Comparando (3.14) con (3.12), se aparenta que una expresión algebraica similar para X (z)
corresponde a dos secuencias diferentes x (n). Correspondiendo a cada una de estas secuencias
diferentes, es una diferente ROC. La ROC por lo tanto, es una parte integral de la representación
de una señal en el dominio z. Para poder especificar únicamente x (n) desde X (z), debemos
saber su ROC.

Ejemplo 3.7
La Función de Paso Unitario de la Transformada z

La función de paso unitario puede ser vista como una instancia en el Ejemplo 3.5, en donde a =
1, y por lo tanto, X (z) existe (converge) para .

[Ecuación]
3.15

La desigualdad [Ecuación] describe el rango de los valores de z, para la cual X (z) existe, esto
es, su (ROC). En este caso en particular, [Ecuación] describe la parte del plano z, la cual se
encuentra afuera del radio 1.
Ejemplo 3.8
La Función Sinusoidal de la Transformada z [Ecuación]

Esta función es de lado derecho o causal. Una función sinusoidal puede ser representada por
exponenciales complejos según la fórmula de Euler [Ecuación] , esto es,
[Ecuación]

3.16
y por lo tanto, la transformada de z de la secuencia [Ecuación] es dada por

[Ecuación]
3.17
Utilizando el resultado de [Ecuación] con [Ecuación] ,

[Ecuación]
3.18

X (z) (converge) para [Ecuación] .

En el plano z, esta función posee cero en su origen y dos polos conjugados complejos en el
círculo en ángulos +/- . Su ROC es el plano z entero, fuera de, pero no incluyendo, el círculo
unitario.

De forma similar, si se utiliza la fórmula de Euler para expresar [Ecuación] como la suma de dos
exponentes complejos, esto puede ser mostrado que la transformada z de la secuencia es
dada por

[Ecuación]
3.19

3.1.3.2 Regiones de Convergencia

Los ejemplos precedentes ilustran algunas de las propiedades importantes de la transformada z.


Los ejemplos 3.5 y 3.6, por ejemplo, demuestran que para la dada transformada z X (z), más que
un ROC puede ser posible, correspondiendo a más de una secuencia diferente en dominio de
tiempo x (n). Para poder transformar el dominio z desde el dominio de tiempo, es necesario
considerar la ROC.
Es instructivo representar los polos y ceros de X (z) y las ROCs en Ejemplo 3.5 y 3.6
gráficamente, tal como se muestra en las Figuras 3.2 y 3.3. En cada caso, X (z) tiene cero en el
origen y un polo de z = a.

[En esta parte se encuentra un diagrama de la figura 3.2]

Figura 3.2 Polos y ceros y región de convergencia para una secuencia causal [Ecuación] ,
[Ecuación] , trazadas en el plano z.

[En esta parte se encuentra un diagrama de la figura 3.3]

Figura 3.3 Polos y ceros y región de convergencia para una secuencia anti causal [Ecuación]
[Ecuación] , trazadas en el plano z.

Las dos diferentes ROCS para la transformada z [Ecuación] mostradas en las figuras son
consistentes con las siguientes propiedades ROC.

 Una ROC es una región singular y conectada del plano z.

 Ya que la convergencia de X (z) es dependiente de la magnitud de z, los límites de una


ROC son círculos centrados en el origen del plano z.

 Ya que las regiones de convergencia corresponden a [Ecuación] , los polos de X


(z) no se encuentran dentro de su ROC.

 Las secuencias x (n) de lado derecho (causal) corresponden a las ROCS que se extienden
en el exterior desde un círculo dibujado a través del polo más exterior de X (z), este es,
el polo con la magnitud más grande.

 Las secuencias x (n) de lado izquierdo (anti causal) corresponden a las ROCS que se
extienden en el interior desde un círculo dibujado a través del polo más interior de X (z),
este es, el polo con la magnitud más pequeña.

 Las secuencias x (n) de ambos lados (no causal) corresponden a las ROCS anulares.

Las Figuras 3.4 a través de la 3.6 ilustran el caso de la transformada z X (z) que posee más de un
polo y para el cual más de dos diferentes ROCs, consistente con las propiedades listadas
anteriormente, son posibles.
[En esta parte se encuentra un diagrama de la figura 3.4]

Figura 3.4 Posible región de convergencia, trazada en el plano z, correspondiente a la secuencia


causal de lado derecho x (n) para un sistema con dos polos con valor real.

Plano z

[En esta parte se encuentra un diagrama de la figura 3.5]

Figura 3.5 Posible región de convergencia, trazada en el plano z, correspondiente a la secuencia


anti causal de lado izquierdo x (n) para un sistema con dos polos con valor real.

Plano z
[En esta parte se encuentra un diagrama de la figura 3.6]

Figura 3.6 Posible región de convergencia, trazada en el plano z, correspondiente a la secuencia


no causal de ambos lados x (n) para un sistema con dos polos con valor real.

3.1.3.3 Regiones de Convergencia y Estabilidad

Un sistema LTY caracterizado por una respuesta impulsiva h (n) es estable BIBO si h (n) es
absolutamente sumable, esto es, si

[Ecuación]
3.20

Dado que la transformada z de h (n) existe si

[Ecuación]
3.21

Si H (z) existe para [Ecuación] , entonces el DTFT de h (n) existe y el sistema es estable BIBO.
En otras palabras, si su ROC incluye el círculo unitario, entonces el sistema representado por H
(z) y h (n) es estable BIBO.

Considera de nuevo el ejemplo de la secuencia (causal) del lado derecho [Ecuación] para la cual
la transformada z, [Ecuación] converge si [Ecuación] . Las Figuras 3.7 a través de la 3.9
muestra regiones posibles de convergencia y secuencias correspondientes x (n) para
a <1, a = 1 y a > 1 .
[En esta parte se encuentra un diagrama de la figura 3.7]

Figura 3.7 Polos y ceros y región de convergencia para, [Ecuación] , trazadas en el plano z.
Secuencia correspondiente [Ecuación] es causal y estable.

[En esta parte se encuentra un diagrama de la figura 3.8]

Figura 3.8 Polos y ceros y región de convergencia para, [Ecuación] , trazadas en el plano z.
Secuencia correspondiente [Ecuación] es causal e inestable.

[En esta parte se encuentra un diagrama de la figura 3.9]

Figura 3.9 Polos y ceros y región de convergencia para, [Ecuación] , trazadas en el plano
z. Secuencia correspondiente [Ecuación] es causal e inestable.

Para la secuencia (anti causal) de lado izquierdo [Ecuación] , la transformada z


converge si [Ecuación] . Las Figuras 3.10 a través de 3.12 muestran las regiones posibles
de convergencia y secuencias correspondientes x (n) para a > 1, a = 1, y a < 1.

Plano z
[En esta parte se encuentra un diagrama de la figura 3.10]

Figura 3.10 Polos y ceros y región de convergencia para, [Ecuación] , trazadas en el


plano z. Secuencia correspondiente [Ecuación] es anti causal y estable.

Plano z

[En esta parte se encuentra un diagrama de la figura 3.11]

Figura 3.11 Polos y ceros y región de convergencia para, [Ecuación] , trazadas en el plano z.
Secuencia correspondiente [Ecuación] es anti causal e inestable.

Plano z

[En esta parte se encuentra un diagrama de la figura 3.12]


Figura 3.12 Polos y ceros y región de convergencia para, [Ecuación] , trazadas en el plano z.
Secuencia correspondiente [Ecuación] es anti causal e inestable.

3.1.3.4 Polos y Ceros

En el caso de los sistemas causales LTI, X (z) pueden ser expresados como un radio de polinomios
en z y como tales, poseen polos y ceros (valores de z por el cual X (z) es igual a cero o ∞). Los
polos y ceros de X (z) están relacionados a la/s región/es de convergencia de X (z). De hecho,
podemos deducir posibles ROCs desde los polos y ceros de X (z) según las reglas listadas
anteriormente. En la mayoría de aplicaciones de ingeniería, nos preocupa y encontraremos,
secuencias causales.

3.1.4 Propiedades de la Transformada z

3.1.4.1 Linealidad

La transformada z obedece a las leyes de superposición

Si [Ecuación] y [Ecuación] luego [Ecuación]


en donde x (n) y y (n) son secuencias arbitrarias y a y b son constantes arbitrarias.

3.1.4.2 Cambio

Para una secuencia de cambio de tiempo x (n – m) en donde m es cualquier entero

3.22
[Ecuación]

Desde la definición de la transformada z,

3.23
[Ecuación]

Substituyendo l = (n – m),

3.24
[Ecuación]

El cual es reconocible como


[Ecuación]

3.25
3.1.4.3 Retraso de Tiempo

Cantidad z-n en el dominio z corresponde al cambio de n, instantes de muestreo en el dominio


de tiempo. Esto también es conocido como propiedad de retraso unitario de la transformada z.

3.1.4.4 Convulsión

La salida forzada y (n) de un sistema LTY, el cual tiene una respuesta impulsiva h (n) y entrada x
(n) y entrada x (n) es (como explícitamente implementada por un filtro FIR)

3.26
[Ecuación]

Esta es la suma de circunvolución. Tomando su transformada z

3.27
[Ecuación]

Cambiando el orden de la suma


[Ecuación]

3.28
Dejando l = n – m,
[Ecuación]

3.29

Por lo tanto,

[Ecuación]

3.30
Esto es, la transformada z de la circunvolución linear de las secuencias h (n) y x (n) es
equivalente al producto de las transformadas z, H (z) y X (z), de h (n) y x (n) (como se muestra
en la Figura 3.13).

[En esta parte se encuentra un diagrama de la figura 3.13]

Figura 3.13 Representaciones de bloque de diagrama de dominio z y dominio de tiempo en


tiempo discreto de sistema LTI.

3.1.5 Funciones de Transferencia z

La propiedad de la circunvolución de la transformada z juntamente es relacionada con el


concepto de la función de transferencia z. La función de transferencia z H (z) en tiempo discreto
del sistema LTY se define como el radio de la transformación z de su secuencia de salida, Y (z), a
la transformada z de su secuencia de entrada, X (z). La transformada z de un sistema de
secuencia de salida es por lo tanto, la transformada z de su secuencia de entrada, multiplicada
por su función de transferencia z, esto es, Y (z) = X (z) H (z). Desde que la transformación z de
una secuencia impulsiva unitaria es igual a una unidad, la función de transferencia z de un
sistema es igual a la transformada z de su respuesta de impulso.

3.1.6 Cartografía desde el Plano s al Plano z

Considerando la transformación Laplace, la cual es aplicada generalmente en sistemas causales.


La transformada Laplace puede ser utilizada para determinar la estabilidad de una causal en
tiempo continuo, sistema LTI. Si los polos de un sistema se encuentran a la izquierda del axis
imaginaria en plano s, estas corresponden a componentes exponencialmente decadentes de la
respuesta de un sistema en dominio de tiempo y por lo tanto, corresponden a la estabilidad. Los
polos localizados en la mitad de la mano derecha del plano s correspondiente a los componentes
de la respuesta del sistema en dominio de tiempo, el cual aumenta exponencialmente y por lo
tanto, corresponde a inestabilidad. Puros polos de imaginación, corresponden a oscilatorio
(sinusoidal) componentes de respuesta de sistema. La relación entre el plano s y el plano z es
representada por la ecuación [Ecuación] . Sustituyendo por s según [Ecuación] ,

3.31

[Ecuación]

La magnitud de z es dada por [Ecuación] y su fase por . Considera las tres regiones del
plano s que determina la estabilidad del sistema.
3.1.6.1 [Ecuación]

La mitad de la mano izquierda del plano s representa los valores de s que tienen partes reales
negativas, y esto corresponde a los valores de z, los cuales tienen magnitudes menos que una
unidad [Ecuación] . En otras palabras, la mitad de la mano izquierda del plano s, traza a la
región del plano z complejo, dentro del círculo unitario como se muestra en la Figura 3.3. Si los
polos de una función de transferencia z se localizan dentro de un círculo unitario, entonces un
sistema causal representado por la función de transferencia z, será estable.

3.1.6.2 [Ecuación]

La mitad de la mano derecha del plano s representa los valores de s, que tienen partes reales
positivas, y esto corresponde a los valores de z, los cuales tienen magnitudes mayores que una
unidad [Ecuación] . En otras palabras, la mitad de la mano derecha del plano s, traza a la
región del plano z complejo, fuera del círculo unitario como se muestra en la Figura 3.4. Si los
polos de una función de transferencia z se localizan fuera de un círculo unitario, entonces un
sistema causal representado por la función de transferencia z, será inestable.

[En esta parte se encuentra un diagrama de la figura 3.14]

Axis imaginaria
Plano s

Axis imaginaria
Plano z

Figura 3.14 Trazo desde el plano s al plano z

3.1.6.3 [Ecuación]

El axis imaginario en el plano s, traza el círculo unitario en el plano z. Si los polos de una función
de transferencia z, se encuentra en el círculo unitario en el plano z, entonces un sistema causal
representado por una función de transferencia z, será una respuesta oscilatoria y esto no se
considera estable.

Esta vista de la relación entre la ubicación de los polos de sistema en el plano z y la estabilidad
del sistema, claro, consistente con consideración de cualquiera o no, la ROC incluye el círculo
unitario como se describe anteriormente. Para sistemas causales, la ROC se extiende en el
exterior desde el polo más exterior, y para obtener estabilidad, la ROC debe incluir el círculo
unitario.
3.1.7 Ecuaciones Diferentes

Un filtro digital es representado por una ecuación de diferencia en una forma similar a la por la
cual un filtro análogo es representado por una ecuación diferencial. Una ecuación diferencial
puede ser resuelta utilizando transformaciones Laplace, en donde una ecuación de diferencia
puede ser resuelta utilizando transformaciones z. Para poder realizar esto, las transformaciones
z de un término x (n - k), el cual corresponde a la k th derivativa con respecto al tiempo
de señal análoga x (t), debe ser encontrada. Desde esta definición, la transformada z de un lado
derecho, la secuencia causal es

[Ecuación]

3.32
La transformada z de x (n – 1), la cual corresponde a la derivativa en primer orden dx (t) / dt,
es

3.33
[Ecuación]

En donde x ( -1) representa la condición inicial asociada con la ecuación de diferencia de primer
orden. De forma similar, la transformada z de (n – 2), la cual corresponde a la derivativa de
segundo orden [Ecuación] , es

[Ecuación]
3.34

En donde x ( -2) y x ( -1) representan las dos condiciones iniciales asociadas con una ecuación
diferencia de segundo orden. En general,

[Ecuación]
3.35

Si las condiciones iniciales son todas cero, entonces x ( -m) = 0 para m = 1, 2, … , k y la Ecuación
(3.35) se reduce a

[Ecuación]
3.36
3.1.8 Respuesta de Frecuencia y la Transformada z

La respuesta de frecuencia en un sistema de tiempo discreto puede ser encontrada al evaluar su


función de transferencia z para , en donde representa la frecuencia en radián por
segundo y la T representa el período de muestreo en segundos. En otras palabras, la respuesta
de la frecuencia de un sistema se encuentra por evaluar su la función de transferencia z para
valores de z, los cuales se encuentran en un círculo unitario en el plano z y el resultado será
periódico en . Es común expresar la respuesta de la frecuencia en un sistema de tiempo
discreto como una función de una frecuencia normalizada más que un rango de 2 pi radián.
Evaluar una transformada z por , esto es, cerca del círculo unitario en el plano z, el cual
corresponde a evaluar la transformada Laplace para , esto es, a lo largo de la axis imaginaria
en el plano s. Esto es fue anteriormente considerado en donde se estableció que la respuesta de
la frecuencia en un sistema de tiempo discreto puede ser encontrada al evaluar el DTFT de su
respuesta impulsiva. Si H (z) representa la función de transferencia z en un sistema LTI de
tiempo discreto, teniendo un FIR con longitud N, entonces la evaluación de aquella expresión,
utilizando rendimientos del sistema de respuesta de frecuencia.

[Ecuación]
3.37

3.1.9 La Transformada z Inversa

En la práctica, la Transformada z inversa es mejor evaluada utilizando tablas de pares de


transformación, en donde por primera vez hizo una expansión de fracción parcial complicada X
(z) (PFE) descompuesta.

3.2 Clasificaciones de Respuesta de Filtro Ideal: LP, HP, BP, BS

Tal como se muestra en la Figura 3.15, se encuentran las respuestas de frecuencia de magnitud
de filtros de paso de banda, paso alto y paso bajo y paro de banda ideal. Existen algunas de las
características de filtro más comunes, utilizadas en un rango de aplicaciones.

[En esta parte se encuentra cuatro diagramas de la figura 3.15]

Figura 3.15 Respuestas de frecuencia de magnitud de filtro ideal. (a) Paso bajo (LP). (b) Paso
alto (HP). (c) Paso de banda (BP). (d) Paro de banda (BS).
3.2.1 Método de Ventana del Diseño del Filtro FIR

La ventana, o la serie de Fourier, aproximada al diseño del filtro FIR, comprenden tres pasos
básicos.

1. Especifica una respuesta de frecuencia deseada.


2. Utiliza la transformación inversa de Fourier para obtener una respuesta impulsiva
correspondiente (discreta).
3. Multiplica tal respuesta impulsiva por una función de ventana finita, cónica para obtener los
coeficientes de filtro FIR.

Si la respuesta de frecuencia deseada del filtro, se especifica como función continua (periódica)
de frecuencia, la forma del análisis inverso de Fourier, el cual rendirá una respuesta impulsiva
en tiempo discreto del filtro, será la transformación inversa de Fourier en tiempo discreto. En
general, la inversa DTFT, aplicada a la respuesta de frecuencia continua, rendirá una secuencia
infinita en el dominio de tiempo. La multiplicación por una función de ventana finita, truncará
aquella secuencia. Una función de la ventana cónica simétrica, reducirá una onda (variación de
ganancia) en la respuesta de frecuencia resultante. Desde que la respuesta impulsiva de un filtro
FIR es discreta, su respuesta de frecuencia será periódica y por lo tanto, su respuesta de
frecuencia deseada, necesita ser específica por solamente un periodo (2 pi radian de frecuencia
normalizada [símbolo] ).

La aplicación de la DTFT inversa, es relativamente directa en algunas de las respuestas de


frecuencia analítica (expresada en funciones algebraicas) incluyendo las características de filtro
ideal, mostradas en la Figura 3.15, más para respuestas de frecuencia arbitraria, aplicando la
DTFT inversa puede ser problemática. En tales casos, es más práctico especificar la respuesta de
frecuencia deseada de un filtro como una función discreta de frecuencia y computar un conjunto
finito de coeficientes de filtro FIR utilizando la inversa DFT.

3.2.2 Funciones de Ventana

Un número de funciones en cuanto a ventanas cónicas, son utilizadas en el diseño del filtro FIR.
Todo tiene el efecto de reducir la magnitud de variaciones de ganancia en la respuesta de la
frecuencia de filtro a costa de una transición menos aguda entre el paso y las bandas de paro.
Estos efectos se relacionan a la diferencia en magnitud entre el pico y el lóbulo lateral, y la
anchura del lóbulo central, del DTFT de la función de ventana (discreta) misma.

3.2.2.1 Indexación de los Coeficientes de Filtros

En un programa computacional, es más probable que los coeficientes de los filtros FIR h(n) y las
funciones de ventana w (n) serán indexados [Ecuación] . Alternativamente, el índice n puede
ser considerado por un rango [Ecuación] . Los siguientes ejemplos involucran el tipo 1 de los
filtros FIR, esto es, los filtros FIR que poseen coeficientes N en donde la N es impar,
y [Ecuación] . El orden de tales filtros es (N – 1).

3.2.2.2 Funciones de Ventana Común

Las funciones de ventana, descritas en lo que a continuación se presentan entre las más
utilizadas comúnmente. Una ventana rectangular simplemente trunca un IIR para rendir un set
finito de coeficientes de filtro FIR.

Ventana Rectangular

La función de la ventana rectangular es


[Ecuación]

3.38

Comparada con otras funciones de ventana, una ventana rectangular posee un lóbulo central
estrecho (correspondiendo una transición aguda entre el paso y el paro de bandas) pero su
primer lóbulo solamente es de 13 dB menos que el pico de su lóbulo principal central.

Ventana Hamming

La función de la ventana hamming es

[Ecuación]
3.39

La magnitud del primer lóbulo es de aproximadamente 43 dB menos que aquella de lóbulo


principal.

Ventana Hanning
La función de la ventana Hanning es

3.40

La magnitud del primer lóbulo es de aproximadamente 31 dB menos que aquella de lóbulo


principal.

Ventana de Blackman

La función de la ventana de Blackman es


[Ecuación]
3.41
La magnitud del primer lóbulo es de aproximadamente 31 dB menos que aquella del lóbulo
principal. Aunque la ventana de Blackman produce una reducción más grande en la magnitud del
lóbulo a diferencia de la de Hamming o la ventana de Hanning, posee de forma significante un
lóbulo principal más amplio. Utilizada en el diseño de un filtro, la ventana Blackman reducirá la
onda en la respuesta de frecuencia de magnitud significantemente, más resultará en una
transición gradual relativamente desde la banda de paso a la banda de paro.

Ventana de Kaiser

La ventana de Kaiser es muy popular para utilizarla en un diseño de filtro FIR. Posee un
parámetro variable para controlar el tamaño del lóbulo relativo al lóbulo principal. La función de
la ventana Kaiser es

[Ecuación]
3.42

En donde a es una variable determinada empíricamente y [Ecuación] es una función


Bessel modificada del primer tipo definido por

[Ecuación]
3.43

El cual converge rápidamente. Un intercambio entre la magnitud del lóbulo y la anchura del
lóbulo principal puede ser logrado al cambiar la longitud de la ventana, n, y el valor del
parámetro a.

El uso de las ventanas para reducir la fuga espectral se discute en el Capítulo 5.

Ejemplo 3.9
Diseño de un Filtro FIR de Bajo Paso Ideal Utilizando el Método Ventana

La característica de un filtro FIR de Bajo Paso Ideal se muestra en la Figura 3.16, este es descrito
por
[Ecuación]
3.44

Y la inversa DTFT de la Ecuación (3.44) es


[Ecuación]
3.45
Para [Ecuación]

[En esta parte se encuentra un diagrama de la figura 3.16]

Magnitud
Frecuencia

Figura 3.16 La respuesta de la frecuencia de bajo paso ideal definida por un rango de frecuencia
normalizado .

Este resultado se ilustra en la Figura 3.17, para [Ecuación] , por el rango [Ecuación]
. Para implementar un filtro FIR, la respuesta de impulso h (n) debe ser truncada por la
multiplicación con la función de ventana de extensión finita. La Figura 3.18 muestra el resultado
de la truncada utilizando una ventana rectangular de longitud N = 33 [Ecuación] . Esto tiene
un efecto de introducir variaciones de ganancia ( onda ) en una respuesta de frecuencia
correspondiente, tal como se muestra en la Figura 3.19. La respuesta de frecuencia continua (
periódica ) se encuentra al tomar la ( más adelante ) DTFT de la respuesta impulsiva truncada,
tal como se muestra en la Figura 3.18.

[En esta parte se encuentra un diagrama de la figura 3.17]

Figura 3.17 Sesenta y uno del número infinito de los valores en tiempo discreto de la respuesta
impulsiva obtenida al tomar la inversa DTFT de una respuesta de frecuencia de bajo paso ideal
de la Figura 3.16.

[En esta parte se encuentra un diagrama de la figura 3.18]

Figura 3.18 La respuesta impulsiva en tiempo discreto de la Figura 3.17 truncada a N = 33


valores.

[En esta parte se encuentra un diagrama de la figura 3.19]

Magnitud
Frecuencia
Figura 3.19 La respuesta de frecuencia de magnitud periódica y continua, obtenida al tomar la
DTFT de la respuesta impulsiva truncada, tal como se muestra en la Figura 3.18 (trazada en
contra de la frecuencia normalizada).

El multiplicar la respuesta impulsiva de la Figura 3.17 a la función de ventana cónica, crea el


efecto de reducir la onda en la respuesta de frecuencia de magnitud a costa de realizar la
transición desde banda de paso a una banda de paro menos formada. Las Figuras 3.20 – 3.21
muestran una función con la ventana de Hanning de 33 puntos, el resultado de multiplicar la
respuesta impulsiva (coeficientes de filtro) de la Figura 3.19 por la función de ventana, y la
respuesta de la frecuencia de magnitud correspondiente a los coeficientes de filtro, mostrados
en la Figura 3.22, respectivamente.

[En esta parte se encuentra un diagrama de la figura 3.20]

Figura 3.20 Una ventana Hanning de 33 puntos.

Magnitud
Frecuencia

[En esta parte se encuentra un diagrama de la figura 3.21]

Figura 3.21 La respuesta de frecuencia de magnitud correspondiente a los coeficientes de filtro


de la Figura 3.22 (trazada en contra de la frecuencia normalizada).

[En esta parte se encuentra un diagrama de la figura 3.22]

Figura 3.22 Los coeficientes del filtro de la Figura 3.17 multiplicada por la ventana Hanning de la
Figura 3.20.

[En esta parte se encuentra un diagrama de la figura 3.23]

La Figura 3.23 muestra las respuestas de frecuencia de magnitud de las Figuras 3.19 y 3.21
trazadas juntas en una escala logarítmica. Esto enfatiza el lóbulo principal más ancho y suprime
los lóbulos laterales asociados con la ventana Hanning.

Magnitud (dB)
Frecuencia
Figura 3.23 las respuestas de frecuencia de magnitud de las Figuras 3.19 y 3.21 trazadas juntas
en una escala logarítmica, en contra de la frecuencia normalizada.

Finalmente, es necesario cambiar los coeficientes del filtro en dominio de tiempo. Las figuras
precedentes muestran las respuestas de frecuencia de magnitud que son hasta funciones de
frecuencia y para las cuales el cambio de la fase cero se especifican. Estas corresponden a
coeficientes filtros en real valores, los cuales son hasta funciones de tiempo pero no son
causales. Esto se puede cambiar al introducir un retraso e indicación de coeficientes desde 0 a
32 más que desde -16 a 16. Esto no tiene ningún efecto en la magnitud pero introduce un cambio
en una fase linear en la respuesta de la frecuencia del filtro.

3.2.3 Diseño de Filtros FIR de Paso Alto, Paso de Banda y Paro de Banda Utilizando el Método
de Ventana

3.2.3.1 Filtro de Paso Alto Ideal

La característica del filtro de paso alto ideal, la cual se muestra en la Figura 3.24 se describe por

3.46
[Ecuación]
En el rango [Ecuación]
.

Figura 3.24 Filtro de paso alto ideal en la respuesta de frecuencia de magnitud.


y la inversa DTFT de la Ecuación (3.46) es

[Ecuación]
3.47

para [Ecuación] .

3.2.3.2 Filtro de Paso de Banda Ideal

La característica del filtro de paso de banda ideal, la cual se muestra en la Figura 3.25 se
describe por
[Ecuación]

3.48
En el rango [Ecuación] .
[En esta parte se encuentra un diagrama de la figura 3.25]

Figura 3.25 Filtro de paso de banda ideal en la respuesta de frecuencia de magnitud.


y la inversa DTFT de la Ecuación (3.48) es
[Ecuación]
3.49
para [Ecuación] .

3.2.3.3 Filtro de Paro de Banda Ideal

La característica del filtro de paro de banda ideal, la cual se muestra en la Figura 3.26 se
describe por

3.50
[Ecuación]
En el rango [Ecuación] .

Figura 3.26 Filtro de paro de banda ideal en la respuesta de frecuencia de magnitud.


y la inversa DTFT de la Ecuación (3.50) es

[Ecuación]
3.51
para [Ecuación] .

Los filtros del paso alto, paso de banda y paro de banda pueden ser diseñados utilizando el
método de la ventana descritos para el filtro de paso bajo, pero el sustituir las Ecuaciones
(3.47), (3.49) o (3.51) para la Ecuación (3.45).

3.3 Ejemplos de Programación

Los siguientes ejemplos ilustran la implementación en tiempo real de los filtros FIR utilizando C y
las funciones desde la biblioteca DSP CMSIS para el procesador ARM Cortex-M4. Diferentes
métodos severos de valorar la respuesta de frecuencia de magnitud de un filtro son presentados.

Ejemplo 3.10
Filtro de Media Móvil ( stm32f4_average_intr . c ) .

El filtro de media móvil es utilizando ampliamente en DSP y posiblemente es el más fácil de


todos los filtros digitales para comprender. Es particularmente efectivo al remover (frecuencia
alta) un ruido random desde una señal o una señal de suavización.
El filtro de media móvil opera al tomar la media aritmética de un número de pasadas muestra de
entrada para poder producir cada muestra de salida. Esto puede ser representado por la
ecuación 3.52
[Ecuación]

3.52
en donde la x (n) representa la n th muestra de una señal de entrada y y (n), la n th muestra del
filtro de salida. El filtro de media móvil es un ejemplo de circunvolución utilizando un filtro muy
simple de kernel, o respuesta impulsiva, comprimiendo los coeficientes N cada cual es igual a
1/N. La Ecuación (3.52) puede ser pensada como un caso particularmente simple de una suma de
circunvolución más general, implementada por un filtro FIR e introducida en la Sección 3.1, esto
es,
[Ecuación]
3.53
en donde los coeficientes del filtro FIR h (i) son muestras de una respuesta de impulso del filtro,
y en caso de mover el filtro de media, cada uno es igual a 1/N. Hasta en donde se sabe en
cuando a la implementación, en n th el instante de muestreo, podríamos

1. Multiplicar N pasado las muestras de entrada individualmente por 1/N y la suma de productos
N,

2. La suma N pasada las muestras de entrada y multiplicar la suma por 1/N, o

3. Mantener una media móvil al agregar una muestra nueva de entrada (multiplicada por 1/N) a
y sustraer el ( n +N + 1 ) th la muestra de entrada ( multiplicada por 1/N) desde una ejecución
total.

El tercer método de implementación es recursivo, esto es, la calculación de la salida y (n), la


cual hace uso de valores de salida previas y ( n – 1 ). La expresión recursiva

[Ecuación]
3.54
es una instancia de una expresión general para un filtro recursivo o IIR

[Ecuación]
3.55
El programa stm32f4_average_intr . c, mostrado en la Lista 3.11, utiliza las primeras de estas
opciones, aun así no pudiere ser el más eficiente computacionalmente. El valor de N definido
cerca del comienzo del archivo de origen, determina el número de las muestras de entrada
previas a ser medias.
[Cuadro de fórmulas] Lista 3.1 Programa stm32f4_average_intr . c.

Varios métodos diferentes existen por el cual las características de filtros de media móvil de
cinco puntos pueden ser demostrados. Un archivo de test mefsin.wav contiene una grabación de
voz corrompida por la adición de un tono sinusoidal. Escucha a este archivo utilizando Goldware,
Windows Media Player, o similar. Entonces conecta la tarjeta de sonido de la Pc en el enchufe
EN LÍNEA (verde) en la fuera de línea en la tarjeta de audio Wofson y escucha la señal de test
filtrada. Con el programa stm32f4_average_intr . c ejecución, necesitarás encontrar que el tono
sinusoidal ha sido bloqueado y que los sonidos de voz apagada. Ambas observaciones son
consistentes con el filtro teniendo una respuesta de frecuencia de paso bajo.

Un método más rigoroso de valorar la respuesta de frecuencia de magnitud del filtro es utilizar
un generador de señal y un osciloscopio o analizador espectral para medir su ganancia en
frecuencias individuales diferentes. Utilizando este método, es para identificar directamente dos
muescas distintas en la respuesta de frecuencia de magnitud a 1600 Hz (correspondiente al tono
en el archivo de test mefsin.wav) y a 3200 Hz.

[Ecuación]

3.56
Evaluar el rango de la frecuencia [Ecuación] , en donde [Ecuación] , es frecuencia en
radians por segundo, y T, es el período de muestreo en segundos. En este caso,

[Ecuación]
3.57
y por lo tanto
[Ecuación]
3.58

La respuesta de magnitud teórica del filtro, es ilustrada en la Figura 3.27. Esta es la magnitud de
un Dirichlet, o sinc periódico, función.

[En esta parte se encuentra un diagrama de la figura 3.27]

Magnitud (dB)
Frecuencia (Hz)

Figura 3.27 La respuesta de frecuencia de magnitud teórica de cinco puntos del filtro de media
móvil (frecuencia de muestreo 8 kHz).
Ejemplo 3.11
Filtro de Media Móvil con un Ruido Pseudo Aleatorio Generado Internamente como Entrada
(stm32f4_average_prbs_intr .c).

Un método alternativo de valorar la respuesta de frecuencia de magnitud de un filtro es utilizar


un ruido de banda ancha como señal de entrada.

El programa stm32f4_average_prbs_intr . c demuestra esta técnica. Una secuencia binaria


pseudo aleatoria (PRBS) es generada dentro del programa ( observa el programa
tm4c123_prbs_intr . c en el Capítulo 2 ) y utilizado como una entrada del filtro en lieu de
muestras leídas desde el ADC. El ruido filtrado puede ser visto en un analizador espectral , en
donde el contenido de la frecuencia de la entrada PRBS es uniforme a través de todas las
frecuencias, el contenido de la frecuencia del ruido filtrado corresponde a la respuesta de la
frecuencia de magnitud del filtro. La Figura 3.28 muestra la salida del programa
stm32f4_average_prbs_intr .c mostrada utilizando la función FFT de un osciloscopio Rigol
DS1052E y utilizando Goldware. Compara estos escenarios con la respuesta de frecuencia de
magnitud teórica, mostrada en la Figura 3.27.

[En esta parte se encuentra dos diagramas de la figura 3.28]

Figura 3.28 La respuesta de frecuencia de magnitud del filtro de media móvil de cinco puntos
demostrados utilizando el programa stm32f4_average_prbs_intr . c y mostrado utilizando (a)
osciloscopio Rigol DS1052E (trazo de hasta abajo) y (b) Goldwave.

Ejemplo 3.12
Identificación de un Filtro de Media Móvil con la Respuesta de Frecuencia del Filtro
Utilizando un Filtro Adaptativo ( tm4c123_sysid_CMSIS_intr . c ) ).

En el Capítulo 2, el programa tm4c123_sysid_CMSIS_intr . c fue utilizado para identificar las


características del antialiasing y los filtros de reconstrucción de un códec. Aquí, el mismo
programa se utilizó para identificar las características de un filtro de media móvil. Para este
ejemplo, dos conjuntos de hardware conectados como se muestra en la Figura 3.29 son
requeridos. En uno de los launchpads, ejecuta el programa tm4c123_average_intr . c, y en el
otro, ejecuta el programa tm4c123_sysid_CMSIS_intr . c. Luego de que el programa
tm4c123_sysid_CMSIS_intr . c ha sido ejecutado por algunos pocos segundos, para el programa y
guarda los valores de los 256 coeficientes de filtro adaptativos firCoeffs32 a un archivo al
escribir

Save <filename.dat> <start address>, <start address + 0x400>


en la línea de Command en el debugger MDK-ARM, en donde start address es la dirección en
formación firCoeffs32, y trázalos utilizando la función MATLAB® tm4c123_logfft ().

[En esta parte se encuentra un diagrama de la figura 3.29]

TM4C123 launchpad y amplificador de audio

TM4C123 launchpad y amplificador de audio

EN LÍNEA
FUERA DE LÍNEA

Filtro de media móvil


Filtro adaptativo

3.5 mm jack a 3.5 mm jack

EN LÍNEA
FUERA DE LÍNEA

3.5 mm jack a 3.5 mm jack

Programa tm4c123_average_intr . c
Programa tm4c123_sysid_CMSIS_intr . c

Figura 3.29 Conexión del diagrama para el uso del programa tm4c123_sysid_CMSIS_intr .c para
identificar las características de un filtro de media móvil implementado utilizando dos conjuntos
de hardware.

El número de coeficientes de filtro adaptativo utilizados por el programa se establece por el


comando preprocesador

#define NUM_TAPS 256

Deberías observar algo similar a lo que se muestra en las Figuras 3.30 y 3.31, esto es, la
respuesta impulsiva y la respuesta de frecuencia de magnitud identificadas por el filtro
adaptativo.
[En esta parte se encuentra un diagrama de la figura 3.30]

Valor de muestra
Tiempo (s)

Figura 3.30 La respuesta impulsiva del filtro de media móvil de cinco puntos identificados
utilizando dos launchpads y amplificadores de audio y los programas tm4c123_sysid_CMSIS_intr .
cy

[En esta parte se encuentra un diagrama de la figura 3.31]

Magnitud (dB)
Frecuencia (Hz)

Figura 3.31 La respuesta de frecuencia de magnitud del filtro de media móvil de cinco puntos
identificados utilizando el programa dos conjuntos de hardware y programas
tm4c123_sysid_CMSIS_intr .c y tm4c123_average_intr . c.

La respuesta impulsiva mostrada en la Figura 3.30 difiere desde la respuesta impulsiva teórica
(rectangular) del filtro de media móvil porque lo combina con las respuestas de la reconstrucción
y los filtros de antialising en dos códec AIC3104 y el ac acoplamiento de las conexiones EN LÍNEA
y FUERA DE LÍNEA en los amplificadores de audio. Las oscilaciones de antes y luego de las
transiciones en la forma de onda son similares a las aquellas identificadas en el Ejemplo 2.52 y
mostradas en la Figura 2.47.

En la respuesta de frecuencia de magnitud, mostrada en la Figura 3.31, las discrepancias entre


las respuestas teóricas y medidas en frecuencias mayores de 3.5 kHz y en unas frecuencias bien
bajas, corresponden a las características del antialiasing y los filtros de reconstrucción en los
códec AIC3104 y el ac acoplamiento de las conexiones EN LÍNEA y FUERA DE LÍNEA en los
amplificadores de audio, respectivamente.

Ejemplo 3.14+
Identificación de la Respuesta de Frecuencia del Filtro de Media Móvil Utilizando un Solo
Amplificador de Audio (tm4c123_sysid_average_CMSIS_intr . c).

El programa tm4c123_sysid_average_CMSIS_ intr. c, como se muestra en la Lista 3.15, colapsa


con el camino de señal, considerada en el previo ejemplo en uno de los set de hardware, tal
como se muestra en la Figura 3.32. Construir y ejecutar el programa, guarda los coeficientes
filtros adaptativos 256 firCoeffs2 al archivo, y rastrearlos utilizando la función MATLAB
tm4c123_logfft (). Los resultados deben diferir sola y sutilmente desde aquellos mostrados en las
Figuras 3.30 y 3.31, porque el camino de la señal identificada contiene solamente un filtro
antialiasing y un filtro de reconstrucción (en oposición a los dos de cada uno). Sin embargo, el
retraso ante el pico en la respuesta de impulso identificada debería ser más corta que la de 12
ms que se muestran en la Figura 3.30.

[En esta parte se encuentra un diagrama de la figura 3.32]

EN LÍNEA
FUERA DE LÍNEA

Filtro de media móvil


Filtro adaptativo

3.5 mm jack a 3.5 mm jack

EN LÍNEA
FUERA DE LÍNEA

3.5 mm jack a 3.5 mm jack

Programa tm4c123_sysid_ average _CMSIS_intr . c

Figura 3.32 Conexión con el diagram para el programa tm4c123_sysid_average_CMSIS_intr . c.

[Cuadro de fórmulas]: Lista 3.2 Programa tm4c123_sysid_ average _CMSIS_intr . c

3.3.1 Alternando los Coeficientes del Filtro de Media Móvil


La respuesta de frecuencia del filtro de media móvil puede ser cambiada al alternar el número
de las anteriores muestras de entrada, las cuales son medias. Modifica el programa
tm4c123_average_prbs_intr .c para que implemente un filtro de media móvil de once puntos, al
cambiar el comando preprocesador que lee

#define N 5

a leer

#define N 11

Construye y ejecuta el programa y verifica que la respuesta de frecuencia del filtro haya
cambiado, tal como se muestra en la Figura 3.33. Alternativamente, puedes realizar un cambio
similar al número de puntos en el filtro de media móvil en el programa
tm4c123_sysid_average_CMSIS_intr . c.
[En esta parte se encuentra un diagrama de la figura 3.33]

Figura 3.33 La respuesta de frecuencia de magnitud de un filtro de media móvil de once puntos
implementada utilizando el programa tm4c123_average_prbs_intr .c y demostrado utilizando
Goldwave.

La respuesta de frecuencia del filtro de media móvil de once puntos posee la misma forma que
la del filtro de media móvil de cinco puntos pero las muescas de la respuesta de la frecuencia
ocurren en un entero de múltiples de (8000/11) Hz esto es en 727, 1455, 2182, y 2909 Hz.

La respuesta de la frecuencia del filtro puede cambiarse por los valores relativos de los
coeficientes. Modifica el programa tm4c123_sysid_average_CMSIS_intr . c de nuevo, cambiar el
comando preprocesador y las declaraciones de programa que leen

#define N 11
float h [N] ;

a leer

#define N 5
float h [N] = {0.0833, 0.250, 0.333. 0.2500, 0.0833} ;

y comenta la siguiente declaración de programa

para (i = 9 ; i<N ; i++) h [i] = 1.0/N ;

Construye y ejecuta el programa y observa la respuesta de la frecuencia del filtro utilizando


Goldwave (en caso de que se trate el programa tm4c123_average_prbs_intr . c) o al guardar y
rastrear los coeficientes del filtro firCoeffs32 (en caso de que se trate del programa
tm4c123_sysid_average_CMSIS_intr . c) Deberías encontrar que los componentes en una
frecuencia alta de la señal de entrada (ruido pseudo aleatorio) haya sido atenuado más que
antes y también que las muescas en 1600 y 3200 Hz han desaparecido, como se muestra en la
Figura 3.34. Has aplicado efectivamente a la ventana Hanning a los coeficientes del filtro de
media móvil de cinco puntos.

[En esta parte se encuentra un diagrama de la figura 3.34]

Figura 3.34 Respuesta de frecuencia de magnitud de filtro de media móvil de cinco puntos con
una ventana Hanning implementada, utilizando el programa stm32f4_average_prbs_intr . c y
demostrados utilizando Goldwave.
El punto N de la ventana Hanning se describe por la ecuación

[Ecuación]
3.59
Y por lo tanto, para n = 0 y n = N, w (n) = 0. Ya que no existe punto en incluir dos coeficientes
con valor de cero en la operación de filtración FIR, en este ejemplo, los cinco valores sin cero de
la función de la ventana Hanning de siete puntos, más que los cinco valores, incluyendo los dos
valores de cero, de la función de la ventana Hanning de cinco puntos, han sido utilizados.
El punto más importante, o quizá obvio, ilustrado por este ejemplo, sin embargo, es que un filtro
FIR de coeficiente cinco puede demostrar características de respuesta de frecuencia diferentes,
dependiendo en los valores de sus coeficientes. La respuesta de frecuencia de magnitud teórica
del filtro puede ser hallada al tomar el DTFT de sus coeficientes.

[Ecuación]

3.60
Por tanto,

[Ecuación]

3.61
Las respuestas de frecuencia medidas del filtro de cinco puntos de su versión de ventana puede
ser interpretada como se demuestran las características del dominio de frecuencia de la ventana
rectangular y Hanning, tal como se discute en la Sección 3.2.2. Especificamente, la ventana de
Hanning posee un lóbulo principal más amplio y relativamente más pequeños lóbulos laterales
que una ventana rectangular.

Ejemplo 3.14
Filtro FIR con Coeficientes de Filtro Específicos en Archivos de Encabezado Separados
(stm32f4_fir_intr . c y tm4c123_fir_intr . c).

El algoritmo utilizado por los programas stm32f4_fir_intr . c tm4c123_fir_intr . c para calcular


cada muestra de salida, son idénticos a aquellos empleados por programas
stm32f4_average_intr . c y tm4c123_average_intr . c. Las funciones de la rutina de servicio de
interrupción SPI2_IRQHandler () y SSI_interrupt_routine () poseen exactamente las mismas
definiciones en cada programa. Sin embargo, los programas stm32f4_average_intr . c y
tm4c123_average_intr . c calculan los valores de sus coeficientes de filtro en función main (), en
donde los programas stm32f4_fir_intr . c (mostrados en la Lista 3.17) y tm4c123_fir_intr . c leen
los valores de sus coeficientes de filtro desde archivos separados de encabezamiento.
[Cuadro de fórmulas]: Lista 3.3 Programa stm32f4_fir_intr . c

3.3.1.1 Media Móvil de Cinco Puntos (maf5.h)

El archivo de coeficiente maf5.h se muestra en la Lista 3.18. Se utiliza archivo de


encabezamiento, los programas stm32f4_fir_intr . c y tm4c123_fir_intr . c implementan la misma
media móvil de cinco puntos, implementados por el programa stm32f4_average_intr . c en
Ejemplo 3.10. El número de coeficientes de filtro se especifican por el valor de la constante N,
definida en el archivo de encabezamiento, y los coeficientes se especifican como los valores
iniciales en un elemente N en formación, h, de tipo float32_t. Construir y ejecutar el programa
stm32f4_fir_intr . c y verificar que implemente un filtro de media móvil de cinco puntos.

[Cuadro de fórmulas]: Lista 3.4 Archivo de coeficiente de encabezamiento maf5.h

3.3.1.2 Filtro de Paso Bajo, Cortar en 2000 Hz (lp55.h)

Editar el archivo de origen stm32f4_fir_intr . c o tm4c123_fir_intr . c, cambiar el comando


preprocesador que lee

#include ave5.h

a leer

#include lp55.h

Construir y ejecutar el programa. Utilizar un generador de señal conectado al enchufe EN LÍNEA


(rosado) en la tarjeta de audio Wolfson a una señal sinusoidal y verificar que esto se atenuado
significantemente en el enchufe FUERA DE SALIDA (verde) si su frecuencia es mayor a la de 2
kHz.

3.3.1.3 Filtro de Paro de Banda, Centrado en 2700 Hz (bs2700.h)

Editar el archivo de origen stm32f4_fir_intr . c, cambiar la línea que lee

# include ave5.h

a leer

#include bs2700 .h

Construir y ejecutar el programa stm32f4_fir_intr . c o tm4c123_fir_intr . c. Entrar una señal


sinusoidal y variar la frecuencia de entrada ligeramente debajo y arriba de 2700 Hz. Verificar
que la magnitud de la salida sea mínima a 2700 Hz. Los valores de los coeficientes para este
filtro son calculados utilizando el diseño de filtro MATLAB y las herramientas de análisis, fdatool,
tal como se muestra en la Figura 3.35.

[En esta parte se encuentra un diagrama de la figura 3.35]

Figura 3.35 Ventana MATLAB fdatool correspondiente para diseñar el filtro centrado a 2700 Hz
con paro de banda FIR.

3.3.1.4 Filtro Paro de Banda, Centrado a 1750 Hz (bp1750.h)

Editar el archivo de origen stm32f4_fir_intr . c o tm4c123_fir_intr . c de nuevo, para incluir el


archivo de coeficiente bp1750 . h en lugar de bs2700 . h. El archivo pb1750 . h presenta un filtro
de paso de banda FIR (81 coeficientes) centrados a 1750 Hz, tal como se muestra en la Figura
3.36. De nuevo, este filtro fue diseñado utilizando fdatool. Construir y ejecutar el programa una
vez más y verificar que se implemente un filtro de paso de banda centrado a 1750 Hz.

[En esta parte se encuentra un diagrama de la figura 3.36]

Figura 3.36 Ventana MATLAB fdatool correspondiente para diseñar el filtro centrado a 1750 Hz
con paso de banda FIR.

3.3.2 Generar Archivos de Encabezamiento con Coeficiente de Filtro FIR Utilizando MATLAB

Si el número de coeficiente de filtro es pequeño, el archivo de encabezamiento del coeficiente


puede ser editado de mano. Para que sea compatible con el programa stm32f4_fir_intr . c y
tm4c123_fir_intr . c, un archivo de coeficiente debe definir la constante N y declarar e iniciar
los contenidos en formación h, conteniendo los valores de punto flotante N. Para grandes
números de coeficientes, la función MATLAB stm32f4_fir_coeffs (), suministrado como el archivo
stm32f4_fir_coeffs.m, o la función MATLAB stm32f4_fir_coeffs (), suministrado como el archivo
tm4c123_fir_coeffs.m, puede ser utilizado. La función stm32f4_fir_coeffs (), mostrada en la
Lista 3.19, debería ser pasada al vector MATLAB de los valores de los coeficientes y avisará al
usuario poner un nombre de archivo de salida. Por ejemplo, el archivo de coeficiente maf5.h,
mostrado en la Lista 3.18, fue creado al escribir la siguiente función MATLAB de aviso:

>> x = [0.2, 0.2, 0.2, 0.2, 0.2] ;


>> stm32f4_fir_coeffs ( x )
Enter filename for coefficienes maf5. h
[Escribir el nombre del archivo para los coeficientes maf5.h]
Ten en cuenta que el nombre del archivo debe ser escrito completo, incluyendo el sufijo .h.
Alternativamente el diseño del filtro MATLAB y la herramienta para análisis fdatool puede ser
utilizada para calcular los coeficientes del filtro FIR y para exportarlos al espacio de trabajo
MATLAB. Luego, la función stm32f4_fir_coeffs () o tm4c123_fir_coeffs () pueden ser utilizados
para crear un archivo de cabecera de coeficiente compatible con los programas stm32f4_fir_intr
. c y tm4c123_fir_intr . c.

[Cuadro de fórmulas]: Lista 3.5 archivo m MATLAB stm32f4_fir_coeffs.m

Ejemplo 3.15
Implementación FIR con el Ruido Pseudo Aleatorio como Entrada
(tm4c123_fir_prbs_intr . c).

El programa tm4c123_fir_prbs_intr. c, como se muestra en la Lista 3.21, implementa un filtro


FIR y utiliza una secuencia con ruido pseudo aleatorio, el cual ha sido generado internamente
como una entrada. En otros sentidos, es similar al programa tm4c123_fir_intr . c. El archivo de
coeficiente bs2700.h se utiliza inicialmente.

[Cuadro de fórmulas]: Lista 3.6 Programa tm4c123_fir_prbs_intr . c

3.3.2.1 Ejecución del Programa

Construir y ejecutar el programa y verificar que la señal de la salida sea un ruido pseudo
aleatorio filtrado por un filtro de paro de banda FIR centrado a 2700 Hz. Esta señal de salida se
muestra utilizando GoldWave y utilizando la función FFT de un osciloscopio Rigol Ds1052E en la
Figura 3.37.

[En esta parte se encuentra dos diagramas de la figura 3.37]

Figura 3.37 Salida generada utilizando el programa tm4c123_fir_prbs_intr . c y el archivo de


coeficiente bs2700.h demostrado utilizando (a) osciloscopio Rigol DS1052E (b) GoldWave.

Testeando Diferentes Filtros FIR

Editar el archivo origen C tm4c123_fir_prbs_intr . c para incluir y testear los diferentes archivos
de coeficiente representando diferentes filtros FIR. Cada uno de los siguientes archivos de
coeficiente, excepto comb14.h, contiene 55 coeficientes.

1. bp55.h: paso de banda con frecuencia centrada fs/4


2. bs55.h: paro de banda con frecuencia centrada fs/4
3. lp55.h: paso bajo con frecuencia cortante fs/4
4. hp55.h: paso alto con frecuencia cortante fs/4
5. pass2b.h: baso de banda con dos bandas de paso
6. pass3b.h: paso de banda con tres bandas de paso
7. pass4b.h: paso de banda con cuatro bandas de paso
8. comb14.h: múltiples muescas (filtro combinante)

[En esta parte se encuentra dos diagramas de la figura 3.38]

La Figura 3.38 (a) muestra el ruido de la salida filtrado por un filtro FIR con dos bandas de paso,
utilizando el archivo de coeficiente pass2b.h. La Figura 3.38 (b) muestra que el ruido de la salida
filtrado por un paso alto de un filtro FIR utilizando el archivo de coeficiente hp55.h. En casos con
filtros de paso alto y paro de banda en particular, la característica de paso bajo del filtro de
reconstrucción en el códec AIC3104 es aparente.

Ejemplo 3.16
Filtro FIR con un Ruido Pseudo aleatorio Generado Internamente como Entrada y Salida
Almacenado en Memoria (stm32f4_fir_prbs_buf_intr . c ).

Este ejemplo extiende al anterior al almacenar las 256 muestras más recientes en la salida en
memoria. El programa stm32f4_fir_prbs_buf_intr . c se muestra en la Lista 3.23. El archivo del
coeficiente bp1750.h representa un coeficiente 81 de filtro de paso de banda centrado a 1750
Hz.

[Cuadro de fórmulas]: Lista 3.7 Programa stm32f4_fir_prbs_buf_intr . c

3.3.2.2 Ejecución del Programa

Construir y ejecutar el programa. Verificar que la señal de la salida sea un ruido con banda
limitada. Luego para el programa y guarda los contenidos en formación ynbuffer al archivo de
datos al escribir

save <filename.dat> <start address>, <start address + 0x400>

en donde start address es la dirección en formación ynbuffer. Utiliza la función MATLAB


stm32f4_logfft () para demostrar el contenido de la frecuencia de las 256 muestras de salida
almacenadas, tal como se muestra en la Figura 3.39 (Figura 3.40).
[En esta parte se encuentra un diagrama de la figura 3.39]

Magnitud (dB)
Frecuencia (Hz)

Figura 3.39 Magnitud de FFT de la salida desde el programa stm32f4_fir_prbs_buf_intr . c


utilizando el archivo de cabecera del coeficiente bp1750.h.

[En esta parte se encuentra un diagrama de la figura 3.40]

Valor de la Muestra
Tiempo

Figura 3.40 Coeficientes de filtro utilizados en el programa stm32f4_fir_prbs_buf_intr . c


(bp1750.h.)

[En esta parte se encuentra un diagrama de la figura 3.41]

Figura 3.41 muestra la magnitud del FFT de los coeficientes de filtro pb1750.h para
comparación.

Magnitud (dB)
Frecuencia (Hz)

Figura 3.41 Magnitud del FFT de los coeficientes de filtro utilizados en el programa
stm32f4_fir_prbs_buf_intr . c.

El programa stm32f4_fir_prbs_buf_intr .c permite al usuario cambiar la señal escrita al WM5102


DAC entre un ruido filtrado y sin filtrar para enfatizar la acción del filtro. El filtro es cambiado
encendido y apagado al presionar el botón de usuario (azul) en la tarjeta Descubrimiento.

Ejemplo 3.17
Efectos en la Voz o Música Utilizando Tres Filtros de Paso Bajo FIR
(tm4c123_fir3lp_intr . c).

La Lista 3.25 muestra al programa stm32f4_fir3lp_intr . c, el cual implementa tres diferentes


filtros de paso bajo FIR con frecuencias cortantes a 600, 1500, y 3000 Hz. Los coeficientes del
filtro diseñados utilizando MATLAB son leídos desde el archivo fir3lp_coeffs.h y, durante la
inicialización, copiada una vez, dos dimensionales en formación h. Mientras que el programa está
siendo ejecutado, la variable FIR_number selecciona al filtro deseado de paso bajo para que sea
implementado. Por ejemplo, si el FIR_number se establece en 0, h [0] [i] se establece como
igual a hlp600 [i], esto es, el set de coeficientes representando un filtro de paso bajo con una
frecuencia cortante de 600 Hz. El valor de FIR_number puede ser ciclado a través de los valores
0 a través de 2 para implementar 600, 1500, o 3000 filtro de Hz paso bajo, utilizando el cambio
SW1 en la launchpad mientras que el programa está siendo ejecutado.

[Cuadro de fórmulas]: Lista 3.8 Programa tm4c123_fir_3lp_intr . c

Como se dijo, el programa configura el códec AIC3104 para aceptar la entrada desde el enchufe
(azul) EN LÍNEA en el amplificador de audio. Para testear efecto de los filtros utilizando un
micrófono como un dispositivo de entrada, cambia la declaración del programa que lee

Tm4c123_aic3104_init (FS_8000_HZ,
AIC3104_LINE_IN,
I0_METHOD_INTR,
PGA_GAIN_6_DB ) ;
a leer

tm4c123_aic3104_init (FS_8000_HZ,
AIC3104_MIC_IN,
I0_METHOD_INTR,
PGA_GAIN_6_DB ) ;

El efecto de los filtros es particularmente llamativo si se aplica a la entrada musical.


Alternativamente, los efectos de los filtros pueden ser ilustrados utilizando un osciloscopio y un
generador de señal. La Figura 3.42 muestra una onda cuadrada de 200 Hz, la cual ha sido pasada
a través de tres diferentes filtros de paso bajo. La cuesta baja en las secciones de las formas de
onda entre transiciones se debe al acoplamiento ac de las conexiones FUERA DE LÍNEA y EN
LÍNEA en el amplificador de audio.

[En esta parte se encuentra tres diagramas de la figura 3.42]

Figura 3.42 Una onda cuadrada de 200 Hz pasada a través de tres diferentes filtros de paso bajo
implementados utilizando el programa tm4c123_fir3lp_intr . c.

La respuesta de la frecuencia de magnitud de los tres diferentes filtros puede ser observada
utilizando Goldwave y al cambiar la declaración del programa que lee

X [0] = input_left ;
a leer

x [0] = (float32_t) (prbs (8000) ) ;

o, alternativamente, al soplar suavemente en el micrófono.

Ejemplo 3.18
Implementación de Cuatro Diferentes Filtros: Paso Bajo, Paso Alto, Paso de Banda, y Paro de
Banda (tm4c123_fir4types_intr . c ).

Este ejemplo es muy similar al previo, ya que ilustra los filtros FIR de efectos de paso bajo, paso
alto, paso de banda y paro de banda. El tipo del filtro puede ser cambiado mientras que el
programa tm4c123_fir4types_intr . c se ejecuta utilizando el switch SW1 en la launchpad. Todos
los filtros de coeficiente que son cuatro 81 fueron diseñados utilizando la función MATLAB. Estos
son

1. Filtro de paso bajo, con ancho de banda de 1500 Hz.


2. Filtro de paso alto, con ancho de banda de 2200 Hz.
3. Filtro de paso de banda, con frecuencia centrada a 1750 Hz.
4. Filtro de paso de banda, con frecuencia centrada a 790 Hz.

Como se muestra en el previo ejemplo, los efectos de los cuatro filtros diferentes en la entrada
musical son particularmente llamativos. La Figura 3.43 muestra la respuesta de la frecuencia de
magnitud del paro de banda FIR centrado en un filtro de 790 Hz, testeado utilizando el archivo
stereonoise.wav utilizado a través de una tarjeta de sonido en una PC como entrada.

[En esta parte se encuentra un diagrama de la figura 3.43]

Figura 3.43 Salida generada utilizando el programa tm4c123_fir_4types_intr . c.

Ejemplo 3.19
Dos Filtros con Muescas para Recuperar una Grabación con Voz Corrompida
(tm4c123_notch_2_intr . c).

Este ejemplo ilustra el uso de dos filtros FIR de muescas (paro de banda) en series para
recuperar una grabación con una voz corrompida por la adición de dos señales sinusoidales en
frecuencias de 900y 2700 Hz. El programa tm4c123_notch2_intr .c se muestra en la Lista 3.28. El
archivo de cabecera notch2_coeffs. h contiene los coeficientes para dos filtros FIR de muesca
(paro de banda) en formaciones h900 y h2700. La salida del primer filtro con muesca, centrado
en 900 Hz, se utiliza como entrada en el segundo filtro con mueca, centrado a 2700 Hz.
Construido y ejecutar el programa. El archivo corrupt.wav contiene una grabación con voz
corrompida por la adición de 900 y 2700 Hz tonos sinusoides. Escucha a este archivo utilizando
GoldWave, Windows Media Player, o similar. Luego conecta la tarjeta de sonido en la salida de la
PC al enchufe (azul) EN LÍNEA en el amplificador de audio y escucha a la señal de testeo filtrada
en las conexiones (negro) FUERA DE LÍNEA o (verde) HP SALIDA. El switch SW1 en la launchpad
puede ser utilizada para seleccionar la salida de ya sea los primeros o segundos filtros de
muesca. Compara estos resultados de este ejemplo con aquellos obtenidos en el Ejemplo 3.10 en
el cual una muesca en la respuesta de frecuencia de magnitud de un filtro de media móvil fue
explotado para poder filtrar un tono sinusoide no deseado. En este caso, la voz filtrada puede
sonar más brillante ya que los filtros de muesca utilizados aquí no poseen característica en
general de paso bajo. La Figura 3.44 muestra la salida del filtro utilizando un ruido pseudo
aleatorio como una señal de entrada.

[En esta parte se encuentra un diagrama de la figura 3.44]

Figura 3.44 Ruido pseudo aleatorio filtrado utilizando el programa tm4c123_notch2_intr . c.

[Cuadro de fórmulas]: Lista 3.9 Programa tm4c123_notch2_intr . c

Ejemplo 3.20
Codificación de la Voz Utilizando Filtro y Modulación (tm4c123_scrambler_intr . c).

Este ejemplo ilustra una codificación y decodificación de un esquema de voz. El enfoque hace
uso de algoritmos básicos para filtrar y modular. La modulación fue presentada en el ejemplo AM
en el Capítulo 2. Con una voz en la entrada, la resultante salida es una voz codificada. La voz
decodifcada original es recuperada cuando la voz codificada se utiliza como entrada a un sistema
segundo ejecutando el mismo programa. El método de codificación utilizado es comúnmente
referido a una inversión de frecuencia. Toma un rango de audio, en este caso 300 Hz a 3 kHz, y
“dobla” su cercanamente señal carrier 3.3 kHz. La inversión de frecuencia de obtiene al
multiplicar (modular) la entrada de audio por la señal carrier, causando un cambio en la
frecuencia espectra con bandas laterales superiores e inferiores. En la banda lateral inferior, la
cual representa un rango de voz audible, los tonos bajos son tonos altos, y viceversa.

La Figura 3.45 muestra un bloque de diagrama de un esquema de codificación. En el punto A, la


señal de entrada ha sido limitada de banda (paso bajo filtrado) a 3 kHz. En el punto B, una señal
de banda lateral doble con un portador suprimido ha sido formada. En el punto C, la banda
lateral superior y la sección de la banda lateral más inferior entre 3 y 3.3. kHz son filtrados. El
esquema es atractivo por su simplicidad. Solamente algoritmos DSP simples, llamados filtrados,
la generación de onda sinusoidal y la modulación son requeridas por su implementación. La Lista
3.30 es del programa tm4c123_scrambler_intr . c, el cual opera una frecuencia de muestreo de
16 kHz. La señal de entrada es filtrada con paso bajo utilizando un filtro FIR con 65 coeficientes,
almacenado en la formación h, y definida en el archivo lp3k64.h. El algoritmo filtrado utilizado
es idéntico a lo que se usa en, por ejemplo, los programas tm4c123_fir_intr . c y
stm32f4_fir_intr . c. El filtro de la línea de retraso es implementado al usar formación x1 y la
salida se asigna a la variable yn1. El filtro de salida (en punto A en la Figura 3.45) se multiplica
(modulado) por un sinusoide 3.3 kHz almacenado en 160 muestras (exactas 33 ciclos) en
formación sine160 (leído desde el archivo sine160.h.). Finalmente, la señal de modulación (en
punto B) es filtrada como paso bajo otra vez, utilizando el mismo set de coeficientes de filtro h
(lp3k64. h) pero una línea de retraso en filtro diferente implementado utilizado la formación x2
y la variable de salida yn2. La salida es una señal de codificación (en el punto C). Utilizando esta
señal de codificación como una entrada en el segundo sistema ejecutando el mismo algoritmo, la
decodificación original en la entrada puede ser recuperada.

[En esta parte se encuentra un diagrama de la figura 3.45]

3 kHz Filtro LP
A Multiplicador B
3 kHz Filtro Lp
C Salida
Entrada

3.3 kHz
generador sinusoidal

Figura 3.45 Representación del diagrama de bloque de un codificador utilizando el programa


tm4c123_scrambler_intr. c.

3.3.2.3 Ejecución del Programa

Construir y ejecutar el programa. Primero, testea el programa utilizando una onda sinusoidal de
2 kHz como entrada. La salida resultante será una señal de banda lateral más baja, a 1.3 kHz. La
señal de la banda lateral superior en 5.3 kHz es filtrada por el segundo filtro de paso bajo. Por la
variación de la frecuencia de la entrada sinusoidal, deberías permitir el verificar que las
frecuencias de entrada en el rango 300-300 Hz aparecen como frecuencias de salida en el rango
invertido 3000-300 Hz.

[Cuadro de fórmulas]: Lista 3.10 Programa tm4c123_scrambler_intr . c

Un segundo sistema hardware ejecutándose al mismo tiempo puede ser utilizado para recuperar
la señal original (simulando el final recipiente). Utiliza la salida de la primera tarjea de audio
como entrada en la segunda. Para poder testear la codificación y decodificación utilizando la voz
desde un micrófono como la entrada, cambia la declaración del programa que lee

tm4c123_aic3104_init (FS_8000_HZ,
AIC3104_LINE_IN,
I0_METHOD_INTR,
PGA_GAIN_6_DB ) ;

a leer

tm4c123_aic3104_init (FS_8000_HZ,
AIC3104_MIC_IN,
I0_METHOD_INTR,
PGA_GAIN_6_DB ) ;

en el extremo de transmisión.

Conecta FUERA DE LÍNEA (negro) en el sistema extremo de transmisión (codificador) al EN LÍNEA


(azul) en el sistema extremo de transmisión (decodificador). La intercepción y la decodificación
de la señal de voz pueden ser hechas más difíciles al cambiar la frecuencia de modulación
dinámicamente y al incluir (u omitir) la frecuencia portadora según la secuencia predefinida.

Ejemplo 3.21
Filtro FIR implementado utilizando DMA-basado en e/s (tm4c123_fir_dma.c y
stm32f4_fir_dma. c.)

Los programas tm4c123_fir_dma. c, stm32f4_fir_dma. c, tm4c123_fir_prbs_dma. c y


stm32f4_fir_prbs_dma. c poseen una funcionalidad similar de los programas tm4c123_fir_intr. c,
stm32f4_intr. c, tm4c123_fir_prbs_intr. c y stm32f4_fir_prbs_intr. c sin embargo, su uso DMA-
basado como oposición de interrupción-basada a e/s (como se ilustra en los Ejemplos 2.5 y 2.6
vistos anteriormente). Como se dijo, estos implementan filtros de paso de banda centrados en
1750 Hz. Las características del filtro implementadas por los programas pueden ser cambiados al
incluir diferentes archivos de cabecera de coeficiente.

Ejemplo 3.22
Filtro FIR implementado utilizando una Función Biblioteca CMSIS DSP
(tm4c123_fir_prbs_CMSIS_dma. c y stm32f4_fir_prbs_CMSIS_dma. c ).

La función arm_fir_f32 () suministrada como parte de la biblioteca CMSIS DSP es un punto


flotante optimizado de implementación de un filtro FIR. La función se pasa a un bloque de
muestras de entrada y calcula un bloque correspondiente de muestras de salida, y por lo tanto,
se adecúa a DMA-basado e/s (aunque es posible establecer el tamaño del bloque de muestras a
uno y a la llamada función en un programa utilizando una interrupción-basada e/s). Aparte de
utilizar la función de biblioteca CMSIS DSP, los programas tm4c123_fir_prbs_CMSIS_dma. c y
stm32_fir_prbs_CMSIS_dma. c (mostrados en la Lista 3.33) son similares a los programas
tmc4123_fir_prbs_dma. c y stm32f4_fir_prbs_dma. c .
3.3.2.4 Número de Valores de Muestra en Cada Transferencia DMA

El número de valores de muestreo en cada transferencia DMA se establece en los archivos de


cabecera stm32f4_wm5102_init. h y tm4c123_aic3104_init. h por el valor de la constante
BUFSIZE. Sin embargo, en el ejemplo de los programas en este libro y como se describe en el
Capítulo 2, en donde TM4C123 se configura para que las cuatro transferencias DMA tomen lugar
concurrentemente (una en cada dirección para cada dos canales de audio L y R), en donde
STM32F4 se configura para que las dos transferencias DMA tomen lugar concurrentemente (una
en cada dirección, pero cada una transfiriendo ambos, canales de valores de muestreo L y R). En
cada caso, el valor de la constante BUFSIZE determina el número de valores 16-bit por
transferencia DMA.

En el caso de TM4C123, cada bloque de transferencia DMA procesado por la función


Lprocess_buffer () contiene BUFSIZE de 16-bit con muestras de canal L y uno de la llamada
función arm_fir_f32 () procesa estos valores de muestreo BUFSIZE.

En el caso de TM4C123, cada bloque de transferencia DMA procesado por la función


Lprocess_buffer () contiene BUFSIZE de 16-bit con canal L con muestras, las cuales intercalaron
con BUFSIZE / 2 muestras de canal R 16-bit y una llamada función arm_fir_f32 () se utiliza para
procesar BUFSIZE / 2 canal L de valores de muestreo.

[Cuadro de fórmulas]: Lista 3.11 Programa stm32f4_fir_prbs_CMSIS_dma. c

Ejemplo 3.23
Comparación de los Tiempos de Ejecución para Tres Diferentes Implementaciones de Filtro
FIR
(tm4c123_fir3ways_intr . c).

Un método directo para medir el tiempo tomado para calcular cada muestra de salida con filtro
FIR es para alternar una salida GPIO pin establecida en alto en la declaración del programa
inmediatamente precediendo computación y restableciéndolo en bajo en la declaración del
programa inmediatamente siguiendo a la computación. La mayoría del ejemplo en los programas
en este capítulo lleva a cabo esto. En la TM4C123 Launchpad, GPIO pin PE2 se utiliza, y en la
STM32F407 Descubrimiento, GPIO pin PD15
se utiliza.
[En esta parte se encuentra dos diagramas de la figura 3.46]

La Figura 3.46 muestra la salida de la señal por el programa tm4c123_fir_prbs_intr . c en GPIO


pin PE2. Este programa utiliza una interrupción-basada e/s y el pulso rectangular se repite cada
125 us, reflejando la frecuencia de muestreo 8-kHz. La duración del pulso, el cual es 13.6 us,
indica que el programa toma ese tiempo para poder calcular el valor de cada valor de muestreo
en la salida. Mientras más alto, así será el orden del FIR implementado por este programa (como
se determina por el archivo de cabecera de coeficiente utilizado), mientras más tardado tome
calcular cada valor de muestreo en la salida. Para poder hacer que el programa funcione, el
tiempo de cálculo debe tomar menos tiempo que el período de muestreo.

Figura 3.46 Pulsos en la salida en GPIO pin PE2 por los programas tm4c123_fir_prbs_intr . c y
tm4c123_fir_prbs_dma. c.

La duración de los pulsos en la salida en GPIO pin PE2 por el programa tm4c123_fir_prbs_dma. c,
el cual utiliza DMA-basado e/a, indica el tiempo tomado para calcular un bloque de la salida
BUFSIZE en los valores de muestreo. Estos pulsos se repiten cada BUFSIZE * us. Mientras más
alto, así será el orden del FIR implementado por este programa (como se determina por el
archivo de cabecera de coeficiente utilizado), mientras más tardado tome calcular la salida
BUFSIZE en los valores de muestreo. La duración del pulso mostrado en la Figura 3.46 es de 3.52
ms, de lo cual, dado que el valor de BUFSIZE en este ejemplo es igual a 256, representa el
tiempo de 13.7 us para calcular el valor de cada muestra de salida.

Las declaraciones del programa utilizadas para implementar la operación de filtración FIR,
afecta su tiempo de ejecución. El programa tm4c123_fir3ways_intr . c, mostrado en la Lista
3.35, otorga al usuario la opción de cambiar entre diferentes implementaciones del filtro FIR
mientras que el programa está siendo ejecutado. Al utilizar el switch SW1 del usuario en la
TM4C123 LaunchPad, el usuario puede ciclar a través de tres alternativas.

[Cuadro de fórmulas]: Lista 3.12 Programa tm4c123_fir3ways_intr . c

El primer método de implementación es directo y utiliza dos curvas separadas. La primer curva

for ( i = 0 ; i< N ; i++ ) yn += h [ i ] * x [ i ] ;

se utiliza para poder calcular la suma de la convulsión de las muestras de entrada previas de N,
almacenadas en la línea de retraso del filtro x y su filtro N, coeficientes , poniendo el resultado
en yn. La segunda curva

for ( i = N-1 ; i>0 ; i - - ) x [ i ] = x [ i – 1 ] ;


se utiliza para cambiar los contenidos de la línea de retraso del filtro por uno. Intuitivamente,
esto es pérdida de esfuerzo computacional para repetidamente mover cada muestra de entrada
desde una ubicación de memoria hacia otra. Por otro lado, el esfuerzo computacional
involucrado en tal operación directa no se espera que sea grandioso.

El segundo método de implementación

for ( i = 0 ; i< N ; i++ )


{
yn + = h [ i ] * x [ k + + ] ;
if ( k > = N ) k = 0 ;
}

involucra el trato de la formación x como un amplificador circular en el cual se pueden


almacenar valores de muestreo de entrada. Media vez una muestra sea almacenada en la
formación x, no se mueve. La variable k se utiliza para mantener rastro del lugar en donde la
formación x, la muestra de entrada más reciente es almacenada. El valor de k se incrementa una
vez por instante de muestreo. Cada vez que el valor de k se incrementa, su valor es testeado, y
si es mayor que o igual que N, se resetea a cero. El valor de k también se incrementa N veces
durante el cálculo de la suma de convulsión volviendo al mismo valor en donde comenzó (antes
que el cálculo de la suma de convulsión). El método de implementación utiliza solamente una
curva pero requiere que el valor de k sea testeado ( N + 1 ) veces en total.

El tercer método de implementación

for ( i = 0 ; i< N ; i++ ) yn + = h [ i ] * x [ k + i ] ;

elimina la necesidad de testear el valor de k ( N veces ) durante el cálculo de la suma de


convulsión, a costa de lo requerido dos veces, así como la memoria para almacenar los valores
de muestreo de entrada. Cada valor de muestreo de entrada se almacena en dos diferentes
ubicaciones, x [ k ] y x [ k + N ], en formación x de longitud 2. Efectivamente, este es un método
alternativo para implementar un amplificador circular.

3.3.2.5 Ejecución del Programa

Construir y ejecutar el programa y observar los pulsos de salda en GPIO pin PE2 utilizando un
osciloscopio. Presiona el switch user SW1 en la launchpad para ciclar a través de tres diferentes
métodos de implementación. En caso de un filtro FIR coeficiente 18, definido en el archivo de
cabecera bp1750. H, los tres diferentes métodos de implementación toman 13.7, 16.0, y 10.2 us
para calcular cada valor de muestreo de salida.
Ejemplo 3.24
Comparación de los Tiempos de Ejecución para los Filtros FIR Implementados en C utilizando
la función de biblioteca CMSIS DSP arm_fir_f32 ().

La función biblioteca CMSIS DSP arm_fir_f32 () es un método eficiente para implementar un filtro
FIR y fue demostrado en el Ejemplo 3.32. La duración de la salida del pulso en GPIO pin PE2 por
el programa tm4c123_fir_prbs_CMSIS_dma. c es 936 us ( BUFSIZE = 256 ), indicando que toma
aproximadamente 3.6 us para calcular el valor de cada muestra de salida. Es más eficiente
computacionalmente hablando, implementar un filtro FIR utilizando DMA-basado e/a para
proveer bloques de datos en la entrada para la función biblioteca CMSIS
arm_fir_f32 (). Sin embargo, este enfoque se lleva a cabo en mayor retraso en tiempo real
(latencia) que a un enfoque de muestra por muestra con interrupción basada.
Capítulo 4
Filtros de Respuesta Infinita al Impulso

El filtro FIR, visto en el Capítulo 3 no posee un equivalente análogo. En este capítulo, vemos el
filtro de respuesta infinita al impulso (IIR) que, comúnmente, hace uso del vasto conocimiento,
el cual existe concerniente con los filtros análogos. El procedimiento de diseño descrito en este
capítulo, involucra la conversión de un filtro análogo a un filtro discreto de equivalencia. Ya sea
la técnica de transformación invariancia o bilineal (BLT) puede ser utilizada para hacer efectuar
tal conversión. Ambos procedimientos de convertir la función de transferencia de un filtro
análogo en el dominio s en una función equivalente de transferencia en tiempo discreto en el
dominio z.

4.1 Introducción

Considerar una ecuación general de entrada y salida de la formula

4.1
[Ecuación]

o, equivalentemente,

[Ecuación]

4.2
Esta ecuación recursiva con diferenciación, representa a un filtro IIR. La salida y (n), en instante
n, no depende solamente en la entrada actual x (n), en instante n, y en entradas pasadas x ( n-1
), x ( n-2 ), …, x ( n-M ), pero también en salidas pasadas y ( n-1 ), y ( n-2 ),…
y ( n-N ). Si asumimos todas las condiciones iniciales para que sean cero en Ecuación ( 4.2 ), su
transformada z es

4.3

[Ecuación]

Dejando M = N en ( 4.3 ), la función de transferencia H (z) del filtro IIR es


4.4
[Ecuación]

en donde N (z) y D (z) representan los polinomios numeradores y denominadores,


respectivamente. Multiplicando y dividiendo por ZN, H (z) se convierte
[Ecuación]
4.5
en donde C es una constante, la cual es una función de transferencia con Z ceros y N polos. Si
todos los coeficientes a1 en Ecuación ( 4.5 ) son iguales a cero, esta función de transferencia
reduce a una función de transferencia con N polos en el origen en el plano z, representando el
filtro FIR visto en el Capítulo 3. Para que un sistema causal en tiempo discreto sea estable, todos
los polos de su función transferencia z, deber permanecer dentro del círculo unitario, como se
vio en el Capítulo 3. Por lo tanto, para que un filtro IIR sea estable, la magnitud de cada uno de
sus polos, debe ser menos de 1, o

1. Si Pi < 1, entonces h (n) 0, como n ∞, llevando a cabo un sistema estable.


2. Si Pi > 1, entonces h (n) ∞ , como n ∞, llevando a cabo un sistema inestable.
3. Si Pi = 1, el sistema es marginalmente estable, llevando a cabo una respuesta oscilatoria.

4.2 Estructuras del Filtro IIR

Varias estructuras diferentes pueden ser utilizadas para representar un filtro IIR.

4.2.1 Estructura de Forma Directa I

Utilizando la estructura de forma directa I, mostrada en la Figura 4.1, el filtro en Ecuación ( 4.2
) puede ser realizada. Para un filtro N th-order, esta estructura contiene elementos de retraso
2N, cada uno representado por un bloque marcado z-1. Por ejemplo, un filtro de segunda orden
con N = 2 contendrá cuatro elementos de retraso.

[En esta parte se encuentra un diagrama de la figura 4.1]

Figura 4.1 Estructura del filtro IIR de forma directa I

4.2.2 Estructura de Forma Directa II

La estructura de forma directa II, mostrada en la Figura 4.2 es una de las estructuras
comúnmente más utilizadas para representar un filtro IIR. Requiere la mitad de la cantidad de
elementos de retraso como forma directa I. Por ejemplo, un filtro de segundo orden requiere dos
elementos de retraso, como el contrario de cuatro con la estructura de forma directa I. Desde el
diagrama de bloque de la Figura 4.2, se puede observar que

4.6
[Ecuación]

y que
4.7
[Ecuación]
Tomando las transformadas z de las Ecuaciones ( 4.6 ) y ( 4.7)

[Ecuación]
4.8
y por lo tanto,

[Ecuación]
4.9
y
[Ecuación]
4.10
Así

[Ecuación]
4.11
Las cuales son similares a la Ecuación ( 4.5 )

[En esta parte se encuentra un diagrama de la figura 4.2]

Figura 4.2 Estructura del filtro IIR de forma directa II

La estructura del filtro IIR de forma directa puede ser representada por Ecuaciones de
diferenciación ( 4.6 ) y ( 4.7 ), tomando lugar de la Ecuación ( 4.2 ). Las ecuaciones ( 4.6 ) y (
4.7 ) pueden ser utilizadas para implementar un filtro IIR en un programa de computación.
Inicialmente, w (n), w ( n-1 ), w ( n-2 ), … son establecidas en cero. En el instante n, una nueva
muestra x (n) es adquirida. La ecuación ( 4.6 ) se utiliza para resolver para w (n) y luego la salida
y (n) se calcula utilizando la Ecuación ( 4.7 ).

4.2.3 Transposición de Forma Directa II

La estructura de transposición de forma directa II, mostrada en la Figura 4.3 es una versión
modificada de la estructura de forma directa II y requiere el mismo número de elementos de
retraso.

[En esta parte se encuentra un diagrama de la figura 4.3]

Figura 4.3 Estructura de filtro IIR de la transposición de forma directa II

Desde la inspección del diagrama de bloque, es aparente que la salida del filtro puede ser
calculada utilizando
4.12
[Ecuación]

Subsecuentemente, los contenidos de la línea de retraso pueden ser actualizados utilizando

4.13
[Ecuación]
y

[Ecuación]
4.14
y de la misma manera hasta que finalmente

[Ecuación]
4.15
Utilizando la Ecuación ( 4.13 ) para hallar w0 ( n-1 ),

[Ecuación]
4.16
La Ecuación ( 4.12 ) se convierte en

[Ecuación]
4.17

Similarmente, utilizando la Ecuación ( 4.14 ) para hallar w1 ( n-2 ),

[Ecuación]
4.18
La Ecuación ( 4.12 ) se convierte en

[Ecuación]
4.19

Continuando con este procedimiento hasta que la Ecuación ( 4.15 ) haya sido utilizada, puede ser
mostrada que la Ecuación ( 4.12 ) es equivalente a la Ecuación ( 4.2 ) y por lo tanto, el diagrama
de bloque de la Figura 4.3 es equivalente a aquellos de las Figuras 4.1 y 4.2. La estructura
transpuesta implementa los ceros del primer filtro y luego los polos, en donde la estructura de
forma directa II implementa los polos de primero.
4.2.4 Estructura/Desarrollo en Cascada

La función de transferencia en la Ecuación ( 4.5 ) puede ser factorizada como

[Ecuación]
4.20
en términos de funciones de transferencia de primer y segundo orden, Hi (z). Esta estructura de
cascada (o series) se muestra en la Figura 4.4. Una función de transferencia en general puede
ser representada con funciones de transferencia de cascada. Para cada sección, ya sea la
estructura de forma directa II o su versión de transposición puede ser utilizada. La Figura 4.5
muestra una estructura IIR de cuarto orden en términos de dos formas directas II en secciones de
segundo orden en cascada. La función de transferencia H ( z ), en términos de funciones de
transferencia de segundo orden en cascada, en este caso pueden ser escritas como

[Ecuación]
4.21

Figura 4.4 Estructura de filtro IIR de forma Cascada

[En esta parte se encuentra un diagrama de la figura 4.5]

Figura 4.5 Filtro IIR de cuarto orden con dos secciones en cascada de forma directa II.

en donde la constante C en la Ecuación ( 4.20 ) se incorpora en los coeficientes. Por ejemplo, si


N = 4 para una función de transferencia de cuarto orden, entonces la Ecuación ( 4.18 ) se
convierte

[Ecuación]
4.22

Como puede ser verificada en la Figura 4.5. Desde un punto de vista matemático, el orden
correcto de los factores de numerador y denominador no afecta el resultado de salida. Sin
embargo, desde un punto de vista práctica, el orden correcto de cada sección de segundo orden
puede minimizar el ruido de cuantificación. Observa que la salida de la primera sección, y1 (n),
convierte la entrada a la segunda sección. Con un resultado de salida intermedia, almacenada en
uno de los registros, un truncamiento prematuro de la salida intermedia se convierte en
negigible. Un ejemplo de programación, más adelante en este capítulo ilustraremos la
implementación de un filtro IIR utilizando una forma directa de secciones de cascada de segundo
orden II.
4.2.5 Estructura de Forma Paralela

La función de transferencia en la Ecuación ( 4.11 ) puede ser representada como

[Ecuación]
4.23

la cual puede ser obtenida utilizando una expansión de fracción parcial (PFE) de la Ecuación (
4.11 ). Esta estructura de forma paralela se muestra en la Figura 4.6. Cada una de las funciones
de transferencia pueden ser ya sea de función de primera o segunda orden.

[En esta parte se encuentra un diagrama de la figura 4.6]

Figura 4.6 Estructura de filtro IIR de forma Paralela

Como en la estructura de cascada, la forma paralela puede ser eficientemente representada en


términos de secciones de estructura II de forma directa de segundo orden. La H (z) puede ser
expresada como

[Ecuación]
4.24

Por ejemplo, la función de transferencia de cuarto orden, H (z) en Ecuación ( 4.94 ) se convierte

[Ecuación]
4.25

Esta estructura paralela de cuarto orden se representa en términos de dos secciones de forma
directa II como se muestra en la Figura 4.7. Desde tal figura, la salida y (n) puede ser expresada
en términos de la salida de cada sección, o

[Ecuación]
4.26
Típicamente, los filtros de N th-orden son implementados como secciones de cascadas de
segundo orden.

[En esta parte se encuentra un diagrama de la figura 4.7]


Figura 4.7 Filtro IIR de cuarta orden con dos secciones de forma directa II en paralelo.

4.3 Impulso Invariante

Este método de diseño de filtro IIR se basa en el concepto de trazar cada polo del plano s de un
filtro en tiempo continuo a un polo de plano z correspondiente, utilizando la sustitución
[Fórmula] para ( s+Pk ) en H (s). Esto puede lograrse por varios métodos diferentes. La PFE de H
(s) y la sustitución [Fórmula] para ( s+Pk ) puede involucrar mucha manipulación algebraica. Un
método equivalente de crear la transformación es usar tablas de Laplace y transformaciones z.
Generalmente, las tablas de la lista de transformaciones Laplace de las funciones de
transferencia con dominio s, y sus respuestas de impulso correspondiente. Las tablas de las
transformaciones z pueden ser utilizadas para hallar la función correspondiente de la
transferencia z a una respuesta impulsiva. El método se refiere al impulso invariante por la
equivalencia de las respuestas impulsivas del filtro digital (descrita por la función de
transferencia z) y el prototipo análogo (descrito por la función de transferencia s). La relación
específica entre las dos respuestas impulsivas es que una comprende muestras de una versión
escalada de la otra. El desempeño de los dos filtros pueden diferir, sin embargo, dependiendo en
cuán bien detallado de la respuesta impulsiva continua del prototipo análogo es representado
por su forma de muestreo. Como será ilustrado en la Sección 4.5 si la frecuencia de muestreo del
filtro digital no es lo suficientemente alto para capturar la respuesta de impulso en tiempo
continuo en detalle, entonces las características de frecuencia alta del filtro de prototipo no
pueden ser reproducidas en la implementación digital.

4.4 TRANSFORMACIÓN BILINEAL

La BLT [por sus siglas en inglés] es la técnica comúnmente más utilizada para transformar un
filtro análogo en un filtro digital. Provee rastreo uno a uno desde el plano análogo s al plano
digital z, utilizando la sustitución

[Ecuación]
4.27
La constante k en Ecuación ( 4.27 ) comúnmente es elegida como K = 2/T, en donde T representa
el período de muestreo en segundos, del filtro digital. Otros valores para K pueden ser
seleccionados, como se describe en la sección 4.4.1. La BLT permite lo siguiente:
1. la región izquierda en el plano s, correspondiente a < 0, traza dentro del círculo unitario en
el plano z.
2. La región derecha en el plano s, correspondiente a < 0, traza fuera del círculo unitario en el
plano z.
3.La axis imaginaria en frecuencias análogas y digitales, respectivamente. Con s = j A y
[Ecuación], Ecuación ( 4.27 ) se convierte

[Ecuación]
4.28
Utilizando la fórmula de Euler para seno y coseno en términos de funciones exponenciales
complejas, [símbolo] A en la Ecuación (4.28) se transforma

[Ecuación]
4.29
A lo cual se relaciona con la frecuencia análoga [símbolo] A a la frecuencia digital [símbolo] D.
Esta relación se traza en la Figura 4.8 para valores positivos de [símbolo] A. La comprensión no
linear del rango de frecuencia análoga entera al rango de frecuencia digital desde cero a
[símbolo] s/2 se refiere como frecuencia deformada [Ecuación].

[En esta parte se encuentra un diagrama de la figura 4.8]

Frecuencia digital normalizada [símbolos].


Frecuencia análoga normalizada [símbolos].

Figura 4.8 Relación entre frecuencias análogas y digitales, [símbolo] A y [símbolo] D, debido a la
frecuencia deformada en la transformada bilineal.

4.4.1 Procedimiento de Diseño de la Transformada Bilineal


El procedimiento de diseño BLT para transformar un diseño de filtro análogo expresado como una
función de transferencia H (s) a una función transferencia z H (z) representando un filtro IIR en
tiempo discreto se describe por

[Ecuación]
4.30
H (s) puede ser elegida según con la teoría de diseño de filtro análogo, por ejemplo,
Butterworth, Chebyshev, Bessel, o elíptica. Es común escoger K = 2/T. Alternativamente, es
posible antes deformar la respuesta de frecuencia de filtro análogo en tal forma que la
transformada bilineal trasca una frecuencia análoga [símbolos], en el rango [símbolos] para
exactamente la misma frecuencia digital [símbolos]. Esto se logra al escoger
[Ecuación]
4.31
4.5 Ejemplos de Programación

Los ejemplos en esta sección introducen e ilustran la implementación de filtros IIR. Muchos
enfoques diferentes para diseñar filtros IIR son posibles, y más a menudo, los filtros IIR son
diseñados con el aid de herramientas software. Antes de utilizar tal paquete de diseño, y para
poder apreciar de mejor forma lo que tal paquetes realizan, un ejemplo simple será llevado a
cabo para ilustrar algunos de los principios básicos de diseño de filtro IIR.

4.5.1 Diseño de un Filtro de Paso Bajo IIR Simple

Tradicionalmente, un diseño de filtro IIR se basa en el concepto de transformar en tiempo


continuo, o análogo, diseño en un dominio de tiempo discreto. Butterworth, Chebyshev, Bessel y
elíptica, clases de filtros análogos son extensamente utilizados. En este ejemplo, un filtro de
paso bajo Chebyshev, tipo 1 de segunda orden con 2 dB de onda de banda de paso y un corte de
frecuencia de 1500 Hz (9425 rad/s) se utiliza.

La función de la transferencia en tiempo continuo de este filtro es

[Ecuación]
4.32

y su respuesta de frecuencia se muestra en la Figura 4.9.

[En esta parte se encuentra dos diagramas de la figura 4.9 ]

Magnitud (dB)
Frecuencia (Hz)

Fase
Frecuencia (Hz)

Figura 4.9 (a) Respuesta de frecuencia de magnitud del filtro H (s). (b) Respuesta de fase de
filtro H (s).

Utilizando MATLAB ®, los coeficientes de esta función con transferencia s puede ser generada al
escribir

>> [ b, a ] = cheby1 ( 2, 2, 2, * pi * 1500, ‘s’ ) ;


en la línea de comando. Nuestro deber es transformar este diseño en un dominio de tiempo
discreto. Un método de lograr esto es a través del método de invariación impulsiva.

4.5.1.1 Método de Invariación Impulsiva

Empezando con la función de transferencia del filtro de la Ecuación (4.32), podemos hacer uso
de la transformación par Laplace

[Ecuación]
4.33
(la función de transferencia s del filtro es igual a la transformada Laplace de su respuesta
impulsiva) y usar los valores

[Ecuación]

Por lo tanto, la respuesta impulsiva del filtro en este ejemplo es dada por

[Ecuación]
4.34

La transformada z par
[Ecuación]
4.35

Rinde la siguiente función de transferencia en tiempo discreto cuando sustituimos por [símbolo],
A, a y establecemos ts = 0.000125 en Ecuación (4.35).

[Ecuación]
4.36
Desde H (z), la siguiente ecuación de diferencia puede ser derivada.

[Ecuación]
4.37
Con la referencia a la Ecuación (4.2), podemos observar que a1 = 0.71624315, a2 = -0.879131, b0
= 0.0000, y b1 = 0.48255.
Para poder aplicar el método invariante impulsivo utilizando MATLAB, tipo
>> [ b, a ] = cheby1 ( 2, 2, 2 * pi * 1500, ‘s’ ) ;
>> [bz, az] = impinvar ( b, a, 8000 ) ;

Este filtro en tiempo discreto posee la propiedad, la cual es una respuesta impulsiva en tiempo
discreto h (n) es igual a las muestras de respuesta impulsiva en tiempo continuo h (t), (escalada
por un período de tiempo, ts), como se muestra en la Figura 4.10. Aunque es evidente en la
Figura 4.10 que la respuesta impulsiva en tiempo discreto h (n) decae más o menos a cero, esta
secuencia no es finita. Quizá vale resaltar que, contraintuitivamente, la definición de un filtro
IIR no es que su respuesta impulsiva es finita en duración pero en vez, esto hace uso de valores
de muestreo previos en la salida para poder calcular su salida actual. En teoría, es posible para
un filtro IIR tener una respuesta finita impulsiva. Mientras que la respuesta impulsiva de un filtro
FIR es dada explícitamente por su set finito de coeficientes, los coeficientes de un filtro IIR son
utilizados es una ecuación recursiva (4.1) para determinar su respuesta impulsiva.

[En esta parte se encuentra un diagrama de la figura 4.10]

Amplitud
Tiempo (ms)

Figura 4.10 Respuestas impulsivas h (t) (escaladas por un período de muestreo ts) y h (n) de filtro
en tiempo continuo H (s) y su implementación digital invariante impulsiva.

Ejemplo 4.1
Implementación de un Filtro IIR Utilizando Secciones de Forma Directa de Segunda Orden de
Cascada II (stm32f4_iirsos_intr. c).

El programa stm32f4_iirsos_intr. c, como se muestra en la Lista 4.1, implementa un filtro IIR


genérico utilizando secciones de forma directa de segunda orden de cascada II, y los valores de
coeficiente almacenados en un archivo de cabecera separado. Cada sección del filtro es
implementado utilizando las siguientes declaraciones de dos programas.

wn = input – a [ section ] [ 1 ] *w [ section ] [ 0 ]


– a [ section ] [ 2 ] *w [ section ] [ 1 ] ;

yn = b [ section ] [ 0 ] * wn + b [ section ] [ 1 ] *w [ section ] [ 0 ]


+ b [ section ] [ 2 ] *w [ section ] [ 1 ] ;

Los cuales corresponden a las ecuaciones

[Ecuación]
4.38
Y
[Ecuación]
4.39
Con referencia a la Figura 4.5 y la (4.18), los coeficientes son almacenados por el programa
como un [ i ] [ 0 ], a [ i ] [ 1 ], a [ i ] [ 2 ], b [ i ] [ 0 ], b [ i ] [ 1 ], y b [ i ] [ 2 ], respectivamente.
w [ i ] [ 0 ] y w [ i ] [ 1 ] corresponden a wi ( n-1 ) y wi ( n-2 ) en Ecuaciones (4.38) y (4.39).

[Cuadro de fórmulas]: Lista 4.1 programa del filtro IIR utilizando secciones de segunda orden
en cascada (stm32f4_iirsos_intr. c)

El filtro invariante impulsivo puede ser implementado utilizando el programa stm32f4_iirsos_intr.


c al incluir el archivo de cabecera de coeficiente impinv. h, como se muestra en la Lista 4.2. El
número de secciones de segunda orden de cascada se define como NUM_SECTIONS en tal archivo.

[Cuadro de fórmulas]: Lista 4.2 Archivo de cabecera de coeficiente impinv. h

Construir y ejecutar el programa. Utilizando un generador de señal y un osciloscopio para medir


la respuesta de frecuencia de magnitud del filtro, deberías encontrar que la atenuación de las
frecuencias sobre 2500 Hz no es muy pronunciada. Esto se debe a ambos, el filtro de orden baja
y las deficiencias inherentes del método de diseño invariante impulsivo. Un número de métodos
alternativos para valorar la repuesta de frecuencia de magnitud del filtro, será descrito en los
próximos pocos ejemplos. En común como la mayoría de los ejemplos de los programas descritos
en este capítulo, el programa stm32f4_iirsos_intr. c utiliza una interrupción basada e/s. Un DMA
basado e/s, versión del programa, stm32f4_iirsos_dma. c, también se provee. Puede ser
utilizado al remover el programa stm32f4_iirsos_intr. c desde el proyecto y agregando el
programa stm32f4_iirsos_dma. c, antes de reconstruir el proyecto.

Ejemplo 4.2
Implementación de un Filtro IIR Utilizando Secciones de Forma Directa Transpuesta de
Segunda Orden de Cascada II (stm32f4_iirsostr_intr. c).

Una estructura de forma directa transpuesta II puede ser implementada utilizando el programa
stm32f4_iirsos_intr. c simplemente al reemplazar las declaraciones del programa

wn = input – a [ section ] [ 1 ] *w [ section ] [ 0 ]


– a [ section ] [ 2 ] *w [ section ] [ 1 ] ;

yn = b [ section ] [ 0 ] * wn + b [ section ] [ 1 ] *w [ section ] [ 0 ]


+ b [ section ] [ 2 ] *w [ section ] [ 1 ] ;
w [ section ] [ 1 ] = w [ section ] [ 0 ] ;
w [ section ] [ 0 ] = wn ;

con las siguientes declaraciones del programa

yn = b [ section ] [ 0 ] *input + w [ section ] [ 0 ] ;


w [ section ] [ 0 ] = b [ section ] [ 1 ] *input + w [ section ] [ 1 ]
-a [ section ] [ 1 ] * yn ;

w [ section ] [ 1 ] = b [ section ] [ 2 ] *input + a [ section ] [ 2 ] * yn ;

(la variable wn no se requiere en último caso)

La sustitución ya ha sido hecha en programas stm32f4_iirsostr_intr . c. No deberías notar


cualquier diferencia en las características de los filtros implementados utilizando los programas
stm32f4_iirsos_intr. c y stm32f4_iirsostr_intr. c.

Ejemplo 4.3
Estimando la Respuesta de la Frecuencia de un Filtro IIR Utilizando el Ruido Pseudo aleatorio
como Entrada (tm4c123_iirsos_prbs_intr. c).

El programa tm4c123_iirsos_prbs_intr. c cercanamente se relaciona al programa


tm4c123_fir_prbs_intr . c, descrito en el Capítulo 3. En tiempo real, genera una secuencia
binaria pseudo aleatoria y utiliza esta señal de banda ancha de ruido como la entrada de un
filtro IIR. La salida del filtro está escrita en el DAC en el códec AIC3104 y la señal análoga
resultante (ruido filtrado) puede ser analizada utilizando un osciloscopio, analizador espectr, o
un Goldwave. El contenido de la frecuencia de la salida del filtro provee una buena indicación de
respuesta de frecuencia de la magnitud del filtro. Las Figuras 4.11 y 4.12 muestran la salida del
ejemplo del filtro (utilizando al archivo del coeficiente impinv. h ) demostrado utilizando la
función FFT de un osciloscopio Rigol DS1052E y utilizar Goldwave.

[En esta parte se encuentra un diagrama de la figura 4.11]

Figura 4.11 Salida desde el programa tm4c123_iirsos_prbs_intr. c utilizando el archivo de


coeficiente impinv. h, visto utilizando la función FFT de un osciloscopio Rigol DS1052E.

[En esta parte se encuentra un diagrama de la figura 4.12]

Figura 4.12 Salida desde el programa tm4c123_iirsos_prbs_intr. c utilizando el archivo de


coeficiente impinv. h, visto utilizando Goldwave.
En la Figura 4.11, la escala vertical de 5 dB por división y la escala horizontal es 625 Hz por
división. La característica de paso bajo del ejemplo del filtro es evidente en la mitad del lado
izquierdo de las figuras entre 0 y 2500 Hz. Entre 2500 y 4000 Hz, la característica de paso bajo
es menos pronunciada y el rodar más allá de 4000 Hz no se debe al filtro IIR, sino a la
reconstrucción del filtro en el códec AIC3104.

Ejemplo 4.4
Estimando la Respuesta de la Frecuencia de un Filtro IIR Utilizando una Secuencia de
Impulsos como Entrada (tm4c123_iirsos_delta_intr. c).

En lugar de una secuencia binaria pseudo aleatoria, el programa tm4c123_iirsos_delta_intr. c,


tal como se muestra en la Lista 4.3, utiliza una secuencia de impulsos en tiempo discreto como
entrada en un filtro IIR. La salida resultante es en aproximación a una secuencia repetitiva de
respuestas impulsivas de filtro. Esto depende en la respuesta impulsiva del filtro decayendo
prácticamente a cero dentro del período entre impulsos de entrada sucesivos. La salida del filtro
se escribe en el DAC en el códec AIC3104 y la señal análoga resultante puede ser analizada
utilizando un osciloscopio, analizador espectro, o Goldwave. Además, el programa
tm4c123_iirsos_delta_intr. c almacena las muestras más recientes de BUFFERSIZE de la salida del
filtro yn en formación response, y al guardar los contenido de tal formación al archivo de datos y
utilizando la función MATLAB tm4c123_logfft (), la respuesta del filtro puede ser vista en ambos,
dominios de tiempo y frecuencia.

[Cuadro de fórmulas]: Lista 4.3 Programa tm4c123_iirsos_delta_intr. c

La Figura 4.13 muestra la señal de salida análoga generada por el programa, capturada
utilizando un osciloscopio Rigol DS1052E conectado a uno de los ganchos de alcance en el
amplificador de audio. El trazo superior muestra la respuesta impulsiva en dominio de tiempo
del filtro ( 500 us por división ) y el trazo inferior muestra el FFT de la respuesta impulsiva sobre
un rango de frecuencia de 0-12 kHz. La forma de onda en la salida es formada ambos, al filtro IIR
y por el filtro de reconstrucción del códec AIC3104. El filtro de reconstrucción del códec es
responsable para la rueda más allá de la ganancia en frecuencias arriba de 4 kHz. Debajo de tal
frecuencia, menos en frecuencias más altas que 1.5 kHz, menos pronunciadas de la ganancia
debido al filtro IIR es discernible. En el trazo superior, las características del filtro de
reconstrucción del códec son evidentes en el timbre ligero que precede la mayor parte de la
forma de onda de la repuesta impulsiva. Detén el programa y guarda los contenidos en formación
response. La Figura 4.14 muestra la magnitud del FFT de los contenidos en formación trazados
utilizando la función MATLAB tm4c123_logfft ().

[En esta parte se encuentra un diagrama de la figura 4.13]

Figura 4.13 Salida del programa tm4c123_iirsos_delta_intr. c utilizando el archivo del coeficiente
impinv. , visto utilizando la función FFT de un osciloscopio Rigol DS1052E.
[En esta parte se encuentra un diagrama de la figura 4.14]

[Diagrama]
Magnitud (dB)
Frecuencia (Hz)

Figura 4.14 La respuesta de la frecuencia de la magnitud del filtro implementado por el


programa tm4c123_iirsos_delta_intr. c utilizando un archivo de coeficiente impinv. h, trazado
utilizando la función MATLAB tm4c123_logfft ().

4.5.1.2 Aliasing en el Método Invariante Impulsivo

Existen diferencias significantes entre la respuesta de frecuencia de la magnitud del filtro


prototipo análogo utilizado en este ejemplo ( Figura 4.9 ) y la de la implementación digital
invariante impulsiva ( Figura 4.14 ). La ganancia del prototipo análogo tiene una magnitud de –
15 dB a 3000 Hz, mientras, según la Figura 4.14, la ganancia del filtro digital en la frecuencia
posee una magnitud más cercana a -11 dB. Esta diferencia se debe al aliasing. Cuando sea que
una señal sea mostrada, el problema de aliasing debe solucionarse, y para poder evitar el
aliasing, la señal a ser mostrada no debe contener ningún componente de frecuencia en
frecuencias mayores a o iguales a la mitad de la frecuencia de muestreo. La transformación
invariante impulsiva del prototipo análogo h (t) en instantes de frecuencia, pero esto no es lo
suficiente para asegurar que la respuesta en tiempo continuo de una implementación en tiempo
discreto del filtro es equivalente al prototipo análogo. El método invariante impulsivo será
completamente libre de efectos aliasing solamente si la respuesta impulsiva en tiempo continuo
h (t) no contiene componentes de frecuencia en frecuencias mayores a o iguales a la mitad de la
frecuencia de muestreo.

En este ejemplo, la respuesta de frecuencia de magnitud del filtro prototipo análogo será
doblado hacia atrás en sí mismo sobre el punto 4000 Hz punto, y esto puede ser verificado
utilizando la función MATLAB freqz (), la cual valora la respuesta de frecuencia de un filtro
digital. Tipo

>> [ b, a ] = cheby1 ( 2, 2, 2, * pi * 1500, ‘s’ ) ;


>> [ bz, az ] = impinvar ( b, a, 8000 ) ;
>> frqz ( bz, az ) ;

en la línea de comando MATLAB para poder observar la respuesta de frecuencia teórica del
filtro, y compararlo con la Figura 4.14.

Un método alternativo de transformación de implementación de un diseño de filtro análogo en


tiempo discreto, el cual elimina este efecto, es el uso de la transformada bilineal.
4.5.1.3 Método de Transformación Bilineal de Implementación de Filtro Digital

El método de transformación bilineal al convertir un diseño del filtro análogo en tiempo discreto
es relativamente directo, a menudo involucra menos manipulación algebraica que el método
invariante impulsivo. Esto se logra al realizar la sustitución

[Ecuación]
4.40

en H (s), en donde T es el período de muestreo del filtro digital, esto es,

[Ecuación]
4.41
Aplicando esto a la función de transferencia s de (4.32) resultados en la siguiente función de
transferencia z.

[Ecuación]
4.42

Desde la Ecuación (4.42), la siguiente ecuación de diferencia puede ser derivada.

[Ecuación]
4.43
Esto puede ser logrado en MATLAB al escribir

>> [ bd, ad ] = bilinear ( b, a , 8000 ) ;

Las características del filtro pueden ser examinadas al cambiar el archivo del coeficiente
utilizado por los programas stm32f4_iirsos_intr. c, tm4c123_iirsos_prbs_intr. c, y
tm4c123_iirsos_delta_intr. c desde impinv.h a bilinear. h. En cada caso, cambia la línea que lee

#include “impinv .h”

A leer
#include “bilinear. h”

antes de construir, cargar y ejecutar programas. Las Figuras 4.15 a través de la 4.18 muestra
resultados obtenidos utilizando los programas tm4c123_iirsos_prbs_intr. c y
tm4c123_iirsos_delta_intr. c con archivo de coeficiente bilinear. h. La atenuación proveída por
este filtro en frecuencias altas es mejor que en el caso invariante impulsivo. De hecho, la
atenuación en frecuencias mayores a 2000 Hz es significantemente mayor que esas de filtro
prototipo.

[En esta parte se encuentra un diagrama de la figura 4.15]

Figura 4.15 Salida desde el programa tm4c123_iirsos_prbs_intr. c utilizando un archivo


coeficiente bilinear. h, visto utilizando la función FFT de un osciloscopio Rigol DS1052E.

[En esta parte se encuentra un diagrama de la figura 4.16]

Figura 4.16 Salida desde el programa tm4c123_iirsos_prbs_intr. c utilizando un archivo


coeficiente bilinear. h, visto utilizando Goldwave.

[En esta parte se encuentra un diagrama de la figura 4.17]

Figura 4.17 Salida desde el programa tm4c123_iirsos_delta_intr. c utilizando un archivo


coeficiente bilinear. h, visto utilizando la función FFT de un osciloscopio Rigol DS1052E.

[En esta parte se encuentra un diagrama de la figura 4.18]

[Diagrama]
Magnitud (dB)
Frecuencia (Hz)

Figura 4.18 La respuesta de frecuencia de magnitud implementada por el programa


tm4c123_iirsos_delta_intr. c utilizando un archivo coeficiente bilinear. h, trazado utilizando la
función MATLAB tm4c123_logfft ().

4.5.1.4 Frecuencia Formación en la Transformada Bilineal

El concepto detrás de la transformada bilineal es que la respuesta de frecuencia de compresión


de un diseño de filtro análogo tal que su respuesta sobre el rango entero de frecuencias desde
cero a infinito es mapeada en un rango de frecuencia desde cero a la mitad de la frecuencia de
muestreo de un filtro digital. Esto puede ser representado por

[Ecuación]
4.44
y

[Ecuación]
4.45
en donde [símbolo] D es la frecuencia en la cual la ganancia compleja del filtro digital es igual al
de la ganancia compleja de un filtro análogo en frecuencia [símbolo] A. Esta relación entre
[símbolo] D y [símbolo] A se ilustra en la Figura 4.19. Consecuentemente, no existe problema con
el aliasing como se ve en el caso de la transformación invariante impulsiva. Sin embargo, como
resultado de la frecuencia formada inherente en la transformada bilineal, en este ejemplo, la
frecuencia cortante del filtro en tiempo discreto obtenido no es 1500 Hz sino 1356 Hz. La Figura
4.19 también muestra que la ganancia del filtro análogo en frecuencia de 4500 Hz es igual a la
ganancia del filtro digital en frecuencia de 2428 Hz y que la frecuencia digital 1500 Hz
corresponde a la frecuencia análoga de 1702 Hz. Si hubiésemos deseado crear el filtro digital que
tuviese frecuencia cortante de 1500 Hz, hubiésemos podido aplicar la Ecuación de la
transformada bilineal (4.35) a un prototipo análogo teniendo la frecuencia cortante de 1702 Hz.

[En esta parte se encuentra un diagrama de la figura 4.19]

Frecuencia digital (Hz)


Magnitud (dB)
Transformación bilineal de filtro análoga H (s) a un filtro digital H (z)
Frecuencia análoga (Hz)

Figura 4.19 El efecto de la transformada bilineal en la respuesta de la frecuencia de magnitud


del filtro de ejemplo.

Esta técnica se refiere a la deformación del prototipo de diseño análogo y se utiliza por default
con MATLAB en el diseño del filtro y herramienta de análisis fdatool, descrita en la sección
siguiente. Un filtro digital con una frecuencia cortante de 1500 Hz puede ser obtenida al aplicar
la transformada bilineal al filtro análogo.

[Ecuación]
4.46
Esto es

[Ecuación]
4.47
El filtro análogo representado por la Ecuación (4.46) puede ser producido utilizando el comando
MATLAB

>> [ bb, aa ] = cheby1 ( 2,2,2 * pi * 1702, ‘s’ ) ;


y el BLT aplicado al escribir

>> [ bbd, aad ] = bilinear ( bb, aa, 8000 ) ;

para rendir el resultado dado por la Ecuación (4.47). Alternativamente, la deformación del
diseño del filtro análogo considerado previamente puede ser combinado con la aplicación de la
transformada bilineal al escribir

>> [ bbd, aad ] = bilinear ( b, a, 8000, 1500 ) ;

y la línea de comando MATLAB. El archivo coeficiente bilinear. h contiene los coeficientes


obtenidos como se describen anteriormente.

4.5.5.1 Utilizando el Diseño del Filtro y la Herramienta de Análisis de MATLAB

MATLAB provee un diseño de filtro y herramienta de análisis, fdatool, el cual hace el cálculo de
los valores de coeficientes del filtro IIR simples. Los coeficientes pueden ser exportados al
espacio de trabajo MATLAB en forma directa II, formato de sección de segunda orden, función
MATLAB

stm32f4_iirsos_coeffs () o tm4c123_iirsos_coeffs (), dados en este libro como archivos


stm32f4_iirsos_coeffs. m y tm4c123_iirsos_coeffs. m pueden ser utilizados para generar
archivos de coeficientes compatibles con los programas en este capítulo.

Ejemplo 4.5
Filtro IIR de Paso Bajo Elíptico de Cuarta Orden Diseñado Utilizando fdatool.

Para invocar la ventana de Diseño de Filtro y Herramienta de Análisis, tipo

>> fdatool

en la ventana de comando MATLAB. Entrar en los parámetros para un filtro IIR de paso bajo
elíptico de cuarta orden con una frecuencia cortante de 800 Hz, 1 dB de onda en la banda de
paso, y 50 dB de atenuación de banda de paro. Haz clic en Design Filter y luego observa a las
características del filtro utilizando las opciones desde Analysis menu (Figura 4.20).

[Ventana fdatool MATLAB]


Figura 4.20 La ventana fdatool MATLAB mostrando la respuesta de la frecuencia de magnitud de
un filtro de paso bajo elíptico de cuarta orden.
Este ejemplo ilustra la transición pronunciada desde bandas de paso a bandas de paro de un
filtro IIR posible hasta con pocos coeficientes de filtro relativamente. Seleccionar Filter
Coefficients desde Analysis menu para poder listar los valores de coeficiente diseñados. La
fdatool automáticamente diseña filtros como secciones de segunda orden de cascada. Cada
sección es similar a aquellas mostradas en la forma de diagrama de bloque en la Figura 4.5, y
cada sección se caracteriza por seis valores de parámetro a0, a1, a2, b0, b1, y b2.

Por default, fdatool utiliza el método de transformada bilineal de diseño del filtro digital, el cual
empieza desde un prototipo análogo. La Figura 4.21 muestra el uso de fdatool para diseñar el
filtro Chebyshev considerado en los ejemplos precedentes. Nota que la respuesta de la
frecuencia de magnitud decrece más y más rápidamente con aproximación de frecuencia de
media frecuencia de muestreo, y compara esto con la Figura 4.16. Esta es una característica de
filtros diseñados utilizando la transformada bilineal.

[Ventana fdatool MATLAB]

Figura 4.21 La ventana fdatool MATLAB mostrando la respuesta de la frecuencia de magnitud de


un filtro de paso bajo Chebyshev de segunda orden.

4.5.1.6 Implementando un Filtro Diseñado Utilizando fdatool

Para poder implementar un filtro diseñado utilizando fdatool, lleva a cabo los siguientes pasos:

1. Diseña el filtro IIR utilizando fdatool.


2. Haz clic en Export en fdatool en File menu.
3. Selecciona Workspace, Coefficients, SOS, y G y clic en Export.
4. En la línea de comando MATLAB, escribe, ya sea stm32f4_iirsos_coeffs ( SOS, G ) o
tm4c123_iirsos_coeffs ( SOS, G ) y escribe el nombre del archivo , por ejemplo, elliptic. h.

[Cuadro de fórmulas]: La Lista 4.4. muestra un ejemplo de un archivo de coeficiente


producido utilizando la función MATLAB smt32f4_iirsos_coeffs () (Lista 4.5)

[Cuadro de fórmulas] : Lista 4.4 Archivo de cabecera de coeficiente elliptic. h


[Cuadro de fórmulas]: Lista 4.5 Función MATLAB stm32f4_iirsos_coeffs ()

El programa tm4c123_iirsos_intr. c, presentado en el Ejemplo 4.1, puede ser utilizado para


implementar el filtro. Edita la línea en el programa que lee
#include “bilinear. h”

a leer
#include “elliptic. h”

y construir y ejecutar el programa. El archivo de cabecera de coeficiente también es compatible


con los programas tm4c123_iirsos_prbs_intr. c y tm4c123_iirsos_delta_intr. c. Las Figuras 4.22 y
4.23 muestran los resultados obtenidos utilizando el programa tm4c123_iirsos_delta_intr. c y el
archivo de coeficiente elliptic. h.

[En esta parte se encuentra dos diagramas de la figura 4.22]

Valor de Muestreo
Tiempo (s)
Magnitud (dB)
Frecuencia (Hz)

Figura 4.22 Respuesta de frecuencia de magnitud y respuesta impulsiva del filtro implementadas
por el programa tm4c123_iirsos_delta_intr. c, utilizando archivo de coeficiente elliptic. h,
trazado utilizando la función MATLAB tm4c123_logfft ().

[En esta parte se encuentra un diagrama de la figura 4.23]

Figura 4.23 Salida desde el programa tm4c123_iirsos_delta_intr. c, utilizando el archivo de


coeficiente elliptic. h visto utilizando el osciloscopio Rigol DS1052E.

Ejemplo 4.6
Diseño de Filtro de Paso de Banda Utilizando fdatool.

La Figura 4.24 muestra el fdatool utilizado para diseñar un Chebyshev de 18 orden tipo 2, filtro
de paso de banda IIR centrado a 2000 Hz. El archivo del coeficiente del filtro bp2000. h es
compatible con los programas tm4c123_iirsos_intr. c, tm4c123_iirsos_delta_intr. c, y
tm4c123_iirsos_prbs_intr. c. Las Figuras 4.25 y 4.26 muestran la salida desde el programa
tm4c123_iirsos_prbs_intr. c utilizando estos coeficientes.

[Ventana fdatool MATLAB]

Figura 4.24 La ventana fdatool MATLAB mostrando la respuesta de la frecuencia de magnitud de


un filtro de paso bajo de 18 orden en 2000 Hz.

[En esta parte se encuentra un diagrama de la figura 4.25]


Figura 4.25 Salida desde el programa tm4c123_iirsos_prbs_intr. c, utilizando el archivo de
coeficiente bp2000. h visto utilizando el osciloscopio Rigol DS1052E.

[En esta parte se encuentra un diagrama de la figura 4.26]

Figura 4.26 Salida desde el programa tm4c123_iirsos_prbs_intr. c, utilizando el archivo de


coeficiente bp2000. h visto utilizando Goldwave.

Ejemplo 4.7
Implementación del Filtro IIR Utilizando la Función CMSIS arm_biquad_cascade_f32 ()
(stm32f4_iirsos_CMSIS_intr. c).

Este ejemplo demuestra el uso de la biblioteca CMSIS DSP IIR función de filtración
arm_biquad_cascade_df1_f32 ().

La función arm_biquad_cascade_df1_f32 () implementa una sección de filtro IIR de segunda


orden ( un biquad ) utilizando una precisión singular (32-bit) de punto aritmético y flotante.
Como el nombre de función sugiere, el filtro se implementa como una estructura de forma
directa I. La función procesa un bloque en las muestras de entrada para producir un bloque
correspondiente de muestras de salida y es por lo tanto, adecuado para el uso de DMA basado
e/s. Sin embargo, el programa stm32f4_iirsos_CMSIS_intr. c utiliza muestra por muestra
interrupción basada e/s y bloque del tamaño de una muestra (Lista 4.6).

[Cuadro de fórmulas]: Lista 4.6 Programa stm32f4_iirsos_CMSIS_intr. c

Como se dijo anteriormente, el programa implementa el filtro de paso bajo elíptico de cuarta
orden usado en el Ejemplo 4.5, leyendo los coeficientes del filtro desde el archivo de cabecera
elliptic. h.

Dentro de la función SPI2_IRQHandler (), el valor del nuevo canal izquierdo de una muestra de
entrada se copia a float32_t variable xn.

La función arm_biquad_cascade_df1_f32 () se pasa a los punteros a

1. Una instancia de una estructura de filtro IIR de tipo arm_biquad_casd_inst_df1_f32.


2. Una formación que contenga una secuencia de valores de muestra de entrada de tipo
float32_t.
3. Una formación en la cual se puede poner una secuencia de valores de muestra de salida de
tipo float32_t.
4. El número de valores de muestra de entrada y salida.
arm_biquad_casd_inst_df1_f32 S ;
y , luego de que los coeficientes del filtro especificos en el archive de cabecera elliptic. h como
se forma a y b han sido copiados en la formación coeffs utilizada por la función
arm_biquad_cascade_df1_f32 (), se inicializa en la declaración del programa

arm_biquad_cascade_df1_init_f32 ( &S, NUM_SECTIONS, coeffs, state ) ;

Cada etapa de Segundo orden de un filtro se representa por cinco valores de coeficiente, de tipo
float32_t, almacenados en formación coeffs para poder b0, b1, b2, -a1, -a2. Esos valores
corresponden a la función de transferencia de la fórmula

[Ecuación]
4.48
La estructura del filtro arm_biquad_casd_inst_df1 mantiene trazo del estado interno de cada de
las etapas del fitro IIR de segundo orden NUM_SECTIONS, esto es, almacena y actualiza previos
valores de muestras de entrada y salida x ( n-1 ), x ( n-2 ), y ( n-1 ), y y ( n-2 ).

4.5.1.7 Testeando el Filtro Utilizando una Señal de Entrada Pseudo Aleatoria

En el programa stm32f4_iirsos_prbs_CMSIS_intr. c, la declaración en el programa


stm32f4_iirsos_CMSIS_intr.c que lee

xn = ( float32_t ) ( left_in_sample ) ;

es reemplazada por

xn = ( float32_t ) ( prbs ( 8000 ) ) ;

para poder utilizar internamente un ruido pseudo aleatorio generado como entrada y habilitar
las características del filtro para que sea observado utilizando un osciloscopio o Goldwave sin la
necesidad de una señal de entrada aplicada externamente.

En programa stm32f4_iirsos_delta_CMSIS_intr.c, la señal de entrada aplicada al filtro es una


secuencia de impulsos discretos leídos desde la formación dimpulse.

Finalizó en página 247

Вам также может понравиться