MATLAB E LA STIMA SPETTRALE Ing.Irene Tagliente E-mail: irene.tagliente@opbg.net Corso Elaborazione Dati e Segnali Biomedici 2 Anno Accademico 2013/2014
COS È MATLAB Il programma MATLAB si è imposto in ambiente ingegneristico come strumento per la simulazione e l'analisi dei sistemi lineari e non lineari e più in generale per l'analisi numerica. Il nome deriva da "MATrixLABoratory" : MATLAB è un sistema interattivo, basato sulle matrici, teso alla computazione numerica.
OBIETTIVI DELLA LEZIONE Toolboxes in generale: Visualizzazioni e demos Matrici e vettori Stringhe di caratteri Grafici 2-D e 3-D Interpolazione 2-D e 3-D: curve fitting Funzioni matematiche e segnali: cos, sen, square wave, randn, ecc
TOOLBOXES IN GENERALE: VISUALIZZAZIONI E DEMOS MATLAB contiene una serie di 'sottoprogrammi' chiamati TOOLBOXES: essi comprendono un particolare gruppo di funzioni (M.files) che estendono il campo delle applicazioni del software, permettendo di risolvere particolari classi di problemi.
I principali TOOLBOXES MATLABR2012b
I PRINCIPALI TOOLBOXES THE SIGNAL PROCESSING TOOLBOX : contiene strumenti utili all'elaborazione di segnali digitali monodimensionali e bidimensionali, al progetto e all'analisi di filtri digitali e la stima dello spettro di potenza THE SPLINE TOOLBOX: contiene comandi per lavorare con le curve di interpolazione denominate splines. THE SYSTEM IDENTIFICATION TOOLBOX: contiene strumenti per la modellizzazione parametrica e per l'identificazione dei sistemi. E' specializzato nella stima di modelli basati su dati input/output o serie temporali. THE OPTIMIZATION TOOLBOX: contiene comandi per l'ottimizzazione di funzioni generali, lineari e non lineari. THE NEURAL NETWORK TOOLBOX: contiene funzioni per il progetto e la simulazione di reti neurali. THE CONTROL SYSTEM TOOLBOX: contiene funzioni per la modellizzazione, l'analisi ed il progetto di sistemi di controllo automatico.
I principali TOOLBOXES MATLABR2012b 1)Ricerca Funzioni/ Opzioni
I principali TOOLBOXES MATLABR2012b 1)Scelgo 2) Identifico e/o scelgo un esempio
Matrici e vettori L elemento fondamentale in MATLAB è la matrice rettangolare numerica: uno scalare corrisponde ad una matrice 1x1, un vettore è una matrice 1xn o nx1. Una variabile scalare: >> s = 5; Un vettore riga 1x4: >> r = [1 2 3 4] ; oppure >> r = [1,2,3,4]; Un vettore colonna 4x1: >> c = [1;2;3;4] c = 1 2 3 4 Si noti che non è necessario definire la dimensione del vettore altrimenti necessario in altri linguaggi di programmazione.
Matrici e vettori Per costruire una matrice si devono seguire le seguenti regole: racchiudere gli elementi tra parentesi quadre, separare gli elementi di una riga con spazi o virgole, utilizzare il punto e virgola o <invio> per indicare la fine di una riga. Ad esempio una matrice quadrata 3x3: La variabile A rimarrà in memoria fino a quando non si deciderà di eliminarla con il comando clear A.
Matrici e vettori Accedere ad un elemento di un vettore: indicare tra parentesi tonde la posizione dell elemento che si desidera. Accedere ad un elemento di una matrice: inserisce tra parentesi tonde il numero della riga seguito dal numero della colonna separati da virgola. Per modificare l elemento appartenente alla seconda riga e terza colonna della matrice basta fare la seguente assegnazione: >> A ( 2,3 ) =12 ; Per inserire il valore 1 nella posizione: 2a riga - 6a colonna:
Matrici e vettori L'istruzione r = ( 1: 3): parti dall'elemento in posizione 1 ed avanza con incrementi di 1 (default), fino ad arrivare all'elemento in posizione 3, Visualizzazione elementi di r: N posizione di partenza: Passo (+ o -): N ultima posizione di interesse Estrarre da un vettore elementi posti in posizione generica/ secondo un ordine differente da quello già stabilito
Matrici e vettori Creazione di matrici a partire da sottomatrici Aggiunge la riga r alla matrice A. Affiancamento Matrici: C= [A B] Prodotto di due Matrici D=A*B Prelevare sottomatrici da matrici: Elementi dalla riga 1 alla 3 e dalla colonna 1 alla 3.
Matrici e vettori Trasformare una matrice rettangolare in un vettore colonna Copiare una matrice in un altra Cancellare una colonna si utilizza il blank tra parentesi quadre: Calcolare la Matrice Trasposta: B
Stringhe di caratteri In MATLAB le variabili di testo sono indicate come stringhe di caratteri, o semplicemente stringhe. Tali stringhe sono considerate come vettori e/o matrici, i cui elementi rappresentano i numeri in codice ASCII che corrispondono ai caratteri da rappresentare. Ad esempio: >> t = Questa e una stringa di caratteri t = Questa e una stringa di caratteri Si noti che: per assegnare una stringa di caratteri ad una variabile si scrive la stringa tra apici (.. ); se la stringa contiene apostrofi questi vanno ripetuti due volte. Per valutare le dimensioni del vettore t si utilizza la funzione size: >> size ( t ) ans = 1 34 t e un vettore riga a 34 colonne (compresi apice e spaziature).
Stringhe di caratteri Per convertire un vettore stringa nel corrispondente vettore numerico (secondo il codice ASCII) si utilizza la funzione double: >> double ( t ) ans = Columns 1 through 12 81 117 101 115 116 97 32 101 39 32 117 110 Columns 13 through 24 97 32 115 116 114 105 110 103 97 32 100 105 Columns 25 through 34 32 99 97 114 97 116 116 101 114 105 Al carattere Q e associato il codice ASCII 81, al carattere u e associato il codice 117, e cosi via. Per ottenere la trasformazione da vettore numerico a vettore stringa secondo il codice ASCII si utilizza la funzione char : >> char ( t ) ans = Questa e una stringa di caratteri Poiche le stringhe sono particolari vettori, esse possono essere manipolate alla stregua delle matrici: >> u = t ( 15 : 21 ) u = stringa
Stringhe di caratteri Le stringhe sono particolari vettori possono essere manipolate alla stregua delle matrici e sono indirizzate come gli array:
Grafici 2D & 3D Il comando più utilizzato per disegnare grafici in 2-dimensioni è il comando plot il quale permette di unire mediante una spezzata i punti individuati dalle coordinate relative a due vettori i cui elementi sono riportati su una coppia di assi ortogonali. E' essenziale che i due vettori abbiano la stessa lunghezza. >> x = linspace(0,2*pi,30); >> y = sin(x); >> plot(x,y) Il vettore x contiene 30 elementi compresi tra 0 e 2 (estremi inclusi) e distribuiti sull'asse x. Il vettore y contiene il seno dei valori di x. Disegnare su una stessa FIGURE window le funzioni seno e coseno relativamente all'intervallo 0-2. >> x = linspace ( 0, 2*pi, 30 ); >> y = sin ( x ); >> z = cos ( x ); >> plot ( x, y, x, z )
Grafici 2D & 3D Se nel comando plot compare un solo argomento: ad es. plot(y) : se Y è un vettore di numeri complessi allora plot(y) è interpretato come plot (real(y),imag(y)) se Y è un vettore di numeri reali allora plot(y) è interpretato come plot(1:length(y),y) cioè disegna il vettore Y in funzione dell'indice dei suoi elementi - se Y è una matrice si applica l'interpretazione precedente ad ogni colonna di Y >> x = linspace ( 0, 2*pi, 30 ); >> y = sin ( x ); >> z = cos ( x ); >> plot ( x, y ) >> hold on Il comando hold on: permette di aggiungere grafici ad una FIGURE windows preesistente >> ishold % questa funzione logica restituisce 1 se hold è on altrimenti restituisce 0 >> plot ( x, z ) >> hold off >> ishold ans = 1 ans = 0
Grafici 2D & 3D E' possibile specificare il tipo di colore, segno e linea utilizzati dal comando plot per tracciare una figura. Ciò si ottiene completando il comando plot con un terzo argomento costituito da una stringa di caratteri racchiusi tra apici (ad es. plot (x,y, r+-- ) significa disegna y in funzione di x con il colore rosso, i punti marcati con il simbolo + e uniti da un tratteggio).
Grafici 2D & 3D Per eliminare la partizione basta utilizzare il comando: >> subplot (1,1,1) Il comando zoom: permette di espandere una regione di interesse all'interno di una FIGURE window. >> zoom out >> zoom off riporta la FIGURE window nello stato iniziale >>zoom ( n ) Per ottenere lo zoom secondo un fattore
Grafici 2D & 3D >> x = linspace (-2*pi, 2*pi, 60); >> y = sin(x); >> z = 2 * cos(x); >> plotyy (x,y,x,z), title ('sin(x) e 2cos(x) con scale differenti')
Grafici 2D & 3D Il comando mesh permette di realizzare una superficie, mappando in uno spazio 3D i punti contenuti nelle matrici X, Y, Z, C mesh ( X, Y, Z, C ) i punti che compongono la superficie hanno coordinate: ( X( i, j ), Y( i, j ), Z( i, j ) ) la matrice C viene utilizzata per specificare i colori della superficie stessa. Si osservi che le matrici X, Y, Z, C devono avere tutte la stessa dimensione mesh ( Z ) assumeremo X, Y, Z come delle matrici di dimensioni rispettivamente 1n, 1m e mn, quindi i punti che compongono la superficie hanno coordinate: ( X( j ), Y( i ), Z( i, j ) )
Grafici 2D & 3D dell uso simultaneo delle funzioni meshc e meshz insieme a subplot Varianti del comando mesh come: meshc : questo comando oltre a disegnare la superficie desiderata, traccia le curve equilivello della superficie meshz : con questo comando si mette in risalto il volume sotteso dalla superficie disegnata
Interpolazione 2-D e 3-D: curve fitting Sono possibili due approcci a questo problema: interpolazione regressione o curve fitting Il metodo della regressione consiste nel trovare la curva che meglio si adatta (curva 'best fit') ai dati sperimentali secondo il criterio della minimizzazione dell'errore quadratico (min (x i - x si ) 2 dove x si è il valore dell'i-esimo campione mentre x i corrisponde al valore della curva fitting). Si noti che la curva di regressione non passa necessariamente attraverso tutti i dati (questo differenzia il metodo curve fitting dal metodo dell'interpolazione).
Interpolazione 2-D e 3-D: curve fitting Interpolazione mono-dimensionale Per default MATLAB unisce i dati mediante una linea spezzata cioè utilizza una interpolazione lineare, supponendo che i valori intermedi tra i vari punti cadano esattamente sulla retta che li congiunge. >> x1 = linspace ( 0, 2*pi, 60 ) ; % 60 punti tra 0 e 2pi >> x2 = linspace ( 0, 2*pi, 6 ) ; % 6 punti tra 0 e 2pi >> plot ( x1, sin(x1), x2, sin(x2), '-') >> xlabel ('x'), ylabel ('sin(x)'), title ('Interpolazione lineare')
SIGNAL PROCESSING TOOLBOX OFFRE FUNZIONI MATLAB PER STIMARE LA DENSITÀ SPETTRALE DI POTENZA, LO SPETTRO DI POTENZA, LO PSEUDOSPETTRO E LA POTENZA MEDIA DEI SEGNALI. Algoritmi per l'analisi dello spettro in MATLAB Gli algoritmi per la stima dello spettro del toolbox comprendono: Metodi basati su FFT, ad esempio periodogrammi, Welch e MTM (multitaper) Metodi parametrici, come Burg e Yule-Walker Metodi basati sugli autovalori, ad esempio autovettori e classificazione di segnali multipli (MUSIC) Visualizzazione del dominio della frequenza Le funzioni di analisi dello spettro del toolbox consentono di calcolare e visualizzare: La rappresentazione tempo-frequenza di un segnale mediante la funzione spettrogramma La densità spettrale della potenza Lo spettro di potenzanza media dei segnali.
SVILUPPARE FILTRI DIGITALI FIR E IIR SIGNAL PROCESSING TOOLBOX CONSENTE DI SVILUPPARE, ANALIZZARE ED IMPLEMENTARE FILTRI DIGITALI FIR E IIR IN MATLAB. Risposte del filtro e metodi di sviluppo Il toolbox supporta una gamma completa di tipi di risposta e metodi di sviluppo, tra cui: Risposte per filtri passa-alto, passa-basso, passa-banda, ferma-banda, Hilbert, differenziatore, sagomatura degli impulsi e magnitudine arbitraria Finestra di Parks-McClellan e di Kaiser per lo sviluppo di filtri FIR Filtri di Butterworth, di Chebyshev tipo I e II e filtri ellittici per lo sviluppo di filtri IIR
Metodo diretto: Si definisce Densità Spettrale di Potenza di un segnale discreto x(n), n=0 N-1 P(ω) =1/N X(ω) 2 con X(ω)=FT[(x(n)] Nella realta si fa una DFT Le istruzioni Matlab sono: Y=fft(x,N) P=(abs(y).^2)/N
Esempio di implementazione in Matlab su Segnale Simulato %Calcolo densita' spettrale di potenza mediante DFT file Spettrogramma.m T=2.5; %tempo di osservazione Fs=1000; t=(0:1/fs:t-1/fs)'; N=length(t); x=sin(2*pi*30*t)+sqrt(0.5)*randn(n,1); %sinusoide a 30 Hz con sovrapposto rumore gussiano %a media nulla e varianza 0.5 subplot(211) plot(t,x) xlabel('tempo(sec)') title('segnale') FTx=fft(x,N); S=(abs(FTx).^2)/N; f_ft=(0:fs/n:fs-fs/n); S=S(1:N/2); %elimino la seconda meta' delle stime f_ft=f_ft(1:n/2); %elimino la seconda meta' dei campioni subplot(212) plot(f_ft,s) axis([0, Fs/2, 0, max(abs(s))]) xlabel('frequenze(hz)') title('densita'''' spettrale di potenza')
Metodo indiretto: P(ω) =FT[R x (m)] In pratica si hanno solo N campioni da cui si ottiene solo una stima di R x (m) per m=0,1,.m con M<<N Sfruttando poi la parita della funzione: R x (m) = R x (-m) e nulla per m >M Si ricorda che m N n x m n x n x m N m R 1 0 ) ( ) ( 1 ) ( ˆ
Esempio di implementazione in Matlab su Segnale Simulato %Calcolo densita' spettrale di potenza: metodo indiretto %(mediante stima autocorrelazione) file MetodoIndiretto.m T=2.5; Fs=1000; t=(0:1/fs:t-1/fs)'; N=length(t); x=sin(2*pi*30*t)+sqrt(0.5)*randn(n,1); %sinusoide a 30 Hz con sovrapposto rumore gussiano %a media nulla e varianza 0.5 subplot(211) plot(t,x) xlabel('tempo(sec)') title('segnale') M=round(N/5); autocorr=zeros(2*m+1,1); %stima della funzione di autocorrelazione for m=0:m somma=0; for j=0:(n-1-m) somma=somma+x(j+1)*x(m+j+1); end autocorr(m+1+m)=somma/(n-m); end for i=1:m autocorr(i)=autocorr(2*m+2-i); %per parita' segnale diventano 2M+1 campioni end
Continuazione metodo indiretto S=fft(autocorr,(2*M+1)); f_ft=(0:fs/(2*m+1):fs-fs/(2*m+1)); S=S(1:(M+1)); %elimino la seconda meta' delle stime f_ft=f_ft(1:(m+1)); %elimino la seconda meta' dei campioni subplot(212) plot(f_ft,abs(s)) axis([0, Fs/2, 0, max(abs(s))]) xlabel('frequenze(hz)') title('densita'''' spettrale di potenza')
Provare a: Modificare l intervallo di osservazione T=1.5, 1, 0.5, 0.1, 0.01 Vedere i grafici a punti Provare l effetto dello zero-padding (ad es con T=0.01, porre N=512) Modificare il segnale simulato: x=sin(2 pi 30 t)+3 sin(2 pi 60 t)+sqrt(0.5)randn(n,1) Provare con entrambi i metodi a stimare la densita spettrale per i dati veri contenuti in dati_eeg.mat (N=512, Fs=512 Hz) (N.B. ricordarsi di togliere il valor medio!!!)
Metodo basato su Stima spettrale AR: 2 2 1 2 2 1 1 ) ( ) ( ˆ u N k k j k u AR e a H P Il risultato dipende dall ordine p scelto per il modello AR I comandi Matlab sono: th=ar(x,p,'yw'); [spettro,f]=ar_dsp(th.a,th.noisevariance,n,fs); Dove ar_dsp e una funzione che calcola lo spettro dalla formula precedente
INTRODUZIONE Tipicamente un problema di identificazione inizia dopo aver progettato un set significativo di prove sperimentali ed aver raccolto una serie di dati dal sistema in esame. In questa presentazione supporremo sempre un approccio Black Box al problema dell identificazione; in altre parole, ci muoveremo come se non sapessimo nulla della fisica del sistema che genera i dati. Se i dati sono contenuti in un file.mat (estensione dei file di dati in matlab), il primo comando da digitare nel prompt di Matlab è:» load nomefile Ciò renderà i dati sperimentali disponibili nel Workspace della sessione di Matlab attiva.
ESEMPIO GUIDA Nel seguito, tutti gli esempi presentati faranno riferimento ad uno specifico sistema, che ora introduciamo. I dati sono stati raccolti simulando un sistema AR(3), asintoticamente stabile: y( t) a1 y( t 1) a2 y( t 2) a3 y( t 3) e( t) e( t) WN (4,1) con. I dati raccolti dalla simulazione sono stati memorizzati in due vettori chiamati ingresso (per il segnale e(t)) ed uscita (per il segnale y(t)), ognuno contenente 10000 campioni. Sulla base di tali dati si calcolerà il predittore e, nell ipotesi che il vero meccanismo di generazione dei dati sia ignoto, si vedrà come impostare la stima parametrica e non parametrica di un modello. Infine si passerà alla validazione del modello scelto.
RAPPRESENTAZIONE E TRATTAMENTO DEI DATI SPERIMENTALI Per iniziare, viene creato un oggetto iddata dove vengono salvati i dati. Questo oggetto consentirà di porre in un unica struttura le diverse informazioni, cui si potrà accedere (come in un usuale struttura C) con la notazione puntata nomemodello.proprietà Il comando Matlab è: >> mymod=iddata(uscita,ingresso,1); Con il comando >> get(mymod) si visualizzano a video tutte le proprietà dei dati. Analogamente, il comando >> set(mymod) consente all utente di modificare le proprietà dei dati.
RAPPRESENTAZIONE E TRATTAMENTO DEI DATI SPERIMENTALI La prima operazione da farsi sui dati prima di intraprendere la fase di identificazione vera e propria è la rimozione di eventuali trend presenti nei dati stessi. Nel caso dell esempio guida il trend si riduce al valor medio non nullo della serie temporale. I comandi che seguono rimuovono il trend e visualizzano il risultato di tale operazione: >> figure % creo una figura in cui plottare i dati >> subplot(2,1,1) %divido la figura in 2 parti in cui plotterò uscita e ingresso originali e senza trend >> plot(ingresso(1:100)); % grafico sulla finestra di grafico creata i primi 100 campioni del segnale in ingresso >> hold on; % mantengo aperta la figura corrente per plottare l ingresso dopo il detrend nella stessa finestra >> y=detrend(ingresso); %assegno alla variabile y i valori dell ingresso da cui viene rimosso il trend >> plot(y(1:100),'r') %grafico nella stessa finestra i campioni dell ingresso dopo il detrend in rosso >> hold off; % rilascio la figura corrente >> subplot(2,1,2) %creo una seconda finestra nella figura >> plot(uscita(1:100)); % grafico sulla finestra di grafico creata i primi 100 campioni del segnale in uscita >> hold on; % mantengo aperta la figura corrente per plottare l usicta dopo il detrend nella stessa finestra >> u=detrend(uscita); %assegno alla variabile u i valori dell uscita da cui viene rimosso il trend >> plot(u(1:100),'r') %gafico nella stessa finestra i campioni dell ingresso dopo il detrend in rosso >> hold off; % rilascio la figura corrente
RAPPRESENTAZIONE E TRATTAMENTO DEI DATI SPERIMENTALI - LA FUNZIONE DETREND - In generale, la funzione detrend (utilizzata nell esempio precedente per rimuovere il valor medio) offre la possibilità di rimuovere diversi tipi di trend La sintassi completa della funzione è: >> new_mod=detrend(mod,o,breakpoint) dove: mod è un oggetto iddata; o è l ordine del trend da rimuovere. Di default o=0: in questo caso si rimuove il trend di ordine 0, ossia la media del segnale. Con o=1 si possono eliminare i trend lineari, con o=2 i trend quadratici e così via; aumentando il valore del parametro o vengono rimossi trend polinomiali di ordine crescente. E possibile decidere anche su quale parte dei dati la funzione deve agire (è possibile infatti che la presenza del trend interessi solo una porzione dei dati). Specificando nel parametro breakpoint gli estremi della porzione di dati a cui applicare il detrend si può applicare la funzione solo alla parte dei dati di interesse. L output della funzione new_mod è un oggetto iddata che conterrà tutti i segnali contenuti in quello di partenza mod privati del trend.
RAPPRESENTAZIONE E TRATTAMENTO DEI DATI SPERIMENTALI Nella figura vediamo il risultato dell operazione di detrend sull esempio guida. Nella finestra in alto sono mostrati i campioni del segnale in ingresso originali (blu) e dopo il detrend (rosso). Nella finestra in basso gli analoghi andamenti dell uscita.
CALCOLO DEL PREDITTORE Si vuole ora ottenere, a partire dai dati raccolti, una predizione dei valori futuri dell uscita del processo mediante un modello (MA,AR(X),ARMA(X)) che l utente può scegliere per descrivere i dati raccolti. La sintassi della funzione Matlab che fa questo tipo di analisi è: >> yhat = predict(modello,dati,k,init) dove: modello è il tipo di modello che si è scelto per descrivere il meccanismo di generazione dei dati; dati è un oggetto di tipo iddata; k è l orizzonte predittivo; init è la modalità di inizializzazione; se init ='estimate lo stato iniziale è fissato al valore che minimizza l errore di predizione associato al modello ed ai dati; init = 'zero' fissa lo stato iniziale a zero; init = 'model' usa lo stato inziale del modello che viene automaticamente salvato alla sua creazione. L output è: yhat, un ogetto iddata i cui OutputData sono i valori predetti.
CALCOLO DEL PREDITTORE A partire dai primi 5000 dati raccolti nel vettore uscita, generati per simulazione tramite l esempio guida, si identifica un modello AR(3). Per l identificazione del Matlab utilizza, in questo caso, l algoritmo dei Minimi Quadrati. Se si fosse desiderato identificare, invece, un modello ARMA, Matlab avrebbe ricorso all algoritmo della Massima Verosimiglianza. >> modello = ar(uscita(1:5000),[3]); In questo modo si è identificato il modello AR(3). Questo modello può essere utilizzato per formare la predizione. In una prima fase, la predizione viene effettuata sui primi 5000 dati, gli stessi usati per l identificazione: >> yhat = predict(modello,[ingresso(1:5000);uscita(1:5000)],2, estimate ); In una seconda fase, la predizione viene effettuata sui restanti dati,così da avere un criterio oggettivo di valutazione della bontà predittiva del modello: >> compare(yhat,modello,2,5001: end);
CALCOLO DEL PREDITTORE Nella figura si vede il confronto tra la seconda metà dei dati e valori predetti dell uscita in base al modello AR(3) stimato.
STIMA NON PARAMETRICA In questa sezione ci occuperemo di stimare alcune caratteristiche del meccanismo di generazione dati (a noi noto solo attraverso una sua realizzazione) in modo non parametrico, senza passare attraverso l identificazione preventiva di un modello. Il primo passo per avere informazioni sulle caratteristiche del sistema è fare una stima della funzione di covarianza campionaria. Ciò si ottiene col comando: >>Gammahat = covf(mymod, 1); dove: mymod è un iddata che contiene i dati in ingresso e in uscita; t t2 t1 11 1 indica che. Il valore di questo parametro (nell esempio 1) decrementato di 1 sarà dunque il valore di t. Con 1, dunque, stimeremo la varianza campionaria. In questo caso, con i dati dell esempio guida, si ottiene: ˆ Rˆ ˆ yy uy (0) (0) ˆ ˆ yu uu 0 (0) 207.16 (0) 57.24 57.24 17.03
STIMA NON PARAMETRICA Il passo successivo della stima non parametrica è l analisi spettrale diretta. Un primo strumento per stimare lo spettro in questo modo è il periodogramma. A partire dai dati in esame, coi comandi >> [Pyy,w] = periodogram(uscita(1:1024)); >> plot(w,pyy) viene calcolato e graficato il periodogramma a partire da 1024 campioni dell uscita del sistema. Dato che, numericamente, il calcolo del periodogramma si basa sulla Fast Fourier Transform (FFT), per ottimizzare l algoritmo è consigliabile utilizzare un numero di campioni che sia una potenza di 2.
- IMAD - Politecnico di Milano: System Identification Toolbox di Matlab- STIMA NON PARAMETRICA In questa figura si vede il grafico del periodogramma calcolato su 1024 campioni dell uscita del processo. La densità spettrale di potenza stimata viene graficata come funzione delle frequenze w, la cui unità di misura, in Matlab, è [rad/sample].
STIMA NON PARAMETRICA Com è noto, la stima dello spettro via periodogramma soffre di diversi problemi, da cui deriva l estrema irregolarità del grafico. Uno dei rimedi più noti per ottenere stime più regolari dello spettro è utilizzare il metodo di Bartlett, ovvero suddividere i dati in diverse sottosequenze, calcolare il periodogramma di ognuna di esse, e ricavare la stima globale dello spettro come media di questi nuovi periodogrammi. Ciò si ottiene, in Matlab, con il comando: >> [Pyy,w]= pwelch(uscita(1:1024),bartlett(256),0); dove bartlett(256) indica che il tipo di finestra scelta è quella di bartlett (molte altre sono disponibili, ognuna ha delle caratteristiche peculiari che non discuteremo in questa sede) e che i campioni in ogni sottosequenza sono 256; 0 è il parametro con cui scegliere il numero di campioni di overlap. Il valore 0 indica che non si utilizzano finestre parzialmente sovrapposte. Matlab offre molte altre funzioni per la stima non parametrica della densità spettrale di potenza (per una panoramica esaustiva si rimanda alla System Identification Toolbox User s Guide).
- IMAD - Politecnico di Milano: System Identification Toolbox di Matlab- STIMA NON PARAMETRICA In questa figura si vede il periodogramm a stimato col metodo di Bartlett, con 4 sottosequenze da 256 dati l una. Si può apprezzare la riduzione delle fluttuazioni. Aumentando il numero delle sottosequenze il diagramma è via via più regolare.
STIMA NON PARAMETRICA DELLA RISPOSTA IN FREQUENZA Matlab consente anche la stima della risposta in frequenza del sistema a partire dai dati. Con la funzione spa : >>g = spa (data) dove data è un vettore che contiene campioni di una realizzazione del processo in esame, si ottiene in output g, che contiene tale stima: Gˆ ( e j Le frequenze cui viene calcolata la stima sono fissate di default ai valori w = [1:128]/128*pi/Ts, dove Ts è il tempo di campionamento (1 nel contesto in esame), ma possono essere anche scelte dall utente (nel qual caso dovranno essere passate come ulteriore parametro alla funzione spa). Con il comando >> bode (g) si ottiene il diagramma di Bode di modulo e fase della risposta in frequenza stimata. )
STIMA PARAMETRICA Passiamo ora ad analizzare le tecniche di identificazione parametrica, ovvero i metodi di identificazione che mirano a descrivere il meccanismo di generazione dati ignoto mediante un modello di una data famiglia (MA, AR(X), ARMA(X), ecc.). Cominciamo ad analizzare la procedura per la stima di un modello AR(n): dove: data uscita; n >> modello = ar (data, n, metodo) è un oggetto iddata che contiene i campioni di ingresso e è l ordine del modello; metodo permette di scegliere l algoritmo da utilizzare. Le opzioni più comuni sono ls, ovvero il metodo dei Minimi Quadrati, e yw che, per trovare la stima, risolve le equazioni di Yule Walker a partire dal calcolo delle funzioni di covarianza campionarie.
STIMA PARAMETRICA Per la stima di modelli MA e ARMA(X), si utilizza la funzione: >> modello = armax(dati,'na',na,'nb',nb,'nc',nc,'nk',nk) in cui i parametri sono quelli del modello teorico: A( z) y( t) B( z) u( t nk ) C( z) e( t) Con un opportuna scelta degli ordini delle diverse parti (AR, MA, X), si possono descrivere modelli AR,MA,ARMAX degli ordini desiderati. La procedura di stima si basa sull algoritmo della Massima Verosimiglianza (MLE).
SCELTA DEL MODELLO OTTIMO E SUA VALIDAZIONE In base alle funzioni viste nella precedente sezione, procederemo ora a stimare diversi modelli per descrivere i dati dell esempio. Si tratterà poi di scegliere il modello ottimo, sia dal punto di vista della complessità sia dal punto di vista della famiglia di modelli. Si sappia che i dati utilizzati nell esempio sono stati generati da un AR(3). Stimiamo 4 diversi modelli: un AR(1), un AR(3), un MA(3) ed un ARMA(1,2): >>m1=ar(uscita, 1, ls ); >>m2=ar(uscita, 3, ls ); >>m3=armax(uscita, na,0, nc,3 ); >>m4=armax(uscita, na,1, nc,2);
SCELTA DEL MODELLO OTTIMO E SUA VALIDAZIONE Prima di tutto occorre comprendere quale sia la famiglia di modelli cui è più probabile appartenga il meccanismo di generazione dati. Per far ciò, analizziamo l errore di predizione, sapendo che il caso ottimo è quello in cui l errore di predizione è un rumore bianco. A tal fine, utilizziamo una particolare funzione Matlab: >> resid(m1,uscita) >> resid(m2,uscita) >> resid(m3,uscita) >> resid(m4,uscita) Tale funzione calcola l errore di predizione commesso dal predittore associato al modello e ne valuta la funzione di autocorrelazione. Il grafico mostra i valori di tale funzione rispetto ad un intervallo di confidenza del 99%. Se l errore è bianco, pertanto, ci aspettiamo che tutti i valori della funzione di autocorrelazione, ad eccezione ovviamente del primo, siano nulli, o comunque sufficientemente piccoli da restare all interno dell intervallo di confidenza.
SCELTA DEL MODELLO OTTIMO E SUA VALIDAZIONE La figura mostra l analisi dei residui prima descritta nel caso del modello AR(1). Come si vede l errore di predizione non è bianco, coerentemente col fatto che il meccanismo di generazione dati reale è un AR(3).
SCELTA DEL MODELLO OTTIMO E SUA VALIDAZIONE La figura mostra l analisi dei residui prima descritta nel caso del modello MA(3). Come si vede l errore di predizione non è bianco, coerentemente col fatto che il meccanismo di generazione dati reale è un AR(3).
SCELTA DEL MODELLO OTTIMO E SUA VALIDAZIONE - IMAD - Politecnico di Milano: System Identification Toolbox di Matlab- La figura mostra l analisi dei residui prima descritta nel caso del modello ARMA(1,2). Come si vede l errore di predizione non è bianco, coerentemente col fatto che il meccanismo di generazione dati reale è un AR(3).
SCELTA DEL MODELLO OTTIMO E SUA VALIDAZIONE La figura mostra l analisi dei residui prima descritta nel caso del modello AR(3). Come si vede l errore di predizione in questo caso è bianco (si vede che l unico campione della funzione di autocorrelazione diverso da zero è il primo), coerentemente col fatto che il meccanismo di generazione dati reale è proprio un AR(3). - IMAD - Politecnico di Milano: System Identification Toolbox di Matlab-
SCELTA DEL MODELLO OTTIMO E SUA VALIDAZIONE Una volta individuata la famiglia di modelli, nel nostro caso AR(n), occorre determinare la complessità ottima. Esaminiamo le funzioni Matlab che consentono questa analisi, applicandole ai modelli della famiglia AR con ordine n = 1,...,10. Per fare ciò utilizziamo i criteri noti, ovvero il Final Prediction Error (FPE) e l Akaike Information Criterion (AIC). I comandi Matlab >> aic(modello) >>fpe (modello) consentono di calcolare i valori di tali indici per il modello identificato.
SCELTA DEL MODELLO OTTIMO E SUA VALIDAZIONE La figura mostra l andamento di FPE al variare dell ordine. Coerentement e con quanto ci si aspetta, l ordine che ottimizza questo criterio nel caso dell esempio guida è n =3. - IMAD - Politecnico di Milano: System Identification Toolbox di Matlab-
ALGORITMI DI IDENTIFICAZIONE RICORSIVI E CON OBLIO Spesso, per ottimizzare i tempi di calcolo, è opportuno utilizzare algoritmi ricorsivi per l identificazione, ad esempio il Recursive Least Square Algorithm (RLS). Allo stesso modo, spesso si vuole poter agire sul peso relativo dei dati, attribuendo importanza minore ai dati lontani nel tempo. Ciò si realizza introducendo il coefficiente d oblio. Matlab offre la possibilità di scegliere questa strada. Per esempio: >> [est,yhat] = rarx (uscita(1:length(uscita)/2),[3], ff,0.98 ); fornisce una stima dei parametri di un modello AR(3), costruito a partire dalla prima metà dei dati utilizzando l algoritmo RLS. In questo caso si è usata l opzione ff (leggi: forgetting factor), che utilizza un coefficiente di oblio, fissato, in questo caso, a 0.98. Gli output di questa funzione sono est, che è una matrice la cui k-esima riga contiene i parametri stimati al tempo k (ovvero stimati in base ai dati fino al k-esimo incluso); yhat è il vettore che contiene la predizione dell uscita secondo il modello stimato. Si può valutarne la bontà analizzando l errore di tale predizione sulla seconda metà dei dati (non utilizzati nella stima del modello).
L INTERFACCIA GRAFICA Per concludere questa breve panoramica sul System Identification Toolbox, introduciamo la GUI che questo tool offre. Per aprirla occorre scrivere al prompt >> ident Questa è l interfacci a che si presenta all utente
L INTERFACCIA GRAFICA Per analizzare i dati occorre importarli: il menù a tendina Data consente di importare i dati dal Workspace di Matlab. E offerta all utente la possibilità di pretrattare i dati importati, secondo le modalità indicate nel menù posto sotto alla scritta Operations (si possono rimuovere i trend, selezionare solo alcune variabili da analizzare, effettuare dei prefiltraggi, ecc.). Dopo aver scelto i dati da analizzare si possono costruire delle stime sia parametriche sia non parametriche, come specificato nelle opzioni del menù a tendina Estimate E possibile, inoltre, importare dei modelli creati precedentemente in Matlab (mediante l opzione import del menù Models ).
L INTERFACCIA GRAFICA Scegliendo l opzione di identificazione parametrica, per esempio, si apre una finestra di dialogo in cui scegliere il tipo di modello e il suo ordine:
L INTERFACCIA GRAFICA Una volta creati i modelli, essi vengono visualizzati nei riquadri sotto la scritta Models. Selezionando una delle caselle sotto la scritta Model Views si possono valutare e confrontare le caratteristiche dei diversi modelli (analizzare gli errori di predizione, valutare la risposta all impulso e allo scalino dei vari modelli, le risposte in frequenza dei modelli stimati, ecc.) Dunque questa interfaccia è uno strumento utile ed intuitivo per la fase iniziale di analisi in una procedura reale di indentificazione. E ovvio, peraltro, che ogni singolo problema avrà delle peculiarità che, quasi sempre, richiederanno un analisi studiata ad hoc, per la quale sarà necessario creare nuove funzioni Matlab che sfruttino le potenzialità del Toolbox ma siano orientate alla specifica applicazione.