Film To Waw: Estrazione dell'Audio Fabio Galanti

Ultimo Aggiornamento 28 Febbraio 2013

Audio e pista ottica
Un nostro lettore: Massimo Renzi, mi ha inviato uno spezzone di alcuni metri di pellicola 16mm sonora, allo scopo di verificare la possibilità di estrarre l'audio dalla pista ottica presente all'interno della pellicola.

16mm Pista Sonora Ottica

La sfida è quella di estrarne il contenuto, simulando il funzionamento del proiettore 16mm che in realtà utilizza una fotocellula che è colpita da una luce che attraversa la pellicola posta dalla parte opposta della pellicola  sopra alla pista ottica che si vede in figura.
Tra la luce e la pellicola in realtà è posto un dispositivo ottico formato da alcune lenti che serve per uniformare la luce della lampada. Questo dispositivo è regolabile in modo da focalizzare la luce nel miglior modo possibile sulla pista ottica.

Ma come simulare questa cosa con il nostro software?
La prima cosa da considerare è che nel caso di un proiettore, ci si trova di fronte ad un sistema audio analogico, mentre con l'uso del SW, siamo in un certo modo obbligati a lavorare con segnali digitali, ovvero dobbiamo operare con una serie di campioni di segnale analogico, che per chi conosce un po' di matematica va sotto il nome di:

Teorema del Campionamento.

Pur non entrando in merito a complesse spiegazioni matematiche, e di Teoria dei Segnali, (per chi lo desidera può partire dal link che ho inserito) fornisco quelle informazioni base allo scopo di far capire a tutti, come si è operato.

Innanzitutto vediamo cosa dice il teorema del campionamento che sta alla base del suono digitale e quindi anche di questa parte del programma.

Un suono una musica un rumore in natura sono fatti come sappiamo da uno spostamento di particelle d'aria che vibrano stimolate a loro volta dalla vibrazione di una corda di violino, di una campana, dalle corde vocali, dalla membrana di un tamburo.
La particella d'aria messa in vibrazione dalla sorgente sonora, "sbatte" su quella vicina che a sua volta sbatte su quella successiva, formando di fatto un'onda sonora, simile se vogliamo alle onde che si propagano sulla superficie di uno stagno dopo che ci abbiamo fatto cadere un sasso dentro.

Come sappiamo queste onde sonore, colpiscono il timpano e lo mettono in vibrazione, permettendoci di percepire il suono. Questi segnali si dicono analogici, perchè son fatti da onde che hanno un andamento continuo anche se variano di intensità e frequenza in modo arbitrario.
Nei primi dispositivi di registrazione, questa variazione continua veniva registrata (ad esempio) su disco di vinile, incidendo la sua superficie in modo proporzionale all'andamento del segnale acustico in ingresso, oppure su nastro magnetico con una intensità di campo magnetico proporzionale ancora all'andamento del segnalo sonoro.
In realtà le cose sono sensibilmente più complesse, ma qui lo scopo è quello di far capire a tutti, anche i non tecnici.

Ma sappiamo che esiste un modo diverso per registrare i suoni, ovvero la Registrazione Digitale. Ma come funziona?
Anche in questo contesto cercheremo di dare le informazioni minime alla portata di tutti, rimandando al link precedente per chi vuole informazioni più dettagliate e precise.

La registrazione digitale si fonda nel concetto di memorizzare una serie di numeri, ovvero di valori detti campioni del segnale presi ad intervalli molto piccoli uno dall'altro, in modo da memorizzare non un segnale proporzionale a quello di partenza come detto per la registrazione analogica, ma una serie di numeri.

Il vantaggio? Beh in un computer che "mastica" solo numeri è l'unico modo possibile, mentre in generale su un CD o un DAT, rappresenta un ottimo modo per minimizzare l'influenza dei disturbi e raggiungere una qualità di segnale veramente alto a parità di costi dei dispositivi.
Non entro in merito al parallelo tra registrazione analogica e digitale perchè esula completamente dallo scopo di questa trattazione, ma entro in merito alla mia scelta di usare il digitale perchè come detto poc'anzi in un computer è l'unico modo possibile.

Ma cosa centra il Teorema del Campionamento con il segnale digitale?
Direi che ne è la base.

Questo teorema è qualcosa di straordinario perchè dice sostanzialmente questo. Se abbiamo un segnale sonoro (ma vale in realtà per qualunque segnale) posso evitare di registrarlo in modo continuo come in una cassetta magnetica di una volta, ma mi basta di prendere dei campioni del segnale, ovvero dei valori ad un cero istante di tempo l'uno dall'altro e basta.
In fase di riproduzione questi valori del segnale staccati uno dall'altro, mi permettono di ricostruire in modo pperfetto il segnale di partenza analogico. Fantastico no?
Faccio un esempio facile facile. Voglio registrare una canzone dal vivo. Ebbene uso un microfono seguito da un amplificatore e all'uscita ottengo una tensione che varia in modo proporzionale all'andamento delle vibrazioni delle particelle d'aria che compongono il suono.

