• Non ci sono risultati.

La ricostruzione di un segmento di speech che è non è arrivato correttamente può necessitare, dipendentemente dalla sua lunghezza, della ricostruzione di uno o più pacchetti. La maggior parte delle operazioni in questo algoritmo sono effettuate per la generazione del primo pacchetto del segmento di speech andato perso; saranno perciò le operazioni necessarie a questa ricostruzione che andranno a determinare, per la maggior parte, la complessità computazionale dell'algoritmo.

Procediamo quindi nella spiegazione supponendo inizialmente di trovarci nella condizione in cui il Current Loss Indicator è settato a true e il previous loss indicator è settato a false. Stiamo perciò supponendo che il pacchetto che dovrebbe essere mandato in play all'istante attuale è andato perso mentre è correttamente arrivato il precedente ed è già stato riprodotto (fatta eccezione per gli ultimi 5 ms che sono stati memorizzati nell'history buffer ma non sono ancora stati spediti all'applicazione).

Come sarà spiegato più dettagliatamente in seguito, inizialmente, tramite la funzione di autocorrelazione fatta sui campioni di segnale contenuti nell'history buffer, sono calcolati gli LP coFefficient che saranno usati sia dall'LP filter che dall'Inverse LP filter. I campioni di speech memorizzati nell'history buffer sono quindi filtrati dall'LP filter producendo in uscita il residual signal, ovvero il segnale speech memorizzato da cui sono state eliminate le caratteristiche del vocal tract. Questo è poi passato al Pitch Detector che si preoccupa di fare una stima del pitch period e poi di passare l'informazione all'Excitation Generator che tramite questa e il residual signal costruisce l'excitation signal. L'Inverse LP filter viene eccitato con quest'ultimo segnale e produce in uscita il recostrucetd signal aggiungendo all'excitation signal le caratteristiche del vocal tract. Sono poi effettuate delle operazioni di overlap-and-addiction tra il reconstructed signal e i 5 ms di segnale presenti nell'history buffer che non sono ancora stati mandati in play. Infine gli ultimi 5 ms dell'history e il frame ricostruito meno gli ultimi 5 ms sono moltiplicati per un inviluppo tramite la funzione di Scaling prima di essere riprodotti.

Di seguito sono descritti in maniera più dettagliata i vari blocchi funzionali di cui è costituito l'algoritmo ed il modo in cui vengono utilizzati per ricostruire il primo pacchetto del segmento di speech che è andato perso.

5.5.2.1 LP analysis

Il blocco LP Analysis si occupa di calcolare gli LP coefficent usando gli ultimi 15 ms del segnale contenuto nell'history buffer. Questi sono inizialmente moltiplicati per la seguente finestra di Hamming asimmetrica:

5 Algoritmi di Packet Loss Concealment h i = 0.54 − 0.46 ∗ cos

2∗∗i 79

per i=0...79 0.54 − 0.46 ∗ cos

2∗∗i−80 39

per i=80...119

In seguito su questo segmento di speech è calcolata la funzione di autocorrelazione:

Rs =

i

swi ∗ swi− con =0...p

con swi segnale risultante dalla moltiplicazione degli ultimi 120 campioni (15 ms) dell'history buffer per h i e  che va da 0 a 20 poiché viene utilizzata una tecnica di linear prediction di ordine 20 (tecnica spiegata in precedenza nel paragrafo 2.2).

In seguito i valori ottenuti con la funzione di autocorrelazione sono controllati per motivi di stabilità; questo controllo è realizzato andando a verificare che l'energia del segnale (calcolata come funzione di autocorrelazione per  uguale a 0) sia superiore al modulo del valore dell'autocorrelazione ottenuto per i successivi valori di  . Se il controllo non fornisce un esito positivo o se l'energia del segnale è considerata troppo bassa (cioè inferiore -63 dBov) allora tutti gli LP coefficient sono settati a zero e sono passati con questo valore all'LP filter e all'Inverse LP filter.

Al contrario nel caso in cui invece il controllo effettuato restituisce un risultato positivo viene applicata la tecnica di bandwidth expansion all'array di valori calcolati con la funzione di autocorrelazione. Motivo dell'introduzione di questa tecnica è che la LP analysis che viene effettuata non permette di stimare correttamente l'inviluppo spettrale per segmenti di speech con un alto valore del pitch e questo può portare alla generazione di un LP filter con degli artificialmente alti picchi della risposta in frequenza. Per evitare questo problema possiamo moltiplicare tutte le radici della risposta in frequenza del filtro per per un expansion factor; questo equivale ad ottenere dei nuovi expanded

