Autor Tema: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.  (Leído 24862 veces)

0 Usuarios y 3 Visitantes están viendo este tema.

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #15 en: 26 de Julio de 2009, 16:42:09 »
Un detalle... el espectro de frecuencias de la voz humana llega a los 4kHz. Cualquier otro ruido ya no es voz (un grito extremo o cualquier otra cosa). Por lo que hay que muestrear a 8kHz.

Para que un sordo escuche bien, sí hay que usar un espectro de 20Hz a 20kHz, pero si tu aplicación se orienta a transmitir voz entonces 8kHz es una buena velocidad de muestreo. De ahí que la codificación PCM @ 8 bits usa una velocidad de datos de 64kbps.


Je je 20 kHz como me afecta el alzeimer a los 25..... pero tampoco llega a los 4 khz te dejo una imagen de un espectrograma de la palabra "choice" que se  ve que va más alla de los 4 khz.

 

algo así


Pd: continuará


LAS MALVINAS SON ARGENTINAS!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #16 en: 26 de Julio de 2009, 20:20:05 »
Touché.  :D

Por lo poco que he aprendido sobre transmisión de voz digital creo que es aceptable la anulación de las frecuencias mayores a 4kHz en una conversación. Definitivamente la voz humana va más allá de los 8kHz, pero para entender una conversación pienso que solo basta con señales de hasta 4kHz. El cerebro se encarga de llenar los vacíos de todas formas.

Entonces, ¿vas a hacer tu compresor de audio sin pérdida con un pic o solo estamos divagando al respecto?  :D

Ya nos dirás si 8kSps o más te harán falta.  :)


Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #17 en: 27 de Julio de 2009, 20:54:12 »

Entonces, ¿vas a hacer tu compresor de audio sin pérdida con un pic o solo estamos divagando al respecto?  :D


 Tengo tantos proyectos inconclusos que si me pongo a tratar de hacer nuevos voy a dejar todo a medias, solo pensaba en voz alta al respecto mig. Seguro algo de esto le saco provecho para la parte de biomedica y algún día me falicita poder hacer algo con audio, además tengo que meterle a la facultad para terminar de una vez.....  :cry:  por el momento lo dejo en stand by.

Saludos!  :mrgreen:

pd:el duelo ese que ya sabes sigue en pie!  :D haber si le das a las teclitas  :D.....
LAS MALVINAS SON ARGENTINAS!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #18 en: 28 de Julio de 2009, 00:06:45 »
Bueno pues cuando avances algo aquí seguirá el tema esperándote.

jajaja déjame practicar con el jamlegend que soy malísimo  :mrgreen:

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #19 en: 11 de Octubre de 2009, 19:08:31 »
No entiendo muy bien el codigo, en ningun momento se usa el ADC, para muestrear la señal de audio se deberia usar no  :?

Un saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #20 en: 11 de Octubre de 2009, 23:52:09 »
Hola, Cerebro usa el arreglo data[] como la señal a pasar a la FFT.

data[] serían las muestras tomadas de un ADC, pero aquí el ejemplo es para poner a prueba la función y no el ADC del pic.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #21 en: 13 de Octubre de 2009, 13:05:26 »
Hola, Cerebro usa el arreglo data[] como la señal a pasar a la FFT.

data[] serían las muestras tomadas de un ADC, pero aquí el ejemplo es para poner a prueba la función y no el ADC del pic.

OK, entendido.

Ahora si no recuerdo mal la teoria de señales, esa tabla que obtenemos de numeros complejos (la FFT) son componentes frecuenciales separadas 2*pi/N, donde N es el numero de muestras ?

Por otro lado esas componentes frecuenciales (las de la tabla) tendriamos que operarlas para encontrar su correspondiente frecuencia de la señal continua ?

Un saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #22 en: 13 de Octubre de 2009, 20:21:07 »
No recuerdo cómo está el asunto de 2*pi/N, pero según entiendo el ejemplo de Cerebro, la delta F entre las componentes frecuenciales se calcula así:

Digamos que tenemos 8 muestras en el dominio del tiempo (N=8) y que la frecuencia de muestreo fue de 1kHz. Entonces la curva de respuesta de frecuencia tendrá las componentes en el eje X separadas por un delta F:

deltaF = 1000Hz / 8
deltaF = 125Hz

Entonces las 8 componentes en el eje X tendrían las siguientes frecuencias...

0Hz125Hz250Hz375Hz500Hz625Hz750Hz875Hz

Pero como sabemos las señales discretas tomadas a una frecuencia de muestreo n solo podrán mostrar señales útiles de n/2 Hz... es decir que solo serán utiles las señales en 0Hz, 125Hz, 250Hz y 375Hz... las demás solo serán un reflejo de las primeras cuatro.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #23 en: 14 de Octubre de 2009, 07:31:58 »
Entonces la magnitud de cada componente frecuencial ¿ es el modulo del numero complejo correspondiente resultado de la FFT ?

Un saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado cerebro

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 735
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #24 en: 14 de Octubre de 2009, 12:08:15 »
me había perdido  :), así es pepe calculando modulo de la FFT obtenes el espectro de magnitud de la repuesta en frecuencias. Espectro muy util para señales unidimensionales (sonido) pero no tanto para señales bidimensionales (ejem. una imagen) donde se privilegia el espectro de fase.

 Como explica santiago la resolución en frecuencias esta dada por Deltaf= fm/N y algo interesante es el principio de incertidumbre que establece
    Deltaf * Deltat = 1/N           // quiere decir que tanto la resolución en frecuencias como la resolución temporal y la cantidad de puntos están relacionadas no vamos a poder modificar ninguna sin afectar a las demás. 

