Sunteți pe pagina 1din 8

Laboratorio de Procesamiento Digital de Seales Docente: Ing.

Roger Guachalla Narvez


xoroger@yahoo.es

PRACTICA 08: FFT con Arduino


1. Objetivos:
Adquirir datos mediante el conversor anlogo/digital para su posterior procesamiento con la librera FFT para
Arduino y la transferencia de resultados por puerto serial
Armar un generador de funciones con la tarjeta Arduino con componentes discretos (resistencias)
2. El algoritmo FFT (Fast Fourier Transform)
La transformada rpida de Fourier es simplemente un algoritmo rpido para la evaluacin numrica de integrales de Fourier
desarrollado en los laboratorios de IBM, y su importancia radica en la rapidez de clculo conseguida, en varios tipos de
aplicaciones: ecualizacin y filtrado en equipos de audio/vdeo en tiempo real, comunicaciones, etc.
La diferencia de velocidad de clculo entre la tradicional transformada discreta DFT y la FFT aumenta segn aumenta el
nmero de muestras a analizar, segn se puede apreciar en la grfica, ya que mientras una aumenta el nmero de
operaciones necesarias para la resolucin de forma exponencial, la otra lo hace de forma prcticamente lineal.
Velocidad
FFT es un algoritmo muy eficiente para el clculo de la DFT.

Cun rpida es la FFT comparada con la DFT?


Para la DFT se requiere realizar operaciones
Para la FFT solamente: Ecuacin 1.
Por ejemplo para 1024 muestras, la DFT requiere 1024 2 = 1 048 576 operaciones, mientras que la FFT necesita solamente
operaciones.
Esto significa que para un nmero de 1024 muestras, la FFT es 102.4 veces ms rpida que la DFT. Para nmeros de
muestras mayores la ventaja en velocidad se incrementa. Si tomamos 4096 muestras, la FFT es 340 veces ms rpida.

3. Librera FFT para Arduino


La librera FFT para Arduino es una implementacin estndar del algoritmo de FFT que opera slo con datos reales. Puede
operar con hasta 256 datos de 16 bits con una actualizacin de 7mseg. Se puede configurar para trabajar con grupos
desde 16 hasta 256 datos, tiene varias funciones de salida para 16 bit lineal, 8 bits lineal, 8 bits logartmico y 8 bits
octavo. Debido a que trabaja con datos en punto fijo de 16 bits, tiene un nivel de ruido de -72 dB para bajas frecuencias y
-76 dB para altas frecuencias. Cuando se utiliza con el conversor Anlogo Digital (ADC) de la tarjeta Arduino, el nivel de
ruido del ADC es del mismo orden del nivel de ruido de la rutina FFT, dando como resultado una Relacin Seal a Ruido
(SNR) entre 9 bit y 10 bit (-55 dB).
Caractersticas de velocidad
Funcin Run Reordenar Window lin lin8 log
N (mseg) (useg) (useg) (useg) (useg) (useg)
256 6.32 412 608 588 470 608
128 2.59 193 304 286 234 290
64 1.02 97 152 145 114 144
32 0.37 41 76 80 59 74
16 0.12 21 37 46 30 39

Caractersticas de la memoria
Function Run Reorder Window lin lin8 log
N S/F(B) F(B) F(B) S/F(B) S/F(B) S/F(B)
256 1k/952 120 512 256/768 128/640 128/256
128 512/448 56 256 128/768 64/640 64/256
64 256/200 28 128 64/768 32/640 32/256
32 128/80 12 64 32/768 16/640 16/256
16 64/24 6 32 16/768 8/640 8/256
S = SRAM, F = Flash ROM
Instalacin de la librera

Despus de descomprimir ArduinoFFT2.zip, copiar el contenido en la carpeta de libreras en el directorio de instalacin


del IDE Arduino. Posteriormente reiniciar Arduino

Funciones FFT
Hay varias funciones que puede llamar para realizar la FFT. La razn por la que se divide en varias secciones, es para que
se pueda adaptar la FFT a distinto requerimientos.

fft_run () - Es la principal llamada a la funcin FFT. No requiere ninguna variable y no devuelve ningn valor. Se
supone que existe un bloque de datos que ya estn en SRAM, y que ya est reordenado. Los datos se almacenan en la
matriz llamada fft_input [], que contiene 2 columnas de valores de 16 bits por cada punto de datos FFT - una para la
parte real y la otra para la parte imaginaria. Si se ingresa los valores en el propio cdigo, colocar los valores reales en las
posiciones pares, y los valores imaginarios en las posiciones impares. Por ejemplo:

fft_input [0] = real1, fft_input [1] = imaginario1


fft_input [2] = real2, fft_input [3] = imaginario2

