2009-04-09 8 views
35

Mi piace pensare a come tutto può essere ed è rappresentato dai numeri. Ad esempio, il testo in chiaro è rappresentato da un codice come ASCII e le immagini sono rappresentate da valori RGB. Questi sono i modi più semplici per rappresentare testo e immagini.Come viene rappresentato l'audio con i numeri?

Qual è il modo più semplice in cui l'audio può essere rappresentato con i numeri? Voglio imparare come scrivere programmi che funzionano con l'audio e ho pensato che sarebbe stato un buon modo per iniziare. Non riesco a trovare alcuna buona spiegazione su Internet, però.

risposta

73

Fisicamente, come probabilmente sapete, l'audio è una vibrazione. In genere, siamo parlando di vibrazioni d'aria tra circa 20 Hz e 20.000 Hz. Ciò significa che l'aria si sposta avanti e indietro da 20 a 20.000 volte per secondo.

Se si misura tale vibrazione e la si converte in un segnale elettrico (ad esempio, utilizzando un microfono), si otterrà un segnale elettrico con la tensione che varia nella stessa forma d'onda del suono. Nella nostra tonalità pura ipotetica, quella forma d'onda corrisponderà a quella della funzione seno.

Ora, abbiamo un segnale analogico, la tensione. Ancora non digitale. Ma, noi sappiamo che questa tensione varia tra (per esempio) -1V e + 1V. Possiamo, di corso , collegare un voltmetro ai fili e leggere la tensione.

Arbitrariamente, cambieremo la scala sul nostro voltmetro. Avremo più volt da 32767. Ora chiama -1V -32767 e + 1V . Oh, e arriverà al numero intero più vicino.

