PRÁCTICAS DE LABORATORIO PARA PROCESAMIENTO DIGITAL DE SEÑAL
Por
EDUARDO AVENDAÑO FERNÁNDEZ
UNIVERSIDAD PEDAGÓGICA Y TECNOLÓGICA DE COLOMBIA
ESCUELA DE INGENIERÍA ELECTRÓNICA
FACULTAD SECCIONAL SOGAMOSO
2019
1. Introducción
La board FM4 de Cypress (FM4-176L-S6E2CC-ETH Pioneer Kit) es una plataforma de desarrollo
de bajo costo para implementar aplicaciones en tiempo real. Incorpora un procesador Cortex-
M4 ARM a 200 MHz con unidad de punto flotante de precisión fija. El procesamiento en tiempo
real de señales de audio está habilitado por un códec de audio WM8731 incluido en la tarjeta
de desarrollo, que conecta a las interfaces periféricas I2C (control) e I2S (datos) del procesador
ARM. El ambiente integrado de desarrollo MDK-ARM habilita al software escrito en C para ser
compilado, enlazado, y descargado para ejecutarse en la tarjeta Cypress FM4.
A través de este ejercicio logrará familiarizarse con el hardware de desarrollo y las herramientas
de desarrollo.
Fig. 1. Kit de Desarrollo Cypress FM4-176L-S6E2CC-ETH.
2. Diagrama de bloques de un sistema de procesamiento digital de señal (DSP)
Un sistema básico DSP, apropiado para aplicaciones de procesamiento de señales de audio
frecuencia en tiempo real, se muestra en la figura 2. El hardware de Cypress FM4 mostrado en
la figura 1, implementa este diagrama de bloques.
Filtro Procesador Digital de Filtro de
Antialias ADC Señal (DSP) DAC Reconstrucción
(AAF)
Fig. 2. Diagrama de bloques de un sistema DSP básico.
El procesador encargado del procesamiento digital de señal es el microcontrolador ARM Cortex-
M4. El filtro anti-alias, conversor analógico a digital (ADC), conversor digital a analógico (DAC), y
funcionalidad del filtro de reconstrucción son proporcionados por el códec Wolfson WA8731.
Esta combinación de componentes asegura adecuar apropiadamente las entradas y salidas
analógicas. Apropiado, quiere decir, que la señal analógica puede ser reconstruida
correctamente desde sus muestras siempre y cuando se satisfaga el teorema de Nyquist. La
calidad de la reconstrucción es una función de numerosos parámetros, tal que el ancho de bit
de los convertidores ADC y DAC (las implementaciones usarán muestras de 16 bits del códec
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 2
WM8731). Esto implica decir que, con este número de muestras, el hardware de la tarjeta
Cypress FM4 proporciona una alta calidad en las E/S analógicas.
3. Ambiente de desarrollo (IDE) e instalación
Para instalar el programa, ejecute mdk51v959.exe, luego de clic en next. Luego, seleccione la
caja I agree to all terms of the preceding License Agreement, y de clic en next. Deje por defecto
la ruta que proporciona el software (C:\Keil_v5 y C:\Keil_v5\ARM\PACK), y de clic en Next.
Ingrese los datos que le piden y de clic en Next, se iniciará la instalación del paquete.
Durante la instalación se le preguntará si desea instalar software o drivers adicionales para el
dispositivo. Si aparece la ventana de la figura 3, de clic en Install.
Fig. 3. Instalación de software del dispositivo.
Finalmente, terminará y se ejecutará la aplicación para instalar paquetes en línea adicionales.
En ese caso, simplemente de clic en YES para los paquetes que pueda considerar útiles, o en No
para continuar con otros paquetes. Y deberá ver una barra de avance en la parte inferior. I esta
ventana del instalador de paquetes no aparece, deberá ejecutarla desde el menú Project.
Tomará varios minutos instalar los paquetes necesarios para ejecutar apropiadamente el
software. Cuando termine, la ventana de Pack Installer debería listar los paquetes como “Up to
date” actualizados, cierre la ventana. Luego de la instalación termine, ejecute el programa Keil
uVision 5. Si aparece un diálogo de bienvenida de clic en OK.
Los paquetes a instalar o actualizar necesarios deben ser:
• Keil::ARM Compiler
• Keil::MDK-Middleware
• Keil::FM4 DFP
• ARM::CMSIS
Luego ejecute en orden los ejecutables de las carpetas Keil C51 v9.59, Keil MDK-ARM 5.24a y
Keil MDK-ARM 5.25 uVision 5. Finalmente, quedará instalado el software, ejecute en modo
administrador uVision y desde File->License Management copie el Computer ID (CID), y ejecute
el crack y pegue el CID donde se le indica para generar una nueva licencia. Luego adicionelo a la
lista y quedará configurado y listo para usar sin restricciones.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 3
Fig. 4. Configuración de licencia
4. Conexión e instalación de la Board Cypress FM4
La board Cypress FM4 se conecta al host PC vía un cable USB usando una herramienta de
programación y depuración CMSIS. Conecte el cable USB al conector CN2 en la tarjeta FM4 y
conecte el otro extremo a su PC. Permita que Windows termine de instalar los drivers de su
tarjeta.
5. Ejemplo de programa – Entrada y salida analógica
El DSP equivalente al programa hola mundo consiste en copiar muestras de entrada leídas
desde el ADC al DAC. El código fuente en lenguaje C para tal programa se lista en la figura 4.
Este programa sirve como una plantilla para otros programas basados en el mismo modelo de
procesamiento en tiempo real basado en manejo de interrupciones.
El código fuente en C loop_intr.c se que muestra en la figura 5, funciona como sigue:
La función main(), hace un llamado a la función de inicialización audio_init(). Esta función
configura las interrupciones de entrada salida del códec WM8731 que muestrearán la señal de
entrada análoga e interrumpe el procesador a la frecuencia de muestreo determinada por el
parámetro pasado a la función. En ese caso, el parámetro hz48000 configura una frecuencia de
muestreo a 48 kHz. El parámetro mic_in especifica que la entrada al ADC del códec WM8731
vendrá de la entrada del micrófono (Conector CN11) de la board Cypress FM4. Cambiar este
parámetro a line_in especifica la entrada de audio del nivel de línea (Conector CN6) en la tarjeta
Cypress FM4. El parámetro intr e I2S HANDLER especifica que se usará la entrada/salida basada
en interrupción (opuesto a consulta basada en acceso directo a memoria - DMA), y es el
nombre de la interrupción. Como resultado, cada vez que una interrupción ocurre, la rutina del
servicio de interrupción I2S HANDLER será llamada. Exactamente una interrupción ocurrirá por
periodo de muestreo. Los dos canales de audio, el canal izquierdo y derecho son procesados en
el mismo llamado a ISR.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 4
También en la función main(), la función gpio_set_mode() es llamada para configurar pines de
entrada salida de propósito general como una salida. Este pin será usado para mediciones de
temporización de la interrupción. Siguiendo las inicializaciones, la función main() ingresa a un
loop while() infinito, que no hace nada pero que espera por la interrupción.
Al inicio de la ISR I2S HANDLER, el valor del pin GPIO es proporcioando un cambio en cada
instante que ocurre una interrupción. Dentro de I2S_HANDLER(), la función i2s_rx() retorna la
muestra de entrada actual leída desde el periférico I2S. El dato contenido en la variable
audio_IN (un entero con signo de 32 bits, declarado en audio.h) está compuesto de 16 bits para
el canal derecho y 16 bits para el canal izquierdo.
Para procesar cada canal independientemente, los canales son separados en las líneas 12 y 13.
Puesto que este ejemplo es un simple bucle de audio (es decir, lee muestras desde el ADC que
se copian al DAC), las muestras del canal derecho e izquierdo son empaquetadas en la variable
audio_OUT (un entero con signo de 32 bits, declarado en audio.h) y son enviadas de regreso al
periférico I2S usando la función i2s_tx().
6. Construyendo y ejecutando programas
Los siguientes pasos servirán como guía a través del proceso de construcción y ejecución de
programas para DSP usando lenguaje C en la tarjeta Cypress FM4.
1. Descargue el archive LabDSP1.zip del aula virtual. Descomprímalo a una carpeta de su
elección. Esto creará la carpeta LabDSP1, explore el folder.
2. Abra el proyecto DSP LiB en Vision 5 dando doble clic en su ícono dentro de la carpeta
LabDSP1. Inmediatamente le preguntara si es necesario instalar algún paquete
adicional, para lo cual deberá darle clic en Install como se muestra en la figura 6.
3.
Fig. 5. Estructura del proyecto y código fuente para bucle
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 5
Debería observar la estructura del proyecto como se muestra en la figura 5 parte izquierda.
Nota: Si se le pregunta instalar algún paquete perdido, elija instalar el paquete y espere
hasta que se realice el procedimiento antes de proceder.
Fig. 6. Instalación adicional de paquetes para ejecutar el código.
4. Construya el proyecto seleccionando Build target del menú Project o dando clic en el
botón de la barra de herramientas Build. El proyecto debería construirse sin errores.
5. Conecte usando un cable USB la board Cypress FM4 al host PC.
6. Conecte los audífonos y micrófono en los sockets correspondientes en la board FM4,
como se muestra en la figura 7.
7. Conmute al depurador dando clic en el botón de la barra de herramientas Start/Stop
Debug Session. Al hacerlo se descargará automáticamente el código ejecutable en la
memoria flash del procesador ARM.
8. Una vez el depurador de Windows haya aparecido, de clic en el botón de la barra de
herramientas Run.
Importante: Nunca descarge y ejecute el software a la tarjeta sin los audífonos conectado a sus
oidos. El amplificador del audífono en la board tiene una alta ganancia y podría dañarle sus
oídos. Cuando pruebe software, lleve lentamente los audífonos a sus oídos.
9. Una vez el programa esté corriendo, debería ser capaz de escuchar sonidos capturados
por el micrófono en los auriculares. Dependiendo de las características del micrófono y
auriculares, el sonido podría ser fuerte o suave. Si no puede oír nada, intente soplar
gentilmente el micrófono.
10. Puede salir del depurador dando clic en el botón de la barra de herramientas Start/Stop
Debug Session. No es estrictamente necesario iniciar una sesión de depuración (Debug)
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 6
PRÁCTICAS DE LABORATORIO PARA PROCESAMIENTO DIGITAL DE SEÑAL
Por
EDUARDO AVENDAÑO FERNÁNDEZ
UNIVERSIDAD PEDAGÓGICA Y TECNOLÓGICA DE COLOMBIA
ESCUELA DE INGENIERÍA ELECTRÓNICA
FACULTAD SECCIONAL SOGAMOSO
2019
1. Introducción
En aplicaciones típicas del DSP la generación de formas de onda o señales es una tarea común.
Diferentes técnicas de DSP son usadas para la creación y control preciso de formas de onda
sintetizadas. Sin embargo, ciertas restricciones son impuestas por el hardware y las técnicas de
procesamiento y deben ser tenidas en cuenta para lograr tareas eficientes
computacionalmente. En esta práctica se ganará experiencia generando formas de onda tanto
en simulación como en hardware DSP en tiempo real usando el kit ARM Cortex M4.
2. Simulación en Matlab
En Matlab, versiones muestreadas de una señal o forma de onda (secuencias de muestras)
pueden generarse de manera sencilla usando Matlab. El código listado en la figura 1 muestra un
ejemplo de creación de una secuencia que representa muestras de una sinusoide oscilando a
200 Hz.
fs = 8000; % Frecuencia de muestreo 8000 muestras/s
Ts = 1/ fs; % Periodo de muestreo
t_max = 0.01; % tiempo máximo 0.01 s
n_max = t_max /Ts; % determina el índice máximo
n = 0:1:n_max ; % vector de índice de muestras
%% generación de muestras
frec = 200; % in Hz
x1 = sin (2*pi*frec*(Ts*n));
%% Dibuja la secuencia discreta
figure
stem (n,x1)
title('Muestreo de señal sinusoidal con f_0=200 Hz')
xlabel('n')
ylabel('Amplitud')
%% Visualización de señal continua
figure
plot(n*Ts,x1)
title('Visualización de señal continua f_0=200 Hz')
xlabel('Tiempo [t]')
ylabel('Amplitud')
Figura 1. Código Matlab para generar muestras de función sinusoidal
Puede cambiar el valor de la variable frec para modificar la secuencia que depende de la
frecuencia de muestreo que se asigne y que debe cumplir con el teorema de muestreo de
Nyquist [XX]. Esto es, si la frecuencia de señal que se intenta generar equivale o excede fs/2,
donde fs es la frecuencia de muestreo, ocurrirá aliasing. Por esa razón, usualmente se aplica un
“oversampling” sobre la señal de manera que se garantice las condiciones que permiten la
recuperación de la señal original a partir de sus muestras.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 2
Pregunta 1: Modifique el código del script de la figura 1, de acuerdo a los valores de fs y frec
mostrados en la tabla 1. En cada caso, observe las gráficas, interprete y comente los resultados.
Puede ser necesario ajustar el tiempo máximo t_max para visualizar apropiadamente las formas
de onda.
Valor asignado de fs Valor asignado a la variable frec
8000 1000
8000 2000
8000 4000
8000 7000
16000 7000
Tabla 1. Valores a modificar en script Matlab para evaluar muestreo.
¿En que casos ocurrirá aliasing? Justifique su respuesta. Incluya en cada caso donde ocurra
aliasing y comente lo que observa en las formas de onda resultantes.
Otros tipos de forma de onda resultantes que pueden ser generados usando Matlab. La figura 2
muestra un script para generar una forma de onda cuadrada.
%% Onda cuadrada
clear all
close all
fs = 8000; % Frecuencia de muestreo 8000 muestras/s
Ts = 1/ fs; % Periodo de muestreo
% Generación de muestras de onda cuadrada
x1 = [1*ones(1,8) -1*ones(1,8)];
n = 1:length(x1);
% Grafica de secuencia discreta
figure
stem (n,x1); grid on; axis([0 16 -1.25 1.25])
title('Muestreo de onda cuadrada')
xlabel('n')
ylabel('Amplitud')
% Visualización de señal continua con muestras super-impuestas
figure
hold on
plot (n*Ts,x1) % visualización de señal continua
plot (n*Ts,x1,'o') % gráfica de puntos de muestra
grid on; axis([0 2e-3 -1.25 1.25])
title('Visualización de señal continua y muestras discretas')
xlabel('Tiempo [t]')
ylabel('Amplitud')
Figura 2. Código Matlab para generar muestras de forma de onda cuadrada
Pregunta 2: Asuma que las muestras corresponden a un periodo de la onda cuadrada. ¿Cuál es
la frecuencia de la onda cuadrada?
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 3
3. Generación de señales en Tiempo Real – Sinusoides de frecuencia arbitraria.
El código del programa sine_intr.c mostrado en la figura 3 genera formas de onda sinusoidales
en la tarjeta de DSP FM4-176L-S6E2CC-ETH. La estructura del programa es idéntica a los
ejemplos de la asignación del primer laboratorio. Esto es, el programa está basado en
interrupciones y opera a una frecuencia de muestreo de 5 kHz. Aunque las muestras del ADC no
son usadas, son utilizadas con base a llamados a la función sin(). La frecuencia de la señal que
es generada es controlada por la frecuencia variable. El DAC reconstruirá una señal continua en
tiempo basada en valores muestra.
Para asegurar la generación de la señal, una parte del cálculo en sine_intr.c debe ser realizada
usando aritmética de punto flotante. Observe que las variables theta_increment y theta son de
tipo float32_t. Debido a que los últimos valores enviados al DAC deben ser enteros, observe el
tipo cast (conversión entre tipos primitivos) que a int16_t cuando se asigna la variable
audio_chL.
// sine_intr .c
# include " audio .h"
void I2S_HANDLER ( void ) { /* ***** I2S Interruption Handler **** */
const int sampling_freq = 8000;
const float32_t frequency = 1000.0;
const float32_t amplitude = 2000.0;
const float32_t theta_increment = 2* PI* frequency / sampling_freq ;
static float32_t theta = 0.0 f;
int16_t audio_chR =0;
int16_t audio_chL =0;
audio_IN = i2s_rx ();
audio_chL = ( audio_IN & 0 x0000FFFF );
audio_chR = (( audio_IN > >16)& 0 x0000FFFF );
theta += theta_increment ;
if ( theta > 2* PI) theta -= 2* PI;
audio_chL = ( int16_t )( amplitude * sin ( theta ));
audio_chR = audio_chL ;
audio_OUT = (( audio_chR < <16) & 0 xFFFF0000 ) | ( audio_chL & 0 x0000FFFF );
i2s_tx ( audio_OUT );
}
int main ( void ) {
audio_init ( hz8000 , line_in , intr , I2S_HANDLER );
while (1){}
}
Figura 3. Estructura de programa sine_intr.c
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 4
a) b)
Figura 4. Salida análoga generada por la función sine_intr.c en a) dominio del tiempo y b)
dominio de la frecuencia.
Conecte un osciloscopo a un canal de la salida del audífono en la board Cypress FM4 y observe
la señal en los dominios del tiempo y de la frecuencia (Función math fft o Analizador de
espectro). Verifique la salida sinusoidal a 1 kHz. Los resultados deben parecerse a los mostrados
en la figura 4.
Pregunta 3: Modifique el script anterior de acuerdo a los valores de frecuencia mostrados en la
tabla de abajo. En cada caso, capture imágenes de la señal de salida en el dominio del tiempo y
la frecuencia e interprete los resultados.
Valor asignado a frecuencia
1500
2641
3500
4500
7000
Tabla 2. Valores de frecuencia a modificar en script sine_intr.c
Una observación respecto a la función sin_intr.c es que el programa usa la función incluida en la
biblioteca de matemáticas sin() para calcular las muestras de salida, lo que es inusual en DSP
para tiempo real. Los llamados a funciones trigonométricas son computacionalmente costoso y
son generalmente omitidos, en ese caso, se utiliza valores pre-calculados que se almacenan en
tablas de búsqueda (Loock-up tables - LUTs).
4. Generación se señales en tiempo real – Método de tablas de búsqueda (LUTs)
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 5
El código fuente en C sine_lut_intr.c de la figura 5 genera una señale sinusoidal usando el
método LUT y opera como sigue:
Una LUT es inicializada en el arreglo sine_table tal que los valores del arreglo corresponden a la
expresión
sine_table[i] = 10000 sin(2i/8)
Los valores en el arreglo sine_table son muestras de exactamente un ciclo de una sinusoide.
La función main() es idéntica a la descrita en el ejercicio del primer laboratorio.
Cuando una interrupción ocurre, IS2_HANDLER es llamado. Valores de muestra leidos de la
sine_table son escritos en los dos canales del DAC. La variable sine_ptr es incrementada para
apuntar al siguiente valor en el arreglo.
La forma de onda resultante en los canales de audio a la izquierda y derecha será una señal
sinusoidal de 1 kHz. Esta frecuencia de 1 kHz es debida a las ocho muestras por ciclo de salida a
una tasa de 8 kHz. La señal será una sinusoide puesto que el codec WM8731 contiene un filtro
paso bajo de reconstrucción que interpola entre muestras de salida para dar una señal
anaógica.
Pregunta 4: Modifique la función sine_lut_intr.c para usar una tasa de muestreo de 48 kHz
cambiando el parámetro hz8000 a hz48000 en el llamado a la función audio_init(). ¿Cuál deberá
ser la nueva frecuencia de la sinusoide? Jusitifique su respuesta. Incluya un osciloscopio y
analizador de espectro que capture la sinusoide generada.
Pregunta 5: Modifique la función sine_lut_intr.c para generar una sinusoide de 2 kHz usando
una tasa de muestreo de 8 kHz. Use el osciloscopio y analizador de espectro para capturar la
sinusoide generada, comente las líneas de código incluidas en el script.
Pregunta 6: Repita el problema anterior pero esta vez genere una sinusoide a 1.5 kHz.
5. Generación de señales en Tiempo Real – Ondas Cuadradas
Considere la secuencia de muestras {10000, 10000, 10000, 10000,- 10000,- 10000,- 10000,-
10000}. La secuencia representa las muestras de un periodo de onda cuadrada. Puesto que hay
ocho muestras en un periodo, usando una frecuencia de muestreo de 8 kHz se tendría una
onda cuadrada en 1 kHz.
Edite el programa sine_lut_intr.c de manera que obtenga la onda cuadrada a 1 kHz. Necesitará
definir un nuevo arreglo que contenga los valores de muestra de la onda cuadrada
int16_t square_table[LOOP_SIZE] = {10000, 10000, 10000, 10000,- 10000,- 10000,- 10000,- 10000};
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 6
y modifique el resto del programa de acuerdo a los requerimientos.
/ sine_lut_intr .c
# include " audio .h"
void I2S_HANDLER ( void ) { /* ***** I2S Interruption Handler **** */
const int loop_size = 8;
const int16_t sine_table [ loop_size ] = {0, 7071 , 10000 , 7071 , 0, -7071 , -10000 , -7071};
static int sine_ptr = 0;
int16_t audio_chR =0;
int16_t audio_chL =0;
audio_IN = i2s_rx ();
audio_chL = ( audio_IN & 0 x0000FFFF );
audio_chR = (( audio_IN > >16)& 0 x0000FFFF );
audio_chL = sine_table [ sine_ptr ];
audio_chR = sine_table [ sine_ptr ];
sine_ptr = ( sine_ptr +1) % loop_size ;
audio_OUT = (( audio_chR < <16) & 0 xFFFF0000 ) | ( audio_chL & 0 x0000FFFF );
i2s_tx ( audio_OUT );
}
int main ( void ) {
audio_init ( hz8000 , line_in , intr , I2S_HANDLER );
while (1){}
}
Figura 5. Código fuente para la creación de tabla de búsqueda
Ejecute el programa y observe la señal de salida usando el analozador de espectro y
osciloscopio.
Pregunta 7: Obtenga las capturas del osciloscopio y analizador de espectro de la onda cuadrada
generada. La forma de onda en el dominio del tiempo se parece a la onda cuadrada? ¿Cómo la
forma de onda se compara con la onda cuadrada generada usando Matlab?
Pregunta 8: Modifique el programa para generar una onda cuadrada a 500 Hz usando una tasa
de muestreo de 8 kHz. Obtenga las capturas del osciloscopio y analizador de espectro de la
onda cuadrada generada. Incluya en su respuesta las líneas de código que haya modificado.
Pregunta 9: Examine cuidadosamente las capturas del analizador de espectro para la onda
cuadrada a 500 Hz y 1 kHz. ¿Corresponden esas mediciones a la transformada de Fourier (o
Series de Fourier) de la onda cuadrada? Qué sugiere esas mediciones acerca del filtro de
reconstrucción del sistema DSP en tiempo real?.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 7
Referencias
[1] Mathworks, http://www.mathworks.com/.
[2] Gnu Octave, https://www.gnu.org/software/octave/.
[3] ARM University Worldwide Education Program. ARM-based Digital Signal Processing Lab-in-
a-Box, 2014.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 8
cada vez que quiera probar un programa. En lugar de ello, luego de construir (build)
satisfactoriamente, puede dar clic en el botón de la barra de herramientas Download o
presionar F8.
7. Verificación de la tasa de muestreo
Como se describió anteriormente, un pin GPIO puede ser usado como un indicador por el
tiempo de ejecución del programa en tiempo real.
En el caso del loop intr.c, los valores de los pines GPIO es conmutada cada vez que ocurra una
interrupción (línea 9):
gpio_toggle(P10);
Puesto que la interrupción debería ocurrir una vez por periodo de muestreo, la señal esperada
en el pin P10 es una onda cuadrada de frecuencia 24 kHz (tasa de muestreo de 48 kHz). Conecte
una terminal del osciloscopio al pin seleccionado sobre la board FM4 para confirmar la forma
de onda a la salida. Observe que las conexiones GPIO son rotuladas al lado inferior de la board
FM4. El pin GPIO puede ajustarse en (HIGH-ALTO) o reset (LOW-BAJO) usando declaraciones de
programa.
gpio_set(P10, HIGH);
gpio_set(P10, LOW);
Nota: cuando se usa boards FM4 PURPURA, especifique y use el pin P10. Cuando se use las
boards FM4 AZULES, especifique y use el pin P15. Las ubicaciones de los pines son marcadas en
el lado inferior de las boards FM4.
Fig. 7. Conexiones de audio en la board Cypress FM4.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 7
8. Adicionando un retardo
El programa listado en la figura 8, muestra una modificación simple del audio que pasa a través
de un programa en el cuál muestras retrasadas del canal izquierdo son sumadas a la salida del
canal de audio izquierdo actual.
Fig. 8. Listado de instrucciones del programa delay_intr.c
La lista de instrucciones de programa implementa el diagrama de bloques de la figura 9. Este
ejemplo ilustra una ventaja clave del DSP, el procesamiento digital permite una variedad de los
efectos de audio para ser implementados rápidamente y fácilmente a través de modificaciones
de software.
La línea de retardo es implementada un arreglo de buffer para almacenar muestras tal como
son leídas del ADC. Una vez el arreglo esté completo el programa sobre escribe las muestras de
entrada almacenadas más viejas con las muestras más nuevas o actuales, la muestra de
entrada. Antes de sobre escribir la muestra de entrada almacenada más vieja en el buffer, esa
muestra es recuperada y adicionada a la muestra de entrada actual y a la salida del DAC. La
longitud del retardo es determinada por el valor de la constante DELAY_BUF_SIZE. El programa
maneja un arreglo con longitud 24000, correspondiente a un 24000(1/48000)=0.5 segundos
de retardo.
El archivo fuente delay_intr.c está incluido en la carpeta LabDSP1\src. Puede guardar en otra
carpeta y reemplazar el archivo loop_intr.c con delay_intr.c haciendo lo siguiente:
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 8
1. De clic en src de la ventana de proyecto Keil, elija Add Existing Files (adicione archivos
existentes) a Group src (grupo fuente) , y luego navegue y seleccione el archivo
delay_intr.c.
2. De clic en loop_intr.c en la ventana del proyecto Keil y elija Remove File (Remover
archivo).
Entrada del canal izquierdo Salida del canal izquierdo
Retardo
G
Figura 9. Diagrama de bloques del retardo en el canal de audio izquierdo.
Construya el proyecto y decarguelo a la board FM4. Experimente con el retardo, ponga
atención a las diferencias entre los canales de audio izquierdo y derecho.
9. Creando un eco
El efecto de eco puede ser introducido a través de una red de realimentación en el
procesamiento. El programa echo_intr.c, mostrado en la figura 10, implementa tal efecto en el
canal de audio izquierdo. Estudie el ejemplo cuidadosamente.
Construya el proyecto y descárguelo a la board FM4. Experimente con diferentes valores de los
parámetros DELAY_BUF_SIZE y GAIN.
Pregunta 1: Dibuje el diagrama de bloques del sistema implementado por echo_intr.c.
Pregunta 2: Qué podría suceder si el valor de ganancia (Gain - G) fuera mayor o igual a 1?
Pregunta 3: Dibuje y grafique en el dominio del tiempo mostrando lo que piense que debería
obtener en la respuesta al impulso para el caso de una ganancia de 0.6?
Comentarios, sugerencias, y ayudas para usar la board Cypress FM4
Observe en la función main() que los programas de muestra usualmente toman audio del
puerto \mic_in. Cambielo a \line_in para usar el puerto de entrada de línea. Esto es apropiado
para recibir música de un reproductor de audio o de un generador de funciones. Desenergize
los micrófonos operando a voltajes mucho menores que los dispositivos de nivel de línea.
La línea en el Jack de la board FM4 debería solamente recibir un voltaje máximo de 894 mV pico
a pico; este es el nivel de audio de línea del consumidor. Se debe monitorear cualquier señal
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 9
que ponga en el Jack usando un osciloscopio, ajustar el nivel de señal antes de conectarla en el
Jack de entrada de línea.
Fig. 10. Lista de instrucciones del programa echo_intr.c
No conecte nada diferente a un micrófono en la entrada MIC de la board FM4.
La board FM4 usa un conductor de audio estándar de 3 conductores de 3.5 mm (1/8 pulgada).
Algunos auriculares específicos tienen una entrada de micrófono y uno o dos canales de salida y
podrían comportarse exactamente igual sobre el auricular de salida de la board FM4.
Referencias
[1] FM4-176L-S6E2CC-ETH - ARM Cortex-M4 MCU Starter Kit Guide, March 26 2015.
[2] ARM University Worldwide Education Program. ARM-based Digital Signal Processing Lab-in-
a-Box, 2014.
[3] Esta guía esta basada en El Laboratorio de DSP en tiempo real recuperado de internet de la
url: https://faculty-web.msoe.edu/prust/EE3221/RTDSP_Lab1.pdf. Reconozco todos los
derechos de los autores creadores que aunque se apoyan en el programa de educación mundial
de universidad ARM, acá se hace una adecuación y traducción para aplicarlo en el curso de DSP.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 10
PRÁCTICAS DE LABORATORIO PARA PROCESAMIENTO DIGITAL DE SEÑAL
“Entradas y Salidas Analógicas”
Por
EDUARDO AVENDAÑO FERNÁNDEZ
UNIVERSIDAD PEDAGÓGICA Y TECNOLÓGICA DE COLOMBIA
ESCUELA DE INGENIERÍA ELECTRÓNICA
FACULTAD SECCIONAL SOGAMOSO
2019
1. Introducción
El procesamiento digital de señal en tiempo real proporciona numersas ventajas en el
procesamiento de señales en tiempo continuo (o analógicas). Sin embargo, hay limitaciones
inherentes en el sistema DSP por si mismo que pueden restringir los tipos de señales que se
pueden procesar. A través de este laboratorio, se caracterizará algunos de los componentes
importantes del sistema DSP para entender su impacto y desempeño en la capacidad del
sistema completo.
Conversor Procesador Conversor
Filtro Anti- Digital a Filtro de
Analógico a Digital de
Alias (FAA) Analógico Reconstrucción
Digital (ADC) Señal
(DAC)
Fig. 1. Diagrama de bloques de un sistema DSP.
2. Respuesta al escalón y al impulso unitario del filtro de reconstrucción del DAC
De acuerdo a la figura 1, el primer análisis se hace sobre el filtro de reconstrucción. Por tanto,
// square_intr .c
# include " audio .h"
void I2S_HANDLER ( void ) { /* ***** I2S Interruption Handler **** */
const int loop_size = 64;
const int16_t square_table [ loop_size ] = {
10000 , 10000 , 10000 , 10000 , 10000 , 10000 , 10000 , 10000 ,
10000 , 10000 , 10000 , 10000 , 10000 , 10000 , 10000 , 10000 ,
10000 , 10000 , 10000 , 10000 , 10000 , 10000 , 10000 , 10000 ,
10000 , 10000 , 10000 , 10000 , 10000 , 10000 , 10000 , 10000 ,
-10000 , -10000 , -10000 , -10000 , -10000 , -10000 , -10000 , -10000 ,
-10000 , -10000 , -10000 , -10000 , -10000 , -10000 , -10000 , -10000 ,
-10000 , -10000 , -10000 , -10000 , -10000 , -10000 , -10000 , -10000 ,
-10000 , -10000 , -10000 , -10000 , -10000 , -10000 , -10000 , -10000};
static int square_ptr = 0;
int16_t audio_chR =0;
int16_t audio_chL =0;
audio_IN = i2s_rx ();
audio_chL = audio_IN & 0 x0000FFFF ;
audio_chR = ( audio_IN > >16)& 0 x0000FFFF ;
audio_chL = square_table [ square_ptr ++];
audio_chR = audio_chL ;
square_ptr %= loop_size ; // return to start if we reached the end of the array
audio_OUT = (( audio_chR < <16) & 0 xFFFF0000 ) | ( audio_chL & 0 x0000FFFF );
i2s_tx ( audio_OUT );
}
int main ( void ) {
audio_init ( hz8000 , line_in , intr , I2S_HANDLER );
while (1){}
}
UPTC
Fig.Ingeniería Electrónica
2. Código de programa Eduardo Avendaño Fernández
square_intr.c 2
para examinar el diseño del filtro, se generará diferentes formas de onda desde el DSP y estas
salidas pasarán a través del DAC y el filtro de reconstrucción, esto requiere aislar la parte de la
salida del sistema.
El programa square_intr.c repetidamente entrega una secuencia que comprende 32 valores
consecutivos de 10000 seguidos por 32 valores consecutivos de -10000. Observando la salida
del sistema, se puede entender que esto podría parecerse a una forma de onda cuadrada que
ha sido pasada a través del DAC y filtro de reconstrucción en el codificador-decodificador
(CODEC), que nos permite tener una percepción de la respuesta al escalón.
Ejecute el programa y observe la salida usando un osciloscopio. Debería obtener un resultado
similar al presentado en la figura 3.
Fig. 3. Forma de onda analógica generada usando la función square intr.c.
Pregunta 1: Incluya una captura gráfica de la medición hecha en osciloscopio. Basado en esa
captura, dibuje lo que usted considera es la respuesta al impulso del DAC y filtro de
reconstrucción. Justifique su respuesta.
Ayuda: Un impulso es la derivada en tiempo de un escalón y, de igual forma, la respuesta al
impulso de un sistema LTI es igual a la derivada en tiempo de su respuesta al escalón.
Pregunta 2: Modifique el programa square_intr.c de manera que la salida del sistema sea una
aproximación de la respuesta al impulso del DAC y filtro de reconstrucción. Incluya el código y
modificaciones que haga y explíquelos. Incluya una captura de la medición del osciloscopio.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 3
Ayuda: Cree y utilice una tabla de búsqueda que aproxime la función impulso o delta de
Kronecker.
3. Magnitud de la respuesta en frecuencia del filtro de reconstrucción del DAC
La forma de onda analógica de salida generada por square_intr.c contine las componentes de
frecuencia de una onda cuadrada a 125Hz y una frecuencia máxima de hasta 4 kHz. Las
componentes de mayor frecuencia (que podrían hacer los bordes de la forma de onda cuadrada
más agudos) se pierden. Esto puede ilustrarse usando cualquiera, la función de transformada
rápida de Fourier (FFT) de un osciloscopio o usando un analizador de espectro. Observe el
espectro de la señal de salida. ¿Qué observa? ¿A que corresponden esas líneas espectrales?, ¿El
resultado se parece a la forma de onda obtenida en la figura 4?
Fig. 4. Magnitud de las componentes de frecuencia presentes en una forma de onda analógica
generada usando la función square intr.c
Una representación más completa de la magnitud en el dominio de la frecuencia de un DAC y
filtro de reconstrucción puede obtenerse usando el programa prbs_intr.c mostrado en la figura
5. Este programa usa la función prbs() para generar una secuencia pseudo-aleatoria que, en
teoría, contiene un rango completo de componentes en frecuencias diferentes a igual
magnitud. Observando que frecuencias están presentes en la salida del sistema, se puede
discernir cómo el sistema atenúa ciertas frecuencias. Ejecute el programa y observe la
respuesta en los dominios del tiempo y la frecuencia.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 4
Pregunta 3: incluya una captura en pantalla de la medición con analizador de espectro.
Comente lo que observa.
Pregunta 4: cambie la tasa de muestreo del sistema a 48 kHz y de nuevo observe la salida del
sistema. Incluya una captura de pantalla de la medición con analizador de espectro. Comente lo
que observa e indique que camibo relativamente respecto a la pregunta anterior.
// prbs_intr .c
# include " audio .h"
void I2S_HANDLER ( void ) { /* ***** I2S Interruption Handler **** */
int16_t audio_chR =0;
int16_t audio_chL =0;
audio_IN = i2s_rx ();
audio_chL = audio_IN & 0 x0000FFFF ;
audio_chR = ( audio_IN > >16)& 0 x0000FFFF ;
audio_chL = prbs ();
audio_chR = audio_chL ;
audio_OUT = (( audio_chR < <16) & 0 xFFFF0000 ) | ( audio_chL & 0 x0000FFFF );
i2s_tx ( audio_OUT );
}
int main ( void ) {
audio_init ( hz8000 , line_in , intr , I2S_HANDLER );
while (1){}
}
Fig. 5. Código de programa prbs_intr.c
4. Respuesta al impulso de un filtro Anti-Alias
Se seguirá una estrategia similar para observar las características del filtro anti-alias a la entrada
analógica del hardware DSP en tiempo real. Se usará un generador de señal externa y se
recuperará las muestras ADC usando las capacidades de depuración en el entorno de desarrollo
(IDE) del Keil.
El programa loop_buf_intr.c mostrado en la figura 6, es un bucle de audio usado
anteriormente. Sin embargo, observe que las muestras de entrada pasadas son almacenadas en
un buffer. Al pausar el programa y recuperar las muestras, se observa (por ejemplo, por medio
de una gráfica en Matlab) las muestras de datos del ADC.
Para investigar la respuesta al escalón del filtro anti-alias en el codec WM8731, conecte un
generador de formas de onda al canal izquierdo del socket LINE IN. Ajuste el generador de señal
al generador para obtener una forma de onda cuadrada a la salida de frecuencia 200 Hz y
amplitud 500 mW pico a pico. Inicie una sesión de depuración (Debug) y ejecute el programa
loop_buf_intr.c. Examine la señal de salida del canal izquierdo desde LINE OUT, y observe que
no es una onda cuadrada perfecta. Detenga el programa dando clic en el botón Stop de la barra
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 5
de herramientas. Escriba el nombre de la variable Ibuffer como la dirección en la ventana de
Memoria 1 (Memory 1) en el depurador. Ajuste el tipo de datos desplegado a tipo Decimal y
Flotante (float) como se muestra en la figura 7 (clic derecho en la ventana Memory 1). La
dirección de inicio del arreglo Ibuffer se desplegará en la parte superior en la esquina izquierda
de la ventana.
// loop_buf_intr .c
# include " audio .h"
static const int buffer_size = 256;
float32_t rbuffer [ buffer_size ];
float32_t lbuffer [ buffer_size ];
void I2S_HANDLER ( void ) { /* ***** I2S Interruption Handler **** */
static int16_t rbufptr = 0;
static int16_t lbufptr = 0;
int16_t audio_chR =0;
int16_t audio_chL =0;
audio_IN = i2s_rx ();
audio_chL = audio_IN & 0 x0000FFFF ;
audio_chR = ( audio_IN > >16)& 0 x0000FFFF ;
lbuffer [ lbufptr ++] = ( float32_t ) audio_chL ;
lbufptr %= buffer_size ; // return to start if we just wrote to the end
rbuffer [ rbufptr ++] = ( float32_t ) audio_chR ;
rbufptr %= buffer_size ; // return to start if we just wrote to the end
audio_OUT = (( audio_chR < <16) & 0 xFFFF0000 ) | ( audio_chL & 0 x0000FFFF );
i2s_tx ( audio_OUT );
}
int main ( void ) {
audio_init ( hz8000 , line_in , intr , I2S_HANDLER );
while (1){}
}
Fig. 6. Código de programa prbs_intr.c
Se puede observer los 128 valores leídos de muestra de entrada más recientes desde el ADC
salvándolos a un archivo usando la ventana de comandos del depurador (debugger’s
command). El comando
SAVE <filename> <start address>, <end address>
Salvará los contenidos del rango de memoria especificado (desde la dirección de inicio a la
dirección final) a un archivo en el espacio de trabajo. Por ejemplo, para almacenar 128
muestras iniciando en la dirección 0x1FFD0C84, use el commando
SAVE output.dat 0x1FFD0C84, 0x1FFD0C84 + 4 * 128
Observe que la dirección final ha sido ajustada como dirección de inicio + 4 * 128, especificando
128 muestras, cada 32 bits (4 bytes) en longitud.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 6
Se puede graficar los contenidos de ese archivo usando la función de Matlab plot_real(). Luego
de ejecutar la función en la ventana de comandos de Matlab, se le preguntara para seleccionar
el nombre de archivo (Por ejemplo, output.data) y las muestras serán graficadas. La función
ihexread (que es llamada dentro de plot_real) analiza el archivo del depurador y retorna las
muestras en punto flotante en un vector, además permite utilizar las muestras como se
requiera. Por ejemplo, el llamado
samples = ihexread(‘output.dat’);
lee los valores del ADC desde el archive output.dat y los ubica en un vector de muestras.
Pregunta 5: Comente lo que observa. Cómo se compara con la respuesta al escalón del filtro de
reconstrucción del DAC? Incluya una gráfica de la respuesta al escalón del filtro anti-alias.
Figura 7: Ventana Memory 1 mostrando los contenidos del arreglo lbuffer.
5. Respuesta magnitud en el dominio de la frecuencia del filtro Anti-Alias
La característica paso bajo del filtro anti-alias del codec WM8731 puede ser adicionalmente
investigada usando el programa loop_buf_intr.c. Ajustando el generador de señal para
proporcionar una salida sinusoidal, se puede observar la respuesta del filtro a unas frecuencias
invididuales.
Pregunta 6: ajuste el generador de señal para generar una salida sinusoidal con amplitud de 500
mW pico a pico. Para cada una de las frecuencias especificadas abajo, ejecute el programa
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 7
loop_buf_intr.c por pocos segundos y grafique los contenidos del arreglo lbuffer usando
Matlab.
Cuidadosamente inspección las gráficas de Matlab, y ponga especial atención a las amplitudes
de la señal. Que le sugieren esas gráficas acerca de la respuesta en frecuencia a la magnitud?
Frecuencia de entrada sinusoidal Hz
100
500
1000
3500
4500
5000
10000
Comentarios, sugerencias y ayudas para usar la tarjeta Cypress FM4
Encontrará un estéreo de 3.5 mm a una tarjeta con terminal macho, incluida en el kit TSC
Cypress FM4, conveniente para conectar la línea de audio del FM4 en una salida jack de
auricular hacia la board Discovery Analógico.
{ \T" connection is the Right audio channel
{ \R" connection is the Left audio channel
{ \S" connection is Ground
Encontrará un estéreo de 3.5 mm a cables banana, disponible en el TSC, conveniente para
conectar la línea de udio del FM4 y una salida de auricular al equipo de laboratorio tradicional
de mesa.
Observe que en main() los programas muestra usualmente toman audio desde el puerto \mic
in. Cambie este puerto a \line in para usarlo. Esto es apropiado para recibir música desde un
reproductor y desde un generador de funciones. Desenergice los microfonos que operan a
voltajes mucho más bajosque los dispositivos de nivel de línea.
El Jack de la línea de entrada de la FM4 debería solamente recibir un máximo de 894 mV pico a
pico; este es el nivel de línea de audio. Monitoree cualquier señal que se ponta en este jack
usando un osciloscopio. Para estar seguros, mantenga el voltaje alrededor de 500 mV pico a
pico.
No conecte nada diferente al Jack mic del FM4 microfono suministrado.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 8
El FM4 usa conectores de audio estándar de 3 conductores (3.5 mm o 1/8 pulg). Algunos
dispositivos auriculares específicos (por ejemplo, teléfonos) tienen un canal de salida de 1 o 2
salidas y un mic, y podrían no comportarse correctamente sobre el jack de salida del auricular.
Por ejmplo, los
The FM4 uses standard 3-conductor 3.5mm (1/8 inch) audio connectors. Some device-specific
headsets (e.g., for cell phones) have a mic and either 1 or 2 audio output channels and might
not behave exactly correctly on the headphone out jack of the FM4, Por ejemplo, 2015 Apple
Earpods (estéreo con un mic que require 4 conductores) solo parecerá trabajar
apropiadamente cuando el boton de pausa esté inactive.
Auriculares con un conector de audio de 3-conductores y 3.5 mm está disponible para
verificación en el TSC.
Podrá encontrar que los canales de audio Izquierdo y derecho están reservados cuando se
escucha la salida FM4 a través de los audífonos.
Referencias
[1] Mathworks, http://www.mathworks.com/
[2] ARM University Worldwide Education Program. ARM-based Digital Signal Processing Lab-in-
a-Box, 2014.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 9
PRÁCTICAS DE LABORATORIO PARA PROCESAMIENTO DIGITAL DE SEÑAL
Por
EDUARDO AVENDAÑO FERNÁNDEZ
UNIVERSIDAD PEDAGÓGICA Y TECNOLÓGICA DE COLOMBIA
ESCUELA DE INGENIERÍA ELECTRÓNICA
FACULTAD SECCIONAL SOGAMOSO
2019
1. Introducción
Los filtros de respuesta al impulso finita (FIR) son usados comúnmente en aplicaciones DSP en
tiempo real debido al número de propiedades deseables tal como su estabilidad y respuesta
lineal en fase. Un filtro particularmente simple es el filtro FIR, también conocido como filtro de
promedio móvil. Sin embargo, varios tipos de filtros FIR sofisticados pueden ser diseñados e
implementados. Esta sesión de laboratorio permite el estudio de las características del filtro
FIR, las técnicas de diseño, y aspectos prácticos relacionados con su implementación.
2. Filtro de promedio móvil
El filtro de promedio móvil es ampliamente usando en DSP y es uno de todos los filtros más
simple de entender. La salida del filtro de promedio móvil es la media aritmética, o promedio,
de las muestras pasadas. Por lo tanto, la señal de salida es una versión “suavizada” de la señal
de entrada. El filtro promedio de N puntos puede representarse por la ecuación en diferencias
N 1
1
y[n]
N
x[n k ]
k 0
El programa average intr.c mostrado en la figura 1 implementa un filtro de promedio móvil
(N=5). Un experimento simple usando la señal de prueba contenida en el archivo mefsin.wav
demuestra que el filtro de promedio móvil atenua algunas componentes de frecuencia de una
señal más que otras componentes. Escuche con cuidado la señal de prueba utilizando algún
reproductor de audio, la muestra contiene algo de voz degradada por la suma de un tono
sinusoidal.
Observe esta señal de prueba conectando la salida del auricular de su tarjeta de sonido de PC a
un osciloscopio. Observe la forma de onda en el dominio del tiempo y ajuste el nivel de
volumen en su PC de manera que la señal no sea mayor a 500 mV pico a pico. Use el analizador
de espectro para observar la señal en el dominio de la frecuencia. Ahora conecte la salida de la
tarjeta de sonido de la PC al socket Line in en la board FM4. Ajuste el volumen del PC de la
configuración previamente determinada. Ejecute el programa average_intr.c en la board FM4 y
use los auriculares para escuchar la salida de la board. El programa aplica un filtro a uno de los
canales de audio. Debería encontrar que el tono sinusoidal ha sido atenuado significativamente
y que el sonido del habla tiene menos brillo que el canal de audio filtrado. Las dos
observaciones son consistentes con el filtro de promedio móvil que tiene una respuesta paso
bajo. Los siguientes ejercicios introducen un número de métodos diferentes y cuantitativos de
evaluar la respuesta en frecuencia del filtro.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 2
// average_intr .c
# include " audio .h"
void I2S_HANDLER ( void ) { /* ***** I2S Interruption Handler **** */
const int N = 5;
const float32_t b[N] = {0.2 , 0.2 , 0.2 , 0.2 , 0.2};
static float32_t x[N];
int16_t audio_chR =0; // 16 bits audio data channel right
int16_t audio_chL =0; // 16 bits audio data channel left
float32_t yn = 0.0;
int16_t k = 0;
audio_IN = i2s_rx ();
audio_chL = audio_IN & 0 x0000FFFF ; // separate 16 bits channel left
audio_chR = ( audio_IN > >16) & 0 x0000FFFF ; // separate 16 bits channel right
x [0] = ( float32_t ) audio_chL ; // new sample is element 0 in array
for (k = 0; k<N; k ++)
{
yn += b[k]*x[k]; // calculate filter output
}
for (k = N -1; k >0; k --) // shift sample stack down for next call to ISR
{
x[k] = x[k -1];
}
audio_chL = ( int16_t ) yn;
audio_OUT = ( audio_chR <<16 & 0 xFFFF0000 ) | ( audio_chL & 0 x0000FFFF ); // put 2 ch together
i2s_tx ( audio_OUT );
}
int main ( void )
{
audio_init ( hz8000 , line_in , intr , I2S_HANDLER );
while (1){}
}
Figure 1: Código fuente del programa average_intr.c
3. Visualización de respuesta en frecuencia usando una entrada sinusoidal
La respuesta en frecuencia de un filtro dice cómo el filtro cambia la amplitud y fase de
diferentes frecuencias que pasan a través del filtro. Por lo tanto, una forma de evaluar la
respuesta en frecuencia de un filtro es aplicar unas señales de entrada sinusoidales y observar
los cambios de amplitud y fase resultantes en la señal de salida relativos a la señal de entrada.
Repitiendo esta observación a un número de diferentes frecuencias revela las características
del filtro como una función de la frecuencia.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 3
Conecte la salida de un generador de onda, configurado para entregar una señal sinusoidal, al
canal izquierdo del socket Line In en la board FM4 y al canal 1 del osciloscopio. Conecte el canal
de la izquierda del socket Headphone Out al canal 2 del osciloscopio. Ejecute el programa
average_intr.c y varíe la frecuencia sinusoidal entre 100 Hz y 5000 Hz. Mantenga constante la
amplitud de la señal de entrada sinusoidal a aproximadamente 500 mV pico a pico.
Probablemente encontrará que es mejor disparar el osciloscopio desde el canal 1. Observe que
como la frecuencia de la señal de entrada es variada, la amplitud y fase de la señal de salida
cambia. La ganancia del filtro es mayor a bajas frecuencias que a altas frecuencias y hay algunas
frecuencias a las cuales la ganancia es casi cero. (Ayuda: Ajuste la frecuencia de entrada a 1.6
kHz y observe la salida). En general, el filtro de promedio móvil tiene una característica paso
bajo.
4. Respuesta en frecuencia teórica usando Matlab
Matlab contiene varias herramientas convenientes para calcular y visualizar las características
de los filtros digitales. La función freqz(), permite calcular y graficar la respuesta en frecuencia
de un filtro de promedio móvil de 5 puntos.
Una forma particular de representar filtros digitales es en términos de la función de
transferencia generalizada
b1 b2 z 2 ... bn 1 z n
H ( z)
a1 a2 z 2 ... an 1 z n
Por tanto, la función freqz calcula al respuesta en frecuencia a partir de los coeficientes del
numerador y denominador, b y a, respectivamente.
Un filtro móvil de 5 puntos tiene la ecuación en diferencia
1
y[n] x[n] x[n 1] x[n 2] x[n 3] x[n 4]
5
Y por lo tanto, la función de transferencia generalizada está dada por
1
H ( z)
5
1 z 1 z 2 z 3 z 4
El script en Matlab mostrado en la figura 2 muestra la respuesta en magnitud y fase para el
filtro promedio móvil de 5 puntos. De los resultados obtenidos se observa la respuesta en
frecuencia y se confirma las características paso bajo y que además a algunas frecuencias tiene
una ganancia cero. La gráfica de respuesta de fase muestra una respuesta lineal (observe que la
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 4
fase está envuelta - wrapped). Una respuesta de fase lineal es un requerimiento importante en
varias aplicaciones prácticas y asegura que todas las componentes en frecuencia de una señal
de entrada son retrasadas en tiempo por alguna cantidad.
clear all
close all
fs = 8000; % la tasa de muestreo es 8000 muestras/s
%% ajusta los vectores de coeficientes a y b
a = 1;
b = [1/5 1/5 1/5 1/5 1/5];
%% Grafica curvas de respuesta en frecuencia usando 10000 puntos de muestra
freqz(b,a,1e4,fs);
Figura 2. Código para determinar la respuesta en frecuencia
-50
-100
-150
-200
-250
-300
-350
0 500 1000 1500 2000 2500 3000 3500 4000
Frecuencia (Hz)
100
50
-50
-100
-150
0 500 1000 1500 2000 2500 3000 3500 4000
Frecuencia (Hz)
Figura 3: Respuesta en frecuencia para el filtro de promedio móvil de 5 puntos calculado
usando freqz().
Se va a revisar el filtro con dos preguntas en mente:
1. Qué sucedería si el promedio móvil fuera calculado sobre un número diferente de muestras
previas?
2. Que podría suceder si los valores de coeficientes del filtro h[n] fueran cambiados?
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 5
Pregunta 1: Considre un filtro de promedio móvil de 5 y 11 puntos. Escriba un script en Matlab
que genere gráficas de la respueta en frecuencia (ambos magnitud y fase) para los dos filtros.
Compare las respuestas en magnitud de los dos filtros y muéstrelos (en dB) en la misma figura.
Escale el eje de magnitud para mostrar un rango razonable de valores (por ejemplo, desde -80
dB a 0 dB). Puede encontrar útil usar la función ylim. Compare las respuestas en fase
mostrándolas en la misma figura. Comente las similaridades y diferencias entre los dos filtros.
Pregunta 2: Considere un filtro de promedio móvil modificado con 5 puntos y respuesta al
impulso dada por
h[n] 0.0833, 0.2500, 0.3333, 0.2500, 0.0833
Escriba un script en Matlab que compare la respuesta en frecuencia (magnitud y fase) de este
filtro con el filtro de promedio móvil de 5 puntos usado en la pregunta previa. Incluya su código
en Matlab y figuras. Comente similaridades y diferencias.
Debería haber observado esos cambios a los coeficientes (no inesperados) que han modificado
la respuesta en frecuencia del filtro. En la siguiene sección, se investigará los métodos para
cualcular los coeficientes que resultan de filtros FIR que encuentran un conjunto de
especificiaciones de diseño.
5. Diseño de filtros FIR pasobajo usando el método de Ventana
Revise en las presentaciones el diseño de filtros FIR usando el método de ventaneo, y aplíquelo
para diseñar filtros paso bajo (LPF).
Pregunta 3: Use el método de ventaneo para diseñar los siguientes filtros:
Longitud 11 (orden 10) LPF con frecuencia de corte 2 kHz, ventana rectangular.
Longitud 11 (orden 10) LPF con frecuencia de corte 2 kHz, ventana Hamming.
Longitud 31 (orden 30) LPF con frecuencia de corte 2 kHz, ventana rectangular.
Longitud 31 (orden 30) LPF con frecuencia de corte 2 kHz, ventana Hamming.
Use una frecuencia de muestreo de 48 kHz para sus diseños. Escriba un script en Matlab que
calcule los coeficientes para cada filtro y genere las gráficas de respuesta en frecuencia
(magnitud y fase) para comparar los filtros.
Pregunta 4: Inspeccione cuidadosamente la respuesta en magnitud de los filtros. Discuta el
impacto del orden del filtro y las funciones ventana.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 6
Pregunta 5: Inspeccione cuidadosamente la respuesta en fase de los filtros. Discuta el impacto
del orden del filtro en la pendiente de la respuesta en fase.
6. Implementación en tiempo real
El programa fir_intr.c mostrado en la figura 4 puede ser usado para implementar un filtro FIR.
Require los coeficientes del filtro y la longitud del filtro, los cuales se especifican en el
encabezado del header del archivo c. Como se observa en el código, la línea 4 utiliza el
encabezado ma_5pt.h para especificar un filtro de promedio móvil de 5 puntos. Este archivo de
header puede ser reemplazado con cualquier conjunto de coeficientes FIR, y la función Matlab
escribe fir_coeffs que puede ser usada para generar un archivo de coeficientes compatibles.
Como ejemplo, ma_5pt.h fue creado usando los comandos Matlab:
h = [0.2 0.2 0.2 0.2 0.2];
write_fir_coeffs(h,’ma_5pt.h’);
Ubique los archivos de los coeficientes en el directorio de drivers.
Pregunta 6: Implemente en la board FM4 uno de los filtros de longitud 11 que diseñó en la
pregunta 3. Mida su respuesta en frecuencia usando un analizador de red. Cree gráficas que
comparen la respuesta en frecuencia teórica (generada usando Matlab) y la respuesta en
frecuencia medida usando la misma gráfica. La opción exportar (export) en Formas de onda
(waveforms) permitirá acceder fácilmente a los datos en bruto de la medición en bruto del
analizador de red. Ayuda: copie y pegue los datos en bruto usando la opción “copy to
clipboard”.
Pregunta 7: Inspeccione cuidadosamente las comparaciones de las gráficas de respuesta en
frecuencia medidas y teóricas. Lo que obsera se parece?. Asegúrese de comentar las respuestas
en magnitud y fase.
/ fir_intr .c
# include " audio .h"
# include " ma_5pt .h" // from " write_fir_coeffs .m"
void I2S_HANDLER ( void ) {
int16_t audio_chR =0;
int16_t audio_chL =0;
static float32_t x[N];
float32_t yn = 0.0;
int k;
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 7
gpio_set (P10 , HIGH ); // write GPIO high to mark start of ISR
audio_IN = i2s_rx ();
audio_chL = ( audio_IN & 0 x0000FFFF );
audio_chR = (( audio_IN > >16)& 0 x0000FFFF );
x [0] = ( float32_t ) audio_chL ; // new sample is element 0 in array
for (k = 0; k<N; k ++) // calculate filter output
{
yn += h[k]*x[k];
}
for (k = N -1; k >0; k --) // shift sample stack down for next call to ISR
{
x[k] = x[k -1];
}
audio_chL = ( int16_t ) yn; // filter output to left channel
audio_OUT = (( audio_chR <<16 & 0 xFFFF0000 )) + ( audio_chL & 0 x0000FFFF );
i2s_tx ( audio_OUT );
gpio_set (P10 , LOW ); // write GPIO low to mark end of ISR
}
int main ( void )
{
gpio_set_mode (P10 , Output ); // configure GPIO for output
audio_init ( hz48000 , line_in , intr , I2S_HANDLER );
while (1){}
}
Figura 4: Programa implementado para filtrado FIR, fir_intr.c
7. Medición del tiempo de ejecución para rutina de servicio de interrupción (ISR)
Observe que fir_intr.c alterna a un pin GPIO durante el ISR. Esto fue incluido en el programa
para dar cuenta del tiempo que toma calcular el valor de cada muestra. Para operación en
tiempo real, este tiempo no debe exceder 1/fs.
Pregunta 8: Mientras el tiempo de ejecución del filtro de longitud 11, conecte un oscilocopio al
pin GPIO y observe la forma de onda. Cuanto le toma la ejecución del ISR?
Nota: para boards FM4, especifique y use el pin P10. Para boards azules, especifique el pin P15.
Las ubicaciones de los pines son marcada en el lado inferior de las tarjetas FM4.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 8
Pregunta 9: Implemente uno de los filtros de longitud 31 y mida el tiempo de ejecución ISR.
Referencias
[1] Mathworks, http://www.mathworks.com/.
[2] Gnu Octave, https://www.gnu.org/software/octave/.
[3] ARM University Worldwide Education Program. ARM-based Digital Signal Processing Lab-in-
a-Box, 2014.
UPTC Ingeniería Electrónica Eduardo Avendaño Fernández 9