2009-07-29 23 views
6

Este es mi problema de hobby de "fin de semana".muestras de audio de 8 bits a 16 bit

Tengo algunas formas de onda de ciclo único muy apreciadas de las ROM de un sintetizador clásico.

Estas son muestras de 8 bits (256 valores posibles).

Como son solo 8 bits, el nivel de ruido es bastante alto. Esto se debe a un error de cuantificación. El error de cuantificación es bastante extraño. Desordena todas las frecuencias un poco.

Me gustaría tomar estos ciclos y hacer versiones "limpias" de 16 bits de ellos. (Sí, sé que a la gente le encantan las versiones sucias, así que dejaré que el usuario interpole entre sucio y limpio al grado que quiera.)

Parece imposible, claro, porque he perdido los 8 bits bajos para siempre , ¿derecho? Pero esto ha estado en la parte posterior de mi cabeza por un tiempo, y estoy bastante seguro de que puedo hacerlo.

Recuerde que se trata de formas de onda de ciclo único que se repiten una y otra vez para la reproducción, por lo que este es un caso especial. (Por supuesto, el sintetizador hace todo tipo de cosas para que el sonido sea interesante, incluyendo envolventes, modulaciones, filtros de fundido cruzado, etc.)

Para cada muestra de bytes individuales, lo que realmente sé es que es uno de 256 valores en la versión de 16 bits. (Imagine el proceso inverso, donde el valor de 16 bits se trunca o se redondea a 8 bits.)

Mi función de evaluación está tratando de obtener el mínimo ruido de fondo. Debería poder juzgar eso con una o más FFT.

Las pruebas exhaustivas probablemente llevarían una eternidad, así que podría tomar una primera resolución de baja resolución. ¿O simplemente presiono aleatoriamente valores elegidos aleatoriamente (dentro de los valores conocidos que mantendrían la misma versión de 8 bits) y realizo la evaluación y mantengo la versión más limpia? ¿O hay algo más rápido que pueda hacer? ¿Estoy en peligro de caer en los mínimos locales cuando podría haber algunos mínimos mejores en otra parte del espacio de búsqueda? He tenido que pasar en otras situaciones similares.

¿Hay alguna conjetura inicial que pueda hacer, tal vez al mirar los valores vecinos?


Editar: Varias personas han señalado que el problema es más fácil si elimino el requisito de que la nueva forma de onda sería probar con el original. Es verdad. De hecho, si solo estoy buscando sonidos más limpios, la solución es trivial.

+0

No soy de ninguna manera un experto en DSP, pero una breve búsqueda (http://www.google.com/search?&q=improve++audio++bit+rate) publicó algunos documentos: http://www2.computer.org/portal/web/csdl/doi?doc=abs/proceedings/icme/2001/1198/00/11980031abs.htm, http://iwaenc05.ele.tue.nl/proceedings/papers/S04 -02.pdf. Tal vez eso te da algunas ideas para el próximo fin de semana ;-) –

+0

Gracias divo! Leeré esos. – Nosredna

+0

La mayoría de los documentos que he encontrado hablan de baja frecuencia de muestreo. Solo unos pocos hablan sobre la recuperación del error de cuantificación. Todavía no he decidido si voy a pensar en el error de frecuencia de muestreo, ya que ya tengo un buen interpolador de calidad de audio. – Nosredna

Respuesta

1

Siguiendo con el enfoque de su pregunta, le sugiero que investigue algoritmos de alpinismo y cosas por el estilo.

http://en.wikipedia.org/wiki/Hill_climbing tiene más información y la ventana lateral tiene enlaces a otros algoritmos que pueden ser más adecuados.

AI es como la alquimia: nunca alcanzamos el objetivo final, pero salieron muchas cosas buenas en el camino.

+0

Eso es exactamente lo que pretendo. Mi estrategia habitual es que por pase I 1) Elija cuántos números va a variar. 2) Decide un rango de movimiento aleatorio para cada uno. 3) Genera un azar en ese rango. 4) Haz la evaluación y decide si comenzar de nuevo allí. Eso generalmente me mantiene fuera de los minutos locales. – Nosredna

2

Puede poner su muestra de 8 bits existente en el byte de alto orden de su nueva muestra de 16 bits y luego usar el byte de orden bajo en linear interpolate algunos nuevos puntos de datos de 16 bits entre cada muestra original de 8 bits.

Esto esencialmente conectaría una línea recta de 16 bits entre cada una de sus muestras originales de 8 bits, utilizando varias muestras nuevas. Suena mucho más silencioso que lo que tienes ahora, que es un salto repentino de 8 bits entre las dos muestras originales.

