2008-12-14 41 views
34

Estoy buscando recursos, enlaces, etc. para comenzar a trabajar programáticamente con audio.Comenzando con audio programático

Específicamente, la plataforma con la que estoy trabajando expone las API para extraer datos de audio de un recurso (como un MP3), o para reproducir datos arbitrarios como audio. En ambos casos, los datos reales son conjuntos de bytes de flotadores de 32 bits que representan 44.1 KHz estéreo. Lo que estoy buscando es ayudar a entender qué representan esos flotadores, y qué tipo de cosas se pueden hacer con ellos para analizar o modificar dinámicamente el sonido que representan.

¿Alguien puede recomendar sitios/tutoriales/referencias para ayudar a asimilar este tipo de cosas?

+0

audio PCM: http: //en.wikipedia .org/wiki/Pulse-code_modulation – some

+0

Básicamente, cada valor de 32 bits representa el nivel de voltaje en un momento específico.Como la frecuencia de muestreo es 44100Hz, obtienes 441000 valores de 32 bits por segundo por canal (* 2 porque tienes estéreo) – some

+0

Con los sonidos estéreo, el canal izquierdo y derecho suele estar intercalado para que la primera muestra represente el canal izquierdo y el segundo la derecha , y así. – some

Respuesta

95

Como algunos han señalado en los comentarios, lo que desea investigar es PCM audio.

En pocas palabras, sound es una onda que viaja por el aire. Para capturar ese sonido, usamos un microphone, que contiene una membrana que vibrará cuando las ondas de sonido lo golpeen. Esta vibración se traduce en una señal eléctrica, donde el voltaje sube y baja. Este cambio de voltaje se cambia a una señal digital mediante un analog-to-digital converter (ADC) al muestrear un cierto número de veces por segundo ("sampling rate" - 44 KHz, o 44,100 muestras por segundo) y, en el caso actual, almacenado como datos de audio modulados por impulsos de código (PCM).

A speaker funciona en opuesto; la señal PCM se convierte a analógica por digital-to-analog converter (DAC), luego la señal analógica va al altavoz donde vibrará una membrana que produce vibraciones en el aire que producen sonido.

Manipulación de audio

Hay muchas bibliotecas que hay para muchos idiomas que se pueden manipular audio con, sin embargo, que ha marcado esta pregunta como "independiente del idioma", voy a mencionar unas cuantas formas sencillas (¡Es todo lo que sé!) que podrá manipular el audio en su idioma preferido.

Voy a presentar los ejemplos de código en pseudocódigo.

El pseudocódigo tendrá cada muestra de audio con una amplitud en el rango de -1 a 1. Esto dependerá del tipo de datos que esté utilizando para almacenar cada muestra. (No he tratado con 32 bits float s antes, por lo que este puede ser diferente.)

amplificación

Con el fin de amplificar el sonido, (por lo tanto, aumentar el volumen del sonido) se Querrá hacer que la vibración de los altavoces sea más grande para que la magnitud de la onda de sonido se incremente.

Con el fin de hacer que los altavoces se mueven más, tendrá que aumentar el valor de cada muestra:

original_samples = [0, 0.5, 0, -0.5, 0] 

def amplify(samples): 
    foreach s in samples: 
     s = s * 2 

amplified_samples = amplify(original_samples) 

// result: amplified_samples == [0, 1, 0, -1, 0] 

Las muestras resultantes están amplificadas por 2, y en la reproducción, se deben sonar mucho más fuerte de lo que era antes

Silencio

Cuando no hay vibraciones, no hay sonido. El silencio puede ser logrado por dejar caer cada muestra a 0, o a cualquier valor específico, pero no tiene ningún cambio en la amplitud entre las muestras:

original_samples = [0, 0.5, 0, -0.5, 0] 

def silence(samples): 
    foreach s in samples: 
     s = 0 

silent_samples = silence(original_samples) 

// result: silent_samples == [0, 0, 0, 0, 0] 

Reproducción de lo anterior debe resultar en ningún sonido, como la membrana en el el altavoz no se mueve en absoluto, debido a la falta de cambio en la amplitud de las muestras.

velocidad arriba y abajo

exceso de velocidad cosas arriba y hacia abajo se puede lograr de dos maneras: (1) el cambio de la frecuencia de muestreo de reproducción o (2) el cambio de las propias muestras.

Al cambiar la velocidad de muestreo de reproducción de 44100 Hz a 22050 Hz, disminuirá la velocidad de reproducción en 2. Esto hará que el sonido sea más lento y el tono más bajo. Yendo desde una fuente de 22 KHz y reproduciendo a 44 KHz, el sonido será muy rápido y agudo, como el canto de los pájaros.

Cambio de las propias muestras (y de mantenimiento de una velocidad de muestreo de reproducción constante) significa que las muestras ya sea (a) son arrojados fuera o (b) se añaden en.

Para acelerar la reproducción del audio, tirar muestras:

original_samples = [0, 0.1, 0.2, 0.3, 0.4, 0.5] 

def faster(samples): 
    new_samples = [] 
    for i = 0 to samples.length: 
     if i is even: 
      new_samples.add(samples[i]) 
    return new_samples 

faster_samples = faster(original_samples) 