Questa tensione invece di mandarla in pasto ad una testina di registrazione, la misuro in continuazione ed ogni valore letto lo memorizzo in una cella di memoria, ovvero lo campiono come detto in gergo.

Ma quanti campioni devo prendere? A questa domanda risponde il teorema del campionamento che ci dice che deve essere almeno (o superiore) al doppio della massima frequenza contenuta in questo segnale sonoro. Ad esempio il parlato che contiene tante frequenze non supera di norma i 4000Hz, ovvero vibrazioni delle particelle dell'aria che si muovono avanti e indietro 4000 volte ogni secondo.
Quindi sono sufficienti 8000 campioni di segnale sonoro composta da uno speaker  che parla per memorizzare perfettamente questo tipo di suono.

Molti di voi sanno che per la musica occorre memorizzare in genere molti più campioni al secondo. Ad esempio in un CD musicale vengono presi 44'100 campioni ogni secondo perchè si suppone che la muica non superi i 20'000Hz come frequenza, almeno per un orecchio comune.

Come estrarre  l'audio: Premessa
Questo piccolo preambolo è servito per cercare di capire come si è ragionato per estrarre l'audio dalla traccia visibile in figura.
Essendo tutto questo una sperimentazione, i presupposti da me fatti, potrebbero essere frutto di scelte sbagliate in partenza; non mi dispiacerebbe un vostro contributo in  tal senso.

La traccia ottica che si vede in figura, è composta da pixel bianchi (o meglio dire chiari) che come si nota si allargano e restringono per far passare più o meno luce del sensore ottico.
Questo può essere così sintetizzato. I pixel che si estendono in verticale (coordinata Y) rappresentano di fatto l'ampiezza del campione, quelli in orizzontale (coordinata X) di fatto il numero di campione.

Vediamo quanti campioni abbiamo per secondo.
Immaginando di scannerizzare a 4800 dpi si ha: 4800 punti per pollice equivale a 189 punti per millimetro.
La traccia è lunga circa 7,5 mm ogni fotogramma, ed essendo 24 ft/sec si ha che la lunghezza di un secondo di pellicola è pari a 7,5x24 ovvero 180 millimetri.
Quindi abbiamo 189X180 ovvero circa 34000 campioni. Se ci ricordiamo quello che dice il teorema del campionamento significa che dobbiamo supporre che la traccia audio del film abbia una banda non superiore ai 17KHz.
A mio avviso direi che possiamo (almeno per il momento prenderla per buona) anche perchè per migliorare la situazione non ci resta che aumentare la risoluzione o (pessima scelta) inventarci campioni per interpolazione (ma in questo caso non credo che matematicamente abbia un senso).

Come estrarre  l'audio: Ampiezza dei campioni
A questo punto entrano in gioco le scelte più strategiche. Il primo passo da fare è quello di individuare la traccia audiio. Alla stessa stregua di quanto fatto per individuare la posizione del fotogramma (si veda la sezione: Film To Avi) si è scelto di partire dall'individuazione della posizione del dentino, visto che la traccia audio si posiziona sempre ad una distanza ben determinabile, facendo in modo di ampliare il programma FilmToAvi, aggiungendo una nuova sezione specifica per l'audio.

 Film to Wav

Come si vede dalla maschera è possibile indicare al programma la posizione relativa della traccia audio, rispetto al dentino della pellicola.
La versione del programma visibile nella foto è in bozza, visto che serve al momento solo per le sperimentazioni.

In fase di test similmente a quanto avviene con la parte relativa alla cattura del frame, si apre una maschera che permette di vedere se i parametri impostati sono corretti.

Estrazione Wav

Anche se la risoluzione è bassa, si può vedere una sottile riga rossa che ha correttamente intercettato la traccia audio. Nella figura in basso un dettaglio ingrandito.

Dettaglio Pista Ottica

Come si nota il programma ha tracciato alcune righe con questi significati.

La traccia centrale rossa, indica la posizione della traccia audio ottica, determinata dalla posizione del dentino di riferimento e dal parametro immesso dall'utente nel campo: <Position X> espresso in decimi di millimetro. Non è fondamentale che si trovi esattamente al centro della traccia, è solo importante che si trovi però in zona bianca, perché dimostra che abbiamo immesso correttamente il valore sulla maschera di configurazione <Position Y> che rappresenta la posizione della traccia audio, rispetto al dentino corrispondente della pellicola.

Le due tracce viola invece devono essere posizionate completamente nella zona nera, ovvero non devono intercettare la modulazione per non inficiare la lettura del campione. La loro posizione ha un'ampiezza pari a quanto indicato nel campo: <Height> di Track, anch'esso espresso in decimi di millimetro. I valori di ogni singolo campione vengono calcolati tra queste due linee viola, dove la linea rossa centrale rappresenta la mediana tra queste due rette.

