Lattice Wave Digital Filters

Una breve introduzione alle principali caratteristiche strutturali dei "Lattice Digital Filters" e alla loro implementazione tramite microcontrollori MSP430. 

Il filtraggio numerico è ormai diventata una tecnica di ampio utilizzo nei moderni sistemi di elaborazione e trattamento dei segnali. I filtri digitali hanno prestazioni nettamente superiori rispetto alla controparte analogica: in termini di risposta in frequenza presentano bande di transizione molto ristrette e valori di ripple in banda passante e oscura relativamente bassi; la presenza poi di numerosi tools di sviluppo e progettazione automatica rende agevole il loro disegno a partire dalle specifiche volute, mentre per quanto riguarda la loro implementazione software esistono numerosi dispositivi specializzati, come DSP di grande potenza o micro general-purpose dal costo più contenuto. Una vasta classe di filtri IIR (a risposta impulsiva infinita), proposti per la prima volta agli inizi degli anni Settanta, sono i LWDF (“lattice wave digital filter“): essi sono completamente caratterizzati da un insieme di coefficienti (gamma) che non richiedono un uso eccessivo di memoria e registri; inoltre sono dotati di una struttura che permette di realizzarli attraverso un insieme ristretto di equazioni e iterazioni; l’applicazione dell’algoritmo di Horner per la valutazione delle funzioni polinomiali che rappresentano l’implementazione  numerica del filtro consente veloci tempi di calcolo ed eccellenti caratteristiche di stabilità e filtraggio.

Lattice Wave Digital Filters

Come si vede dalla figura 1 la struttura generale di un LWDF si realizza attraverso l’impiego in cascata di più sezioni del primo o del secondo ordine (all-pass sections o adaptors) collegate secondo uno schema fisso e indipendente dal tipo di filtro che si vuole ottenere; nel disegno l’LWDF consiste di adaptors a due porte, con due ingressi e due uscite, cui sono affiancati opportuni elementi di ritardo rappresentati tramite  i blocchi T (delay elements).

Figura 1: Struttura di un LWDF

Figura 1: Struttura di un LWDF

Come si può notare esiste una parte superiore (top section) composta dagli adaptors 0,3,4,7,8…ed una inferiore (bottom section) da quelli 1,2,5,6 …: esse sono completamente indipendenti ma i loro segnali sono poi combinati in modo da ottenere le due uscite complementari HPF e LPF. Il numero totale N degli adaptors (sempre dispari) rappresenta l’ordine del filtro ed è il minimo, rispetto ad altre possibili realizzazioni IIR, per ottenere una data funzione di trasferimento. Come si vedrà più in dettaglio oltre, ciascun adaptor realizza numericamente  sul segnale tre addizioni e una moltiplicazione; quest’ultima coinvolge i già citati coefficienti gamma, i quali si possono ottenere direttamente a partire dalla risposta in frequenza della corrispondente sezione a due porte analogica. Tale problema è ampiamente trattato in letteratura ed esistono tools di sviluppo che, date le specifiche del filtro come ripple, frequenza di campionamento, tagli tra le bande…ne calcolano automaticamente ordine e coefficienti. Utilizzando opportunamente più LWDFs e sfruttando le uscite complementari viste si possono ottenere innumere voli tipologie di filtri: per esempio la combinazione di un LWDF passa alto e di uno passa basso realizza contemporaneamente un filtro passa-banda da un’uscita e uno elimina-banda da quella complementare, come si può vedere dalla figura 2.

Figura 2: Connessione di due LWDFs

Figura 2: Connessione di due LWDFs

La figura 3 riporta un particolare tipo di LWDF, detto Bireciproco.

Figura 3: Struttura di un LWDF Bireciproco.

Figura 3: Struttura di un LWDF Bireciproco.

In esso tutti i coefficienti gamma pari, incluso lo zero, si annullano; rimangono solo da implementare gli adaptors dispari, con un notevole risparmio di tempo di esecuzione e un alleggerimento del codice. Di contro esso presenta una intrinseca frequenza di cut-off e una frequenza di campionamento del segnale ridotta ad un quarto rispetto ad un LWDF completo. Questa struttura può realizzare filtri di Butterworth ed Ellittici, ma non di Chebychev.

Implementazione dell’LWDF

Come già ricordato ogni LWDF è completamente determinato dal numero e tipo di adaptors impiegati, dai coefficienti gamma (o alfa) e dai delay-elements: ottenuti questi dati da opportuni tools interattivi integrati nell’ambiente di sviluppo non rimane altro che tradurre le suddette routine matematiche in codice. Considerata la struttura tipica degli adaptors e l’operazione di moltiplicazione svolta in essi, gli esempi che seguono fanno uso dell’algoritmo di Horner, il quale permette di valutare un generico polinomio della forma:

P(x) = xN +a1*xN-1+ a2*xN-2+…aN-1*x + aN

svolgendo N addizioni e N moltiplicazioni, anziché le N addizioni e le (N(N+1))/2 moltiplicazioni richieste con il metodo di valutazione tradizionale: ciò consente di eseguire la moltiplicazione per il coefficiente  alfa in un numero minimo di istruzioni di add e shift.

Figura 4,5,6,7: Connessioni interne dei 4 tipi di Adaptors più comuni.

Figura 4: Connessioni interne dei 4 tipi di Adaptors più comuni.

Implementazione passo-passo sul micro  MSP430

Inizializzazione: si consideri nuovamente la figura 1: per un dato ordine N del filtro ci sono N adaptors, ciascuno con due inputs (INP1 e INP2) e due outputs (OUTP1 e OUTP2). E’necessario inizializzare entrambi gli inputs prima di avviare le operazioni connesse al relativo adaptor. Inoltre vanno assegnati i valori iniziali agli N delays: questi possono essere convenientemente posti uguali a 0 e poi via via aggiornati durante l’esecuzione del codice.

Implementazione dell’algoritmo di Horner: per ciascun adaptor è necessario scrivere una funzione che, in base a quale dei 4 tipi di adaptors si vuole implementare, fornisca i valori degli OUTPUTs e i nuovi delays. Il tempo di esecuzione della moltiplicazione per il numero alfa si può ridurre ricorrendo al metodo di Horner e alla rappresentazione  CSD per il coefficiente alfa stesso.

Uso e reinizializzazione dei  delays: sempre rifacendosi alla figura 1 si vede come il codice deve provvedere a reinizializzare le n variabili delays durante l’operazione di filtraggio. Esse vanno caricate con i valori forniti da OUTPUT2 e fungono a loro volta da input per l’adaptor successivo o per lo stesso all’arrivo di un nuovo sample all’ingresso dell’LWDF.

Operazioni di flitro - sezione  superiore  dell’LWDF:  per un corretto funzionamento dell’LWDF va sempre inizializzata per prima la sezione superiore, partendo con l’adaptor 0 e seguendo l’ordine adaptor 4, 3, 8, 7 e così via. Per l’adaptor 0 l’INP1 coincide con il sample digitale in ingresso al filtro, mentre INP2 è uguale al valore di OUTP2, precedentemente memorizzato nella variabile delay0. Il valore calcolato di OUTP1 diventa il nuovo ingresso INP1 per l’adaptor3, mentre  il nuovo OUTP2 viene caricato in delay0. L’adaptor 4 viene implementato con l’INPUT1 caricato col valore ritardato di OUTP2 dell’adaptor 3 (valore che si legge da delay3) e con l’INPUT2 preso dal valore ritardato del proprio OUTP2 (memorizzato in delay4). Ottenuti dalla rispettiva funzione i valori di OUTP1 e OUTP2, quest’ultimo andrà nuovamente a caricare delay4, mentre il primo sarà il nuovo valore di ingresso INP2 dell’adaptor3. La funzione che implementa quest’ultimo avrà così gli input necessari per produrre le due uscite corrispondenti. Di queste OUTP1 diventa l’INPUT1 dell’adaptor7, mentre OUTP2 sarà caricato in delay3. Seguendo questo iter la sezione superiore produrrà la propria uscita finale pari all’OUTP1 dell’adaptor N-3.

Operazioni di  filtro:  sezione inferiore dell’LWDF: la sezione inferiore viene implementata partendo dall’adaptor2, 1, 6, 5… Per l’adaptor 1 INPUT1 coincide con il sample d’ingresso e l’INPUT2 è uguale all’OUTP1 dell’adaptor 2. I successivi  adaptors vengono processati in modo simile a quanto visto per la sezione superiore. Come risultato finale viene prodotto l’output della bottom section, coincidente col valore OUTP1 dell’adaptor N-1.

Output  sample:  l’output finale dell’LWDF sarà dato dalla somma (LPF) e dalla differenza (HPF) dei valori finali delle due sezioni del filtro. Come già ricordato, essendo LPF e HPF complementari, possono contemporaneamente essere utilizzate per realizzare filtri passa banda o elimina banda. Il listato 3 riporta un esempio di pseudo-codice di implementazione di un possibile filtro di ordine 9.

Esempio  di codice  di inizializzazione e implementazione del filtro

