Retrasa la reproducción de música mientras se mantiene la frecuencia

10

La reproducción de una pieza de audio musical a una velocidad más lenta reduciría su tono (frecuencia). ¿Existe una herramienta y una teoría para ralentizar la reproducción de la canción mientras se mantiene la frecuencia? Supongo que uno puede hacer transformada de Fourier en ventana o transformada wavelet. Parece que uno tiene que preseleccionar el tamaño de la ventana o elegir dinámicamente la base de wavelet. ¿Existe alguna teoría y aplicación específica y detallada para hacerlo?

Hans
fuente
1
Además de la respuesta proporcionada a continuación, consulte este enlace para obtener más información.
A_A

Respuestas:

5

Sí, algunos de nosotros podemos hacerlo, puedes acelerar o reducir la velocidad sin afectar el tono, algunos chicos llaman a esto aplicaciones de Time Stretch, hay diferentes formas de hacerlo, puedes hacerlo en el dominio de la frecuencia o el dominio del tiempo, tendrás que elegir lo que es mejor para usted, encontrará algunas ventajas y desventajas de cada uno.

Dominio del tiempo:

En Time Domain puedes probar algunas técnicas como:

  • TDHS (escala armónica de dominio de tiempo)
  • SOLA (adición de superposición síncrona)
  • PSOLA (Pitch Synchronous Overlap Add)
  • WSOLA (adición de superposición de similitud de forma de onda)

Pros: es rápido, algunos algoritmos son fáciles de entender, de buena calidad en sonidos monofónicos.