Por lo tanto existe el doble de datos en la matriz que los datos FFT. Si se utiliza slo los datos reales (es decir, valores
muestreados del conversor ADC), poner esos valores en las posiciones pares, y escribir 0 a las posiciones impares.
La salida final se mantiene en fft_input [], con las posiciones pares conteniendo las magnitudes reales, y las posiciones
impares las magnitudes imaginarias. Las posiciones estn en secuencia de incremento de frecuencia. Por ejemplo:

fft_input [0] y fft_input [1] = magnitudes posicin 0 (0 Hz -> Fs / N)


fft_input [2] y fft_input [3] = magnitudes posicin 1 (Fs / N -> 2Fs / N)

Se debe ejecutar una de las funciones de magnitud para obtener datos tiles de estos valores.
fft_reorder () - Reordena las entradas FFT para prepararlos para el modo particular en que el algoritmo FFT procesa
los datos. Se debe llamar a esta funcin antes de ejecutar la funcin fft_run ().No requiere ninguna variable y no
devuelve ningn valor. La funcin utiliza los datos de la matriz fft_input [], por lo que los datos deben ser llenados en esa
matriz antes de que esta funcin sea llamada.

fft_window () - Esta funcin multiplica los datos de entrada por una funcin de Ventana para ayudar a incrementar
la resolucin de frecuencia de los datos FFT. No requiere ninguna variable y no devuelve ningn valor. La funcin
procesa los datos en la matriz fft_input [], de modo que los datos deben ser ingresados en esa matriz antes de que sea
llamada. Tambin debe llamarse antes fft_reorder () o fft_run ().

fft_mag_lin8 () - Entrega la magnitud de cada dato de la FFT. Suma los cuadrados de las partes imaginaria y real, y
luego toma la raz cuadrada, redondeando la respuesta a 8 bits de precisin (utiliza una tabla y escala los valores a un
rango completo de 8 bits). No requiere ninguna variable y no devuelve ningn valor. Opera en la matriz fft_input [] y
devuelve los datos en una matriz llamada fft_lin_out8 [].La magnitud se calcula nicamente para los primeros N/2 datos,
ya que la segunda mitad de la FFT es idntica a la primera mitad para todas las entradas reales. Por lo tanto, fft_lin_out8
[] tiene N/2 valores de 8 bits, con cada ndice que representa el orden de datos.

Por ejemplo:
fft_lin_out8 [0] = primer dato de magnitud (0 Hz -> Fs / N)
fft_lin_out8 [1] = segundo dato de magnitud (Fs / N -> 2Fs / N)
La salida se puede escalar para maximizar la resolucin mediante el factor de Escala.

fft_mag_lin () - Entrega la magnitud de cada dato de la FFT. Suma los cuadrados de las partes imaginaria y real, y
luego toma la raz cuadrada. Utiliza una tabla para calcular la raz cuadrada, por lo que su precisin es limitada. Cubre la
gama completa de 16 bits, pero slo tiene 8 bits de precisin en cualquier punto en ese rango. Los datos se toman de la
matriz fft_input [] y son devueltos en fft_lin_out []. Los valores estn en orden secuencial, y slo hay N/2 valores en
total, debido a que la FFT de una seal real es simtrica con respecto de la frecuencia central.