Nel listato 1 viene riportato un esempio di codice C che può essere utilizzato per valutare la risposta in frequenza di un ipotetico filtro del nono ordine.

# include “sine.data_ex1.dat”
# include <stdio.h>
int wdf_ex1(int);
int delay0, delay1, delay2, delay3,
int delay4, delay5, delay6, delay7, delay8;
int I, outer_loop, input, output;
float sum=0,gain[44], finaloute5;
main()
  { //scansione di 44 frequenze
  for (outer_loop=0; outer_loop<44; outer_loop++)
  {
       delay0=0; //inizializzazione dei delays
       delay1=0;
       delay2=0;
       delay3=0;
       delay4=0;
       delay5=0;
       delay6=0;
       delay7=0;
       delay8=0;
       sum=0;
       //400 samples per ciascuna frequenza
       for (I=0;I<400;I++)
       {
             input=(data[(outer_loop)*400+I]);
             //funzione che implementa il filtro
             wdf_ex1(input);
             //valore restituito dal filtro
             finalout=output/2047.0;
             //valore che rappresenta il guadagno
             sum=sum+finalout*finalout;
         }
         gain[outer_looop]=sum;
         printf(“%f\n”,sum);
    }
}
Listato 1
; Adaptor0 Tipo1 alfa0 =0.332286 alfa0(bin)= 0.010101010001
mov.w r12, r11 ;r11= sample d’ingresso
sub.w &delay0, r12 ;creazione del valore P1
;P1= input1- input2
;(quest’ultimo caricato in delay0)
rra.w r13
rra.w r13
rra.w r13
rra.w r13
add.w r12,r13 ; x1=x*2^-4 + x
rra.w r13
rra.w r13
add.w r12,r13 ; x2=x1*2^-2 + x
rra.w r13
rra.w r13
add.w r12,r13 ; x3= x2*2^-2 + x
rra.w r13
rra.w r13
add.w r12,r13 ;x4= x3*2^-2 + x
rra.w r13
rra.w r13
add.w &delay0,r13 ;output2= alfa*p1 + input2
;(preso da delay0)
mov.w r13, &delay0 ; delay0 caricato con output2
sub.w r12,r13 ; r13=output1 = output2 – p1
mov.w r13,r15 ; r15=output1
Listato 2
void main(void)
{
//initializations
delay0=0;
delay1=0;
delay2=0;
delay3=0;
delay4=0;
delay5=0;
delay6=0;
delay7=0;
delay8=0;
//wave digital filter stars here
//top section
INP1=Input sample, INP2=delay0
filter(alpha0, adaptor_type[0], INP1, INP2);
delay0=OUTP2
INP1=delay3, INP2=delay4
filter(alpha4, adaptor_type[4], INP1, INP2);
delay4=OUTP2
INP1=OUTP1 of Adaptor 0, INP2=OUTP1 of Adaptor 4
filter(alpha3, adaptor_type[3], INP1, INP2);
delay3=OUTP2
INP1=delay7, INP2=delay8
filter(alpha8, adaptor_type[8], INP1, INP2);
delay8=OUTP2
INP1=OUTP1 of Adaptor 3, INP2=OUTP1 of Adaptor 8
filter(alpha7, adaptor_type[7], INP1, INP2);
delay7=OUTP2
Output1=OUTP1
}
Listato 3

Come si può notare il primo ciclo for fa la scansione di 44 frequenze diverse, mentre il secondo for scandisce, per ciascuna frequenza, 400 campioni presi da una stringa di dati memorizzati nel file sine_data_ex1.dat: ognuno di questi valori sarà poi processato dalla funzione wdf_ex1, che implementa il filtro LWDF. Per calcolare il guadagno relativo a ciascuna frequenza vengono sommati i quadrati dei valori di output restituiti dalla funzione (finalout): essi rappresentano  i 400 valori in uscita dal filtro, corrispondenti agli altrettanti valori in ingresso.  I valori dei 44 guadagni sono poi memorizzati nel vettore gain[ ]. La funzione wdf_ex1 richiede in ingresso un sample (input), lo elabora secondo la successione prestabilita e il tipo di ciascun adaptor e restituisce  il valore d’uscita finalout. Per il filtro del nono ordine considerato nell’esempio tale funzione dovrà implementare nove adaptors secondo lo schema previsto per ciascun tipo. La moltiplicazione per il coefficiente alfa viene eseguita tramite istruzioni di add e shift secondo la regola di Horner per risparmiare cicli macchina e registri di memoria, data la natura ricorsiva dell’algoritmo. Nel listato 2 è mostrato un esempio in codice assembler relativo ad un adaptor0 del primo tipo.

 

 

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend