Búscalo aquí:

Obtener el Vector de Amplitud de una señal de Audio [código]

Para poder realizar el procesamiento de señales de audio, un paso importante es obtener el vector de amplitud de un determinado audio. Es decir, obtener la representación digital a través de un vector de elementos de tipo double de una señal análogica, para que, mediante el tratamiento de este vector resultante podamos realizar el procesamiento de la señal.


A continuación el código fuente en Java de la clase Datos ubicada en nuestro paquete Audio.
  1. package Audio;
  2. /**
  3. * @author Jorge Guevara Díaz
  4. */
  5. import java.awt.*;
  6. import java.io.*;
  7. import java.io.IOException;
  8. import java.util.*;
  9. public class Datos {
  10. byte[] bits ;
  11. boolean formato;//formato bigEndian y littleEndian
  12. double mayor, menor;
  13. public Datos(int tamano, boolean formato)
  14. {
  15. bits = new byte[tamano];
  16. this.formato=formato;
  17. mayor=0;
  18. menor=0;
  19. }
  20. public void llenarByte(byte[] bits)
  21. {
  22. this.bits = bits;
  23. }
  24. /* ejemplo bits[2]=2 (00000010) bits[3]=3 (00000011)
  25. se aplica bits[2]<<8>
  26. en total da 10 00000011 que es el numero 515 ,
  27. este es un short de 16 bits, han entrado dos bytes en uno
  28. (short[i]=contacenar byte[i]+byte[i+1])
  29. los valores negativos estan en complemento a 2
  30. */
  31. public double[] convertirByteADouble()
  32. {
  33. double[] arrayDouble = new double[bits.length/2];
  34. if (formato==true)
  35. {
  36. int temp = 0x00000000;
  37. for (int i = 0, j = 0; j < arrayDouble.length ;
  38. j++, temp = 0x00000000)
  39. {
  40. temp=(int)bits[i++]<<8;
  41. temp |= (int) (0x000000FF & bits[i++]);
  42. arrayDouble[j]=(double)temp;
  43. }
  44. return arrayDouble;
  45. }
  46. if(formato==false)
  47. { // si el formato es littleEndian
  48. int temp = 0x00000000;
  49. for (int i = 0, j = 0; j< arrayDouble.length ;
  50. j++, temp = 0x00000000)
  51. {
  52. temp=(int)bits[i+1]<<8;
  53. temp |= (int) (0x000000FF & bits[(i)]);
  54. i=i+2;
  55. arrayDouble[j]=(double)temp;
  56. //calcular mayor y menor esto me servira para establecer
  57. //los parametros en el eje y para la grafica
  58. if(mayor<arrayDouble[j])
  59. mayor=arrayDouble[j];
  60. if(menor>arrayDouble[j])
  61. menor=arrayDouble[j];
  62. }
  63. return arrayDouble;
  64. }
  65. else
  66. {
  67. System.out.println("orden de Bytes desconocido o no soportado");
  68. }
  69. return arrayDouble;
  70. }
  71. }

Espero les sea de utilidad.


Quieres leer más post como éste???...suscribete aquí!!!


