Algoritmo di Levinson-Durbin

Da testwiki.
Vai alla navigazione Vai alla ricerca

L'algoritmo di Levinson-Durbin, in algebra lineare, serve per calcolare, con metodo ricorsivo, la soluzione di un'equazione che coinvolge una matrice di Toeplitz. L'algoritmo viene eseguito in Θ(n2) passi, il che rappresenta un forte miglioramento rispetto al Metodo di eliminazione di Gauss, il quale richiede Θ(n3) passaggi.

L'algoritmo Levinson–Durbin fu proposto prima da Norman Levinson, nel 1947, e migliorato da James Durbin nel 1960; successivamente fu ulteriormente migliorato, portandolo da 4n2 fino a 3n2 moltiplicazioni, da W. F. Trench e S. Zohar, rispettivamente.

Altri metodi per elaborare i dati, includono la decomposizione di Schur e la decomposizione di Cholesky. In confronto a questi, la ricorsione di Levinson (in particolare la ricorsione di Levinson suddivisa) tende a essere più veloce dal punto di vista computazionale, ma più sensibile a inesattezze computazionali come gli errori di arrotondamento.

L'algoritmo di Bareiss per le matrici di Toeplitz (da non confondere con l'algoritmo di Bareiss generale) è veloce quanto la ricorsione di Levinson-Durbin, ma utilizza Θ(n2) passaggi, mentre la ricorsione di Levinson-Durbin richiede solo Θ(n) passaggi. L'algoritmo di Bareiss, tuttavia, è numericamente stabile,[1][2] mentre la ricorsione di Levinson-Durbin, nella migliore delle ipotesi, è solo debolmente stabile (cioè mostra stabilità numerica per sistemi lineari ben condizionati).[3]

Gli algoritmi più recenti, chiamati algoritmi di Toeplitz asintoticamente veloci o, in alcuni testi, superveloci, possono risolvere il problema in Θ(nlogpn) per vari p (es. p=2,[4][5] p=3[5]). La ricorsione di Levinson-Durbin rimane popolare per diversi motivi; primo, è relativamente facile da comprendere; inoltre, può essere più veloce di un algoritmo superveloce per piccoli n (di solito n<256).[6]

Derivazione

Introduzione

Le equazioni matriciali sono della seguente forma:

𝐌 x=y.

L'algoritmo di Levinson-Durbin può essere usato per qualsiasi equazione, purché 𝐌 sia una matrice di Toeplitz nota, con diagonale principale diversa da zero; dove y è il vettore noto, mentre x è il vettore incognito di numeri xi da determinare.

Si consideri e^iun vettore composto interamente da zeri, a eccezione del suo termine i-esimo, il quale contiene un valore unitario. La sua lunghezza sarà implicitamente determinata dal contesto. Il termine N si riferisce alla larghezza della matrice 𝐌 avente dimensioni N×N. Infine, gli apici fanno riferimento a un indice induttivo, mentre i pedici indicano gli indici. Per esempio (e definizione) la matrice 𝐓n è una matrice n×n che copia il blocco n×n in alto a sinistra da 𝐌, ovvero Ti,jn=Mji.

Pertanto, anche 𝐓n è una matrice di Toeplitz; nel senso che può essere scritta nella seguente forma:

𝐓n=[t0t1t2tn+1t1t0t1tn+2t2t1t0tn+3tn1tn2tn3t0].

Passaggi introduttivi

L'algoritmo procede seguendo due passaggi. Nel primo passaggio vengono stabiliti due gruppi di vettori, chiamati vettori avanti e indietro. I vettori avanti sono usati per aiutare a ottenere l'insieme dei vettori indietro; pertanto, possono essere immediatamente scartati. Viceversa, i vettori all'indietro sono necessari per il secondo passaggio, dove vengono utilizzati per creare la soluzione desiderata.

La ricorsione di Levinson-Durbin definisce l'ennesimo "vettore avanti", chiamato fn, un vettore di lunghezza n che soddisfa l'equazione:

𝐓nfn=e^1.

L'ennesimo "vettore indietro", chiamato bnè definito in modo analogo; è il vettore di lunghezza n che soddisfa l'equazione:

𝐓nbn=e^n.

Una semplificazione importante può verificarsi quando 𝐌 è una matrice simmetrica; in questo caso i due vettori sono correlati da bin=fn+1in, ovvero sono le inversioni di riga l'uno dell'altra. Questo può risparmiare alcuni calcoli in questo caso particolare.

Ottenere i vettori indietro

Anche se la matrice non è simmetrica, l'ennesimo vettore avanti e indietro può essere trovato dai vettori di lunghezza n1 come segue. Innanzitutto, il vettore indietro può essere "esteso" con uno zero al fine di ottenere:

