Documentos de Académico
Documentos de Profesional
Documentos de Cultura
P08 FFT Con Arduino PDF
P08 FFT Con Arduino PDF
Características 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
Instalación de la librería
Funciones FFT
Hay varias funciones que puede llamar para realizar la FFT. La razón 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 función FFT. No requiere ninguna variable y no devuelve ningún valor. Se
supone que existe un bloque de datos que ya están 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 código, colocar los valores reales en las
posiciones pares, y los valores imaginarios en las posiciones impares. Por ejemplo:
Por lo tanto existe el doble de datos en la matriz que los datos FFT. Si se utiliza sólo 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 están en secuencia de incremento de frecuencia. Por ejemplo:
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 función antes de ejecutar la función fft_run ().No requiere ninguna variable y no
devuelve ningún valor. La función utiliza los datos de la matriz fft_input [], por lo que los datos deben ser llenados en esa
matriz antes de que esta función sea llamada.
fft_window () - Esta función multiplica los datos de entrada por una función de Ventana para ayudar a incrementar
la resolución de frecuencia de los datos FFT. No requiere ninguna variable y no devuelve ningún valor. La función
procesa los datos en la matriz fft_input [], de modo que los datos deben ser ingresados en esa matriz antes de que sea
llamada. También 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 raíz cuadrada, redondeando la respuesta a 8 bits de precisión (utiliza una tabla y escala los valores a un
rango completo de 8 bits). No requiere ninguna variable y no devuelve ningún 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 idéntica 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 resolución 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 raíz cuadrada. Utiliza una tabla para calcular la raíz cuadrada, por lo que su precisión es limitada. Cubre la
gama completa de 16 bits, pero sólo tiene 8 bits de precisión en cualquier punto en ese rango. Los datos se toman de la
matriz fft_input [] y son devueltos en fft_lin_out []. Los valores están en orden secuencial, y sólo hay N/2 valores en
total, debido a que la FFT de una señal real es simétrica 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 raíz cuadrada, posteriormente toma el logaritmo en base 2 de ese valor. Por lo tanto, la salida se
comprime de forma logarítmica, y esta esencialmente en decibelios (multiplicada por un factor de escala). No requiere
ninguna variable y no devuelve ningún valor. Utiliza una tabla para calcular el logaritmo de la raíz cuadrada, y escala la
salida al rango completo de 8 bits (la ecuación 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 están en orden
secuencial de frecuencia FFT, y sólo 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 (duplicación de frecuencia).
Esto es más útil en algunos aspectos ya que está más cerca de cómo los seres humanos perciben el sonido. No requiere
ninguna variable y no devuelve ningún 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:
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 continuación, se divide por el
número de datos y se toma la raíz cuadrada, seguido por el cómputo del logaritmo.
4. Generador se señales basado en Arduino - Autor: Ajoy Raman
4.1 Características
Requiere tan solo de componentes pasivos: 10 resistencias y un capacitor
Generador de Onda por el método de Síntesis 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 Análogo (DAC) de 6 bits usando una combinación 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 comunicación 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 Señal, presionar el botón RUN
g) Para terminar presionar el botón EXIT
7. Informe escrito
I. Mostrar las capturas de pantalla en Matlab para cada tipo de señal.
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 representación
diagramática del algoritmo FFT.
4. Comprender el patrón de bit reverso ‘reverse bit pattern’ para el ingreso de datos y la razón de su uso.
Incluir:
Fuentes de Información: direcciones web o bibliografía
Impresión de las primeras páginas de la fuente de información
Resumen escrito a mano (de un mínimo de 6 páginas)
III. Conclusiones