También puede intentar aplicar algunos low-pass filtering.

+0

Eso fue lo primero que hice. ;-) Primero probé lineal, luego cambié a un método mejor. Hace un poco de limpieza solo porque cuando golpeas entre las muestras, funciona mejor. Es un poco mejor que en bruto, pero realmente no aborda el hecho de que los puntos, gracias al error de cuantificación, están en el lugar equivocado. – Nosredna

+0

Tal vez estoy obteniendo una sugerencia incorrecta, ¿pero no duplicaría la velocidad de muestreo en lugar de mejorar la relación S/N? –

+0

Del mismo modo, el paso bajo elimina el ruido elevado, pero no ayuda al ruido en la parte superior de la señal. Y, por supuesto, afecta la fase. Básicamente, todos estos viejos sintetizadores tenían paso bajo de todos modos. Realmente voy detrás del error de cuantificación hardcore aquí. :-) Pero gracias por las sugerencias. – Nosredna

1

Bueno, esperaría un poco de filtrado FIR (IIR si realmente necesita ciclos de procesamiento, pero FIR puede dar mejores resultados sin inestabilidad) para limpiar el ruido. Tendría que jugar con él para obtener el efecto que desea, pero el problema básico es suavizar los bordes afilados en el audio creado al muestrearlo con resoluciones de 8 bits. Daría un amplio nacimiento a la frecuencia central del audio y haría un filtro de paso bajo, y luego escucharía para asegurarme de que no lo haga sonar "plano" con el filtro que elegí.

Aunque es duro, hay mucho que se puede hacer, se pierden los 8 bits inferiores, lo mejor que se puede hacer es aproximarlo.

Es casi imposible deshacerse del ruido que se parece a su señal. Si comienzas a tweeking en tu banda de frecuencia, eliminará la señal de interés.

Para el muestreo superior, ya que está utilizando una FFT, puede agregar ceros al final de la señal de dominio de frecuencia y realizar una FFT inversa. Esto conserva por completo la información de frecuencia y fase de la señal original, aunque difunde la misma energía en más muestras. Si cambias 8bits para que sean muestras de 16 bits primero, esto no será demasiado problema. Pero normalmente lo pateo por un factor de ganancia entero antes de hacer la transformación.

Pete

Editar: Los comentarios están un poco largo, así que moverán a algunos a la respuesta.

Los picos en la salida FFT son picos armónicos causados ​​por la cuantificación. Tiendo a pensar en ellos de manera diferente que el piso de ruido. Puede teclear cuando alguien menciona y elimina la amplitud de los picos de armónicos y aplanar el piso de ruido, pero pierde toda la señal a ruido en la parte plana de su piso de ruido. En lo que se refiere a la FFT. Cuando interpola utilizando ese método, retiene la misma energía y se propaga en más muestras, esto reduce la amplitud. Entonces, antes de hacer lo inverso, dale a tu señal más energía multiplicándola por un factor de ganancia.

¿Las señales son sinusoides simples/complejas, o tienen bordes duros? es decir, triángulo, ondas cuadradas, etc. Supongo que tienen continuidad de ciclo a ciclo, ¿es eso válido? Si es así, también puede aumentar su resolución FFT para precisar con mayor precisión las frecuencias aumentando la cantidad de ciclos de forma de onda alimentados a su FFT. Si puede identificar con precisión el uso de frecuencias, suponiendo que sean algo discretas, puede recrear completamente la señal deseada.

El requisito de truncamiento de 16 bits a 8 bits producirá resultados que no coinciden con la fuente original. (Por lo tanto, hacer que encontrar una respuesta óptima sea más difícil.) Normalmente, produciría una forma de onda de punto fijo intentando "obtener la coincidencia más cercana", lo que significa redondear al número más cercano (el enlace es una operación de piso). Es muy probable que se hayan generado originalmente. Agregar 0.5 (en este caso 0.5 es 128) y luego truncar la salida le permitiría generar resultados más precisos. Si eso no es una preocupación, entonces está bien, pero definitivamente tendrá un efecto negativo en la precisión.

ACTUALIZADO: ¿Por qué? Porque el objetivo de muestrear una señal es poder reproducir lo más cerca posible de la señal. Si el umbral de conversión se establece de manera deficiente en el muestreo, todo lo que está error es hacia un lado de la señal y no está bien distribuido y centrado alrededor de cero.En tales sistemas, normalmente intenta maximizar el uso del rango dinámico disponible, especialmente si tiene baja resolución, como un ADC de 8 bits.