𝐓n[fn10]=[   tn+1 𝐓n1 tn+2   tn1tn2t0][ fn1 0 ]=[100ϵfn].

Andando da 𝐓n1 a 𝐓n, la colonna aggiuntiva aggiunta alla matrice non disturba la soluzione quando si usa uno zero per estendere il vettore in avanti. Tuttavia, la riga aggiuntiva aggiunta alla matrice ha perturbato la soluzione; e ha creato un termine di errore indesiderato εf che si verifica in ultimo luogo. L'equazione precedente fornisce il valore di:

ϵfn = i=1n1 Mni fin1 = i=1n1 tni fin1.

Questo errore verrà restituito a breve ed eliminato dal nuovo vettore avanti; ma prima, il vettore all'indietro deve essere esteso in modo simile (anche se invertito). Per il vettore all'indietro si ha:

𝐓n[0bn1]=[t0tn+2tn+1   tn2 𝐓n1 tn1  ][ 0 bn1 ]=[ϵbn001].

Come prima, la colonna aggiuntiva alla matrice non disturba questo nuovo vettore all'indietro; ma la riga aggiuntiva lo fa. Qui si ha un altro errore indesiderato ϵ pari a:

ϵbn = i=2n M1i bi1n1 = i=1n1 ti bin1. 

Questi due termini di errore possono essere utilizzati per formare vettori avanti e indietro di ordine superiore descritti come segue. Usando la linearità delle matrici, la seguente identità vale per tutti gli (α,β):

𝐓(α[f 0]+β[0 b])=α[100ϵf]+β[ϵb001].

Se α e β sono scelti in modo destrorso e^1 o e^n,n, allora la quantità in parentesi sarà pari alla definizione dell'ennesimo vettori avanti o indietro, rispettivamente. Con la scelta dei termini α e β, la somma dei vettori tra parentesi è semplice e produce il risultato desiderato.

Per trovare questi coefficienti, αfn, βfn devono essere tali che:

fn=αfn[fn10]+βfn[0bn1]

e, rispettivamente, αbn, βbn sono tali che:

bn=αbn[fn10]+βbn[0bn1].

Moltiplicando e dividendo le precedenti equazioni per 𝐓nsi ottiene la seguente equazione:

[1ϵbn0000ϵfn1][αfnαbnβfnβbn]=[10000001].

Ora, tutti gli zeri dei due vettori sopra vengono ignorati, rimane solo la seguente equazione:

[1ϵbnϵfn1][αfnαbnβfnβbn]=[1001].

Con questi soluzione (utilizzando la formula inversa della matrice di Cramer 2×2), i nuovi vettori avanti e indietro sono:

fn=11ϵbnϵfn[fn10]ϵfn1ϵbnϵfn[0bn1]
bn=11ϵbnϵfn[0bn1]ϵbn1ϵbnϵfn[fn10].

L'esecuzione di queste sommatorie vettoriali, quindi, dà gli ennesimi vettori avanti e indietro partendo da quelli precedenti. Non resta che trovare il primo di questi vettori, quindi con rapide somme e moltiplicazioni rapide si ottengono i termini restanti. I primi vettori avanti e indietro sono semplicemente:

f1=b1=[1M11]=[1t0].

Utilizzo dei vettori all'indietro

I passaggi precedenti danno agli N vettori all'indietro per 𝐌. Da lì, un'equazione più arbitraria è:

y=𝐌 x.

La soluzione può essere costruita nello stesso modo ricorsivo in cui sono stati costruiti i vettori all'indietro. Di conseguenza, x deve essere generalizzato a una sequenza di xnintermedi, tali che xN=x.

La soluzione viene quindi costruita ricorsivamente notando che, se

𝐓n1[x1n1x2n1xn1n1]=[y1y2yn1],

allora, inserendo nuovamente uno zero al termine del vettore, e definendo una costante di errore dove necessario, si ha:

𝐓n[x1n1x2n1xn1n10]=[y1y2yn1ϵxn1].

Possiamo quindi utilizzare l'ennesimo vettore all'indietro per eliminare l'errore e sostituirlo con la formula desiderata come segue:

𝐓n([x1n1x2n1xn1n10]+(ynϵxn1) bn)=[y1y2yn1yn].

L'estensione di questo metodo fino a quando n=N produce la soluzione desiderata x .

In pratica, questi passaggi vengono spesso eseguiti in concomitanza con il resto della procedura, formando un'unità coerente e meritano di essere trattati singolarmente.

Algoritmo di Levinson-Durbin

Se 𝐌 non è una matrice di Toeplitz in senso stretto, ma una matrice a blocchi di Toeplitz, la ricorsione di Levinson può essere derivata più o meno allo stesso modo considerando la sottomatrice di Toeplitz (Musicus 1988).