LP coefficient del tipo:

ak=ak∗ k con 1≤k ≤ p

In alternativa (come è stato effettuato nell'algoritmo) si può moltiplicare l'array di valori ottenuti con la funzione di autocorrelazione per un' exponential lag window del tipo:

lagwindowi−1 = exp

−

2

i2∗72

640000

per i=1,2... p

Una volta eseguite queste operazioni si dispone della matrice R e del vettore dell'equazione presentata nel paragrafo 2.2.2 ed è possibile perciò calcolare il vettore a . Per effettuare quest'ultima operazione è stato sfruttato l'algoritmo di Levinson-Durbin riportato nel paragrafo 2.2.3. Questo

5 Algoritmi di Packet Loss Concealment

permette di risolvere il sistema calcolando in maniera ricorsiva gli LP coefficient ak . Questi ultimi, oltre ad essere passati all'LP filter e all'invers LP filter, sono memorizzati e usati per la ricostruzione di eventuali pacchetti persi consecutivamente al first loss packet.

5.5.2.2 LP filter

L'intero segnale contenuto dell'history buffer è filtrato dall'LP filter per eliminare dal segnale speech memorizzato le caratteristiche del vocal tract.

La risposta impulsiva del filtro è:

h n =

k=1 p

ak∗ n−k  con a0=1

Il risultante segnale, chiamato residual signal, sarà perciò :

r n = s n −

k=1 p

aks n−k 

dove s(n) è la sequenza di campioni contenuta nell'history buffer; si considerano i primi 5 ms dell'history buffer come condizioni iniziali del filtro. Si ottiene perciò un residual signal di 30−5 ms, cioè di 240−20 campioni (sempre nell'ipotesi di una frequenza di campionamento di 8 KHz).

Il residual signal sarà passato al pitch detector e all'excitation generator.

5.5.2.3 Pitch detector

Il pitch period dei 30 ms di speech memorizzati nell'history buffer è stimato andando a fare un'elaborazione sul residual signal (cioè sul segnale speech memorizzato da cui sono state eliminate le caratteristiche del vocal tract). La stima è effettuata andando a calcolare il picco della funzione di cross-correlazione normalizzata calcolata tra segmenti di speech contenuti nell'history buffer. In particolare la si calcola tra una finestra contenente gli ultimi 100 campioni di speech dell'history buffer e una della stessa dimensione traslata indietro da 2.5 ms (20 campioni) a 15 ms (120 campioni) a passi di 125 microsecondi. Questo corrisponde ad effettuare una ricerca del pitch in un range tra i 66 Hz e i 400 Hz. Si considerano cioè inizialmente il segmento 1 ed il segmento 2 della figura seguente (formati entrambi da 100 campioni), si moltiplicano campione per campione e si sommano; si effettua poi la stessa operazione tra il segmento 1 ed il segmento 3, tra il segmento 1 e il 4 e così via fino ad arrivare all'ultimo segmento (quello contenuto nella finestra temporale traslata di 120 campioni rispetto a quella contenente gli ultimi 100 campioni di speech dell'history buffer). Si normalizzano i

5 Algoritmi di Packet Loss Concealment

valori ottenuti (rispetto all'energia dei vari segmenti considerati ad ogni passo) e si memorizza il valore della traslazione per cui si ottiene il risultato massimo.

Figura 5.9: Algoritmo per la stima del pitch period

Il pitch detector inoltre, con l'obiettivo di migliorare le prestazioni dell'algoritmo durante le sezioni di speech unvoiced, si preoccupa in alcuni casi di modificare il pitch period stimato in precedenza. Usare un pitch period piccolo durante queste sezioni porta all'introduzione di armoniche non volute e perciò alla generazione di un segnale ricostruito caratterizzato da suoni artificiali che peggiorano la qualità audio percepita dall'utente. Per risolvere il problema in questi casi viene utilizzato il più piccolo pitch period multiplo di quello stimato maggiore di 10 ms (80 campioni).

Il pitch period stimato (o un suo multiplo nel caso unvoiced) è passato all'excitation generator ed è memorizzato così da poter essere utilizzato per eventuali pacchetti persi consecutivamente al first loss packet.

5.5.2.4 Excitation generator (first loss packet)

Il residual signal precedentemente determinato e il pitch period stimato sono utilizzati come input per l'excitation generator che si occupa di effettuare una ricostruzione del pacchetto perso e di due

5 Algoritmi di Packet Loss Concealment

segmenti di 5 ms, uno precedente e uno successivo al segnale ricostruito. Questo blocco dell'algoritmo si occupa quindi di determinare l'excitation signal. Il processo utilizzato è rappresentato in figura numero 5.10 per un pitch period di P campioni.

Figura 5.10: Generazione del new excitation signal dal residual signal.

Inizialmente vengono copiati i 5 ms di segnale appena prima degli ultimi P campioni del residual signal. Questi andranno a costituire i primi 5 ms dell'excitation signal. La rimanente porzione di quest'ultimo è costruita andando a ripetere per quante volte è necessario gli ultimi P campioni del residual signal.

L'intero excitation signal viene poi memorizzato nell'excitation buffer (per essere utilizzato nel caso in cui anche il pacchetto successivo al first loss packet vada perso) e passato all'Inverse LP filter.

5.5.2.5 Inverse LP filter

L'excitation signal è filtrato dall'Inverse LP filter con l'obiettivo di aggiungergli le caratteristiche del vocal tract andando così a creare il reconstructed signal. I 20 campioni precedenti a quelli che costituiscono gli ultimi 5 ms dell'history buffer sono usati come condizioni iniziali del filtro.

Il segnale in uscita dal filtro sarà esprimibile quindi come:

rec n = exn 

k=1 p

ak∗ rec n−k 

5 Algoritmi di Packet Loss Concealment

signal.

Il reconstructed signal è passato al blocco Overlap-and-Add Unit.

5.5.2.6 Overlap-and-add unit

I due segmenti di 5 ms all'inizio e alla fine del reconstructed signal sono usati dall'Overlap-and-Add Unit per operazioni di overlap-and-addiction, mentre la parte centrale del reconstructed signal, lunga

T ms (supponendo il pacchetto andato perso di dimensione T ms) viene usata per la ricostruzione del pacchetto perso.

I 5 ms alla fine dell'history buffer, ovvero i 40 campioni che sono stati memorizzati in precedenza ma non sono ancora stati mandati in play, e i primi 5 ms del reconstructed signal sono rispettivamente pesati per una rampa discendente e una ascendente e poi sommati. Questi 5 ms di segnale così ottenuti vanno a rimpiazzare gli ultimi 5 ms dell'history buffer e permettono un passaggio meno brusco tra il segmento di speech precedentemente mandato in play e il pacchetto ricostruito riducendo l'introduzione di rumori artificiali che portano a una diminuzione della qualità audio percepita dall'utente.

I 5 ms di segnale alla fine del reconstructed signal sono invece copiati all'interno dell'overlap buffer per essere usati, come spiegato in seguito, nel caso il pacchetto successivo a quello perso arrivi correttamente.

5.5.2.7 Scaling (lost packet)

Blocco che si preoccupa di moltiplicare ogni campione del segmento di speech costituito dagli ultimi 5 ms dell'history buffer e dai primi T −5 ms del pacchetto ricostruito per il valore corrente contenuto in Scale (stiamo supponendo il pacchetto di lunghezza T ms). Il segmento di segnale in questione, dopo aver subito l'operazione di Scaling, costituirà l'informazione che sarà riprodotta all'istante attuale. L'intero pacchetto ricostruito sarà memorizzato nell'history buffer e i suoi 5 ms finali andranno a costituire quella parte di segnale non ancora riprodotta presente alla fine dell'history buffer.

Scale è settato a 1.0 al momento dell'inizializzazione della classe con cui è costruito l'algoritmo ed è decrementato ad ogni campione del segmento di segnale per cui viene moltiplicato in modo da decrescere di 0,054 in 10 ms. Questo processo prosegue fino all'ultimo campione del segmento se questo è di durata inferiore ai 20 ms. Dopo 20 ms la pendenza con cui il valore di Scale decresce è

5 Algoritmi di Packet Loss Concealment

aumentata in modo da farlo diminuire di 0,222 in 10 ms. Il processo prosegue fino alla fine del segmento o finchè il valore di Scale è maggiore di 0. Se Scale arriva ad essere minore o uguale a 0 i restanti campioni del segnale sono moltiplicati per 0.

Il valore di Scale alla fine del processo viene mantenuto in memoria per poter essere usato, come sarà spiegato in seguito, per l'elaborazione dei pacchetti successivi.

Documenti correlati