Ora colleghiamo il nostro voltmetro a un computer e chiediamo al computer di leggere il contatore a 44.100 volte al secondo, al numero . Aggiungi un secondo voltmetro (per l'altro canale stereo ), e ora abbiamo i dati che vanno su un CD audio .

Questo formato è chiamato stereo 44,100 Hz, PCM lineare a 16 bit. Ed è davvero lo solo un mucchio di misure di tensione.

+0

Spiegazione molto bella, grazie! –

+1

Tecnicamente parlando si tratta di una serie di misurazioni di ampiezza. Accade semplicemente che la maggior parte degli ADC usano la tensione per rappresentare l'ampiezza. –

+1

@SteveKuo tecnicamente parlando, è corretto, ma sembra aggiungere che in qualsiasi modo significativo complicherebbe notevolmente la questione. E poiché questo non è un sito di ingegneria elettrica ... – derobert

3

Penso che i campioni della forma d'onda a una frequenza di campionamento specifica sarebbero la rappresentazione di base.

+0

http://en.wikipedia.org/wiki/Audio_file_format sembra indicare anche questo – Jimmy

+0

Corretto - il termine tecnico per questo è "modulazione del codice di impulso lineare". –

2

Hai mai visto una forma d'onda da vicino? L'asse Y è semplicemente rappresentato come un intero, tipicamente in 16 bit.

8

L'audio può essere rappresentato da campioni digitali. In sostanza, un campionatore (chiamato anche convertitore da analogico a digitale) acquisisce un valore di un segnale audio ogni 1/fs, dove fs è la frequenza di campionamento. L'ADC, quindi quantizza il segnale, che è un'operazione di arrotondamento. Pertanto, se il segnale è compreso tra 0 e 3 Volt (intervallo di scala completo), verrà arrotondato un campione, ad esempio un numero a 16 bit. In questo esempio, un numero a 16 bit viene registrato una volta ogni 1/fs/

Quindi, ad esempio, la maggior parte dei WAV/MP3 sono campionati con un segnale audio a 44 kHz. Non so come i dettagli si desidera, ma c'è questa cosa chiamata "Frequenza di campionamento di Nyquist" dice che la frequenza di campionamento deve essere almeno il doppio della frequenza desiderata. Quindi nel tuo file WAV/MP3 sei nel migliore dei casi in grado di sentire le frequenze di tp 22 kHz.

C'è un sacco di dettagli che puoi visitare in quest'area. La forma più semplice sarebbe sicuramente il formato WAV. È un audio non compresso. Formati come mp3 e ogg devono essere decompressi prima di poter lavorare con loro.

2

Cerca cose come la conversione analogico-digitale. Questo dovrebbe iniziare. Questi dispositivi possono convertire un segnale audio (onde sinusoidali) in rappresentazioni digitali. Quindi, un ADC a 16 bit sarebbe in grado di rappresentare un seno compreso tra -32768 e 32768. Questo è in virgola fissa. È anche possibile farlo in virgola mobile (sebbene non consigliato per motivi di prestazioni, ma potrebbe essere necessario per motivi di autonomia). L'opposto (conversione analogico-digitale) avviene quando convertiamo i numeri in onde sinusoidali. Questo è gestito da qualcosa chiamato DAC.

2

Penso che un buon modo per iniziare a giocare con l'audio sarebbe con Processing e Minim. Questo programma disegnerà lo spettro di frequenza del suono dal tuo microfono!

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

Il modo più semplice per rappresentare il suono come numeri è PCM (Pulse Code Modulation). Ciò significa che l'ampiezza del suono è registrata ad una frequenza impostata (ciascun valore di ampiezza è chiamato campione). Il suono di qualità CD, ad esempio, è costituito da campioni a 16 bit (in stereo) alla frequenza di 44100 Hz.

Un campione può essere rappresentato come un numero intero (di solito 8, 12, 16, 24 o 32 bit) o ​​un numero in virgola mobile (16 bit float o 32 bit double). Il numero può essere firmato o non firmato.

Per campioni con firma a 16 bit, il valore 0 sarebbe nel mezzo e -32768 e 32767 sarebbero gli amplitui massimi. Per campioni a 16 bit senza segno il valore 32768 si trova nel mezzo e 0 e 65535 sarebbero le ampiezze massime.

Per i campioni in virgola mobile il formato normale è che 0 è nel mezzo e -1,0 e 1,0 sono le ampiezze massime.

I dati PCM possono quindi essere compressi, ad esempio utilizzando MP3.

+0

Potrebbe valere la pena notare che quando si rappresenta il suono come numeri interi, i valori minimo e massimo sono assoluti; se il suono viene elaborato attraverso più passaggi e qualsiasi passo supera tale ampiezza, il ritaglio risulterà [suono generalmente molto duro]. Quando si passa l'audio in virgola mobile attraverso più fasi di elaborazione, è probabile che il ritaglio si verifichi se l'audio finale ha valori al di fuori dell'intervallo +/- 1.0, ma gli stadi intermedi potrebbero uscire da tale intervallo senza causare il clipping. – supercat

2

Esempio minimo C generazione audio

L'esempio seguente genera un puro sinusale 1000K Hz in formato raw. A 44,1 kHz frequenza di campionamento, durerà 4 secondi:

#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; 
} 

Giocare con:

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

Parametri spiegato a: https://superuser.com/a/1063230/128124

testato su Ubuntu 15.10. Più fun examples on GitHub, incluso un semplice sintetizzatore Canon.

Fisica

audio è codificato come numero unico per ogni momento nel tempo. Confrontalo con un video, che richiede un numero di WIDTH * HEIGHT per momento nel tempo.

Questo numero viene poi convertito allo spostamento lineare del diaphragm dell'altoparlante:

| /
|/
|-/ 
| | A I R 
|-\ 
| \ 
| \ 
<-> displacement 

| /
| /
|---/ 
| | A I R 
|---\ 
| \ 
|  \ 
<---> displacement 

|  /
| /
|-----/ 
|  | A I R 
|-----\ 
|  \ 
|  \ 
<-----> displacement 

Lo spostamento dell'aria spinge avanti e indietro, creando differenze di pressione, che viaggiano attraverso l'aria come P-waves.

Solo lo spostamento ha importanza: un segnale costante, anche se massimale, non produce alcun suono: il diaframma rimane in posizione fissa.

Il sampling frequency determina la velocità con cui devono essere eseguiti gli spostamenti.

44,1kHz è una frequenza di campionamento comune perché gli esseri umani possono udire fino a 20kHz e a causa dello Nyquist–Shannon sampling theorem.