Contras: en general, necesitará una pista de tono muy buena para empalmar en la posición correcta, es difícil de hacer :-(, por lo que si su pista de tono falla o no funciona en sonidos polifónicos, estos algoritmos darán muchos fallos / artefactos en el sonido de salida.

Dominio de la frecuencia:

Todo el tiempo que conozco en el dominio de la frecuencia se basa en técnicas de vocoder de fase .

Pros: funcionará en sonidos polifónicos o monofónicos.

Contras: puede ser doloroso comprender todas las matemáticas, la implementación es un poco difícil, no es tan rápida como los códigos de dominio de tiempo, para la voz prefiero los resultados de dominio de tiempo, algunos trucos para mejorar el resultado del codificador de voz de fase estándar no se comparten.

Puedo decir que la ventana y el tamaño del salto son una de las claves para la calidad del codificador de fase, generalmente elegimos la 4xsuperposición para la resíntesis, una ventana de tamaño de hann 4096es suficiente para mis oídos (por supuesto, si tiene potencia de procesamiento para estos tamaños) , el codificador de voz de fase estándar puede agregar algunos efectos reverberantes, para tratar de evitar este tipo de problemas que tal vez necesite bloquear la fase.

Para datailed echar un vistazo en el Miller Puckette y Portnoff papel

ederwander
fuente
Gracias por su respuesta. ¿Cuál es el problema con los enfoques más ingenuos ?: expandir la señal de tiempo en conjunto como una función en todo el intervalo de tiempo sin ventanas en series de Fourier y multiplicar todas las frecuencias por una constante. Entiendo que cualquier error local en el dominio del tiempo afectaría todos los coeficientes de Fourier. Aparte de eso, ¿cuáles son las trampas de este enfoque ingenuo no localizado?
Hans
Nunca he intentado algo así, puede funcionar, el problema obvio es que esto puede ser bastante costoso, ciertamente no es una forma eficiente, imagina que tienes una pieza de audio (1 minuto) muestreada a 44100Hz, ahora para haga lo que está proponiendo, tendrá que aplicar Fourier en 44100 * 60 = 2646000puntos a la vez y procesar, así que olvídese de cualquier intento de procesamiento en tiempo real como este ,
ederwander
1
No creo que lo que sugerí antes funcionaría en sentido matemático puro (sin tener en cuenta el costo y la sensibilidad al error).
Hans
3

La herramienta / teoría que describe es realmente un gran área de investigación en tecnología musical, en términos generales llamada modificación de escala de tiempo de audio. Un componente importante de este campo es cómo puede evitar cambios audibles en la frecuencia después del estiramiento. Esto puede abordarse con métodos de dominio de frecuencia y tiempo, dependiendo de las restricciones u objetivos de su aplicación. La entrada de wikipedia para la modificación de escala de tiempo / tono de audio es un buen punto de partida.

Si desea seguir un enfoque utilizando la base de frecuencia / wavelet, el tamaño de su ventana y la elección de la base afectarán qué tan bien puede localizar la señal. Para usar el STFT como ejemplo, una ventana larga funcionará bien para sinusoides estacionarios pero destruirá sus transitorios. Una ventana más corta proporcionará una respuesta transitoria preferible a costa de la localización del dominio de frecuencia. El rendimiento de otras bases wavelet dependerá de la naturaleza de la proyección de su señal en la base.

Rápido
fuente
Muchas gracias por la respuesta. ¿Tiene alguna referencia sobre la aplicación de wavelet a este problema?
Hans
Por favor, vea mi comentario debajo de la respuesta de ederwander también. Gracias.
Hans
2

A continuación hay un enlace a una función tutorial simple y valiosa en C ++ (smbPitchShift.cpp) de Stephan M. Bernsee, que puede ralentizar o acelerar la música sin cambiar su tono.

Él ha lanzado este código bajo la licencia The Wide Open License (WOL). Dentro de mi aplicación, pude adaptar su función para ralentizar la música en tiempo real , es decir, al reproducir un archivo mp3 y al mismo tiempo hacer una detección de tono en esa señal mp3.

También he incluido un enlace al sitio web de Bernsee que contiene sus descripciones detalladas sobre el estiramiento de tiempo y el cambio de tono de las señales de audio, como la música.

https://github.com/AndyA/BatPhone/blob/master/pitchshift.c

http://blogs.zynaptiq.com/bernsee/time-pitch-overview/

James Paul Millard
fuente
El código original no se aplica time stretch, se aplica el código original Pitch Shift, en este caso para aplicar la modificación de la escala de tiempo deberá combinar Pitch Shifit + Resample (interpolation), el código de Bernsee funciona bien usando una ventana de tamaño 4096que podrá cambiar de tono una octava (arriba o abajo) , significa que en consecuencia solo podrá hacer una escala de tiempo con una buena calidad utilizando factores entre 2.0x-0.5x, un vocoder de fase bien construido puede lograr mejores resultados usando el mismo tamaño de ventana, y podrá extrapolar estos factores con mejor calidad
ederwander
Oops, ahora recordando que tuve que aplicar Re-Sampling para completar el período de tiempo, para que el tono original no se alterara. Parece que Bernsee ha creado algunos cambios en su código desde la versión vinculada a GitHub. Su código más reciente está disponible para su descarga desde su sitio web; puede aumentar el rango de cambio de su especificación original. Modifiqué su código original para poder aumentar el cambio 8 veces.
James Paul Millard
no hay diferencias entre su código y la página de Bernsee, la matemática principal sigue siendo la misma, la gran diferencia que puedo ver es el tamaño de la ventana = 8192en los códigos de la página de descarga, por lo que debe hacer 4 veces más puntos para el procesamiento , Vuelvo a decir que con la mitad del tamaño de la ventana 8192/2=4096puede hacer lo mismo usando algunos secretos del codificador de voz de fase, el punto aquí es que puede mantener la calidad con mucho menos procesamiento.
ederwander
Aunque proporcioné el enlace de GitHub a BatPhone, NO es mi código. Acabo de sacarlo de una búsqueda en Internet para ver smbPitchShift (). Mi código está muy modificado de la versión de Bernsee, y residía en este archivo: github.com/CreativeDetectors/PitchScope_Player/blob/master/Src/…
James Paul Millard
Sí, ahora puedo ver, es realmente una muestra, puede que te interese ver / escuchar mi vocoder de fase en acción.
ederwander