Autor Tema: reproducir wav desde PIC  (Leído 23485 veces)

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

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #15 en: 23 de Julio de 2011, 16:04:15 »
hola Suky!
He hecho ese resample, y la tabla me ha variado, es decir, en funcion del sample, claro, hay unos datos u otros. Ahora me ha quedado en const rom char datos2[2868]. Si hago el cálculo que tu hiciste, me queda el mismo tiempo, es decir:

2868/8000 =358,5 ms
15807/41000=385,5 ms
que para el caso es el mismo...

Al dcir resample, te refires al archivo wav original ? Con matlab me ha salido esa tabla, pongo el procedimiento, a ver si hay algo mal :
Citar
Primero digo cómo he resampleado
Con matlab:
Uso esta instrucción para cargar el wav original (44100Hz, 8 bits)
[datos,Fs,NBits,Opts]=wavread('E:\Proyectos_carpeta_seguridad\PIC\PWM en C18\bocina3.wav')
La instrucción directa para resamplear es esta:
datos =resample(datos,p,q)
donde “datos ” es el resultado del resample( se sobreescribe), datos el archivo del array ( aún no es un array en C propiamente dicho) , y p y q son dos parámetros del resampleo, p/q veces el sampleo original.
Como no sabemos qué números son esos, hay que usar una instrucción previa:
[p,q]=rat(8000/Fs,0.0001), donde  Fs es la frecuencia de sampleo original, del archivo bocina3 (44100Hz), 8000 es el resultado del sampleo que queremos, y el vector [p,q] como resultado para poner en la instrucción anterior.
datos=resample(datos,39,215)
Ahora queda adecuar esos datos, para ponerlos en una tabla y “migrarlos” a C, del modo siguiente:
datos = datos *127
datos = datos +127
datos = fix(datos)
csvwrite('E:\Proyectos_carpeta_seguridad\PIC\PWM en C18\datos.csv',datos);
Con Excel
Ahora  abrimos  el ficherocreado “ datos.csv “
Aparece una columna con el array de datos, en forma de columna. En opción “buscar y reemplazar”, en la casilla “buscar” la dejamos en blanco ( busca los espacios) y en reemplazar añadimos una coma “,”. Seleccionamos la columna ( entera) de la derecha de la columna de datos, y hacemos el cambio ( damos aceptar a buscar y reemplazar).
Con Notepad.
Ahora abrimos un archivo txt , previa copia de esas dos columnas de Excel, y cambiamos un poco para adecuarlo a C, es decir, poner al principio  const  char nombre[número de columnas de la columna en Excel] ={los números mas la coma añadida}. Ese archivo lo guardamos con extensión “.h” y ya tenemos el archivo de sonido resampleado a 8000 Hz y en forma de array de chars, para leerlo en C.
todo esto veo que es antes de iniciar nada con el PWM, que por cierto, n entiendo bien lo de combertir los 10 bits a 8bits, me suena una funcion en C estilo "(int)dato(byte)" de conversión, ??
« Última modificación: 31 de Julio de 2011, 18:59:10 por PICYO »

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: reproducir wav desde PIC
« Respuesta #16 en: 23 de Julio de 2011, 18:09:40 »
Hablo de la conversión sobre el archivo original. La idea es un audio de ~1.5 s muestrearlo a 8k. Sino no tiene sentido  ;-)

Respeto a la conversión, es bastante sencillo, si el dato de audio es de 8-bits entonces tenes que 0V son 0x00, y 5.0V es 0xFF. Ahora si tengo PWM de 10-bits, tengo que multiplicar por un k para que 0x00 sean 0V y 0x3FF sean 5.0V.

Si el PWM me diera de 10-bits, yo haría:

CicloTrabajoPWM=((unsigned int)DatoAudio<<2);   ;-)


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #17 en: 24 de Julio de 2011, 08:35:17 »
esto se complica, la verdqad, no lo veo sencillo.
Dcies que use la velocidad a 48 MHz, y asi me olvido de temas del oscillador ( habilite el PLL). Cuando hago la simulacion por Proteus, siempre he de poner la velocidad en KHz, pero bueno, digo, deberé tocar el periodo de algun modo.
Pues bien, cambio la velocidad de programa a 48MHz, y ahora calculo el Periodo . Bueno. mas que el periodo el PR2 :
Código: C
  1. PWM Period = [(PR2) + 1]4 • TOSC •(TMR2 Prescale Value)
  2. Tal como dices  la frecuencia a 8KHz ( que ya no se llegar a esa conclusión yo solo)
  3. 8KHz=(PR2+1)*4*2083x10^-9        ( este ultimo tiempo es la inversa de la fecuencia de programa, que son 48MHz)
  4. PR2=960153623 o lo que es mi msimo, PR2=0x393AC817
vamos, ya no he seguido... ¿ por que no debería bajar la velocidad de programa? Si no lo hago, veo imposible llegar a esa frecuencia del PWM

Antes de cambiar la velocidad de programa ( me corria entonces a 1 Mhz, pero en Proteus no me funciona nada por menos de 7KHz) si que he hecho algo que me has dicho, pero no exactamente como decias:
Código: C
  1. for (i=0;i<2868;i++) {SetDCPWM2( datos2[i]<<2 );}
me ha sonado algo mejor, aunque nada bueno tampoco. ese desplazamiento de bits (<<2) no hace que pierda información ?
Bueno cada vez me entero de menos..ya empieza a haber demasiada información y pocos resultados

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: reproducir wav desde PIC
« Respuesta #18 en: 24 de Julio de 2011, 10:30:53 »
Por lo que veo no tienes mucha practica usando microcontroladores, por ahi te conviene hacer proyectos mas sencillos para aprender a trabajar con los distintos modulos... en el calculo te falto el preescaler...
Despues, no es cuestion de colocarlo en un for, hay que respetar los tiempos de reproduccion...
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #19 en: 24 de Julio de 2011, 12:10:27 »
claro, me falta la práctica por eso no me queda mas opcion que preguntar lo que no se. de todos modos, no entiendo como hicieron este proyecto otras personas con ese mismo for, y les funcionó. Es el mismo for que llevo arrastrando durante todo el post. Lo uncio que hecho hasta ahora es rectificar las cosas según aparecen aqui,
« Última modificación: 24 de Julio de 2011, 12:19:37 por PICYO »

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: reproducir wav desde PIC
« Respuesta #20 en: 24 de Julio de 2011, 14:54:13 »
Hola,
 yo hice hace un tiempo una prueba basandome en ese mismo proyecto y tal como esta en la web no funciona correctamente, puesto que si los datos estan muestreados a 8Khz se deben de pasar al pwm a esa misma frecuencia o de lo contrario sonara mal y la frecuencia del PWM debe de ser al menos el doble de la maxima frecuencia que desees escuchar (teorema del muestreo).

El bucle for deberia de quedar algo parecido a esto:

Código: C
  1. //ejemplo para sonido muestreado a 8Khz
  2. for (i = 0; i <length; i++) {
  3.     SetPWMDuty(datos[i]);   //establece el duty cicle del pwm
  4.     delay_us(125);              //delay para sacar un dato cada 8KHz
  5. }

Saludos.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: reproducir wav desde PIC
« Respuesta #21 en: 24 de Julio de 2011, 15:19:14 »
Cita de: omix link=topic=35508.msg296104#msg296104
y la frecuencia del PWM debe de ser al menos el doble de la maxima frecuencia que desees escuchar (teorema del muestreo).


La frecuencia del pwm no tiene nada ver con el teorema de muestreo, la minima debe ser igual a la de muestreo asi al cambiar el ciclo de trabajo se hace de forma correcta, o puede ser k veces, con k entero  ;-) es otro el concepto a aplicar
No contesto mensajes privados, las consultas en el foro

Desconectado sal0m0n

  • PIC12
  • **
  • Mensajes: 54
    • Sobre Mí
Re: reproducir wav desde PIC
« Respuesta #22 en: 25 de Julio de 2011, 16:59:38 »
Buenas tardes amigos, ya resolví los problemas que tenia con mi DAC del dsPIC33FJ128GP802, ahora puedo reproducir música casi sin problemas, lo único es que a pesar de realizar los cálculos correctamente una y otra vez es evidente que la reproducción esta un poco mas lenta de lo normal....


como estoy reproduciendo el audio a 44.1kHz, el reloj del DAC debe ser 44100Hz * 256 = 11,289MHz, entonces, con una frecuencia FVCO de 160 MHz, en APSTSCLR debo colocar 2, para que lo divida entre 2, 160Mhz/2 = 80Mhz y luego, en el DACFDIV debo volver a dividir esa frecuencia (de 80mhz) a la que me sirva para obtener los 11,289Mhz del reloj del DAC, así que coloco en DACFDIV 6, para que divida los 80 Mhz entre 7, (DACFDIV=6  -> 80Mhz/7 = 11,428Mhz ), que supera por 139Hz la frecuencia del clock dek DAC requerida para 44,1kHz, asi que debería sonar algo mas rapido, pero en vez de eso, suena un poco mas lento!!, y se supone que a esa frecuencia del clock (11,428Mhz) del DAC, la reproduccion debería ir a 44,642Khz, ~540hz de mas de la frecuencia del audio original... entonces no entiendo por que en vez de sonar mas rapido, suena un poquito mas lento!!

se me ha ocurrido usar el oscilador FRC de este micro, para poder "tunearlo" a la frecuencia de trabajo ideal, o quizas un metodo para "resamplear" la frecuencia del audio a un valor personalizado... P.E. 44,8kHz o 43,9kHz pero no se de algun software que permita esos valores "no estandar"...



saludos.
« Última modificación: 25 de Julio de 2011, 17:05:05 por sal0m0n »
Mis herramientas!
PicKit 3, MPLAB REAL ICE, OWON SDS6062, Zeroplus LAP-C 16128, Weller WES51, Probotix Fireball Meteor,  Altium Designer y otras mas!

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #23 en: 31 de Julio de 2011, 18:55:56 »
hola omix, he probado ese delay, y no me funciona ( en ccs) tal como a ti, de hecho sigue igual.. Salomon, has probado con matlab ? si solo quieres hacer una conversion de frecuencia de sampleo, es matar moscas a cañonazos ( sirve para..casi todo, todo el mundo lo usa..pero nadie lo entiende :D), pero si te lo instalas, seguro que le darás mas usos postteriormente. En una de mis preguntas, pongo los pasos que hize para resamplear, prueba eso a ver si te va bien.

Seguire en unos dias el proyecto desde C18, a ver si consigo que suene. por cierto, salomon, podrías colgar tu proyecto ?

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: reproducir wav desde PIC
« Respuesta #24 en: 31 de Julio de 2011, 20:10:54 »
Buenas! Toma como ejemplo el siguiente proyecto hecho en un 18F4620. El archivo está muestreado a 8kHz:

Código: C
  1. #include <p18f4620.h>
  2.  
  3. /** CONFIGURATION **************************************************/
  4. #pragma config OSC=HSPLL
  5. #pragma config IESO=OFF
  6. #pragma config PWRT=ON
  7. #pragma config WDT=OFF
  8. #pragma config MCLRE=ON
  9. #pragma config XINST=OFF
  10. #pragma config DEBUG=OFF
  11. #pragma config FCMEN = OFF
  12. #pragma config LVP=OFF
  13. #pragma config BOREN=OFF
  14. #pragma config PBADEN = OFF
  15. #pragma config CCP2MX = PORTC
  16. /** END CONFIGURATION **************************************************/
  17. #include <pwm.h>
  18. #include <timers.h>
  19. #include "WavFile.c"
  20. extern rom const unsigned char Buffer[8395];
  21. /*-----------------------------------------------------------*/
  22. void main( void ){
  23.         unsigned int k=0;
  24.  
  25.         // Fijo F PWM a ~32kHz  Fosc = 40 MHz -> 10Mhz x 4 PLL
  26.         OpenTimer2(TIMER_INT_OFF & T2_PS_1_4 & T2_POST_1_1);
  27.         OpenPWM1(77);
  28.         OpenPWM2(77);
  29.         // Para 32kHz, resolución 8.3 bits
  30.         // Seteo un valor medio.. (~)
  31.         SetDCPWM1(0x80);
  32.         SetDCPWM2(0x80);
  33.         while(1){
  34.                 // Borro flag. Los datos del archivo wav están muestreado a 8kHz y como F PWM es 32kHz..
  35.                 // ..para reproducir a mismo tiempo debo esperar que ocurran 4 overflow de Timer2:
  36.                 PIR1bits.TMR2IF=0;
  37.                 for(k=0;k<8395;k++){
  38.                         // Cargo dato de archivo en ambos canales:
  39.                         SetDCPWM1(Buffer[k]);
  40.                         SetDCPWM2(Buffer[k]);
  41.                         while(PIR1bits.TMR2IF==0);
  42.                         PIR1bits.TMR2IF=0;
  43.                         while(PIR1bits.TMR2IF==0);
  44.                         PIR1bits.TMR2IF=0;
  45.                         while(PIR1bits.TMR2IF==0);
  46.                         PIR1bits.TMR2IF=0;
  47.                         while(PIR1bits.TMR2IF==0);
  48.                         PIR1bits.TMR2IF=0;
  49.                 }
  50.         }
  51. }

Adjunto WavFile.c.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #25 en: 01 de Agosto de 2011, 10:55:58 »
Hola Suky! Estoy realizando un proyecto aparte, con este material que me has dado, para ver directamente su funcionamiento, pero no me compila C18. Estoy compilando individualmnente cada fichero, pero al final me sale lo siguiente :

Error - symbol 'Buffer' has multiple definitions.

he cambiado el nombre a la variable, creyendo que habria conflicto con alguna variable en el proyecto, y la rebautizado como MiBuffer, y el error es el mismo.
el linker no consigo que me compile ( si lo compilo individualmente)  pero lo mismo me pasa  con todos los proyectos y al final el programa me corre.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: reproducir wav desde PIC
« Respuesta #26 en: 01 de Agosto de 2011, 13:02:23 »
WavFile.c no se debe incluir en el proyecto.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: reproducir wav desde PIC
« Respuesta #27 en: 01 de Agosto de 2011, 13:25:01 »
Hola PICYO,
te adjunto uno de los proyectos que yo he probado y que funcionan, esta hecho en CCS para el PIC18F452 con un oscilador de 10Mhz. Si todo va bien deberias de escuchar el sonido de una cabra  :D, no intentes simularlo ya que yo no tuve exito tuve que realizar el montaje en una protoboard, puesto que en el proteus no me iba (no se el motivo).

Saludos y ya contarás.

Desconectado PICYO

  • PIC16
  • ***
  • Mensajes: 104
Re: reproducir wav desde PIC
« Respuesta #28 en: 01 de Agosto de 2011, 13:54:49 »
Hola Suky! Bueno, a no ser que el sonido sea el de una metralleta de un juego de Spectrum... tampoco me va bien :D pero como dice Omix, quizas el fallo resida en el Proteus. En la ventana de avisos se me llena, que no carga ciertos ficheros .asm y la velocidad de simulación no es real..bueno, qu eno va bien. otra cosa Suky, en el que me has mandado, usas las dos salidas del PWM, en vez de una, ¿ has hecho un ejemplo estilo a aquel de CCS que puse yo? Es decir,¿ colocas 2 speackers?

Omix! En cuanto pueda monto un circuito, pero de momento no lo puedo probar, no tengo speacker y componentes y me voy de vacaciones, os dejo aqui "solicos". De momento me lo bajo ! Lo que podrias decir como has montado la salida? si has puesto un filtro, o  como lo has hecho
« Última modificación: 01 de Agosto de 2011, 14:19:03 por PICYO »

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: reproducir wav desde PIC
« Respuesta #29 en: 01 de Agosto de 2011, 15:43:26 »
Hola Suky! Bueno, a no ser que el sonido sea el de una metralleta de un juego de Spectrum... tampoco me va bien :D pero como dice Omix, quizas el fallo resida en el Proteus. En la ventana de avisos se me llena, que no carga ciertos ficheros .asm y la velocidad de simulación no es real..bueno, qu eno va bien. otra cosa Suky, en el que me has mandado, usas las dos salidas del PWM, en vez de una, ¿ has hecho un ejemplo estilo a aquel de CCS que puse yo? Es decir,¿ colocas 2 speackers?

Seguramente en proteus no funcione para nada bien. Yo lo hice de esa manera para usar el siguiente circuito que tenia armado:


del proyecto que anteriormente te mencionaron: http://www.micros-designs.com.ar/reproductor-de-archivos-wav-desde-sd-card-mas-analizador-de-espectro/

Saludos!
No contesto mensajes privados, las consultas en el foro