Saludos

LAS MALVINAS SON ARGENTINAS!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #25 en: 14 de Octubre de 2009, 12:40:26 »
Para ver el contenido en amplitud de cada frecuencia debes seguir esta tablita que Cerebro incluyó...

Código: [Seleccionar]
#
/* Re{F[0]}= out0 */
#
/* Im{F[0]}= 0 */
#
/* Re{F[1]}= out8 */
#
/* Im{F[1]}= out12 */
#
/* Re{F[2]}= out4 */
#
/* Im{F[2]}= -out6 */
#
/* Re{F[3]}= out11 */
#
/* Im{F[3]}= -out15 */
#
/* Re{F[4]}= out2 */
#
/* Im{F[4]}= -out3 */
#
/* Re{F[5]}= out10 */
#
/* Im{F[5]}= out14 */
#
/* Re{F[6]}= out5 */
#
/* Im{F[6]}= -out7 */
#
/* Re{F[7]}= out9 */
#
/* Im{F[7]}= -out13 */
#
/* Re{F[8]}= out1 */
#
/* Im{F[8]}=0 */

Por ejemplo, el contenido de la componente de DC (0Hz) es el cuadrado de output[0] más el cuadrado de 0 y luego la raíz... es decir, el módulo.

El contenido de la componente a 125Hz sería...

sqrt(output[8]^2 + output[12]^2)

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #26 en: 26 de Octubre de 2009, 13:38:07 »
Pongamos que entre otras componentes frecuenciales necesito conocer las de: 540Hz, 600Hz, 720Hz y 750Hz.

Como maximo puedo tener N=128. Entonces las de 540Hz y 600Hz las puedo conseguir con una fc=1280Hz:

1280/128=10Hz alcanzando como maximo 630Hz.

El problema esta en alcanzar las frecuencias de 720Hz y 750Hz. Pues una es multiplo de 60 y la otra de 50.

Se trata (quizas alguien intuya algo) de analizar señales de 50 y 60Hz, provenientes de convertidores de potencia (ac-dc, dc-ac, ac-ac) para hacer un voltimetro de verdadero valor eficaz. Por lo tanto existen unas frecuencias concretas multiplos de 50 y 60 que son necesarias de analizar.

¿Como puedo llegar a esas componentes frecuenciales?

Un saludo.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #27 en: 26 de Octubre de 2009, 14:20:48 »
Hola Pepe

Una frecuencia de muestreo múltiplo de 30Hz es común a todas las frecuencias que necesitas...

540Hz/30Hz = 18
600Hz/30Hz = 20
720Hz/30Hz = 24
750Hz/30Hz = 25

Por lo que si muestreas a 1500Hz conocerías las tres primeras frecuencias de tu lista, pero la de 750Hz no la podrías ver, verías la de 720Hz (por el asunto del espejo).

Muestrea 30Hz más rápido... 780Hz * 2 = 1560Hz para que puedas ver sin problemas la de 750Hz.

Si puedes tener solo 128 muestras solo obtendrás 64 componentes frecuenciales con una deltaf de...

1560Hz / 128 = 12.1875Hz

Esto implica que usando la Fast Fourier Transform nunca verás exactamente los valores en Hz que buscas mientras muestrees lentamente... calculemos la componente que más se acercaría a 540Hz por ejemplo...

540Hz / 12.1875Hz = 44.3

La componente 44 sería la más cercana a 540Hz, valiendo exactamente...

44 * 12.1875Hz = 536.25Hz

Así que el error sería de -3.75Hz... cosa que deberás evaluar en tu aplicación.

Veamos cuánta diferencia hay con la componente de 750Hz...

750Hz / 12.1875Hz = 61.53
62 * 12.1875Hz = 755.625Hz
Error = 5.625Hz

Yo la usaría sin tanta preocupación...  :mrgreen:

Por lo que un muestreo a 1560Hz con 128 muestras es suficiente para ver las componentes frecuenciales que buscas.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #28 en: 26 de Octubre de 2009, 20:20:37 »
Pepe, acabo de modificar una función FFT para C# y me di cuenta de que te di mal la explicación  :oops:

Para poder ver una frecuencia de hasta 750Hz solo es necesario muestrear al doble... a 1500Hz.

Por ejemplo, si tomamos 16 muestras, entonces obtendremos 9 componentes de frecuencia útiles... la frecuencia de DC, 7 frecuencias y la frecuencia Nyquist, sumando en total 9.

Aquí un documento de Matlab que lo explica correctamente.
http://www.mathworks.com/support/tech-notes/1700/1702.html

Así que corrigiendo... un muestreo a 1500Hz con 128 muestras es suficiente para ver las componentes frecuenciales que buscas.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: SOLUCIONADO-problemas con FFT con 18f4550, queriendo inventar la rueda.
« Respuesta #29 en: 30 de Enero de 2010, 00:03:12 »
Como extra a los resultados de Cerebro puedo confirmar que esta split radix se ejecuta correctamente en un PIC24 en CCS. Tarda 674us en entregar resultados corriendo el pic a 16MIPS.  :mrgreen: