2009-04-09 20 views
35

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.¿Cómo se representa el audio con números?

¿Cuál es la manera más simple 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.

Respuesta

73

Físicamente, como probablemente sepa, el audio es una vibración. Por lo general, somos 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 segundos.

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, la tensión. Aún no es digital. Pero, sabemos que este voltaje varía entre (por ejemplo) -1V y + 1V. Podemos, del curso , conectar un voltímetro a los cables y leer el voltaje.

Arbitrariamente, cambiaremos la escala de nuestro voltímetro. Multiplicaremos los voltios por 32767. Ahora llama a -1V -32767 y + 1V . Oh, y redondeará al número entero más cercano.

Ahora, conectamos nuestro voltímetro a una computadora, e instruimos a la computadora a , 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.

+0

Muy buena explicación, gracias! –

+1

Técnicamente hablando, es un conjunto de mediciones de amplitud. Simplemente sucede que la mayoría de los ADCs usan voltaje para representar la amplitud. –

+1

@SteveKuo técnicamente hablando, eso es correcto, pero parece que agregar eso de cualquier manera significativa complicaría el problema en gran medida. Y dado que este no es un sitio de ingeniería eléctrica ... – derobert

3

creo muestras de la forma de onda a una frecuencia específica de la muestra sería la representación más básica.

+0

http://en.wikipedia.org/wiki/Audio_file_format parece indicar esto también – Jimmy

+0

Correcto - el término técnico para esto es "modulación de código de pulso lineal". –

2

¿Alguna vez has mirado una forma de onda de cerca? El eje Y simplemente se representa como un entero, generalmente en 16 bits.

8

Audio puede representarse 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, un número de 16 bits se graba una vez cada 1/fs/

Así, por ejemplo, la mayoría de WAV/MP3 se toman muestras de audio en una señal de 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 un montón de 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.

2

Busque cosas como 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.

2

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(); 
} 
4

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 punto flotante (float 16 bits o 32 bits doble). El número puede estar firmado o sin firmar.

Para muestras con signo de 16 bits el valor 0 habría en el medio, y -32768 y 32767 serían los amplitues máximo. 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 se encuentra en el medio, y -1,0 y 1,0 son las amplitudes máximas.

Los datos de PCM se pueden comprimir, por ejemplo, utilizando MP3.

+0

Puede valer la pena señalar que al representar el sonido como enteros, los valores mínimo y máximo son absolutos; si el sonido se procesa a través de varios pasos y cualquier paso excedería esa amplitud, se producirá un recorte [generalmente un sonido muy fuerte]. Al pasar audio de coma flotante a través de múltiples pasos de procesamiento, es probable que se produzca clipping si el audio final tiene valores fuera del rango +/- 1.0, pero las etapas intermedias pueden salir de ese rango sin causar clipping. – supercat

2

Minimal ejemplo generación audio C

En el ejemplo siguiente genera un seno 1000k Hz puro en formato RAW. A una velocidad de muestreo de 44,1 kHz, que tendrá una duración de 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 & 8; 
     fwrite(bytes, 2, sizeof(uint8_t), f); 
    } 
    fclose(f); 
    return EXIT_SUCCESS; 
} 

Juega con:

sudo apt-get install ffmpeg 
ffplay -autoexit -f u16be -ar 44100 -ac 1 out.raw 

parámetros que se describen en: https://superuser.com/a/1063230/128124

probado en Ubuntu 15.10. Más fun examples on GitHub, incluido un simple sintetizador Canon.

Física

audio se codifica 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 se convierte después en el desplazamiento lineal de la 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.

Sólo 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.

El sampling frequency determina qué tan rápido deben realizarse los desplazamientos.

44,1kHz es una frecuencia de muestreo común porque los humanos pueden escuchar hasta 20kHz y debido a Nyquist–Shannon sampling theorem.

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 subespecificada que contiene sólo los bytes de amplitud, y no hay 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 esa información.

También hay otros formatos sin comprimir que contienen todos los metadatos necesarios, p. .wav, ver: WAV File Synthesis From Scratch - C

En la práctica, sin embargo, la mayoría de la gente se ocupa exclusivamente de 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 seres humanos perciben el sonido sobre todo por su descomposición frecuencia (También conocido como Fourier transform).

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 in this example.

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, por lo que 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 Heisenberg's uncertainty principle.

Wavelets puede ser una descripción matemática más precisa de esta descripción de tiempo-frecuencia intermediaria.

1

La conversión de audio análogo real a formato digital consta de 2 pasos.

  1. muestreo
  2. Cuantización

muestreo

La velocidad a la que se muestrea una forma de onda continua (en este caso, audio), se denomina la tasa 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.

Cuantización

El conjunto discreto de valores recibidos desde la fase de 'muestreo' ahora tienen que ser convertidos 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.

0

Todas las respuestas se refieren a 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!

Cuestiones relacionadas