Duda acerca del tratamiento de archivos de sonido
Publicado por David (2 intervenciones) el 04/01/2012 18:01:30
Buenas tardes,
Os comento el problema. He implementado un programa en Matlab que tomando un fichero de audio aumenta el pitch de la canción progresivamente hasta un determinado valor que el propio usuario elige (por ejemplo, si la canción presenta una velocidad de 100 bpm y el usuario elige una variación de 20 bpm, el resultado será la propia canción con la velocidad variando linealmente y de forma progresiva de 100 bpm hasta 120 bpm al final.
La cuestión es que he conseguido optimizar bastante el coste computacional trabajando por fragmentos y liberando memoria en un momento determinado volcando el resultado correspondiente al fragmento asociado al disco duro. Al final de todo, el programa lee todos los fragmentos, los concatena y crea el archivo final, eliminando posteriormente todos los archivos fragmentados.
El problema es que esto último da problemas cuando la canción en cuestión presenta una duración superior a 4 minutos por problemas en la memoria de almacenamiento (tened en cuenta que por cada segundo hay 2 canales x 44100 muestras = 88200 datos por cada segundo). Tengo claro cómo resolver el problema. La idea sería que fuera leyendo fragmento por fragmento y que los fuera concatenando no todo en una matriz que se almacena en el espacio de trabajo sino directamente en el archivo wav que se va generando. El problema es que no sé cómo hacer esto. Tan sólo conozco la existencia de la función "wavwrite" que es la que utilizo para volcar la información de la matriz en un archivo wav, pero lo que me gustaría saber es si existe una función tal que teniendo un archivo wav ya existente volcar la información de una matriz en el mismo archivo agregando tal información al final del archivo wav ya existente (y no que lo sobrescriba), de modo que sólo sería necesario guardar en la memoria el contenido de un solo fragmento.
Sé que tiene que haber alguna forma, ya que no me parece muy lógico que la función "wavread" sí que permita leer y almacenar entera una canción de más de 4 minutos, pero que luego no pueda concatenar poco a poco la información que recoge de los fragmentos modificados (que es de hecho de menor tamaño si realizamos un aumento progresivo de la velocidad).
Un saludo y gracias por adelantado.
Os comento el problema. He implementado un programa en Matlab que tomando un fichero de audio aumenta el pitch de la canción progresivamente hasta un determinado valor que el propio usuario elige (por ejemplo, si la canción presenta una velocidad de 100 bpm y el usuario elige una variación de 20 bpm, el resultado será la propia canción con la velocidad variando linealmente y de forma progresiva de 100 bpm hasta 120 bpm al final.
La cuestión es que he conseguido optimizar bastante el coste computacional trabajando por fragmentos y liberando memoria en un momento determinado volcando el resultado correspondiente al fragmento asociado al disco duro. Al final de todo, el programa lee todos los fragmentos, los concatena y crea el archivo final, eliminando posteriormente todos los archivos fragmentados.
El problema es que esto último da problemas cuando la canción en cuestión presenta una duración superior a 4 minutos por problemas en la memoria de almacenamiento (tened en cuenta que por cada segundo hay 2 canales x 44100 muestras = 88200 datos por cada segundo). Tengo claro cómo resolver el problema. La idea sería que fuera leyendo fragmento por fragmento y que los fuera concatenando no todo en una matriz que se almacena en el espacio de trabajo sino directamente en el archivo wav que se va generando. El problema es que no sé cómo hacer esto. Tan sólo conozco la existencia de la función "wavwrite" que es la que utilizo para volcar la información de la matriz en un archivo wav, pero lo que me gustaría saber es si existe una función tal que teniendo un archivo wav ya existente volcar la información de una matriz en el mismo archivo agregando tal información al final del archivo wav ya existente (y no que lo sobrescriba), de modo que sólo sería necesario guardar en la memoria el contenido de un solo fragmento.
Sé que tiene que haber alguna forma, ya que no me parece muy lógico que la función "wavread" sí que permita leer y almacenar entera una canción de más de 4 minutos, pero que luego no pueda concatenar poco a poco la información que recoge de los fragmentos modificados (que es de hecho de menor tamaño si realizamos un aumento progresivo de la velocidad).
Un saludo y gracias por adelantado.
Valora esta pregunta


0