Nel programma è stato introdotto un sistema autocorrettore anche per la traccia audio. Funziona in questo modo: se le traccie viola intercettano la modulazione, viene automaticamente (rispettivamente) alzata e abbassata la loro posizione rispetto a quella impostata, fino a ricadere nella zona nera. In sostanza si aumenta artificialmente l'ampiezza verticale impostata sulla maschera in figura, ma non in modo simmetrico; ovvero l'operazione è fatta in modo indipendente per le due linee viola, fino a quando ciascuna delle due cade completamente nella zona nera.
Per evidenziare questa correzione, durante la fase di test, viene visualizzata sia la linea viola impostata dall'utente, sia una rossa ricalcolata.

La traccia Gialla ha il solo scopo di indicare graficamente l'andamento dei campioni calcolati e in qualche modo deve avere un andamento simile al bordo della traccia ottica.

La traccia ottica in realtà non è perfettamente simmetrica nella parte superiore e inferiore, visto che si tratta di un segnale stereo. Per semplicità al momento sommeremo le due tracce insieme, trasformando il segnale stereo in mono.
Il valore del campione segue quindi la media dei bordi della traccia audio.  

Per calcolarne il valore si possono scegliere vari metodi. Al momento si è scelto una soluzione semplice, ovvero si conta quanti punti più chiari ci sono tra le due linee viola.
Immaginiamo che X sia l'asse orizzontale e Y quello verticale. In questo modo un determinato valore di X, mi rappresenta l'X-esimo campione.

A parità di coordinata X, partendo dal punto y appartenente alla linea viola inferiore e raggiungendo la linea y superiore si controllano tutti i punti di questo immaginario segmento verticale e se la luminosità di questo punto è maggiore di quanto indicato nel parametro <Brigthness> viene conteggiato, altrimenti no. In questo modo non è critica la posizione della linea rossa, che difficilmente si riesce a posizionarla esattamente al centro della traccia audio ottica, visibile in figura.

Una volta determinati i valori di tutti i campioni si opera in questo modo. Si memorizza il valore più alto e più basso trovati e da questi due si determina il valore medio che viene posto come zero. Questo significa che i campioni sopra a questo valore medio sono da considerarsi positivi, gli altri negativi.
Questo modo di determinare il riferimento zero non è molto corretto, visto che probabilmente andrebbe calcolato tramite una media effettiva dei valori, ma al momento per semplicità è stata fatta questa scelta.

Dal valore medio trovato si calcolano i valori effettivi, sottraendo a ciascun campione il valore medio, che quindi assume sia valore positivo che negativo a seconda se si trova sopra o sotto rispettivamente al valore medio.

Come estrarre  l'audio: Formato Wav
Per costruire un file wav occorre inizialmente sapere come è composto. Il file WAV è un file di byte, composto da una intestazione formata da 44 elementi che servono per informare il programma lettore che dovrà eseguirlo, di come è costituito.

Le informazioni fondamentali sono:

- Stereo o Mono (Mono nel nostro caso)
- Bit per codificare ciascun campione (16 bit nel nostro caso)
- Bitrate, ovvero quanti campioni per ogni secondo (34'000 nel nostro caso)
- Numero di campioni totale

Ricordo che un CD Audio è composta da una traccia stereo a 16 bit, con 44100 campioni al secondo per ogni canale.

Senza entrare nel significato di ogni Byte dell'intestazione del file wav, i principali sono, considerando il primo pari a Zero:

- 22=1 (per indicare mono, altrimenti sarebbe dovuto essere 2)
- 24-27 (usati per indicare il bitrate 34'000 nel nostro caso)
- 34 (usato per indicare i bit di codifica, ovvero 16 nel nostro caso)

Per memorizzare i singoli campioni invece, siccome abbiamo scelto una codifica a 16bit, dovremmo usare 2 Byte e spacchettare quindi il valore tra byte alto e basso. Inoltre siccome i campioni contengono valori negativi, prima dello spacchettamento si opera un complemento a due di tutti i valori, che come noto è una delle tecniche più diffuse per memorizzare numeri negativi.
I campioni nel file wav partono quindi dal 44 byte (0-43 usati per l'intestazione) ed essendo il segnale mono a 16 bit, il primo campione è memorizzato nei byte 44 e 45 (basso e alto) il secondo nel 46 e 47 e così via.

Prima di scrivere i campioni nel file WAV si opera tuttavia in questo modo. Siccome si è impostato di lavorare a 16 bit, si opera su tutti i campioni in modo da espanderli al loro massimo possibile, senza tuttavia superare il massimo valore rappresentato da 16 bit (ovvero 65535).

I valori negativi vengono invece convertiti come previsto dai file WAV in complemento a due, ovvero ci si somma il valore 65536.

Qui il fle:  Audio16mm.wav che abbiamo ottenuto da queste prime prove.

Continua.....