Lezione 15 Analisi e risintesi: phase vocoder Programmazione timbrica - Prof. Luca A. Ludovico Elaborazione del suono con analisi/risintesi • Il processo di analisi e risintesi si compone dei seguenti passi: 1. un file audio viene analizzato tramite un programma per l’analisi. I risultati vengono posti in un file di analisi; 2. il file di analisi può essere modificato in modo che alcune caratteristiche del suono non corrispondano più a quelle originali; 3. il file di analisi viene utilizzato come modello per risintetizzare il suono, tornando dunque alla produzione di un file audio. Le eventuali modifiche al passo 2 si ripercuoteranno nel risultato. • Esempi di applicazione: – allungare o abbreviare la durata di un suono senza modificarne la frequenza (time stretching) – cambiare la frequenza di un suono senza alterarne la durata (pitch shifting) Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Analisi e risintesi in Csound • Esistono numerosi metodi e algoritmi di analisi e risintesi. • Csound ne supporta nativamente 3: – Phase vocoder (basato su FFT) – Analisi con filtro a eterodina – Predizione lineare, o LPC • Per ciascuno di questi metodi, Csound mette a disposizione un programma di analisi, supporta un tipo di file di analisi e prevede un metodo di risintesi con specifici opcode. Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Phase vocoder: introduzione • Un phase vocoder è un tipo di vocoder in grado di riscalare segnali audio sia nel dominio della frequenza sia in quello del tempo utilizzando informazione di fase. – Tipici esempi di modifica sono l’espansione/compressione temporale e il pitch shifting. • Il termine vocoder nasce dalla contrazione dei termini inglesi voice ed encoder, e indica i dispositivi elettronici o programmi capaci di codificare un qualsiasi segnale audio attraverso i parametri di un modello matematico. Originariamente si trattava di codec per l’analisi e la sintesi di segnale vocale umano. Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Phase vocoder: basi matematiche • Alla base di un phase vocoder si trova la trasformata di Fourier a tempo breve (short-time Fourier transform, o STFT), utilizzata per determinare il contenuto frequenziale e la fase delle sinusoidi su sezioni locali di un segnale variabile nel tempo, e dunque non stazionario. • Una STFT converte la rappresentazione di un suono nel dominio del tempo in una rappresentazione tempo-frequenza durante la fase di analisi, consentendo modifiche alle ampiezze e fasi di specifiche componenti frequenziali del suono. La risintesi con il passaggio dal dominio della frequenza a quello del tempo ha luogo tramite la STFT inversa. L’evoluzione temporale del suono risintetizzato può essere modificata tramite la modifica della posizione temporale dei frame STFT prima della risintesi, consentendo variazioni sulla scala temporale del suono originario. Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Finestre e fotogrammi (windows e frames) • La STFT consente di dividere un segnale audio in finestre di tempo (windows) la cui dimensione varia in genere tra 1 ms e 300 ms. Il segnale viene suddiviso in parti di breve durata che vengono analizzate separatamente. L’insieme delle finestre viene analizzato tramite una FFT, generando così tanti insiemi di dati detti fotogrammi (frames). • L’obiettivo del programma pvanal è analizzare un file audio e generare una serie di fotogrammi, salvati in un file di analisi con estensione fft (in Windows) o pv (in Mac). • Tipicamente si lavora su file mono, e nel caso di segnali audio multicanale si sceglie un solo canale. Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Il frame size • Il frame size, ossia il numero di punti (campioni) per fotogramma, è un fattore chiave per ottenere una buona analisi del suono originale. Migliore è l’analisi, più vicina all’originale sarà la risintesi. • Dalla scelta del frame size dipendono: – – la definizione in termini di frequenza (larghezza di banda dei canali di frequenza); la definizione in termini di tempo (intervallo di tempo) • Purtroppo si tratta di fare una scelta di compromesso, in quanto ad una maggiore risoluzione in termini di frequenza corrisponde una minore risoluzione in termini di tempo, e viceversa (vedi slide successive) • Il frame size deve sempre essere una potenza di 2. Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Considerazioni sulla frequenza • L’analisi viene fatta dividendo tutto lo spettro in canali di frequenza. La larghezza di banda lb dei canali, uguale per ciascun canale, si ottiene dividendo la frequenza di campionamento sr per il frame size fs: lb = sr / fs • Di conseguenza, maggiore è fs, minore diventa lb. Se la larghezza di banda diminuisce, lo spettro viene “coperto” da un numero maggiore di bande strette e quindi l’analisi si fa più raffinata in termini frequenziali. Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Phase vocoder e frequenza: esempio 1 • Si consideri un suono campionato a 44100 Hz e fs = 1024 punti. lb = sr / fs = 44100 / 1024 = 43,06 Hz • L’analisi verrà compiuta dividendo il file in canali di circa 43 Hz, da 0 a 22050 Hz (frequenza di Nyquist, sr / 2). Quindi: primo canale 0 – 43 Hz secondo canale 43 – 86 Hz terzo canale 86 – 129 Hz quarto canale 129 – 172 Hz quinto canale 172 – 215 Hz eccetera • Considerando un suono armonico con fondamentale a 70 Hz, questa cade nel secondo canale, la seconda armonica a 140 Hz viene analizzata nel quarto, la terza a 210 Hz nel quinto, ecc. → OK!!! Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Phase vocoder e frequenza: esempio 2 • Si consideri un suono campionato a 44100 Hz e fs = 256 punti. lb = sr / fs = 44100 / 256 = 172,27 Hz • L’analisi verrà compiuta dividendo il file in canali di circa 172 Hz, da 0 a 22050 Hz (frequenza di Nyquist, sr / 2). Quindi: primo canale 0 – 172 Hz secondo canale 172 – 344 Hz terzo canale 344 – 516 Hz eccetera • Considerando un suono armonico con fondamentale a 70 Hz, sia la fondamentale sia la seconda armonica a 140 Hz vengono analizzate nel primo canale, la terza a 210 Hz e la quarta a 280 Hz nel secondo canale, la quinta e la sesta nel terzo canale, ecc. Poiché nell’analisi viene fatta una media del contenuto del canale per ogni frame, si avrà scarsa definizione in termini frequenziali → NO!!! Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Generalizzazione • Dai semplici esempi precedenti si evince che – almeno dal punto di vista frequenziale – è bene avere frame size grandi. • L’individuazione del valore ottimale dipende anche dalle caratteristiche del suono da analizzare (e risintetizzare). Infatti la scelta di un frame size grande, che implica larghezze di banda piccole, è rilevante soprattutto per i suoni gravi: – nel registro grave, 172 Hz di differenza possono significare più di 2 ottave (ad esempio, A1 = 55 Hz e A3 = 220 Hz, differenza 165 Hz) – nel registro acuto, 172 Hz di differenza possono essere meno di un semitono (ad esempio, G7 = 3136 Hz e G#7 = 3322 Hz, differenza 186 Hz) Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Phase vocoder e tempo • L’analisi viene fatta non solo dividendo lo spettro in canali di frequenza, ma anche la durata complessiva in porzioni di tempo dette finestre (windows). Più larghe sono le finestre, meno ce ne saranno. La FFT analizza un intervallo di tempo t che si ottiene dividendo il numero di punti del frame fs per la frequenza di campionamento sr (inverso del calcolo per lb): t = fs / sr • Di conseguenza, più fine è l’analisi in termini di frequenza, più grossolana risulta quella in termini di tempo. Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Un esempio completo • Si consideri un suono con sr = 44100 Hz e fs = 8192 punti. lb = sr / fs = 44100 / 8192 = 5,38 Hz t = fs / sr = 1 / lb = 0,1858 s • Se il suono ha un attacco rapido, ad esempio inferiore a 0.1 secondi, esso verrà analizzato in modo poco preciso, perché la FFT fa la media di qunato succede in ogni canale di analisi per ogni intervallo di tempo. • Ne risulterà una buona definizione dal punto di vista della frequenza, e un’analisi (e una risintesi) grossolana dal punto di vista del tempo. Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Sovrapposizione delle finestre (windows overlap) • Possibile soluzione: la sovrapposizione delle finestre (windows overlap). • Il fattore di sovrapposizione descrive quante finestre di analisi si coprono a vicenda. Nell’esempio mostrato sopra, il valore del fattore di sovrapposizione è 5. Analogamente, si può dire che lo spiazzamento tra frame è pari a (frame size / windows overlap). Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Phase vocoder: altri parametri • Nei normali phase vocoder, oltre a frame size, window size e window overlap, esistono altri 2 parametri principali che si possono controllare: 1. il tipo di finestra (Hamming, Hanning, Gauss, Blackman-Harris, Kaiser, rettangolare, ecc.); 2. la FFT size, in genere posta a una potenza di 2 che sia almeno il doppio del frame size. • In Csound questi parametri possono essere fissati all’atto della creazione del file di analisi. Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Analisi con PVANAL • PVANAL appartiene alla famiglia di Analysis File Generation, assieme a HETRO e LPANAL. Questo programma converte un file audio in una serie di frame di una STFT, creando un file di analisi per l’opcode Csound pvoc. • Sintassi: csound -U pvanal [flags] infilename outfilename pvanal [flags] infilename outfilename • Principali flag: -n frmsiz – dimensione dei frame, ossia numero di campioni in ogni frame dell’analisi. Deve essere potenza di 2 compresa tra 16 e 16384. Per un buon risultato, è consigliabile che sia maggiore del periodo T più lungo nel campione. Il valore di default è la più piccola potenza di 2 che corrisponde a più di 20 ms nel sorgente (ad es. 256 punti con sr = 10 kHz, ossia un frame da 25.6 ms); -w windfact – fattore di window overlap. L’opcode pvoc interpola tra frame, ma averne pochi genera distorsione udibile, troppi un file di analisi molto grande. Compromesso (e valore di default) = 4. Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Analisi con PVANAL • Sintassi: csound -U pvanal [flags] infilename outfilename pvanal [flags] infilename outfilename • Elenco dei flag: • -n frmsiz – dimensione dei frame -w windfact – fattore di window overlap -s srate – frequenza di campionamento dell’input (se non specificata e non inferibile dall’header, il default è 10000) -c channel – canale da analizzare, di default 1 -b begin – istante iniziale in secondi del segment audio da analizzare, di default 0.0 -d duration – durata in secondi del frammento da analizzare, di default 0.0 che in realtà indica la fine del file -h hopsize – frame offset dell’STFT, alternativo a -w -H – uso di finestre di Hamming anziché finestre di von Hann (default) -K – uso di finestre di Kaiser anziché finestre di von Hann (default) con parametro di default impostato a 6.8, e reimpostabile attraverso l’ulteriore flag -B beta Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Suggerimenti per l’analisi • Per un’analisi corretta, il numero di punti deve essere almeno pari al numero di campioni che definiscono un ciclo della minima frequenza presente (la fondamentale). • Esempio: se la fondamentale è a 100 Hz, un suo ciclo dura 0,01 s. Con sr = 44100 Hz, fs non deve essere minore di 441 (si sceglie potenza di 2 da 512 in su) • Analisi “percettiva” delle caratteristiche del suono da analizzare: – – – – – Suono grave con attacco lento: f può dare problemi, t no → conviene frame size grande Suono acuto con attacco rapido: t può dare problemi, f no → conviene frame size piccolo Suono grave con attacco rapido: sia f sia t sono fattori problematici. Se il suono è armonico, ci si concentra più sulla definizione temporale, se è inarmonico più su quella frequenziale (aumentando frame size e windfact) Suono acuto, armonico, con attacco lento: nessun problema, quindi impostazioni di default o al limite frame size più alto per migliorare la definizione frequenziale Suono acuto, inarmonico, con attacco rapido: frame size abbastanza grande e windfact alto Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Opcode pvoc • L’opcode pvoc implementa la ricostruzione del segnale attraverso un phase vocoder basato su FFT. E’ la controparte di risintesi, interna all’orchestra di Csound, dell’analisi condotta precedentemente con pvanal. • Sintassi: ares pvoc ktimpnt, kfmod, ifilcod [, ispecwp] \ [, iextractmode] [, ifreqlim] [, igatefn] ove i principali argomenti sono: – ktimpnt (da “time pointer) - indicazione, istante per istante, del punto in cui pvoc legge I dati dal file di analisi. Deve essere sempre positivo, ma può comportare tanto un avanzamento quanto un arretramento del tempo e ammette punti di discontinuità; – kfmod - fattore di trasposizione della frequenza – Ifilcod – identificativo del file di analisi Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder Esempi • Gli esempi sotto riportati richiedono di estrarre dall’archivio ZIP i file audio e di collocarli in un’apposita cartella (ad es. C:\test) per poi invocare il comando di analisi pvanal, con o senza specifici parametri. • Applicazione del phase vocoder a segnale vocale umano: → 15_01_pvoc_speech.csd • Applicazione del phase vocoder a campioni strumentali con diverse caratteristiche timbriche e di pitch: → 15_02_pvoc_instruments.csd • Applicazione del phase vocoder a un pizzicato d’archi: → 15_03_pvoc_pizzicato.csd Programmazione timbrica - Prof. Luca A. Ludovico Analisi e risintesi: phase vocoder