¿Versiones limitadas de banda? Si se filtran a diferentes frecuencias, sospecho que es para permitir que reproduzcas el mismo sonido sin distorsiones cuando te alejas demasiado de la otra variación. Un poco como mipmapping en gráficos. Sospecho que las dos son de la misma señal con diferentes filtros de aliasing aplicados, esto puede ser útil en la reproducción del original. Deberían ser la misma señal de base con diferentes convoluciones aplicadas.

+0

Afortunadamente, mirando la señal, en la mayoría de los casos es bastante obvio: el ruido no se parece a la señal. Me doy cuenta de que no puedo recuperar la señal actual, pero me alegra dejar el ruido fuera del alcance audible. Sé que podría hacer la FFT inversa. Mi objetivo es poder dividir las muestras de 16 bits entre 256 y tener los mismos datos con los que comencé. Es por eso que estaba preocupado por la FFT inversa. ¿Puedes explicar lo último que dijiste sobre la necesidad de aumentar la ganancia? No entendí lo que querías decir allí. – Nosredna

+0

Mi idea es que _todos los resultados de 16 bits que obtengo y que pueden truncarse en los ciclos originales de 8 bits es "válido" en el sentido de que era una entrada posible. Pero hay picos de señal claros (-ish) rodeados por este piso de ruido que no estaba allí en el sonido que se grabó. Lo sé por las entrevistas con creadores de sintetizadores de la época, que pasaron a los DAC de 12 y 16 bits tan pronto como pudieron. – Nosredna

+0

No hay picos de cuantización. Al menos no demasiados y no demasiado alto. Realmente es más como un piso de ruido. He hecho trituración de bits y efectos de cuantificación, así que estoy bastante familiarizado con el ruido que recibes como resultado. Para las muestras que tengo, las formas de onda que tienen bordes duros a menudo tienen una segunda versión de banda limitada para ser utilizada en registros superiores. No sé suficiente historia para saber cómo fueron creados. Si fuera por la ruta inversa de FFT, aún me aseguraría de poder obtener de 16 bits a 8 bits tomando la palabra alta. Ese es un requisito. – Nosredna

1

Puede haber un enfoque simple aprovechando la periodicidad de las formas de onda. ¿Qué tal si:

  1. Hacer una forma de onda de 16 bits en los bytes altos son la forma de onda y los bytes bajos son cero - llamarlo x [n].

  2. Calcula la transformada de Fourier discreta de x [n] = X [w].

  3. Haga una señal Y [w] = (dBMag (X [w])> Umbral)? X [w]: 0, donde dBMag (k) = 10 * log10 (real (k)^2 + imag (k)^2), y el umbral es tal vez de 40 dB, basado en 8 bits con un rango dinámico de aproximadamente 48 dB, y permitiendo ~ 1.5 bits de ruido.

  4. Invertir transformar Y [w] para obtener y [n], su nueva forma de onda de 16 bits.

  5. Si y [n] no suena nada bien, difúndalo con un nivel de ruido muy bajo.

Notas:

A. Esta técnica sólo funciona en las formas de onda originales son exactamente periódica!

B. El paso 5 podría reemplazarse con el establecimiento de los valores "0" al ruido aleatorio en Y [w] en el paso 3, tendría que experimentar un poco para ver qué funciona mejor.

Esto parece más fácil (al menos para mí) que un enfoque de optimización. Pero truncado y [n] probablemente no sea igual a sus formas de onda originales. No estoy seguro de cuán importante es esa restricción. Siento que este enfoque generará formas de onda que suenan bien.

+0

La restricción es crucial. Quiero poder tener formas de onda que muestrearán hasta 8 bits y coinciden. De lo contrario, el problema es fácil. Pero pensaré sobre esto. – Nosredna

+0

Quizás podría hacer un enfoque de optimización donde la función de costo es minimizar | y [n] - x [n] | + | Y [w] |, y el espacio de búsqueda es el valor "0" de Y [w]. El | y [n] - x [n] | parte de la función de costo mantendría y [n] haciendo coincidir x [n] en los bits de orden superior, y | Y [w] | parte empuja el piso de ruido hacia abajo. No sé cómo la optimización se ocuparía de la transformación inversa de Fourier entre el espacio de búsqueda y la función de costo. Tengo muy poca experiencia con las técnicas de optimización. – mtrw

Cuestiones relacionadas