Le matrici con blocchi di Toeplitz sorgono naturalmente negli algoritmi di elaborazione del segnale quando si trattano flussi di segnali multipli (per esempio nei sistemi MIMO) o segnali ciclostazionari.

Applicazione pratica dell'algoritmo di Levinson-Durbin

L'algoritmo di Levinson-Durbin è molto utilizzato per la risoluzione dei modelli autoregressivi AR(p) di ordine p (utilizzati nel protocollo GSM), i quali si presentano sotto la seguente equazione alle differenze:

t(n)+x1t(n1)+x2t(n2)++xpt(np)=e(n)t(n)+i=1nxit(ni)=e(n),

dove t(n) è il campione attuale del sistema stimato tramite il modello AR(p), xi sono i p parametri del modello, i quali vengono applicati ai suoi p campioni precedenti, o - analogamente - definiscono la memoria del modello (in questo caso di ordine p). Infine e(n) è il residuo di predizione del campione t(n) che si desidera minimizzare, ovvero: la componente non predicibile del sistema.

Queste equazioni si presentano sotto forma di matrici di Toeplitz, pertanto per la loro soluzione si ricorre all'algoritmo di Levinson-Durbin.

Pseudocodice per la ricorsione Levinson-Durbin

L'algoritmo si basa sul calcolo dei coefficienti autoregressivi di matrici di ordine crescente. Si divide in due fasi: una prima di inizializzazione per il calcolo del parametro x1 o - che è lo stesso - per il caso elementare della matrice 1×1. Successivamente, si procede con il calcolo iterativo dei parametri per matrici di ordine via, via crescente 2×2, 3×3,..., p×p.

Utilizzando la notazione MATLAB/Octave, il pseudocodice per il calcolo della ricorsione di Levinson-Durbin è il seguente[7]:

k = M(2) / M(1);                                    % Stima il primo elemento 
x = k;
E = (1 - k2) * M(1);                                % Calcola l'errore quadratico medio
for i = 2:p
    k = (M(i + 1) - x * M(2:i)) / E;                % Coefficienti di riflessione
    x = [k, x - k * x(i-1:-1:1)];                   % Stima gli elementi successivi
    E = (1 - k2) * E;                               % Aggiorna l'errore quadratico medio
end

x = [1, - x(N:-1:1)];                               % Restituisce vettore incognito

Da sottolineare che MATLAB opera con vettori e matrici, pertanto - volendo tradurre il codice in linguaggi come C++ o Java, si otterranno due cicli for annidati.

Note

Bibliografia

Fonti per le definizioni

  • Levinson, N. (1947). "The Wiener RMS error criterion in filter design and prediction." J. Math. Phys., v. 25, pp. 261–278.
  • Durbin, J. (1960). "The fitting of time series models." Rev. Inst. Int. Stat., v. 28, pp. 233–243.
  • Trench, W. F. (1964). "An algorithm for the inversion of finite Toeplitz matrices." J. Soc. Indust. Appl. Math., v. 12, pp. 515–522.
  • Musicus, B. R. (1988). "Levinson and Fast Choleski Algorithms for Toeplitz and Almost Toeplitz Matrices." RLE TR No. 538, MIT. [1]
  • Delsarte, P. and Genin, Y. V. (1986). "The split Levinson algorithm." IEEE Transactions on Acoustics, Speech, and Signal Processing, v. ASSP-34(3), pp. 470–478.

Lavori futuri

  • Template:Cita pubblicazione
  • Brent R.P. (1999), "Stability of fast algorithms for structured linear systems", Fast Reliable Algorithms for Matrices with Structure (editors—T. Kailath, A.H. Sayed), ch.4 (SIAM).
  • Bunch, J. R. (1985). "Stability of methods for solving Toeplitz systems of equations." SIAM J. Sci. Stat. Comput., v. 6, pp. 349–364. [2]
  • Template:Cita pubblicazione

Sintesi

  • Bäckström, T. (2004). "2.2. Levinson–Durbin Recursion." Linear Predictive Modelling of Speech – Constraints and Line Spectrum Pair Decomposition. Doctoral thesis. Report no. 71 / Helsinki University of Technology, Laboratory of Acoustics and Audio Signal Processing. Espoo, Finland. [3]
  • Claerbout, Jon F. (1976). "Chapter 7 – Waveform Applications of Least-Squares." Fundamentals of Geophysical Data Processing. Palo Alto: Blackwell Scientific Publications. [4]
  • Template:Cita pubblicazione
  • Golub, G.H., and Loan, C.F. Van (1996). "Section 4.7 : Toeplitz and related Systems" Matrix Computations, Johns Hopkins University Press

Voci correlate

Template:Portale