Analizador de espectro con PIC

Un par de consejos:

1º - Usar un número de muestras que sean potencia de 2 (1024-2048-4096).
2º - Usar coma fija y no flotante.
3º - Olvidarse de los PIC de 8 bits y empezar con un dsPIC, o mejor, ARM cortex M3. El STM32 ya tiene librerías de FFT.
4º - No pasar de 1024-2048 muestras.
6º - Aprender a programar seriamente, empezando por cosas sencillas. No se empiezan las casas por el tejado.
 
Tratante: ok. estoy de acuerdo. Utilizemos una lcd grafica. En cuanto al micro a utilizar, creo que debemos aceptar que es necesario utilizar dspic u otro micro mas potente. En lo personal solo he llegado hasta los pic18, pero me parece buen momento para avanzar otro peldaño hacia los dsp (que ironia "DSP" no ha utilizado DSPs solo simulaciones en matlab!! jeje). Me gustaria, si alguien tiene experiencia en procesamiento digital, nos recomendara un micro facil de conseguir y adecuado. Me viene en mente la Beagle board y así mato varios pajaros de un tiro.

Beamspot: gracias por los consejos, solo tengo una duda: ¿no se te hace poco 2048 muestras para procesar audio? Con respecto a Aprender a programar seriamente, Creo que estoy consciente de la complejidad que estamos abordando, pero convoco a superarla con un buen trabajo en equipo.

Voy a investigar sobre diferentes opciones de los micros.
Ojala y se unan mas compañeros.

Saludos a todos
 
Que tal DSP, beamspot

Si consideran que los temas a desarrollar estan mas o menos completos es cosa de tomar alguno (el que gusten) y empezar.

beamspot, aun no sabemos si el algoritmo es complicado, si gustan voy analizando el procedimiento FFT y elaboro el algoritmo en español estructurado. De ahi podremos juzgar el tipo de microprocesador requerido.

Como ven si vamos elaborando un documento para que vaya tomando forma este proyecto?

Saludos
 
La Beagel board, o similares (como la IGEP) llevan un ARM grande con DSP incluido. El funcionamiento interno del DSP viene que ni al pelo para los algoritmos típicos de FFT.

Por otro lado, estoy haciendo testeo de sonido con FFT's sobre 8196 puntos con un PC, y necesito dicha resolución para calcular con precisión la frecuencia de los picos. Pero para la representación gráfica, con 1024 puntos tenemos una escala de 512 frecuencias, que ya ocupa una buena parte de la pantalla de un monitor normal.

Una buena lectura es el 'numerical c receipes', gratuito en inglés por la red, donde hay implementaciones de FFT en C, aunque no me acaban de convencer. El algoritmo en sí no es excesivamente complicado, pero tiene muchos cálculos a realizar dentro de un bucle, y eso es algo que suele enlentecer mucho las rutinas, ya que los micros habituales no están muy pensados para este tipo de operaciones.

Aún así, para el manejo real de la FFT, hace falta algo más de procesado sobre los resultados de la FFT pura. Ésta devuelve números complejos que generalmente se suelen convertir a módulo (lo normal es expresarlo en dB) y fase (grados). Eso implica el uso de logaritmos y arcotangentes, ambos cálculos muy pesados para la CPU. Además, según mi experiencia, un filtrado mínimo sobre el resultado es importante para una buena reproducción gráfica, así como para cierto tipo de trabajo/procesado.

En mi caso, uso una ventana de Hamming sobre los datos en bruto, y un filtrado del módulo por Savitzky-Golay. 16 bits, ya que 8 no son suficientes. Representación en dB.

De todo ello, rápidamente deducí que hace falta un micro de 16 o más bits para poder trabajar cómodamente. El uso de múltiples acumuladores para mantener el índice, los contadores y los demás valores dentro del micro sin acceder a RAM acelera el proceso. Unidades MAC son fenomenales y aún más ventajosas.

Realizar un documento es español con todas esta partes claramente separadas y explicadas puede ser interesante y formativo.
 
Que tal...

Encontre un algoritmo escrito en C++, me di a la tarea de convertirlo a VB.net; le hice ajustes menores a la parte de la visualizacion.

Se los dejo para que lo vayan analizando, si tiene algun falla avisenme para revisarlo.

El original escrito en C++ esta en howtofft_src.zip
El convertido a VB.Net esta en FFTnet.zip

Saludos

Hola

Encontre este interesante articulo, es importante que lo lean.

http://www.piclist.com/techref/microchip/fft/picspect.htm

Saludos

Algo mas... despues de leer este articulo aprendan este apellido; LACOSTE
 

Adjuntos

  • FFTnet.zip
    73.2 KB · Visitas: 284
  • howtofft_src.zip
    27 KB · Visitas: 203
  • lacoste98.pdf
    170.4 KB · Visitas: 314
Última edición:
Lo siento tratante, no me he podido dar el tiempo necesario pero, si que me interesa.
Este fin de semana me pongo otra vez en frecuencia. saludos
 
Hola compañeros. Revise los archivos que pusiste tratante. Al parecer, el algoritmo no es tan complicado. Y si un pic17 sirve, ¿porque no utilizar un PIC18F452? Lo que me preocupa es que consecuencias se pueden tener al utilizar un ADC de 10 bits para audio. En lo personal, no requiero tanta resolucion en el analizador de espectro. Quisiera empezar con algo sencillo.
¿que opinan?
 
Si lo que pretendes es hacer un analizador de espectro que mire unas pocas frecuencias discretas (pongamos 16, 32, 64) y donde el valor no necesite ser de 16 bits, no deberías tener muchos problemas.
 
Si lo que pretendes es hacer un analizador de espectro que mire unas pocas frecuencias discretas (pongamos 16, 32, 64)

Realmente en eso pense en un principio (unas 16 bandas), incluso pense en hacerlo por medio de filtros pasabanda FIR o IIR, pero, sea cual sea el algoritmo, ya empeze a armarme un circuito con un pic18f452 y estoy pensando en ponerle una memoria ram de 32k por si fuera necesario. Tambien veo como opcion consegur un ADC serial de audio con interfaz i2s. O mejor aun, hacer pruebas con las dos opciones. Mi idea es ir de menor a mayor.

Por cierto, alguien sabe donde conseguir ADCs de audio en Mexico?
 
Cuidado con el I2S. Creo que hacer ambas cosas con un pic18f (es decir, usar el I2S y la FFT a la vez) no va a ser posible. Así mismo, cuidado con la FFT: ésta es lineal en frecuencia y amplitud, mientras que en audio se suele trabajar en logarítmico.

Para 16 bandas a frecuencias repartidas logarítmicamente igual te sale más a cuenta un banco de filtros IIR (creo que hay uno muy bueno que 'cuesta poco' en términos de computación, pero no recuerdo el nombre) que una FFT.

Para usar I2S, igual te conviene otro micro más grande que tenga el I2S por HW. No se si los dsPIC los tienen. Seguro que los AT91SAM7 (ARM7TDMI, algo no muy nuevo) sí que los tienen, así como potencia de cálculo de sobras, pero eso ya son 'palabras mayores', nada sencillos (lo sé porque he trabajado con estos últimos, el AT91SAM7S64 y el AT91SAM7X256).
 
Hola a todos me integro a este post, muy interesante e leido cada una de las opiniones de los señores y se me hace muy interesante, me gustaria aportar algo a este post pero estoy todabia en frecuencia con ustedes, pero creo QUe ahi muchas formas de hacer un FFT pero depende la aplicacion es la herramienta pero no esta de mas empezar por algo sencillo como dice un compañero,, seguire atento a este tema y cualquier cosa que descubre sin lugar a dudas lo publicara, yo actualmente estoy en desarrollo de proyectos y me topo con un proyecto QUe ahi QUe aplicar la FFT y pues a investigar a parte QUe me gusta me pagan que buen trabajo no creen, aQUi andamos saludos... ing. electroniCa
 
Última edición por un moderador:
Hola a todos

En el material que envie se tiene codigo (ver la liga insertada) y un articulo de la revista Circuit Cellar en donde se comenta la realizacion del proyecto.

Este LACOSTE es un tipo avanzado y creo que su proyecto gano un reconocimiento.

Revisenlo con calma, solo es cosa construir, quizas adaptar el codigo para que corra en algun otro procesador; en realidad tiene todo, captura el sonido que se analizará, obtiene las frecuencias involucradas y las muestra en un monitor VGA sin mas circuito que el mismo PIC.

Manos a la obra.

Saludos cordiales
 
hola a todos este era el foro que necesitaba ya que tambien me encuentro desarrollando un analizador de espectro con un pic segun lo que he leido aqui lo que hacia falta era pasar la fft en terminos de seno y coceno para poder aplicarla a un pic jeje bueno yo tengo un algoritmo en matlab que me gustaria que vieran ya esta en senos y conenos solo queda aplicarlo a un pic no se si alguno puede probar esto de todos modos ahi les subo el archivo para que lo prueben esta hecho en matlab y corre bien ojo para que salga bien vacno coloquenle una fracuencia de mustreo 10 veces mayor a la frecuencia a mirar
 

Adjuntos

  • fft.rar
    578 bytes · Visitas: 177
Mucho me temo que los PIC no pueden ejecutar el Matlab.

En mi opinión, el procesado matemático con microcontroladores, aunque sean 'grandes', es muy, pero que muy diferente de lo que se hace en los PC's. En primer lugar, hay que evitar todo cálculo supérfluo (como senos y cosenos), y poner todas las constantes en una tabla precalculada. En segundo lugar, mirar de trabajar en 'coma fija' si es posible, o mejor incluso con 'enteros' (que en realidad, son lo mismo), tratar de reducir las divisiones, y dejar para lo mínimo imprescindible, la coma flotante y cualquier otra operación diferente de sumar, restar, o multiplicar.

Y ante la duda o el más mínimo atisbo de problema, ir a parar a algo como los Cortex M3, o mejor aún, los nuevos Cortex M4 con extensiones en coma flotante y añadidos DSP por HW. Aunque con un PIC de 8 bits se pueden hacer cosas, realizar este tipo de cálculos empieza a requerir micros más poderosos (dsPIC, ARM's, etc).
 
bueno ps yo estoy pasando el algoritmo a un pic18 ylo voy a montar a ver que tan rapido es aa y por sierto beamspot lo de las costantes es una buena idea si esta cosa funciona les comentare
 
Conozco algo del tema, primero tienes que tomar una porcion de la onda, quiza como decian 1024 muestras en 8, 10 o mas bits
Luego, es una simple solucion de un sistema de 1024 equaciones lineales con 1024 incognitas, allí es donde tenemos que expresar la onda como una suma vectorial de 1024 vectores ortogonales, donde cada uno aporta un valor a la onda, luego sigo, tengo que irme
 
Atrás
Arriba