# Grabar audio con PIC y enviarlos a la PC en formato WAV



## titockmente (Jul 10, 2011)

Hola que tal gente!

He mirado algunos post que se han publicado, con respecto al manejo de audio con
microcontroladores:

https://www.forosdeelectronica.com/f24/generacion-comandos-voz-medio-microcontrolador-658/

Estamos armando un proyecto con un compañero, que consiste en lo siguiente:

*Realizar grabaciones de los latidos del corazon
*Guardarlas en un microcontrolador
*Enviarlas a la PC

Tengo dudas en cuanto al hardware a utilizar para la implementacion. La idea seria
pasar los datos por bluetooth a la compu y tomarlos en formato .wav
para despues analizarlos con labview.

Teniamos ganas de usar un integrado, el apr9600 que permite grabar y
reproducir voz, pero por lo que estoy viendo, no se puede acceder a la
memoria del integrado por lo tanto no tenemos forma de transmitir los
datos a la PC.

Agradeceriamos muchisimo cualquier tipo de informacion.

--
TiTo


----------



## rojjo (Jul 10, 2011)

Hola:

puedes adquirir la señal deseada y almacenarla en una eeprom (hasta donde sé los pics no permiten guardar datos en su memoria una vez programado).

la información adquirida no tiene que ser guardada con este formato(wav). Si puedes visualizar los datos en labview, puedes abrir el dispositivo de sonido y enviarle los datos que tú adquiriste.

saludos


----------



## titockmente (Jul 11, 2011)

Gracias por la respuesta!. En cuanto a los PICs, tienen dos memorias una donde se almacena el programa y otra que se utiliza en la ejecucion (no me acuerdo el nombre ahora). El tema es que esta segunda creo que es un poco limitada, de todos modos depende de la gama del PIC en cuestion.

Entonces, la idea seria:
·Tomar las señales con un ADC (de 8 bits y con una tasa de muestreo lo mas alta que se pueda por ej:44,1kHz para no perder tanta informacion)
·Pasar esos datos a la EEPROM y almacenarlos alli
·Comunicarse mediante RS232 (en principio) con la PC y pasar los datos
·Tomar el stream de datos con Labview

Mi duda seria si la velocidad de escritura de la EEPROM da como para ir tomando los datos muestreados por el conversor y escribirlos en la misma sin perdida de informacion. Pero bueno será cuestion de ver los datasheets y todo eso.

Si alguien tiene algun otro dato se lo agradezco
--
TiTo


----------



## rojjo (Jul 11, 2011)

Hola:

grabar audio en un micro es algo complicado, yo lo hice en un msp de 64kB de flash y solo pude cargarle alrededor de 12 segundos de grabación.

la velocidad de muestreo la programé a 4khz.

a esa tasa de muetreo y durante 12 segundos utilicé 48kB de flash.

al reproducir el audio, lo hice mediante una dac a la misma frecuencia de grabación y se escuchó perfecto.

si deseas reproducir música con alta calidad si es necesario la adquisición a la velocidad de 44.1khz, pero utilizarías 44.1kB de memoria por cada segundo de grabación.
solo información adicional a considerar.

saludos


----------



## titockmente (Jul 11, 2011)

Estuve viendo un poco mejor los requisitos de muestreo

El BW siginficativo es hasta 1kHz, lo que me haria pensar que muestrear con una frecuencia de 2,5 kHz - 3kHz sería suficiente (ver imagen adjunta). Sin embargo en algunos papers y publicaciones citan que la minima tasa de muestreo aceptada es de 8 kHz, siendo el óptimo unos 11 Khz. http://www.dalcame.com/wdescarga/articulo estetoscopio.pdf (pagina 8 columna de la derecha)

Solo me harian falta unos 30 segundos de grabación, que digitalizando con 8 bits darían unos 240 kB - 330 kB. 

Otra duda que tengo es con cuantos bits cuantificar la señal, alcanzan con 8? 10, 16? Cual es la diferencia?


----------



## fernandob (Jul 11, 2011)

y por que no ves (si se puede) grabar con un MP3 (muy barato) y luego mediante el puerto bajar la info, asi no tenes probelmas de velocidad ni de nada.

el MP3 hace el trabajo de grabar y guardar.

el asunto es si podes controlar lso comandos (dar ordenes) a un MP3 mediante su puerto y si podes leer (info de como manejar rutinas y comandos para controlar el MP3 ) .

si se puede me parece que tendras algo mas versatil.

yo nunca busque a ver si habia info de los MP3 /4 para manejarlos asi .


----------



## titockmente (Jul 11, 2011)

fernandob dijo:


> y por que no ves (si se puede) grabar con un MP3 (muy barato) y luego mediante el puerto bajar la info, asi no tenes probelmas de velocidad ni de nada.
> 
> el MP3 hace el trabajo de grabar y guardar.
> 
> ...



No es mala tu idea, pero le veo dos inconvenientes:

1) Me parece que lo unico que podes hacer es acceder a la memoria FLASH pero no darle comandos de inicio/fin de grabacion (solo supongo q es asi, que la PC lo unico que reconoce es un dispositivo de almacenamiento)

2) Necesito un microfono externo, ya que la idea es usar el electret montado sobre la membrana del estetoscopio para tener mas sensibilidad y (supongo) aumentar la SNR (relacion señal a ruido)

De todos modos, me diste la idea de que es posible usar una memoria FLASH para almacenar temporalmente las muestras del ADC (no se si sera posible)

Tengo otra pregunta:
· Que ADC puedo conseguir en Argentina con estas caracteristicas:
      + Frecuencia de muestreo 11 kHz
      + Cuantificacion en 16 niveles (16 bits)
      + Posibilidad de comunicacion con PIC (i2C, SPI, etc.) y FLASH (o EEPROM?)

Muchas Gracias por la buena onda gente!


----------



## Daniel Meza (Jul 11, 2011)

¿Y porque en vez de utilizar EEPROM o FLASH no usar una RAM?, ya que estás son más rápidas y baratas el problema es que no se si haya RAM disponibles en encapsulados como las EEPROM de PIC que usan el protocolo I2C.



> Tengo otra pregunta:
> · Que ADC puedo conseguir en Argentina con estas caracteristicas:
> + Frecuencia de muestreo 11 kHz
> + Cuantificacion en 16 niveles (16 bits)
> + Posibilidad de comunicacion con PIC (i2C, SPI, etc.) y FLASH (o EEPROM?)



Encontré este  de la marca MICROCHIP, pero es de 18 bits (No creo que sea un impedimento sobre su uso), tiene comunicación I2C. En fin creo que es el adecuado para tu aplicación. Sobre su venta no se si puedas pedirlo por mensajeria a Microchip o ver si se puede conseguir allá. Saludos


----------



## titockmente (Jul 11, 2011)

Me parece muy buena idea lo de usar RAM!

Excelente lo del ADC de Microchip, lastima que solo puede efectuar hasta 240 [muestras/segundo] lo que es muy poco (necesito unas 11000).

Muchas Gracias por la ayuda!


----------



## titockmente (Jul 14, 2011)

Hola gente!

Estuve viendo que estos dos dsPICs me pueden ayudar y los consigo en Argentina, que opinan?

dsPIC30F3013 http://ww1.microchip.com/downloads/en/devicedoc/70139C.pdf
dsPIC30F4013 http://ww1.microchip.com/downloads/en/devicedoc/70138c.pdf

Ahora la pregunta es:
Como paso la informacion adquirida a una memoria, uso I2C por ejemplo? 
Podre salir directamente por el puerto serie?

Pienso que a 11 ksamples/seg *16 bits (en realidad son 12bits dispuestos en 2 registros de 8 bits) necesito una conexion con la PC de unos 200 kbps si quiero pasar los datos a medida que los voy tomando. Se las aguanta la conexion serie (RS-232) de la compu?

Muchas Gracias!!


----------



## rojjo (Jul 14, 2011)

Hola:

te puede servir este adc
http://www.mct.net/download/ti/tlv2556.pdf
o cualquier otro del tipo sar ya que son los mas rápidos.
este es un adc de 12 bits y la forma que los adquieres es en 2 bytes, es decir, los otros 4 bytes no se utilizan.

considero que cualquier micro con capacidad de generar pulsos de reloj a 1Mhz, leer y guardar el estado de este pin a esta velocidad, te es suficiente.

el puerto serie puede ir hasta 921600baudios, lo cual facilmente te soporta la transferencia de tu audio sin la necesidad de guardalo en una memoria.

saludos


----------



## dragondgold (Jul 14, 2011)

Doy una humilde opinion por lo que leí. La mayoria de los PICs que tienen ADC son de 10bits y pueden realizar 500k muestras por segundo por lo que si tu necesitas 44.1k muestras por segundo estas sobrado.

Para grabar el audio la RAM es una buena opcion pero las RAM de gran tamaño son algo mas costosas, podrías probar de grabarlo en una tarjeta de memoria uSD que son econoómicas, facil de usar y de gran capacidad y creo que las velocidades te dan trabajando con el SPI a unos 12MHz teniendo en cuenta que cualquier tarjeta SD graba como mínimo 400kb de informacion por segundo y si vos grabas 44.1k por segundo estas sobrado tambien y grabas el audio sin formato no hace falta que implementes sistema de archivos FAT.

Con respecto a la velocidad, un PIC18 que tenga USB puede llegar a los 12MIPS que creo que serían suficientes ademas de disponer de una conexión USB que sería más rapida que UART para enviar la informacion a la PC.

Saludos y espero que te sirva =)


----------



## titockmente (Jul 17, 2011)

Gracias chicos!! Ya les tendre mas novedades del proyecto en un tiempo. Les agradezco muchisimo la informacion!

Un abrazo!


----------



## soymoe (Sep 23, 2012)

Yo estoy tratando de generar mensajes  de voz al azar pero no se que usar para grabar la voz y reproducirla despues con el PIC, pense en unas eeprom de 1Mbyte pero no se si las voy a conseguir, debo grabar los datos de 8 bits en la memoria que representan el audio y despues sacarlo como stream por un puerto del pic para producir la voz, asi que un seg de sonido me puede ocupar unos 30k bytes, alguna solucion para el almacenamiento del audio?


----------



## Scooter (Sep 23, 2012)

Si es lo bastante rápido usa una SD y tendrás sitio para aburrir.


----------



## Meta (Sep 23, 2012)

Hola:







Aquí hay uno que hace lo de la voz y usa microSD controlado con PIC.

Ver enlace

Un saludo.

PD: _Si no lo puedes ver, avisame y lo paso en PDF por aquí._


----------



## Gradmaster (Sep 23, 2012)

Viendo lo que tratas de hacer me recuerda un proyecto que inicie y como muchos otros deje de lado, pero lo que puedo aportar es que si usas un pic a 4MHz te dara un 1us por instruccion y para el adc tomara alrededor de 16us por conversion, con las demas intrucciones en tu bucle igual puedes alcanzar un muestreo de 50kps, en mi caso use una memoria eeprom de 512K que a 8 bits de resolusion del adc te alcanzara para unos 10segundos de grabacion.

La memoria eeprom tiene un acceso de escritura y lectura de 200ns algo asi como 5Mhz sufiecientemente veloz para almacenar tu muestreo, el unico detalle que encontre es que 10 segundos es muy poco para una aplicacion practica, pero si bajas los muestreos por segundo facilmente alcazas el tiempo que requieres.

saludos.


----------



## Meta (Sep 23, 2012)

Buenas:

Pongo un ejemplo en C para el PIC16F886.


```
/*                                  

El módulo de reconocimiento de voz VRbot. Reconocimiento de voces definidas por el usuario SD.
Se trata de reconocer las voces definidas por el usuario y que se encuentran en el grupo
Grupo 1 (se supone que contiene las voces de los números 0 al 9 en castellano). Cada vez que se 
detecte cualquier voz del 0 al 9, el display de la unidades, conectado en RB0-RB7, visualiza el 
número dictado. Si la voz no es reconocida el display se apaga hasta la siguiente. */

#include <16f886.h>

/* Ajusta los valores de las palabras de configuración durante el ensamblado.Los bits no empleados
adquieren el valor por defecto.Estos y otros valores se pueden modificar según las necesidades */

#fuses     NOLVP,PUT,NOWDT,EC_IO,NOFCMEN,NOBROWNOUT    //Palabra 1 de configuración
#fuses    NOWRT,BORV40                                //Palabra 2 de configuración

/* Con estas directivas las funciones "input" y "output_bit" no reprograman
el pin de la puerta cada vez que son utilizadas. Si no se indica el
modo fast_io se asume por defecto standard_io el cual reprograma el pin
siempre antes de ser utilizadas estas funciones. */

//Habilita las funciones RS232, velocidad a 9600 baudios
#use delay(clock=4000000)
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

#use fast_io (A)
#use fast_io (B)

#include    <VRbot_16FXXX.h>        //Incluye las rutinas del módulo de reconocimiento VRbot

int grupo=1;                        //Nº del Grupo cuyas voces se van a reconocer (del 0 al 16)

/*Esta tabla almacena en memoria de programa los códigos de 7 segmentos necesarios
para visualizar cualquier dígito del 0 a la F */
unsigned int const Tabla[16]={0xc0,0xf9,0xa4,0xb0,    // Al ser una tabla constante
                              0x99,0x92,0x82,0xf8,    // se crea dentro de la memoria
                              0x80,0x98,0x88,0x83,    // de programa.
                              0xc6,0xa1,0x86,0x8e};
main()
{
      output_b(0xff);                    //Apaga los segmentos del display
    setup_adc_ports(NO_ANALOGS);    //Puertas A y B digitales
      set_tris_b(0b00000000);         //Puerta B se configura como salidas
    set_tris_c(0b10111111);            //RC7/Rx entrada, RC6/Tx salida

    VRbot_Serie();                    //Inicia el módulo VRbot
    VRbot_Dato1=0;
    VR_TIMEOUT();                    //Desconecta el Time Out (infinito)

     while(1)
    {
    VRbot_Grupo=grupo;
    VR_RECOG_SD();                    //Reconocimiento de voces predefinidas del Grupo 1
    if(VRbot_Status!=STS_RESULT)    //Si hay algún tipo de error en el reconocimiento ...
        output_b(0xff);                //Apaga los segmentos del display

/*Voz válida detectada dentro del grupo 1. VRbot_Pos contiene la posición de la misma dentro del grupo.
En función de ella se obtiene el dígito a visualizar en el display de las unidades. */
    else
        output_b(Tabla[VRbot_Pos]);    
    }
}
```


----------



## Melghost (Sep 25, 2012)

Hola, Soymoe, te traigo la solución  

Échale un vistazo a los integrados que empiezan con las letras ISD de Winbond. Tienes, por ejemplo, la familia ISD5100. Tienes varias formas de conexión, dependiendo de la familia. Los ISD5100 se comunican por i2c, mientras que otras familias implementan entradas para pulsadores, etc.

Concretamente el ISD5116 te permite 16 minutos de grabación a 4KHz de muestreo, u 8 minutos a 8KHz. Yo lo he utilizado a 8KHz y funciona muy bien. Según el fabricante, el chip no incorpora ningún conversor AD, sino que cada muestra se guarda en un único bit... ¡analógico! La caña.


----------



## Sebastian1989 (Sep 25, 2012)

Otra opción es cambiar el PIC por un Propeller, este micro tiene hechas las librerías para reproducir WAV desde una memoria SD y también para grabar sonido en formato WAV a 16 bit dentro de una memoria SD.


----------



## soymoe (Sep 26, 2012)

Melghost dijo:


> Hola, Soymoe, te traigo la solución
> 
> Échale un vistazo a los integrados que empiezan con las letras ISD de Winbond. Tienes, por ejemplo, la familia ISD5100. Tienes varias formas de conexión, dependiendo de la familia. Los ISD5100 se comunican por i2c, mientras que otras familias implementan entradas para pulsadores, etc.
> 
> Concretamente el ISD5116 te permite 16 minutos de grabación a 4KHz de muestreo, u 8 minutos a 8KHz. Yo lo he utilizado a 8KHz y funciona muy bien. Según el fabricante, el chip no incorpora ningún conversor AD, sino que cada muestra se guarda en un único bit... ¡analógico! La caña.



Gracias!! parece que esa es la solucion, solo tengo que preguntar si lo consigo aca y ponerme a probar.


----------