La frequenza di campionamento è analoga a quella dell'FPS per video, sebbene abbia un valore molto più alto rispetto alla gamma 25 (cinema) - 144 (monitor da gioco hardcore) che comunemente vediamo per i video.

Formati

.raw è un formato underspecified contenente solo i byte di ampiezza, e non metadati.

Dobbiamo passare alcuni parametri di meta-dati sulla riga di comando come la frequenza di campionamento perché il formato non contiene quei dati.

Esistono anche altri formati non compressi che contengono tutti i metadati necessari, ad es. , vedere: WAV File Synthesis From Scratch - C

In pratica, tuttavia, la maggior parte delle persone si occupa esclusivamente di formati compressi, che rendono i file/streaming molto più piccoli. Alcuni di questi formati prendono in considerazione le caratteristiche dell'orecchio umano per comprimere ulteriormente l'audio in modo smorzato.

Biologia

gli esseri umani percepiscono il suono per lo più da loro decomposizione frequenza (AKA Fourier transform).

Penso che questo sia dovuto al fatto che l'orecchio interno ha parti che risuonano a frequenze diverse (conferma TODO).

Pertanto, quando sintetizziamo la musica, pensiamo di più in termini di aggiunta di frequenze anziché di punti nel tempo. Questo è illustrato in this example.

Questo porta a pensare in termini di un vettore 1D tra 20Hz e 20kHz per ogni punto nel tempo.

La trasformata di Fourier matematica perde la nozione di tempo, quindi ciò che facciamo quando si sintetizza è prendere gruppi di punti e sommare le frequenze per quel gruppo e prendere lì la trasformata di Fourier.

Fortunatamente, la trasformata di Fourier è lineare, quindi è possibile sommare e normalizzare direttamente gli spostamenti.

La dimensione di ciascun gruppo di punti porta a un compromesso di precisione in termini di tempo, mediato dalla stessa matematica di Heisenberg's uncertainty principle.

Wavelets può essere una descrizione matematica più precisa di questa descrizione intermedia di tempo/frequenza.

1

Ci sono 2 passaggi coinvolti nella conversione dell'audio analogico reale in una forma digitale.

  1. campionamento
  2. Quantization

campionamento

La velocità alla quale viene campionato una forma d'onda continua (in questo caso, audio), è chiamata la frequenza di campionamento. La gamma di frequenza percepita dall'uomo è 20 - 20.000 Hz. Tuttavia, i CD usano il teorema di campionamento di Nyquist, che significa frequenza di campionamento di 44.100 Hz, copre le frequenze nell'intervallo 0 - 22.050Hz.

Quantization

L'insieme discreto di valori ricevuti dalla fase 'campionamento' ora hanno bisogno di essere convertito in un numero finito di valori. Una quantizzazione a 8 bit fornisce 256 valori possibili, mentre una quantizzazione a 16 bit fornisce fino a 65.536 valori.

0

Le risposte riguardano tutte la frequenza di campionamento, ma non risolvono la domanda. Immagino che un'istantanea particolare di un suono includa ampiezze individuali per un sacco di frequenze diverse (ad esempio, si colpisce sia una A che una C simultaneamente su una tastiera, con A più forte). Come viene registrato in un numero a 16 bit? Se tutto ciò che si sta facendo è misurare l'ampiezza (quanto è alto il suono), come si ottengono le note diverse?

Ah! Penso di averlo capito da questo commento: "Questo numero viene quindi convertito nello spostamento lineare del diaframma del tuo altoparlante." Le note appaiono dalla velocità con cui il diaframma sta vibrando. Ecco perché hai bisogno dei 44.000 valori diversi al secondo. Una nota è da qualche parte dell'ordine di 1000 hertz, quindi una nota pura farebbe entrare e uscire il diaframma circa 1000 volte al secondo. Una registrazione di un intero orchestratore ha molte note diverse dappertutto, e che miracolosamente può essere convertita in una singola storia del movimento del diaframma. 44.000 volte al secondo il diaframma viene istruito a muoversi dentro o fuori un po ', e quella semplice (lunga) lista di numeri può rappresentare Beyonce a Beethoven!

Problemi correlati