fft_mag_log () - Entrega la magnitud de cada dato de la FFT. Suma los cuadrados de las partes imaginaria y real, y
luego toma la raz cuadrada, posteriormente toma el logaritmo en base 2 de ese valor. Por lo tanto, la salida se
comprime de forma logartmica, y esta esencialmente en decibelios (multiplicada por un factor de escala). No requiere
ninguna variable y no devuelve ningn valor. Utiliza una tabla para calcular el logaritmo de la raz cuadrada, y escala la
salida al rango completo de 8 bits (la ecuacin es 16 * (log 2 ((img 2 + 2 real2) )) almacenada en un valor 8 bits. Los
valores se toman de la matriz fft_input [], y se devuelven en fft_log_out []. Los valores de salida estn en orden
secuencial de frecuencia FFT, y slo hay N/2 datos en total, ya que la segunda mitad del resultado FFT es redundante
para las entradas reales.

fft_mag_octave () - Entrega el valor efectivo RMS de los datos en formato de octava (duplicacin de frecuencia).
Esto es ms til en algunos aspectos ya que est ms cerca de cmo los seres humanos perciben el sonido. No requiere
ninguna variable y no devuelve ningn valor. La entrada se toma de la matriz fft_output [] y se devuelve en fft_oct_out
[]. Los datos se representan como un valor 8 bits (16 * log2 ( (mag) ). Los datos LOG_N se dan como sigue:

FFT_N = 256: datos = [0, 1, 2, 4, 5: 8, 09:16, 17:32, 3:64, 65: 128]


FFT_N = 128: datos = [0, 1, 2, 4, 5: 8, 09:16, 17:32, 3:64]

Donde, por ejemplo, (5: 8) es la suma de todos los datos desde 5 hasta 8. Los datos se elevan al cuadrado (partes
imaginarias y reales) y luego se suman con todas las magnitudes al cuadrado del rango. A continuacin, se divide por el
nmero de datos y se toma la raz cuadrada, seguido por el cmputo del logaritmo.
4. Generador se seales basado en Arduino - Autor: Ajoy Raman
4.1 Caractersticas
Requiere tan solo de componentes pasivos: 10 resistencias y un capacitor
Generador de Onda por el mtodo de Sntesis Digital Directa Direct Digital Synthesis (DDS)
Formas de onda: Sinusoidal, Triangular, Rampa Creciente, Rampa Decreciente
Generador de formas de onda arbitrarias Arbitrary Waveform Generation (AWG)
Frecuencia de salida de hasta 45 kHz
4. 2 Lista de componentes
Componente Cantidad Valor
Resistencia 1 560
Resistencia 1 1 k
Resistencia 4 2.2 k
Resistencia 1 2.7 k
Resistencia 1 8.2 k
Resistencia 1 15 k
Resistencia 1 33 k
Capacitor 1 10 nF
4.3 Hardware
El circuito implementa un conversor Digital Anlogo (DAC) de 6 bits usando una combinacin de resistencias 8-4-2-1
conectada a 6 pines PWM (PB0 a PB5) de la tarjeta Arduino UNO. Adicionalmente se incorpora un capacitor al conversor
DAC con fines de suavizar la forma de onda.
4.4 Firmware Arduino
Para subir el firmware 007_DDS.hex a la tarjeta Arduino, utilizar el software utilitario Xloader. Este permite
subir archivos .hex a la tarjeta Arduino sin necesidad de usar el IDE Arduino.
4.5 Software PC
a) Descomprimir el archivo Windows GUI.rar
b) Ejecutar el archivo
c) Establecer la comunicacin serial con la tarjeta Arduino
d) Elegir el tipo de forma de onda
e) Elegir la frecuencia de salida
f) Para iniciar el Generador de Seal, presionar el botn RUN
g) Para terminar presionar el botn EXIT

4.6 Formas de Onda Arbitrarias


Archivos de formas de onda arbitrarias deben ser creadas en formato .csv (valores separados por comas) que
contengan una columna de datos de longitud 128.
Los valores de los datos deben ser nmeros enteros en base decimal en el rango de 0 a 63.
Estos valores son transferidos a la tarjeta Arduino Uno donde salen como una forma de onda arbitraria.
Tres formas de onda tpicas con sus respectivos archivos .csv se proveen como ejemplos:

arb1_SinSq.csv (495 bytes)


arb2-f2f.csv (489 bytes)
arb3_Rect.csv (500 bytes)
5. Ejemplo FFT con Arduino
La biblioteca FFT se utiliza para obtener una salida de magnitud de8 bits logartmica en base una Seal de Entrada
proveniente del Generador de Seales Arduino. Los datos procesados sern enviados al computador mediante el puerto
serial. Los resultados se observarn con la herramienta Serial Plotter del IDE Arduino.
6. Procedimiento en Laboratorio
1era Firma:
Mostrar el funcionamiento del Generador de Seales Arduino viendo la salida en un osciloscopio
2da Firma:
Mostrar el funcionamiento del Ejemplo FFT con Arduino ingresando los siguientes tipos de seal:
Cuadrada, Triangular, Sinusoidal con frecuencias bajas menores a 1 KHz.

7. Informe escrito
I. Mostrar las capturas de pantalla en Matlab para cada tipo de seal.
II. Realizar un RESUMEN (escrito a mano):
ALGORITMO FFT
Comprender el algoritmo FFT es una tarea un tanto larga, se deben incluir los siguientes puntos:
1. Comprender el concepto del Lema Danielson-Lanczos (D-L Lemma). Si bien requiere escribir ecuaciones largas,
es un componente vital para la FFT.
2. Explicar el concepto del Factor de Giro Twiddle Factor que junto al D-L Lemma son esenciales para comprender
como trabaja la FFT.
3. El Diagrama Butterfly (Mariposa). El cual se basa en los dos conceptos anteriores y es una representacin
diagramtica del algoritmo FFT.
4. Comprender el patrn de bit reverso reverse bit pattern para el ingreso de datos y la razn de su uso.
Incluir:
Fuentes de Informacin: direcciones web o bibliografa
Impresin de las primeras pginas de la fuente de informacin
Resumen escrito a mano (de un mnimo de 6 pginas)
III. Conclusiones

S-ar putea să vă placă și