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!
audio PCM: http: //en.wikipedia .org/wiki/Pulse-code_modulation – some
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
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