Pregunta

Este es mi " fin de semana " problema de hobby.

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).

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

Me gustaría tomar estos ciclos y hacer " limpiar " Versiones de 16 bits de ellas. (Sí, sé que a la gente le encantan las versiones sucias, así que dejaré que el usuario interpole entre lo sucio y lo limpio en la medida que lo desee).

Suena imposible, ¿verdad? Porque perdí los 8 bits bajos para siempre, ¿verdad? Pero esto ha estado en la parte de atrás de mi cabeza por un tiempo, y estoy bastante seguro de que puedo hacerlo.

Recuerde que estas son formas de onda de un solo ciclo 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 hacer que el sonido sea interesante, incluyendo envolventes, modulaciones, filtros de fundido cruzado, etc.).

Para cada muestra de bytes individual, lo que realmente sé es que es uno de los 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 del piso. Debería poder juzgar eso con uno o más FFT.

Las pruebas exhaustivas probablemente tardarían una eternidad, por lo que podría dar un primer paso de menor resolución. ¿O simplemente presiono aleatoriamente los valores elegidos aleatoriamente (dentro de los valores conocidos que mantendrían la misma versión de 8 bits) y hago la evaluación y mantengo la versión más limpia? ¿O hay algo más rápido que puedo hacer? ¿Estoy en peligro de caer en mínimos locales cuando podría haber mejores mínimos en otras partes del espacio de búsqueda? He tenido que suceder en otras situaciones similares.

¿Puedo hacer algunas conjeturas iniciales, tal vez mirando 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 muestrear al original. Es verdad. De hecho, si solo busco sonidos más limpios, la solución es trivial.

¿Fue útil?

Solución

Siguiendo el enfoque de su pregunta, sugeriría buscar algoritmos de escalada y similares.

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

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

Otros consejos

Puede poner su muestra de 8 bits existente en el byte de orden superior de su nueva muestra de 16 bits, y luego usar el byte de orden bajo para interpolación lineal algunos puntos de datos nuevos 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. Sonaría mucho más silencioso que lo que tiene ahora, que es un salto repentino de 8 bits entre las dos muestras originales.

También puedes probar a aplicar filtrado de paso bajo .

Bueno, esperaría algo 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 del audio creado al muestrear en resoluciones de 8 bits. Daría un amplio nacimiento a la frecuencia central del audio y hacía un filtro de paso bajo, y luego escuchaba para asegurarme de que no lo hiciera sonar "plano" con el filtro que elegí.

Sin embargo, es difícil, solo hay tanto que puedes hacer, cuanto menos se pierden los 8 bits, lo mejor que puedes hacer es aproximarte.

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

Para muestrear, ya que ya está usando una FFT, puede agregar ceros al final de la señal del dominio de la frecuencia y hacer una FFT inversa. Esto preserva completamente la información de frecuencia y fase de la señal original, aunque distribuye la misma energía en más muestras. Si lo cambias a 8 bits para que sea una muestra de 16 bits primero, esto no será demasiado problema. Pero generalmente lo hago por un factor de ganancia entero antes de hacer la transformación.

Pete

Editar: Los comentarios se están volviendo un poco largos, así que pasaré un poco 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 al piso de ruido. Puede vacilar como alguien mencionado y eliminar la amplitud de los picos armónicos y aplanar el piso de ruido, pero pierde toda señal de ruido en la parte plana de su piso de ruido. En lo que respecta a la FFT. Cuando se interpola utilizando ese método, retiene la misma energía y se extiende sobre más muestras, lo que reduce la amplitud. Entonces, antes de hacer lo inverso, dale más energía a tu señal multiplicándola por un factor de ganancia.

¿Son las señales 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 localizar con mayor precisión las frecuencias al aumentar el número de ciclos de forma de onda que alimenta su FFT. Si puede identificar con precisión las frecuencias de uso, suponiendo que sean un tanto discretas, podrá 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). Por lo general, produciría una forma de onda de punto fijo al intentar " obtener la coincidencia más cercana " eso significa redondear al número más cercano (el enlace es una operación de piso). Es muy probable que se hayan generado originalmente. La adición de 0.5 (en este caso 0.5 es 128) y luego el trunking de salida le permitirá 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é? Debido a que el objetivo del muestreo de una señal es poder reproducir la señal lo más cerca posible. Si el umbral de conversión está mal establecido en el muestreo, todo lo que está equivocando está en 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 una resolución baja, como un ADC de 8 bits.

¿Versiones limitadas de banda? Si se filtran en diferentes frecuencias, sospecho que fue para permitirte reproducir el mismo sonido sin distorsiones cuando te alejaste demasiado de la otra variación. Un poco como mipmapping en gráficos. Sospecho que los dos son la misma señal con diferentes filtros de alias aplicados, esto puede ser útil para reproducir el original. Deben ser la misma señal de base con diferentes convoluciones aplicadas.

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

  1. Cree una forma de onda de 16 bits donde los bytes altos son la forma de onda y los bytes bajos son cero; llámelo x [n].

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

  3. Hacer 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 que 8 bits son aproximadamente 48 dB de rango dinámico, y permitiendo ~ 1.5 bits de ruido.

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

  5. Si y [n] no suena bien, modifíquelo con un nivel de ruido muy bajo.

Notas:

A. Esta técnica solo funciona en las formas de onda originales, ¡son exactamente periódicas!

B. El paso 5 podría reemplazarse con la configuración de " 0 " de valores a ruido aleatorio en Y [w] en el paso 3, tendrías 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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top