2009-10-16 19 views
6

Hola, necesito reducir la frecuencia de muestreo de un archivo de audio wav de 44.1kHz a 8kHz. Tengo que hacer todo el trabajo manualmente con una matriz de bytes ... es para fines académicos.Java - archivo de audio wav de baja resolución

Actualmente estoy usando 2 clases, Sumidero y Fuente, para abrir y empujar matrices de bytes. Todo va bien hasta que llego a la parte en la que necesito reducir la resolución del fragmento de datos mediante una interpolación lineal.

Dado que estoy disminuyendo la resolución de 44100 a 8000 Hz, ¿cómo puedo interpolar una matriz de bytes que contiene algo así como 128 000 000 bytes? En este momento estoy sacando 5, 6 o 7 bytes dependiendo de i% 2 == 0, i% 2 == 1 e i% 80 == 0 y envío el promedio de estos 5, 6 o 7 bytes al nuevo archivo .

El resultado es de hecho un archivo de audio más pequeño que el original pero no se puede reproducir en Windows Media Player (dice que hay un error al leer el archivo) y hay mucho ruido aunque puedo escuchar el camino correcto el ruido.

Por lo tanto, para resumir, necesito ayuda con respecto a la parte de interpolación lineal. Gracias por adelantado.

+0

Será más fácil para nosotros ayudarlo a encontrar sus errores si publica el código que está utilizando ahora. –

Respuesta

7

Creo que no deberías usar el promedio de esas muestras, ya que sería un filtro mediano, no exactamente un muestreo descendente. Simplemente use cada 5ª/6ª/7ª muestra y escríbalo en el nuevo archivo.

Probablemente tenga algunos artefactos de aliasing pero en general podría ser reconocible.

Otra solución más compleja, pero probablemente una con mejores resultados, calidad-sabia, sería primero convertir sus muestras en una distribución de frecuencia usando una FFT o DFT y luego convertirla de nuevo con la frecuencia de muestreo adecuada. Ha pasado un tiempo desde que hice algo así, pero definitivamente es factible. Sin embargo, es posible que tengas que jugar un poco para que funcione correctamente.

También cuando no toma un FT de la matriz completa, sino que en segmentos tiene el problema de que los límites del segmento son 0. Hace unos años, cuando jugué con esas cosas, no encontré una solución viable para esta allí (ya que genera artefactos también), pero probablemente es uno si has leído los libros adecuados :-)

en cuanto a WMP quejándose del archivo: usted hizo modificar el encabezado se escribe en consecuencia, ¿verdad?

+0

Promover es probablemente una mala idea, sí. Usted podría simplemente hacer una muestra ascendente y luego reducir la resolución si desea menos artefactos de los que obtendría con tan solo recoger muestras. –

+2

Woah! Muchas gracias "Simplemente use cada 5ª/6ª/7ª muestra y escríbalo en el nuevo archivo" ¡es lo que corrigió todo mi problema! ¡No puedo creer que haya pasado horas en esto mientras que tardé exactamente 2 minutos en escribirlo! ¡Gracias de nuevo! –

+1

De nada :-) Si lo piensas, promediar es una * realmente * mala idea. La forma general completa de la forma de onda se pierde. Y eso es lo importante para nosotros para escuchar algo sensato :) – Joey

Cuestiones relacionadas