reproducir - ¿Cómo se representa el audio con números?
insertar audio mp3 en html (10)
¿Alguna vez has mirado una forma de onda de cerca? El eje Y simplemente se representa como un entero, generalmente en 16 bits.
Me gusta pensar cómo todo puede ser y está representado por números. Por ejemplo, texto plano está representado por un código como ASCII, y las imágenes están representadas por valores RGB. Estas son las formas más simples de representar texto e imágenes.
¿Cuál es la forma más sencilla en que el audio se puede representar con números? Quiero aprender a escribir programas que funcionan con audio y pensé que sería una buena forma de comenzar. Sin embargo, parece que no puedo encontrar buenas explicaciones en Internet.
Audio puede representado por muestras digitales. Esencialmente, un muestreador (también llamado convertidor analógico a digital) toma el valor de una señal de audio cada 1 / fs, donde fs es la frecuencia de muestreo. El ADC, luego cuantifica la señal, que es una operación de redondeo. Entonces, si su señal varía de 0 a 3 voltios (rango de escala completa), entonces se redondeará una muestra a, por ejemplo, un número de 16 bits. En este ejemplo, se registra un número de 16 bits una vez cada 1 / fs /
Entonces, por ejemplo, la mayoría de los WAV / MP3 se muestrean como una señal de audio a 44 kHz. No sé cómo detalle desea, pero hay una cosa llamada la "Tasa de muestreo de Nyquist" que dice que la frecuencia de muestreo debe ser al menos el doble de la frecuencia deseada. Por lo tanto, en su archivo WAV / MP3, en el mejor de los casos podrá escuchar frecuencias de hasta 22 kHz.
Hay muchos detalles que puede entrar en esta área. La forma más simple sería sin duda el formato WAV. Es audio sin comprimir. Los formatos como mp3 y ogg deben descomprimirse antes de poder trabajar con ellos.
Busca cosas como la conversión analógico-digital. Eso debería hacerte comenzar. Estos dispositivos pueden convertir una señal de audio (ondas sinusoidales) en representaciones digitales. Entonces, un ADC de 16 bits podría representar un seno de entre -32768 a 32768. Esto es en punto fijo. También es posible hacerlo en punto flotante (aunque no se recomienda por motivos de rendimiento, pero puede ser necesario por razones de rango). Lo contrario (conversión digital-analógica) ocurre cuando convertimos los números a ondas sinusoidales. Esto es manejado por algo llamado DAC.
Creo que las muestras de la forma de onda en una frecuencia de muestreo específica serían la representación más básica.
Creo que una buena manera de comenzar a jugar con audio sería con Processing y Minim . ¡Este programa dibujará el espectro de frecuencias del sonido de su micrófono!
import ddf.minim.*;
import ddf.minim.analysis.*;
AudioInput in;
FFT fft;
void setup()
{
size(1024, 600);
noSmooth();
Minim.start(this);
in = Minim.getLineIn();
fft = new FFT(in.bufferSize(), in.sampleRate());
}
void draw()
{
background(0);
fft.forward(in.mix);
stroke(255);
for(int i = 0; i < fft.specSize(); i++)
line(i*2+1, height, i*2+1, height - fft.getBand(i)*10);
}
void stop()
{
in.close();
Minim.stop();
super.stop();
}
Físicamente, como probablemente sabrá, el audio es una vibración. Normalmente, estamos hablando de vibraciones de aire entre aproximadamente 20Hz y 20,000Hz. Eso significa que el aire se mueve hacia adelante y hacia atrás de 20 a 20,000 veces por segundo.
Si mides esa vibración y la conviertes en una señal eléctrica (digamos, usando un micrófono), obtendrás una señal eléctrica con el voltaje variando en la misma forma de onda que el sonido. En nuestro hipotético tono puro, esa forma de onda coincidirá con la de la función senoidal.
Ahora, tenemos una señal analógica, el voltaje. Aún no es digital. Pero, sabemos que este voltaje varía entre (por ejemplo) -1V y + 1V. Podemos, por supuesto, conectar un voltímetro a los cables y leer el voltaje.
Arbitrariamente, cambiaremos la escala en nuestro voltímetro. Multiplicaremos los voltios por 32767. Ahora llama -1V -32767 y + 1V 32767 . Oh, y redondeará al número entero más cercano.
Ahora, conectamos nuestro voltímetro a una computadora, e instruimos a la computadora para que lea el medidor 44.100 veces por segundo. Agregue un segundo voltímetro (para el otro canal estéreo), y ahora tenemos los datos que van en un CD de audio.
Este formato se llama estéreo de 44,100 Hz, PCM lineal de 16 bits . Y realmente es solo un montón de mediciones de voltaje.
Hay dos pasos involucrados en la conversión de audio analógico real en una forma digital.
- Muestreo
- Cuantificación
Muestreo
La velocidad a la que se muestrea una forma de onda continua (en este caso, audio) se denomina velocidad de muestreo. El rango de frecuencia percibido por los humanos es de 20 a 20,000 Hz. Sin embargo, los CD usan el teorema de muestreo de Nyquist, lo que significa una frecuencia de muestreo de 44,100 Hz, cubre frecuencias en el rango de 0 - 22,050Hz.
Cuantificación
El conjunto discreto de valores recibidos de la fase ''Muestreo'' ahora debe convertirse en un número finito de valores. Una cuantificación de 8 bits proporciona 256 valores posibles, mientras que una cuantización de 16 bits proporciona hasta 65.536 valores.
La forma más sencilla de representar el sonido como números es PCM (Pulse Code Modulation). Esto significa que la amplitud del sonido se graba a una frecuencia establecida (cada valor de amplitud se denomina muestra). El sonido con calidad de CD, por ejemplo, muestra 16 bits (en estéreo) a la frecuencia 44100 Hz.
Una muestra se puede representar como un número entero (generalmente 8, 12, 16, 24 o 32 bits) o un número de coma flotante (flotante de 16 bits o doble de 32 bits). El número puede estar firmado o sin firmar.
Para muestras firmadas de 16 bits, el valor 0 estaría en el medio, y -32768 y 32767 serían las amplitudes máximas. Para muestras de 16 bits sin signo, el valor 32768 estaría en el medio, y 0 y 65535 serían las amplitudes máximas.
Para las muestras de punto flotante, el formato habitual es que 0 está en el medio, y -1.0 y 1.0 son las amplitudes máximas.
Los datos del PCM pueden comprimirse, por ejemplo, usando MP3.
Todas las respuestas se relacionan con la frecuencia de muestreo, pero no abordan la pregunta. Una instantánea particular de un sonido, imagino, incluiría amplitudes individuales para muchas frecuencias diferentes (digamos que golpeas una A y una C simultáneamente en un teclado, con la A siendo más alta). ¿Cómo se registra eso en un número de 16 bits? Si todo lo que estás haciendo es medir la amplitud (qué tan fuerte es el sonido), ¿cómo obtienes las diferentes notas?
Ah! Creo que lo entiendo de este comentario: "Este número se convierte luego en el desplazamiento lineal del diafragma de su altavoz". Las notas aparecen por la velocidad con que el diafragma está vibrando. Es por eso que necesita los 44,000 valores diferentes por segundo. Una nota está en el orden de 1000 hertz, por lo que una nota pura haría que el diafragma se moviera hacia adentro y hacia afuera unas 1000 veces por segundo. Una grabación de una orquesta entera tiene muchas notas diferentes por todo el lugar, y milagrosamente se puede convertir en una historia única de movimiento de diafragma. ¡44,000 veces por segundo se le indica al diafragma que se mueva hacia adentro o hacia afuera un poco, y esa simple (larga) lista de números puede representar a Beyonce para Beethoven!
Ejemplo de generación de audio Minimal C
El siguiente ejemplo genera un seno puro de 1000 kHz en formato sin formato. A una frecuencia de muestreo de 44.1kHz, durará 4 segundos:
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
int main(void) {
FILE *f;
const double PI2 = 2 * acos(-1.0);
const double SAMPLE_FREQ = 44100;
const unsigned int NSAMPLES = 4 * SAMPLE_FREQ;
uint16_t ampl;
uint8_t bytes[2];
unsigned int t;
f = fopen("out.raw", "wb");
for (t = 0; t < NSAMPLES; ++t) {
ampl = UINT16_MAX * 0.5 * (1.0 + sin(PI2 * t * 1000.0 / SAMPLE_FREQ));
bytes[0] = ampl >> 8;
bytes[1] = ampl & 0xFF;
fwrite(bytes, 2, sizeof(uint8_t), f);
}
fclose(f);
return EXIT_SUCCESS;
}
Jugar con:
gcc -std=c99 a.c -lm
./a.out
sudo apt-get install ffmpeg
ffplay -autoexit -f u16be -ar 44100 -ac 1 out.raw
Parámetros explicados en: https://superuser.com/a/1063230/128124
Probado en Ubuntu 18.04. Más ejemplos divertidos en GitHub , incluido un simple sintetizador de Canon.
Física
El audio está codificado como un número único para cada momento en el tiempo. Compárelo con un video, que necesita ANCHURA * ALTURA números por momento en el tiempo.
Este número luego se convierte al desplazamiento lineal del diaphragm de su altavoz:
| /
| /
|-/
| | A I R
|-/
| /
| /
<-> displacement
| /
| /
|---/
| | A I R
|---/
| /
| /
<---> displacement
| /
| /
|-----/
| | A I R
|-----/
| /
| /
<-----> displacement
El desplazamiento empuja el aire hacia atrás y hacia adelante, creando diferencias de presión, que viajan a través del aire como P-waves
Solo el desplazamiento es importante: una señal constante, aunque sea máxima, no produce ningún sonido: el diafragma simplemente permanece en una posición fija.
La frecuencia de muestreo determina qué tan rápido deben hacerse los desplazamientos.
44,1kHz es una frecuencia de muestreo común porque los humanos pueden escuchar hasta 20kHz y debido al teorema de muestreo Nyquist-Shannon .
La frecuencia de muestreo es análoga a la FPS para video, aunque tiene un valor mucho más alto en comparación con la gama de 25 (cine) - 144 (monitores de juegos hardcore) que comúnmente vemos para video.
Formatos
.raw
es un formato no especificado que contiene solo los bytes de amplitud y sin metadatos.
Tenemos que pasar algunos parámetros de metadatos en la línea de comandos como la frecuencia de muestreo porque el formato no contiene esos datos.
También hay otros formatos sin comprimir que contienen todos los metadatos necesarios, por ejemplo, .wav
, consulte: WAV File Synthesis From Scratch - C
Sin embargo, en la práctica, la mayoría de las personas maneja exclusivamente formatos comprimidos, lo que hace que los archivos / la transmisión sean mucho más pequeños. Algunos de esos formatos tienen en cuenta las características del oído humano para comprimir aún más el audio de una manera con pérdida.
Biología
Los humanos perciben el sonido principalmente por su descomposición de frecuencia (también conocida como transformada de Fourier ).
Creo que esto se debe a que el oído interno tiene partes que resuenan a diferentes frecuencias (confirmación TODO).
Por lo tanto, al sintetizar música, pensamos más en términos de sumar frecuencias en lugar de puntos en el tiempo. Esto se ilustra en este ejemplo .
Esto lleva a pensar en términos de un vector 1D entre 20Hz y 20kHz para cada punto en el tiempo.
La transformación matemática de Fourier pierde la noción de tiempo, entonces lo que hacemos al sintetizar es tomar grupos de puntos, y sumar las frecuencias para ese grupo, y tomar la transformada de Fourier allí.
Afortunadamente, la transformada de Fourier es lineal, por lo que podemos simplemente sumar y normalizar los desplazamientos directamente.
El tamaño de cada grupo de puntos conduce a una compensación de precisión de frecuencia de tiempo, mediada por las mismas matemáticas que el principio de incertidumbre de Heisenberg .
Wavelets puede ser una descripción matemática más precisa de esta descripción de frecuencia de tiempo intermedia.