// result: silent_samples == [0, 0.2, 0.4] 

el resultado del programa anterior es que el audio se acelerará en un factor de 2, similar a la reproducción de un archivo de audio que se muestrea a 22 KHz a 44 KHz.

a ralentizar la reproducción del audio, el tiro en algunas muestras:

original_samples = [0, 0.1, 0.2, 0.3] 

def slower(samples): 
    new_samples = [] 
    for i = 0 to samples.length: 
     new_samples.add(samples[i]) 
     new_samples.add(interpolate(s[i], s[i + 1])) 
    return new_samples 

slower_samples = slower(original_samples) 

// result: silent_samples == [0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3] 

Aquí, se añadieron muestras adicionales, por lo que ralentizan la reproducción. Aquí, tenemos una función interpolation que hace una "conjetura" sobre cómo completar ese espacio adicional que tanto se debe agregar.

Análisis y Spectrum Sonidos Modificación por FFT

Usando una técnica llamada Fast Fourier transform (FFT), los datos de sonido en el dominio de tiempo de amplitud pueden ser mapeados al dominio de frecuencia-tiempo para averiguar los componentes de frecuencia de audio. Esto se puede utilizar para producir el spectrum analyzers que puede ver en su reproductor de audio favorito.

No sólo eso, ya que ahora tiene los componentes de frecuencia del sonido, si cambia la cantidad de

Si quieres corte de ciertas frecuencias, puede utilizar FFT para transformar los datos de sonido en el dominio de frecuencia-tiempo, y poner a cero los componentes de frecuencia que no son deseados.Esto se llama filtering.

Cómo hacer una high-pass filter, que permite a frecuencias por encima de una cierta frecuencia se pueden realizar de esta manera:

data = fft(orignal_samples) 

for i = (data.length/2) to data.length: 
    data[i] = 0 

new_samples = inverse_fft(data) 

En el ejemplo anterior, todas las frecuencias de más de la mitad del camino es de corte. Por lo tanto, si el audio puede producir 22 KHz como la frecuencia máxima, se cortará cualquier frecuencia superior a 11 KHz. (Para audio reproducido a 44 KHz, la frecuencia teórica máxima que se puede producir es de 22 KHz. Consulte Nyquist–Shannon sampling theorem.)

Si desea hacer algo como aumentar el rango de baja frecuencia (similar al efecto de refuerzo de graves) , tomar el extremo inferior de los datos FFT-transformado y aumentar su magnitud:

data = fft(orignal_samples) 

for i = 0 to (data.length/4): 
    increase(data[i]) 

new_samples = inverse_fft(data) 

Este ejemplo aumenta el cuarto inferior de los componentes de frecuencia del audio, que conduce a las bajas frecuencias a ser más fuerte.


Hay muchas cosas que se pueden hacer a las muestras para manipular el audio. ¡Solo adelante y experimenta! Es la forma más emocionante de aprender.

¡Buena suerte!

+3

Wow ... Si tan solo pudiera responder las respuestas favoritas;) – TraumaPony

+0

Ctrl + D (las preguntas en SO tienen URL únicas si no estoy equivocado ...) –

+0

¡Guau, excelente respuesta! Por cierto, su pseudo código se parece mucho a Python;) –

4

Parece que usted quiere saber más sobre PCM audio

En principio, cada valor de 32 bits representa el nivel de tensión en un momento determinado. Dado que la frecuencia de muestreo es 44100Hz, obtiene 441000 valores de 32 bits por segundo por canal (* 2 porque tiene estéreo)

Con sonidos estéreo, el canal izquierdo y derecho suele estar intercalado para que la primera muestra represente el canal izquierdo y el segundo la derecha, y así sucesivamente.

3

Para comprender qué representan esas matrices de flotadores de 32 bits, necesita leer una buena introducción al audio digital.

Si está cerca de una biblioteca, 'The Computer Music Tutorial' de Curtis Roads puede ser útil. Específicamente el capítulo uno 'Conceptos de audio digital'. (Ha pasado mucho tiempo desde que leí este libro).

Una vez que tenga una comprensión del audio digital, hay muchas maneras de manipularlo. Cuando esté listo, estos enlaces pueden ayudar.

El Dsp + Plugin Development forum at KVR Audio es un lugar para hacer preguntas. Las publicaciones aquí generalmente se dividen entre los temas generales de audio DSP y plugin VST.

MusicDsp tiene una gran cantidad de fragmentos de código.

The Scientist and Engineer's Guide to Digital Signal Processing Es un libro de texto en línea gratuito que profundiza en los temas estándar de DSP. Gran parte de lo cual también se aplica al audio digital.

1

He publicado una pregunta similar recientemente: good audio dsp tutorials.

El enlace de oro es ciertamente The Audio EQ Cookbook, si quiere escribir y entender los ecualizadores, pero en general, el musicdsp.org archive es el mejor recurso que he encontrado para la codificación de audio DSP.

He aquí un video de un sintetizador ("Soundoid") que co-hechos en Flash: http://www.youtube.com/watch?v=O-1hHiA7y4o

Y se puede jugar con él aquí: http://www.zachernuk.com/2011/03/28/soundoid-audio-synthesizer-v0-5/