17 comentarios:

  1. Hola este metodo sirve para converetir de tipo bytes a double, pero estoy buscando la manera de convertir audio a tipo byte, si me pudieses ayudar te lo agarcecería,

    un servidor

    ResponderEliminar
  2. Hola Anthony, lo que andas buscando lo publiqué en un post anterior a este :D,

    para convertir la informacion que un archivo d eaudio mantiene a tipo de dato byte puedes usar el método que publicó en el post Lectura y graficación de señales de audio en Java [código]

    Saludos

    ResponderEliminar
  3. jhaira: Hola, disculpa no puedo compilar el codigo, tengo el error en la fila 61, en: j < class="me1">length , indica que class no es una variable. Te agradecería mucho si me indicas que es lo qeu debo hacer.
    Mcuhas gracias

    ResponderEliminar
  4. Listo, la apreciacion de jhaira ya esta corregida, se trataba de un error de paso de Java al HTML, gracias por leer, saludos

    ResponderEliminar
  5. Jhaira, muchas gracias !!

    ResponderEliminar
  6. Hola Jorge! Mi pregunta surge por lo siguiente, estoy mandando a imprimir por cónsola el arreglo que contiene los bytes del audio, que en este caso es el arreglo denominado bits, por qué una cierta cantidad de los bytes del arreglo son ceros? esta cantidad varía de un archivo a otro y siempre son los primeros bytes. Te felicito por tu aporte, ha sido de gran ayuda. Quedo de tu respuesta. Gracias

    ResponderEliminar
    Respuestas
    1. Hola! asegurate de revisar exactamente el contenido del vector bits puede que este corrupto o no este siendo generado correctamente. También puede estar ocurriendo que los archivos de audio que estas utilizando simplemente tienen esos valores en sus primeros índices. Verifica el contenido de tus archivos para que descartes cualquier inconveniente.

      saludos

      Eliminar
    2. Gracias por responder Jorge! Los archivos que estoy utilizando estaban originalmente en formato mp3(compresión con pérdida) y eran convertidos a formaro wav(sin pérdida) creo que es por eso que el contenido de los primeros índices del vector son ceros. El archivo "dominaiting.wav" que utilizaste en el post Lectura y graficación de señales de audio en Java [código] está originalmente en formato .wav o le hiciste alguna transformación previa? Ya que al usar ese archivo en la aplicación los primeros bytes del arreglo no son ceros, lo que me lleva a sospechar que es por la transformación previa que hago a los ficheros. Quedo de tu respuesta. Gracias.

      Eliminar
    3. Entonces puede ser eso, el archcivo dominaiting.wav que disponibilizo ha sido creado originalmente en formato .wav...ahora como bien mencionas, al hacer la conversión puede que por ahi se dejen/pierdan detalles de la estructura original de un archivo WAV por lo que podría estar originando el problema que citas...busca un editor que convierta/genere correctamente los archivos wav (puros)

      saludos

      Eliminar
    4. Hola, buen día.

      Estoy viendo tu código y me he basado en el para realizar fingerprints de audio. Pero he tenido el mismo problema que el anonimo. Intenté usar javazoom para hacer la conversión, pero simplemente me salen los vectores en cero (y al contrario del anonimo, son todos, no solo los iniciales).

      Si necesitas ver mi código, me dices.

      Saludos

      Eliminar
  7. Hola Jorge, tu info es muy clara, te felicito por los post sobre audio, ya que no hay muchos tan claros como los que lei por tu blog!

    Queria saber si tuviste la posibilidad de hacer algo similar a este ejemplo pero en QT??? o si tenes alguna idea, porque estoy trabado en la transformacion del frame a un valor entero. Obtengo los frames pero no se como pasarlos a un valor que pueda entender je

    saludos y gracias!

    ResponderEliminar
    Respuestas
    1. Hola Alejo, gracias por tu comentario sobre mi blog. En lo personal no he tenido la oportunidad de trabajar en QT por lo que no podría darte una idea específica de cómo abordar este tema.

      sds

      Eliminar
  8. Hola Jorge, tus post me han sido de mucha ayuda y gradezco que compartas con nosotros el código que desarrollaste, realmente llevaba varios días sin poder hacerme de una idea de como obtener el vector de amplitud de una señal de audio, al revisar tus post me ha quedado un poco más claro, probaré tus códigos y si me encuentro con alguna dificultad vendré a consultarte, espero no te moleste.
    Gracias

    ResponderEliminar
  9. Hola Jorge, oye tengo un programa en eclipse de Comparación de sonidos, el problema que tengo es que cuando grabo desde un micrófono y gráfico lo grabado no puedo hacer la comparación, como puedo hacerle para saber si los sonidos grabados y almacenados, pueda yo saber si son iguales o diferentes
    si me pueden ayudar se los agradecería.

    ResponderEliminar
    Respuestas
    1. Ten cuidado y asegurate que la señal que llega desde el microfono tenga el mismo formato digital del que tiene un archivo WAV (que es el que uso en estos ejemplos). Si no fuera de esa manera, tienes que ver las propiedades de la libreria de Audio de Java que estes usando, para hacer la lectura correcta.

      Saludos

      Eliminar
  10. Trate de corregir todos los errores pero no encontré solución a los paquetes, me hice un lío, habrá bronca si los mandas a mi correo alex.neri.pena@gmail.com

    ResponderEliminar

Bienvenido a jcGeorge's Blog!!!

Por favor deja tu comentario, consulta o sugerencia, procura mantener habilitado tu perfil de Blogger o deja un enlace a tu blog o web.

Gracias por leer este blog!!!

Related Posts Plugin for WordPress, Blogger...