Si possono individuare due tipi di compressione audio:di tipo percettivo e non. Alla base degli algoritmi non percettivi c'è l'idea di codificare un segnale audio sfruttando le similitudini esistenti tra i vari campioni del segnale. Per esempio,se il segnale contiene pochi transitori*,data una sequenza di valori come 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 254 si potrebbe pensare di comprimerla usando i due valori 254 20 In questo caso a ciascun campione segue la sua molteplicità,cioè quante volte di seguito il campione si ripete;in altre parole,per decomprimere il segnale sarà sufficiente replicare ogni campione per M volte di seguito,dove M è la molteplicità di ciascun campione. In questo caso,per questa particolare sequenza si è ottenuto un rapporto di compressione di 10:1. Questo tipo di codifica risulta efficace per segnali costanti a tratti,ma i suoni "reali" non sono quasi mai costanti per lunghi periodi di tempo,per cui questo tipo di compressione è del tutto inefficace per la maggior parte delle applicazioni reali. Un metodo più interessante consiste nel rappresentare ciascun campione con un numero di bit inferiore al campione originale,e di fatto questa è l'idea alla base degli algoritmi A-law e Mu-law,molto usati per la compressione dei segnali telefonici. In pratica,il segnale viene quantizzato usando intervalli di diversa ampiezza,che si infittiscono verso il centro e si diradano verso gli estremi.**Si vede subito che l'accuratezza nella descrizione aumenta per i campioni di ampiezza trascurabile,mentre diminuisce man mano che l'ampiezza del segnale aumenta. Perciò,quando il segnale viene ricostruito si avrà una certa perdita d'informazione in corrispondenza dei punti di ampiezza maggiore;tuttavia,questo non è un grosso problema perchè nei punti in cui la perdita risulta più grande,il segnale risulta più "forte" e riesce a coprire il disturbo prodotto,in modo che il nostro orecchio non lo percepisca. Un'altra tecnica di compressione molto nota,usata soprattutto per comprimere segnali musicali in qualità CD,è la PCM adattativa differenziale (Adaptive Differencial Pulse Code Modulation) un'estensione della tecnica PCM,che come le codifiche law usa un numero di bit ridotto per rappresentare ogni singolo campione. Tuttavia,ADPCM non codifica tutto il campione,bensì la differenza di ampiezza (in modulo e segno) tra un campione e il successivo;come è facile immaginare,se il segnale non presenta variazioni di ampiezza troppo brusche,le differenze di ampiezza tra i campioni si manterranno in un range di valori limitato,dunque saranno rappresentabili con meno bit rispetto ai campioni interi. In caso contrario (ad esempio,nei violenti attacchi delle canzoni "heavy-metal") i bit usati per codificare le differenze possono non bastare;proprio per questo motivo ADPCM associa ad ogni differenza un fattore correttivo e una variazione del passo di quantizzazione (in modulo e segno). In sostanza,quindi,l'algoritmo "adatta" il passo di quantizzazione alla differenza riscontrata tra i campioni (lo allarga quando la differenza aumenta e lo restringe quando la differenza diminuisce).
La ricostruzione del segnale avviene leggendo la differenza codificata(X):da questa,usando apposite tabelle di lookup si ricavano il fattore correttivo(fc) e la variazione del passo di quantizzazione(dQP). Il valore del campione attuale si ottiene sommando al campione precedente(x) il prodotto del passo di quantizzazione attuale(QP) per il fattore correttivo;la somma del passo di quantizza zione attuale e della variazione diventa il passo di quantizzazione per trovare il campione successivo. Dallo schema a blocchi si nota che per decomprimere un segnale ADPCM,il decoder deve conoscere il valore del primo campione e il passo di quantizzazione iniziale. Leggermente diversa è la filosofia di FLAC (Free Lossless Audio Codec),un algoritmo open-source senza alcuno scopo di lucro,pensato per comprimere i segnali audio senza produrre perdite d'informazione:in parole povere,il segnale ricostruito coincide esattamente con il segnale originale. Questo algoritmo divide i campioni del segnale in blocchi,e cerca di descrivere ciascun blocco usando un predittore**** che sia di bassa complessità (al massimo di quarto o quinto grado) e che approssimi sufficientemente bene il profilo dei campioni. L'algoritmo FLAC codifica i coefficienti del predittore e i residui per ciascun campione (in modulo e segno),cioè le differenze tra il valore approssimato del campione e il valore effettivo. Anche in questo caso,la decodifica è piuttosto semplice;ogni campione si ottiene come combina zione lineare degli N campioni immediatamente precedenti (dove N è il grado del predittore),a cui si somma il residuo per quel campione. Ad esempio,se per un certo blocco il predittore vale x(t-1)-x(t-2) e i primi due campioni valgono x(0)=110 e x(1)=113,con una sequenza di residui r(2)=+2,r(3)=-6,r(4)=+3,r(5)=0 i campioni ricostruiti valgono x(2) = 113 - 110 + 2 = 5 x(3) = 5 - 113 - 6 = -114 x(4) =-114 - 5 + 3 = -116 x(5) =-116 + 114 + 0 = -2 ... e via dicendo... In questo TC abbiamo visto gli algoritmi più diffusi per la compressione audio di tipo non percettivo:ne esistono molti altri (Shorten,MusicPak ecc.) meno noti e perciò poco utilizzati. Se da un lato gli algoritmi non percettivi sono facilmente implementabili,dall'altro non permettono di raggiungere elevati rapporti di compressione (superiori a 4:1).Nel prossimo TC vedremo che questo limite è superato dai ben più complessi algoritmi percettivi. Nella prossima puntata: gli algoritmi di compressione percettivi -------------- Note a margine -------------- *Un transitorio è un breve intervallo del segnale in cui questo varia più o meno rapidamente; un segnale reale continuo contiene una quantità pressochè infinita di transitori,perchè pressochè infinite sono le variazioni di ampiezza del segnale nell'arco di un periodo di tempo sufficientemente lungo. **Questo metodo si chiama quantizzazione logaritmica,e consente di suddividere un segnale in meno livelli di ampiezza rispetto alla quantizzazione lineare,in cui tutti i livelli hanno la stessa dimensione;pertanto,ciascun campione è rappresentabile con meno bit e il segnale risultante occuperà meno spazio.In questo caso,per decomprimere il segnale si usa un'esponenzia le (funzione matematica inversa del logaritmo). ***Esiste una variante della ADPCM classica messa a punto da Microsoft,la cui specifica è (stranamente) di pubblico dominio. ****Un predittore è una funzione matematica in grado di descrivere una serie numerica sulla conoscenza di pochi dati iniziali (tipicamente,i primi numeri della serie). Andèm innanz