Esercitazioni MATLAB

September 24, 2017 | Author: anya111 | Category: Matlab, Directory (Computing), Matrix (Mathematics), Mathematics, Physics & Mathematics
Share Embed Donate


Short Description

Download Esercitazioni MATLAB...

Description

Esercitazioni con MATLAB per il corso di TRATTAMENTO DEI SEGNALI Laurea Magistrale in Fisica

Dott. Silvia Maria Alessio - Dipartimento di Fisica Universit`a di Torino - Anno Accademico 2011/2012 18 aprile 2012

Introduzione In questo documento sono raccolte le esercitazioni che accompagnano il corso di Trattamento dei segnali. Esse si dividono in esercitazioni “guidate”, intese per essere svolte in classe sotto la diretta supervisione della docente, ed esercitazioni “libere”, che lo studente svolger` a per proprio conto secondo le indicazioni fornite. In seguito preparer` a una breve relazione sui risultati ottenuti, da portare all’esame.

ii

Indice

Introduzione

ii

1 Esercitazioni guidate

4

1.1

1.2

1.3

Un primo approccio a MATLAB . . . . . . . . . . . . . . . . . .

4

1.1.1

Premessa . . . . . . . . . . . . . . . . . . . . . . . . . . .

4

1.1.2

Generalit`a su MATLAB . . . . . . . . . . . . . . . . . . .

5

1.1.3

L’ambiente di lavoro MATLAB . . . . . . . . . . . . . . .

7

1.1.4

Generazione di dati sintetici . . . . . . . . . . . . . . . . .

20

Trasformata discreta di Fourier . . . . . . . . . . . . . . . . . . .

23

1.2.1

Premessa . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

1.2.2

DFT e spettro di ampiezza: caratteristiche . . . . . . . .

24

1.2.3

La function fft di MATLAB . . . . . . . . . . . . . . . . .

25

1.2.4

Prove con dati sintetici . . . . . . . . . . . . . . . . . . .

26

1.2.5

Prova coi dati di pressione . . . . . . . . . . . . . . . . . .

28

1.2.6

Aliasing . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

Filtraggio nel dominio del tempo . . . . . . . . . . . . . . . . . .

30

1.3.1

Premessa . . . . . . . . . . . . . . . . . . . . . . . . . . .

30

1.3.2

Filtraggio via equazione alle differenze . . . . . . . . . . .

34

1.3.3

Filtraggio mediante convoluzione lineare . . . . . . . . . .

35

1

2

INDICE

1.4

1.5

1.6

1.3.4

Filtraggio nel dominio della frequenza . . . . . . . . . . .

36

1.3.5

Filtraggio a fase nulla . . . . . . . . . . . . . . . . . . . .

37

1.3.6

Filtraggio con decimazione . . . . . . . . . . . . . . . . .

37

Caratteristiche di un filtro numerico . . . . . . . . . . . . . . . .

40

1.4.1

Premessa . . . . . . . . . . . . . . . . . . . . . . . . . . .

40

1.4.2

Risposta in frequenza . . . . . . . . . . . . . . . . . . . .

41

1.4.3

Risposta all’impulso . . . . . . . . . . . . . . . . . . . . .

43

1.4.4

Deconvoluzione . . . . . . . . . . . . . . . . . . . . . . . .

43

Progetto di filtri FIR equiripple . . . . . . . . . . . . . . . . . . .

44

1.5.1

Premessa . . . . . . . . . . . . . . . . . . . . . . . . . . .

44

1.5.2

Procedura di progetto: un passa-banda . . . . . . . . . .

45

1.5.3

Stima dell’ordine minimo . . . . . . . . . . . . . . . . . .

46

1.5.4

Progetto di filtri passa-basso e passa-alto . . . . . . . . .

48

Metodi di stima dello spettro di potenza . . . . . . . . . . . . . .

48

1.6.1

Premessa . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

1.6.2

Metodi non-parametrici . . . . . . . . . . . . . . . . . . .

49

1.6.3

Metodi parametrici . . . . . . . . . . . . . . . . . . . . . .

59

2 Esercitazioni libere 2.1

61

Analisi di una serie temporale . . . . . . . . . . . . . . . . . . . .

61

2.1.1

Premessa . . . . . . . . . . . . . . . . . . . . . . . . . . .

61

2.1.2

Analisi statistica elementare . . . . . . . . . . . . . . . . .

62

2.1.3

Autocorrelazione . . . . . . . . . . . . . . . . . . . . . . .

63

2.1.4

Spettro di potenza . . . . . . . . . . . . . . . . . . . . . .

63

2.1.5

Significativit`a dei picchi . . . . . . . . . . . . . . . . . . .

65

2.1.6

Whitening . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

3

INDICE

2.2

2.1.7

Rumore rosso . . . . . . . . . . . . . . . . . . . . . . . . .

66

2.1.8

Stazionariet` a . . . . . . . . . . . . . . . . . . . . . . . . .

67

Analisi spettrale evolutiva: la CWT . . . . . . . . . . . . . . . .

68

2.2.1

Premessa . . . . . . . . . . . . . . . . . . . . . . . . . . .

68

2.2.2

Le function . . . . . . . . . . . . . . . . . . . . . . . . . .

69

2.2.3

Il programma . . . . . . . . . . . . . . . . . . . . . . . . .

73

2.2.4

Interpretazione dello scalogramma . . . . . . . . . . . . .

77

2.2.5

Prove con wavelets diverse . . . . . . . . . . . . . . . . . .

78

2.2.6

Spettro globale di wavelet . . . . . . . . . . . . . . . . . .

79

2.2.7

Scelta delle scale . . . . . . . . . . . . . . . . . . . . . . .

80

Capitolo 1

Esercitazioni guidate 1.1

Un primo approccio a MATLAB

1.1.1

Premessa

Lo scopo dell’esercitazione `e quello di imparare ad usare MATLAB 1 ad un livello di base, utilizzando questo breve testo per provare al computer alcune operazioni elementari, seguendo passo per passo le istruzioni date.

Attenzione: il testo che segue `e volto esclusivamente a fornire agli studenti del corso di Trattamento dei Segnali le nozioni indispensabili per eseguire le esercitazioni. Non va pertanto considerato una introduzione a MATLAB con caratteristiche di generalit` a e completezza.

Nella prossima sottosezione viene data un’idea generale della struttura di MATLAB e delle parti che lo compongono; nel terzo si accede a MATLAB, si introducono al suo interno alcune variabili e si impara a maneggiarle e a graficarle in modo semplice. Segue una sottosezione in cui si parla di generazione di segnali sintetici (cio`e dati simulati matematicamente, non frutto di vere misure). Nell’elaborazione numerica dei segnali si presenta spesso la necessit`a di generare tali segnali, per utilizzarli al fine di testare algoritmi e sistemi. poich´e, come si vedr` a, dati possono essere importati in ambiente MATLAB e poi esportati, si consiglia di creare nella propria area di lavoro una directory o cartella apposita, in cui poi risiederanno tutti i files relativi agli scambi tra MATLAB e l’ambiente di lavoro esterno (files da importare e files esportati). Durante le esercitazioni si useranno alcuni files (contenenti set di dati, filtri numerici e pro1 Ci

si riferisce alla versione 7.8.0, R2009a di MATLAB.

4

1.1. UN PRIMO APPROCCIO A MATLAB

5

grammi) che lo studente dovr` a copiare nella propria area di lavoro, prelevandoli dalla pagina web del Corso su Campusnet (http://fisica.campusnet.unito.it) 2 .

1.1.2

Generalit` a su MATLAB

MATLAB `e un sistema software interattivo per • calcolo, • visualizzazione e grafica, • analisi ed elaborazione di dati, • simulazione e modellazione, • programmazione in un proprio linguaggio. L’elemento di base `e una matrice che non richiede dimensionamento: MATLAB sta in effetti per “Matrix Laboratory” ed in esso tutte le variabili sono matrici. Il sistema software MATLAB `e costituito da un pacchetto fondamentale (MATLAB Toolbox), pi` u numerosi Toolboxes per applicazioni specifiche: ad esempio elaborazione numerica dei segnali, wavelets, statistica, ecc... Il pacchetto-base include cinque parti principali. 1. L’ambiente di lavoro MATLAB (Development Environment): set di strumenti che consentono di usare files e function di MATLAB (le function sono programmi che implementano i vari algoritmi; si veda pi` u avanti). Tramite tali strumenti si manipolano, nel cosiddetto workspace di MATLAB, che ospita l’insieme delle variabili definite in un dato istante di una sessione di lavoro, le variabili stesse; si importano ed esportano dati nel e dal workspace, ecc... Il desktop di MATLAB include la Command Window (finestra dove, al prompt di MATLAB, si possono digitare direttamente i comandi); un’altra finestra col “diario” dei comandi dati in precedenza (Command History); un elenco dei componenti installati 3 ; browser per accedere all’help, per elencare le variabili contenute nel workspace, i files presenti nelle directories/cartelle... Oltre a lavorare da linea comandi, l’utente pu` o accedere a vari strumenti specialistici (Tools, come ad es. sptool relativo al Toolbox di Signal Processing) che si presentano come Graphical User Interfaces (GUIs) 4 . 2 Il lettore che non disponga delle credenziali necessarie pu` o richiedere il materiale all’autrice, tramite e-mail all’indirizzo alessioph.unito.it. 3 I Toolboxes specialistici si acquistano separatamente dal pacchetto di base. 4 In queste esercitazioni si lavorer` a prevalentemente da linea comandi e/o tramite semplici programmi: si ` e ritenuto pi` u istruttivo per lo studente accedere cos`ı, piuttosto che dalle GUIs, ai vari algoritmi. Tuttavia le GUIs sono molto comode e lo studente ` e caldamente incoraggiato ad esplorarle.

6

CAPITOLO 1. ESERCITAZIONI GUIDATE 2. La libreria di funzioni matematiche (function): algoritmi di calcolo che vanno dalle funzioni elementari, come seno e coseno, a funzioni pi` u complicate, come ricerca degli autovalori di una matrice o FFT. Le function sono insiemi di istruzioni, cio`e programmi in linguaggio MATLAB, indicati come M-files perch´e caratterizzati da una estensione .m. Ogni Toolbox non `e nient’altro che una raccolta di M-files. Tra le categorie di M-files disponibili nel pacchetto-base citiamo: • matrici e loro manipolazione;

• funzioni matematiche elementari;

• funzioni matematiche specialistiche; • analisi dati e FFT;

• interpolazione, polinomi;

• soluzione di equazioni differenziali, ecc... Gli M-files corrispondenti a funzioni relative ad un certo argomento si trovano raggruppate in una singola directory/cartella di MATLAB; per esempio, funzioni della libreria matematica si trovano in • elmat

• elfun

manipolazione elementare di matrici, funzioni matematiche elementari,

• datafun analisi dati e FFT,

• polyfun interpolazione e polinomi.

3. Il sistema grafico (Handle Graphics): comprende comandi high level, per visualizzare dati in due e tre dimensioni (e altro, p.es. animazioni) e comandi low level per personalizzare i grafici ottenuti. Esiste anche la possibilit`a di costruire GUI’s (Graphical User Interfaces), con menu per gestire le applicazioni personali, sviluppate dall’utente usando il linguaggio di programmazione MATLAB. 4. Il linguaggio di programmazione MATLAB, che serve all’utente per sviluppare i propri algoritmi di calcolo, i quali vengono posti in nuovi M-files (script e function). Le espressioni matematiche coinvolgono intere matrici, per cui si ha una grande concisione nel linguaggio, con conseguente rapidit` a di programmazione. Uno script file `e un M-file contenente una sequenza di istruzioni in linguaggio MATLAB. Supponiamo di aver creato, con un editor qualsiasi o con quello disponibile in MATLAB (v. descrizione del desktop nella prossima sottosezione), un nuovo M-file detto nuovo.m. Dando il comando >>nuovo le istruzioni verranno eseguite; si tratta dunque dell’analogo di una subroutine del Fortran. Un function file `e anch’esso un M-file, salvo che in testa ha una definition line in cui vengono definiti esplicitamente l’input e l’output: per esempio function h = circle(x,y,r) %CIRCLE=function to draw a circle of radius r centered in x,y

1.1. UN PRIMO APPROCCIO A MATLAB

7

%Call syntax: circle(x,y,r); %Input: (x,y) = center coordinates; r = radius %Output: none th = 0:pi/50:2*pi; xunit = r * cos(th) + x; yunit = r * sin(th) + y; h = plot(xunit, yunit); ` quindi analogo ad una function Fortran. E 5. La Application Program Interface (API): una libreria che consente di scrivere programmi in FORTRAN e C che interagiscono in vari modi con MATLAB. Le modalit` a d’uso di MATLAB pi` u complicate non verranno prese in considerazione in queste pagine. Infatti per potere svolgere le esercitazioni gli studenti hanno soltanto bisogno di sapere: • come introdurre dati nel workspace e come estrarli; • come maneggiare le variabili nel workspace, anche mediante semplici espressioni matematiche che le contengano; tali espressioni spesso includeranno function di MATLAB; • come produrre e stampare semplici grafici bidimensionali, con assi dalle caratteristiche a piacere, delle label per gli assi stessi ed eventualmente un titolo; • come scrivere e far girare semplici programmi che svolgano i compiti elencati ai punti precedenti. Pertanto nel seguito parleremo esclusivamente di quanto concerne queste operazioni di base.

1.1.3

L’ambiente di lavoro MATLAB

Questa sottosezione descrive come maneggiare le variabili nel workspace e come importare ed esportare dati. 1. Per entrare in MATLAB battere al prompt del sistema 5 : matlab Appare il desktop di MATLAB, che presenta, nelle condizioni di default : 5 D’ora

in poi, si consiglia di dare effettivamente i comandi citati!

8

CAPITOLO 1. ESERCITAZIONI GUIDATE • in alto, la barra coi vari menu (File, Edit, ..., Desktop, Window, Help), il pulsante per invocare l’help (?), l’editor per M-files (icona col foglio bianco), la finestra per vedere o cambiare la directory/cartella corrente ecc... • al centro, la Command Window col prompt (>>); • a sinistra, l’elenco dei files contenuti nella Current Directory; • a destra in alto, il contenuto del workspace; • a destra in basso, la Command History (storia dei comandi dati, anche nelle sessioni precedenti). Le varie finestre si possono chiudere per far pi` u posto ad altre; per variare l’aspetto del desktop andare su: Desktop/Desktop Layout. Nella Command Window si danno i comandi, si fanno girare gli M-files 6 , si inseriscono dati... Alcuni comandi utili: >>type nome_file mostra le istruzioni in linguaggio MATLAB contenute nel M-file il cui nome `e specificato nella stringa nome_file. Il comando non funziona per le funzioni built-in di MATLAB, funzioni di base come seno, coseno, fft ecc... >>what matlab/elfun elenca i files contiene una data directory/cartella di MATLAB (nell’esempio, quella delle funzioni matematiche elementari). Inoltre funzionano sia il comando Unix ls, sia l’analogo MATLAB, che `e dir. In ogni istante della sessione di lavoro si pu` o accedere alla documentazione su Web e all’help per vedere quali funzioni sono disponibili e come utilizzarle. Esiste, come si `e detto, un apposito browser per l’help; qui facciamo solo alcuni esempi da linea comandi: >>helpbrowser richiama il browser dell’help; >>help nome_function d` a sintassi e comportamento della funzione il cui nome `e dato nella stringa nome_function; analogamente, >>help nome_comando d` a informazioni sul comando stesso; >>doc nome_function apre la pagina della documentazione relativa alla funzione il cui nome `e dato nella stringa nome_function; analogamente, >>doc nome_comando apre la pagina del comando stesso; >>help elfun elenca e descrive brevemente le funzioni in una particolare directory/cartella,

6 Quando MATLAB cerca un file, lo fa secondo un certo path prefissato; ogni file che si vuole chiamare deve essere o nella directory/cartella corrente, o sul path di ricerca. Per vedere quale sia il path o apportarvi cambiamenti: File/Set Path.

1.1. UN PRIMO APPROCCIO A MATLAB

9

qui elfun 7 ; >>help produce una lista delle directories di MATLAB con descrizione della categoria di funzioni contenute in ciascuna; >>lookfor parola_chiave cerca, tra le funzioni disponibili, quella che ha qualche cosa a che fare con la parola_chiave data. Infatti ogni function `e corredata di alcune righe di intestazione, in cui viene spiegato lo scopo e l’uso della function stessa; il comando lookfor esamina la prima riga di ogni intestazione (header ) alla ricerca della data parola_chiave. Per inciso, si noti che quando si prepara un nuovo M-file, conviene sempre mettere in testa (in uno script) o dopo la linea di definizione (in una function) un header, ossia una linea commentata che spieghi concisamente lo scopo del file. In tal modo il comando lookfor potr` a operare anche sugli M-files preparati dell’utente. Attenzione: quando, come accadr` a nel seguito delle esercitazioni, si deve ripetere pi` u volte una certa sequenza di comandi, `e sempre consigliabile memorizzarla in un nuovo M-file; cos`ı si risparmia molto lavoro. Notiamo anche che volendo modificare una function di MATLAB (sia ad es. cwt.m), si pu` o copiarla nella propria directory/cartella di lavoro ed editarla. MATLAB utilizzer` a automaticamente la cwt.m che si trova nell’area di lavoro dell’utente: infatti quando viene dato il comando cwt, MATLAB cerca cwt.m prima nell’area dell’utente e solo dopo, non trovandola, cerca nell’area di installazione. Per richiamare comandi gi` a dati (e poi eventualmente modificarli) si usano le frecce sulla tastiera; per interrompere l’esecuzione di un comando, >>Ctrl c 2. Per inserire “a mano” una matrice 8 , sia A: si digita ad esempio >>A=[1 2 3; 4 5 6; 7 8 10] In risposta, MATLAB visualizza la matrice cos`ı introdotta nel workspace: A= 1 2 3 4 5 6 7 8 10 “Cliccando” poi sul nome della matrice nel workspace browser, si apre l’Array Editor (editor di matrici 9 ) che consente di modificarla. p Per indicare ( − 1) nei numeri complessi si usa i oppure j, indifferentemente. Bisogna per` o, naturalmente, fare attenzione a non ridefinire incautamente queste variabili nei propri script e function, usandoli come indici in cicli di for (che sono gli analoghi MATLAB dei cicli di do del FORTRAN), ecc... poich´e inoltre alcune function di MATLAB (come, per esempio, cwt.m del Wavelet Toolbox Wavelet) usano i o j come indice, `e 7 Vi sono contenute le funzioni matematiche elementari; tuttavia le funzioni pi` u basilari, come seno e coseno, sono built-in, cio` e parte del core di MATLAB, molto efficienti ma non visibili come M-files. 8 Attenzione: MATLAB distingue le maiuscole dalle minuscole (come si dice, ` e case sensitive), per cui la variabile A ` e diversa dalla variabile a. 9 A tutti gli effetti pratici possiamo usare come sinonimi le parole matrix e array.

10

CAPITOLO 1. ESERCITAZIONI GUIDATE bene controllare √ durante la sessione di lavoro il valore di i e j, prima di o essere ottenuto usarli come −1. In alternativa, un numero complesso pu` dalle sue parti reale ed immaginaria mediante la function complex. Se non si desidera la visualizzazione del risultato di una operazione, si mette dopo il comando un punto e virgola: ad esempio >>A=[1 2 3; 4 5 6; 7 8 10]; Si possono anche dare due o pi` u comandi in una stessa linea, separandoli con una virgola: ad esempio, per assegnare due scalari scal1e scal2 si pu` o digitare >>scal1=1,scal2=2 Per continuare a nuova riga una linea comandi troppo lunga si usano tre punti: ad esempio, supponendo di aver definito degli scalari da a a g e dei vettori di ugual lunghezza da h a l, potremo scrivere >>s=a+b+c+d+e+f+g+10*log10(abs(fft(... h+i+l))) 3. Uso delle matrici e relativi indici: in MATLAB tutte le variabili sono matrici. Uno scalare `e una matrice 1x1; un vettore `e una matrice 1xN (vettore-riga) oppure Nx1 (vettore-colonna). Esistono non solo matrici di numeri, ma anche di stringhe character. Le dimensioni (M,N) di una matrice A contenuta nel workspace possono essere rese note e memorizzate col comando >>[M,N]=size(A) Infatti quando si desidera assegnare pi` u variabili in output, le si include in parentesi quadre, separandole con virgole. Quando non si assegna esplicitamente alcuna variabile di output, il risultato di una operazione viene di default assegnato alla variabile ans (da answer, risposta), il cui valore viene visualizzato. Se si considera, anzich`e una matrice vera e propria, un semplice vettore, ad esempio >>v=[1 2 3 4 5] per conoscerne le dimensioni si pu` o usare anche la function length: >>L=length(v) Una matrice reale (come A o v) pu` o venire trasposta digitando >>A=A’, v=v’; In questo modo un vettore-riga diviene un vettore-colonna, e viceversa. Se A `e complessa, A’ `e la trasposta complesso-coniugata, mentre la semplice trasposta `e A.’. L’uso degli indici per maneggiare gli elementi di matrice obbedisce alle usuali regole: detta A la matrice, A(i,j) `e l’elemento nella riga i e colonna j. L’ultima riga e l’ultima colonna di una matrice possono essere indicate con end: ad esempio, A(1,end) indica l’elemento nella prima riga e ultima colonna. Se si tenta di usare indici fuori dall’intervallo definito in precedenza, si ha un errore, ma se si definiscono nuovi elementi “fuori range”, la matrice originaria viene allargata fino a contenere i nuovi elementi. Gli elementi non definiti, posti tra quelli pre-esistenti e quelli definiti ex-novo, vengono uguagliati a zero. Ad esempio: >>A

11

1.1. UN PRIMO APPROCCIO A MATLAB (matrice con tre righe e tre colonne definita in precedenza...) >>A(4,4)=25 (matrice allargata).

Quanto al numero massimo di dimensioni di una matrice, le uniche limitazioni sono dovute alla memoria disponibile ed al massimo numero di elementi – non dimensioni – in una matrice. La memoria disponibile dipende dal computer in uso; il numero massimo di elementi permesso dipende dalla versione di Matlab installata. Per conoscere il numero massimo di elementi (maxsize) si usa il comando computer che fornisce informazioni sul sistema in uso: [C,maxsize]=computer Ogni matrice definita dovr` a dunque avere dimensioni tali che il loro prodotto (numero di righe × numero di colonne ×...) sia inferiore a (maxsize). Invece per conoscere i limti di memoria sul proprio sistema si usa il comando memory. ` possibile maneggiare parti di matrici: ad esempio A(1:k,j) indica gli E elementi nella colonna j, dalla prima alla k-esima riga; A(:,j) indica tutti gli elementi della colonna j-esima. Si possono, infine, cancellare righe e colonne: ad es. >>A(:,2)=[] cancella la seconda colonna di A. 4. Operazioni elementari con matrici (quindi con qualsiasi variabile): esempi. Nota: le operazioni qui citate sono fatte elemento per elemento. Esse richiedono che gli operandi abbiano le stesse dimensioni; se un operando `e uno scalare, viene applicato a tutti gli elementi dell’altro operando (scalar expansion). Quando utilizzate insieme, in una determinata espressione, tutte queste operazioni hanno uguale precedenza e vengono valutate da destra verso sinistra; si pu` o cambiare quest’ordine di precedenza con l’uso di parentesi. • Addizione elemento per elemento: >>a=[0 1 0 1 0 1] >>b=[2 2 2 2 2 2] >>a+b • Sottrazione elemento per elemento: >>a-b • Cambiamento di segno: >>-a • Moltiplicazione elemento per elemento >>a.*b

10

:

• Divisione elemento per elemento: >>a./b 10 Lo stesso comando senza il punto implementa invece il prodotto matriciale, righe per colonne.

12

CAPITOLO 1. ESERCITAZIONI GUIDATE • Elevamento a potenza elemento per elemento: >>b.^2 • Radice quadrata elemento per elemento: >>sqrt(b) che `e come >>b.^(1/2) ma pu` o risultare pi` u accurato. • Addizione di uno scalare scal a tutti gli elementi di una matrice a: >>a+scal (si ricordi la scalar expansion). Analogamente si procede per la sottrazione. • Logaritmo elemento per elemento, in base e, in base 2 o in base 10: >>log(b) oppure >>log2(b) oppure ancora >>log10(b) 5. Importazione di dati in MATLAB: per farla esistono diverse possibilit`a. Limitiamoci alle pi` u semplici, menzionando solo il fatto che in MATLAB esiste anche un Import Wizard, richiamabile col comando uiimport. • Fornire i dati come lista esplicita di elementi, come gi`a visto; ad esempio: >>B=[1 1 1 0] • Usare l’editor preferito oppure quello di MATLAB per creare un M-file che faccia la stessa cosa. Ad esempio si pu` o editare un file contenente l’istruzione B=[1 1 1 0], salvarlo come B.m, poi dare il comando >>B • Usare l’Array Editor.

• Caricare i dati da un file ascii esterno contenente solo la variabile da caricare. Questa diverr`a una matrice MxN, se il file conteneva M righe di N dati ciascuna. Il nome della variabile sar`a quello del file, privato dell’estensione. Per provare il procedimento: – copiare nella propria directory/cartella di lavoro il file pd.dat, che contiene una serie temporale di 25921 dati di pressione differenziale in Pascal 11 ; l’intervallo di campionamento `e Tc = 5 s; copiare anche tr.dat, che contiene i contemporanei dati di trasparenza atmosferica registrati con lo stesso Tc ; – digitare >>load pd.dat >>load tr.dat e controllare come si presentano le nuove variabili cos`ı caricate. 11 Si tratta di microfluttuazioni di pressione atmosferica, misurate con un microbarometro, registrate in inverno a Trino Vercellese (Torino) durante un esperimento volto a rivelare l’influenza di onde di gravit` a in atmosfera sulla visibilit` a, durante episodi di nebbia.

1.1. UN PRIMO APPROCCIO A MATLAB

13

Allo scopo, da linea comandi si pu` o usare >>who oppure >>whos che per ogni variabile d` a anche le dimensioni ed il tipo di array: double array= matrice normale, char array=matrice character... 6. Workspace e uso della memoria: le variabili create o importate nel workspace si possono rimuovere; ad es., per cancellare la variabile A si digita >>clear A; mentre se si vuole ripulire tutto il workspace, >>clear Le function utilizzano, per le loro variabili, un’area di memoria distinta dal workspace principale (tant’`e vero che le variabili definite all’interno di una function non sono “visibili” col comando who). Per ripulire anche quest’area di memoria, si d` a il comando >>clear function 7. Funzioni per generare matrici speciali: >>z=zeros(2,4) z= 0 0 0 0 0 0 0 0 >>q=ones(2,3) q= 1 1 1 1 1 1 >>r=rand(3,2) (matrice con tre righe e due colonne di numeri pseudocasuali con distribuzione uniforme, compresi tra zero e uno). >>r=randn(10,1) (matrice con dieci righe e una colonna di numeri pseudocasuali con distribuzione gaussiana a media nulla e varianza unitaria). La routine rand produce numeri pseudocasuali; la sequenza di numeri effettivamente generati `e determinata dallo stato del generatore. poich´e questo ha memoria, ogni volta che lo si chiama esso genera una sequenza diversa. Se vogliamo fargli generare due volte la stessa sequenza, dobbiamo • leggere lo stato interno del generatore: rand_state=rand(’state’); • generare la prima sequenza: x1=rand(10,1); • resettare lo stato interno del generatore: rand(’state’,rand_state); • generare la seconda sequenza: x2=rand(10,1); D’altra parte, poich´e lo stato interno del generatore viene resettato ogni volta che MATLAB viene lanciato, la sequenza di numeri generata la prima

14

CAPITOLO 1. ESERCITAZIONI GUIDATE volta che si chiama rand in ogni sessione di lavoro sar`a la stessa, a meno di cambiare lo stato del generatore stesso. Considerazioni analoghe valgono per la function randn. 8. Funzioni speciali che danno i valori di certe costanti: • pi, π;

p • i oppure j, ( − 1) (rammentare il pericolo di ridefinirli usandoli come indici);

• eps, precisione relativa floating;

• realmin, il pi` u piccolo numero reale ammesso; • realmax, il pi` u grande numero reale ammesso; • Inf (o inf), infinito;

• NaN (o nan), not-a-number: pu` o essere, ad esempio, usato per rappresentare dati mancanti in una serie temporale; la sua posizione nel vettore o matrice pu` o poi essere rintracciata con l’uso di operatori logici (v. oltre). Questi valori si possono ridefinire, ad es. digitando >>eps=1.e-6, e poi riportare ai valori di default: >>clear eps 9. Espressioni matematiche: da linea comandi si possono usare le varie funzioni. Ne citiamo alcune: (a) funzioni trigonometriche: sin, asin, cos, acos, tan, atan, cot, acot ecc...; (b) funzioni esponenziali: exp, log, ,log2, log10, sqrt; (c) funzioni complesse: abs, angle, conj, real, imag, complex; (d) funzioni di arrotondamento: fix (arrotondamento verso lo zero), floor (arrotondamento verso l’intero pi` u vicino nella direzione di meno infinito), ceil (arrotondamento verso l’intero pi` u vicino nella direzione di pi` u infinito), round (arrotondamento verso l’intero pi` u vicino), rem (resto dopo divisione), sign (funzione segno); (e) funzioni di statistica ed analisi dati elementare, quali la media e la deviazione standard 12 . Ad esempio: >>mupd=mean(pd) trova la media del vettore pd; >>mupd=median(pd) trova la mediana; >>sigmapd=std(pd) 12 In MATLAB, le funzioni relative a questo argomento risiedono nella directory/cartella datafun e lavorano anche su vere matrici, non soltanto su vettori. A questo proposito, notiamo che per l’analisi statistica, in generale multivariata, MATLAB ` e column oriented: assume che la matrice dei dati abbia per colonne le singole sequenze (p.es. serie temporali) di cui i dati sono composti. Pertanto le varie operazioni (di media, deviazione standard ecc...) vengono condotte per colonne e il risultato ` e un vettore riga. Quali vettori di dati, MATLAB accetta per altro sia vettori riga, sia vettori colonna.

1.1. UN PRIMO APPROCCIO A MATLAB

15

trova la deviazione standard; inoltre vi sono min (minimo assoluto), max (massimo assoluto), sum (somma degli elementi), diff (differenze, prima approssimazione della derivata), trapz (integrazione numerica trapezoidale), ecc... Quando si cerca il massimo o minimo assoluto, si pu` o nel contempo trovare l’indice del vettore a cui questo si verifica: >>[mapd,indmapd]=max(pd) e analogamente >>[mipd,indmipd]=min(pd) Operando solo su parte del vettore, si possono limitare le operazioni precedenti a un dato intervallo di indici. Per togliere la media agli elementi di un vettore di dati (cio`e per centrare la sequenza), si operer`a con la scalar expansion: >>pd_c=pd-mupd; Invece per togliere la media ad una matrice vera e propria di dati bisogna “matricizzare” l’operazione, come nell’esempio che segue. >>A=[1 4 7; 2 5 8; 3 6 9] >>muA=mean(A) (vettore riga) >>[M,N]=size(A) >>e=ones(N,1) (vettore colonna) >>A_c=A-e*muA (A meno il prodotto matriciale del vettore-colonna e, fatto di N valori unitari, con il vettore-riga muA). 10. Formato dei valori numerici che appaiono sullo schermo (i calcoli vengono comunque sempre fatti in doppia precisione): `e possibile sceglierlo col comando format. Ad esempio >>x=[4/3 1.2345e-6]; >>format short >>x 1.3333 0.0000 >>format long >>x 1.33333333333333 0.00000123450000 >>format short e >>x 1.3333e+00 1.2345e-06 ecc... Il default `e il formato short. 11. Espressioni con operatori relazionali e logici: in esse si confrontano elementi analoghi di matrici equidimensionali (salvo scalar expansion). Gli operatori relazionali sono: < > >= >A=[1 2 3 4] >>B=[1 0 0 4] >>A==B ans= 1001 Sebbene questi operatori vengano normalmente usati nella programmazione in linguaggio MATLAB, in conditional statements quali if - then - else per ramificare algoritmi, essi possono essere utilizzati per eseguire manipolazioni di matrici: per esempio >>v=[1.2 0.8660 0.3] >>u=v(v>=sin(pi/3)) trova tutti gli elementi vi del vettore v tali che vi ≥ sin( π3 ) e li memorizza nel vettore u. Gli operatori relazionali vengono valutati dopo gli operatori aritmetici. Gli operatori logici sono: & and | or ~ not ed operano come quelli relazionali. Esistono anche function logiche, su cui non ci soffermiamo; citiamo solo la function find, che determina gli indici degli elementi di una matrice che soddisfano ad una data condizione logica: ad esempio >>i=find(A>2) i= 3 4 e la function isfinite(x) che esamina la variabile x alla ricerca di valori Inf o NaN: essa diverr`a true (ossia 1) in corrispondenza dei valori numerici e false (ossia 0) in corrispondenza di quelli Inf o NaN.

12. Esportazione di dati da MATLAB: il contenuto del workspace pu` o essere salvato in un file binario, detto MAT-file, con estensione .mat. Per esempio, da linea comandi, >>save 211212 salver` a il contenuto del workspace nel file 211212.mat. In seguito, rientrando in MATLAB dopo esserne usciti, tutte le variabili salvate potranno essere ricollocate nel workspace con il comando load. Proviamo questa procedura: >>quit per uscire da MATLAB (attenzione a non farlo mai senza aver prima salvato il risultato delle proprie fatiche!!!). Poi al prompt del sistema matlab per rientrare; >>who per verificare che il workspace ora `e vuoto; >>load 211212 per restaurare il precedente contenuto del workspace; >>who per verificarlo.

1.1. UN PRIMO APPROCCIO A MATLAB

17

Attenzione: variabili omonime pre-esistenti, definite tra il momento del riingresso in MATLAB ed il momento del caricamento, verranno ricoperte. Si pu` o anche salvare solo certe variabili, ad esempio >>save file1 v A (dove v, A sono le variabili da salvare), oppure decidere di salvare una variabile alla volta in un file ascii, ad esempio >>save A.dat A -ascii (8 digits) o >>save A.dat A -double (16 digits). In seguito la variabile potr` a tornare nel workspace con >>load A.dat 13. Grafici in due dimensioni, nozioni essenziali: si utilizza la function plot. Si voglia graficare la variabile pd in funzione del tempo, in scala linearelineare. Allora occorre prima di tutto costruire un vettore che rappresenti la variabile indipendente (in questo caso, un vettore di tempi equispaziati, espressi, p.es., in secondi). Per questo si possono usare due comandi, di seguito esemplificati. (a) >>M=25921 >>T_c=5. >>t_i=0. >>t_f=(M-1)*T_c >>t=t_i:T_c:t_f; che crea un vettore-riga t contenente i valori da t_i a t_f, con passo T_c (se non specificato vale 1.); (b) >>M=25921 >>T_c=5. >>t_i=0. >>t_f=(M-1)*T_c >>t=linspace(t_i,t_f,M); che crea un vettore-riga con valori da t_i a t_f, contenente M valori. Ora per plottare il vettore pd in funzione di t si digita >>plot(t,pd) ed il grafico appare, in una finestra separata. Al grafico si pu` o poi assegnare un titolo e delle label per gli assi con l’indicazione dell’unit`a di misura: questa ed altre operazioni sono rese agevoli dai comandi e dai menu della barra che appare nella finestra della figura. Citiamo ad esempio Edit per FigureProperties e AxesProperties, Insert per le label degli assi, la lente per zoomare, ecc... Naturalmente le stesse operazioni sono possibili anche da linea comandi: ad esempio >>xlabel(’Tempo [s]’); ylabel(’Pressione diff. [Pa]’) >>title(’Dati esperimento Trino 21.12.89’) 13 13 In

questi comandi il testo tra apici viene interpretato secondo le regole di Teχ.

18

CAPITOLO 1. ESERCITAZIONI GUIDATE Se si desidera un grigliato di fondo, >>grid on mentre per disattivare il grigliato, >>grid off Si possono anche tracciare pi` u linee su un grafico, in stili o colori diversi; ad esempio possiamo fare il grafico di pd e tr sovrapposti. L’unica avvertenza `e che trattandosi in questo caso di grandezze fisiche diverse, dovremo prima (centrarle e) standardizzarle, dividendole ciascuna per la loro deviazione standard. In questo modo diverranno variabili adimensionali confrontabili. Supponendo di averlo fatto, daremo poi il comando plot(t,pd,’k-’,t,tr,’b--’) grafica le variabili rispettivamente in nero continuo e blu tratteggiato. Il grafico pu` o riguardare anche solo una parte dei dati: ad esempio MM=fix(M/3); plot(t(1:MM),pd(1:MM),’k-’,t(1:MM),tr(1:MM),’b--’) che grafica insieme il primo terzo dei valori di pressione differenziale e trasparenza. In questo contesto pu` o essere utile una legenda: >>legend(’Pressione differenziale’,’Trasparenza’,2) (il 2 specifica la posizione della legenda nel grafico, in alto a sinistra). Altri possibili stili per le linee nei grafici sono: ’:’ (puntinata) e ’-.’ (tratto e punto). Si possono pure fare grafici per punti, usando i seguenti markers: ’+’, ’o’, ’*’, ’x’, ’.’, ’s’ (square=quadrato), ’d’ (diamond=rombo), ’^’ (triangolo), ecc... Per avere markers sovrapposti a linee, occorre specificare entrambi: ad es. ‘:^’ dar` a una linea puntinata con triangoli in corrispondenza dei valori. Si pu` o scegliere il colore delle linee che si tracciano; ad esempio >>plot(t(1:200),pd(1:200),’g’) dar` a una linea verde (su uno schermo a colori, linee multiple in un grafico appaiono automaticamente di colori diversi). Per aggiungere un ulteriore elemento (per esempio una curva) ad un grafico gi` a esistente, battere, prima di dare il secondo comando di plot, >>hold on (per disattivare, >>hold off). Per stabilire esplicitamente l’intervallo di valori da plottare sugli assi, si usa >>axis([xmin xmax ymin ymax]) dove ovviamente xmin ecc.. sono da sostituire coi valori desiderati. Se per uno di questi estremi si desidera un valore scelto automaticamente, lo si mette uguale a -Inf (meno infinito) se `e un limite inferiore, +Inf se `e un limite superiore. Queste manipolazioni degli assi consentono di “zoomare” solo su parte della serie, esattamente come si farebbe limitando il comando plot a una parte del vettore pd o con lo strumento zoom. Anche l’aspect ratio degli assi si pu` o scegliere: ad esempio >>axis equal produce intervalli di uguale ampiezza sugli assi.

1.1. UN PRIMO APPROCCIO A MATLAB

19

Quanto ai tick, essi vengono automaticamente equispaziati, sebbene sia possibile controllarne la posizione con il menu Edit/CurrentObjectProperties nella finestra della figura. Si apre un Property Editor che consente di variare a piacere le propriet` a dell’oggetto grafico (sia esso figura, linea, punto, asse, ecc...) su cui si `e cliccato per ultimo 14 . Si pu` o intervenire sui tick anche da linea comandi: ad esempio, dopo aver dato un comando di plot (figura n.1), digitando >>h=gca(1) >>get(h) >>set(h,’Ytick’,[0 40 80 120 160 200]) >>set(h,’YMinorTick’,’on’) si metteranno i major ticks nelle posizioni indicate in parentesi quadre e si abiliter`a il tracciamento dei minor ticks. Per avere grafici in scale diverse da quella lineare-lineare, si usano, al posto di plot, le funzioni loglog, semilogx, semilogy, con ovvio significato. Citiamo infine il fatto che si possono fare pi` u grafici in una sola figura usando l’istruzione subplot, creare grafici con doppio asse delle ordinate usando yyplot, ecc... 14. Salvataggio di grafici: una volta creato un grafico, si pu` o salvarlo in un formato grafico a scelta. Si esporta il grafico in un file, ad es. postscript, (sia figura.ps), col comando >>print -dps2 figura.ps (b/n, postscript livello 2), oppure >>print -dpsc2 figura.ps (colore, postscript livello 2). Naturalmente sono possibili altri formati di output, quali EPS (encapsulated postscript ), TIFF, JPEG ecc... Supponiamo ora che si voglia intervenire successivamente su un certo grafico che `e stato creato. Distinguiamo fra due diverse esigenze: (a) in una stessa sessione di lavoro si desidera avere pi` u finestre-figura, richiamabili e modificabili. Ci`o `e possibile col comando figure: si creano in successione diverse finestre-figura, ciascuna caratterizzata da un proprio handle (un numero intero), e si plottano differenti set di dati nelle singole finestre-figura. Per esempio: >>...... >>h1=figure crea una figura vuota, caratterizzata da un handle che viene memorizzato in h1; >>...... >>plot...... riempie la figura con un grafico; >>...... >>h2=figure 14 Ogni singolo oggetto grafico riceve un identificatore univoco (handle) che pu` o essere recuperato (cio` e si pu` o venire a conoscenza del suo valore) e poi usato per cambiare le propriet` a dell’oggetto stesso con opportuni comandi. Questa ` e la base del sistema Handle graphics di MATLAB.

20

CAPITOLO 1. ESERCITAZIONI GUIDATE crea una seconda figura vuota con un handle diverso, che viene memorizzato in h2; >>...... >>plot...... riempie la seconda figura, ecc... Ogni volta si crea una figura diversa ed il suo handle viene memorizzato. Per usare nuovamente una figura gi` a creata (per aggiungervi un nuovo plot, o semplicemente rivederla o modificarla in qualche modo) si “clicca” sulla figura scelta o si digita >>figure(h) dove h `e lo handle della figura voluta. Si procede poi alle modifiche desiderate. Le figure cos`ı create si posso chiudere, anche digitando da linea comandi >>close(h) ecc... Lo handle serve anche per modificare le propriet` a della figura (o di qualsiasi altro oggetto grafico) da linea comandi, come gi`a accennato: ad es., per una figura con un handle h, digitando >>get(h) si ha una lista delle propriet` a, che si possono cambiare con comandi del tipo >>set(h,’PropertyName’,PropertyValue) Si pu` o scegliere cos`ı, ad esempio, il valore A3 per il formato della carta (mentre il default `e A4): >>set(h,’PaperType’,A3) Inoltre si possono fare grafici con orientamento landscape anzich´e portrait, ecc... (b) Si vuole “trasmettere” un grafico da una sessione di lavoro ad un’al` in effetti possibile salvare la figura corrente (quella su cui si tra. E `e “cliccato” per ultima) per poi rigenerarla quando lo si desidera; allo scopo si fa s`ı che MATLAB crei un M-file con i comandi utili a ricreare la figura (che pu` o poi essere rilanciato a piacere) e, se necessario, anche un file .mat avente lo stesso nome del precedente e contenente i dati che servono per ricreare la figura medesima. Ad esempio, digitando >>print -dmfile mio_grafico dopo aver creato una figura, si otterranno un mio_grafico.m e un mio_grafico.mat; in ogni momento, poi, digitando >>mio_grafico si ricreer`a la figura.

1.1.4

Generazione di dati sintetici

Spesso, per studiare le caratteristiche e le prestazioni di algoritmi e sistemi, si eseguono simulazioni numeriche mediante segnali costruiti (sintetizzati) appositamente. Nel caso pi` u comune, essi vengono composti con un numero arbitrario di sinusoidi con certe ampiezze, frequenze e fasi iniziali. Se lo scopo `e quello

21

1.1. UN PRIMO APPROCCIO A MATLAB Frequenza f0 f1 f2 f3 f4 f5

Valore 6.0 × 10−2 3.5 × 10−2 1.5 × 10−2 8.0 × 10−3 4.0 × 10−3 2.0 × 10−3

Hz Hz Hz Hz Hz Hz

Tabella 1.1: Frequenze analogiche delle sei sinusoidi che andranno a formare i dati sintetici. di simulare dati random da misure fisiche, `e bene che la fase iniziale di ogni componente sia scelta a caso tra 0 e 2π. Per la stessa ragione, alle sinusoidi si aggiunge rumore bianco gaussiano 15 con media e varianza opportuna. Nonostante nelle tecniche di elaborazione di dati a tempo discreto l’intervallo di campionamento dei dati non giochi alcun ruolo, qui e nel seguito si desidera mantenere costantemente un aggancio con un ipotetico contesto fisico, in cui si suppone sia esistito un segnale a tempo continuo da cui i dati a tempo discreto deriverebbero, per campionamento a passo Tc ; quindi assegneremo anche ai dati sintetici che ora genereremo un valore di Tc da noi arbitrariamente scelto. Per fissare le idee, decidiamo di generare un segnale contenente N = 8192 dati con Tc = 5 s, includendovi: • sei sinusoidi, tutte di ampiezza unitaria, fase iniziale random e frequenze date nella Tabella 1.1. • rumore bianco a media nulla e varianza 0.25 (σr = 0.5). A tal fine creeremo un M-file, sia16 dat_sint.m, che contenga le seguenti istruzioni: 15 Campioni di rumore bianco gaussiano possono venire generati partendo da un generatore di numeri pseudo-casuali e modificandone l’uscita per avere la gaussianit` a. Supponiamo di scegliere una serie di numeri reali secondo le regole seguenti:

• tutti i numeri devono essere compresi tra zero e uno; • non si possono fare discriminazioni in favore di (o contro) alcun numero o intervallo di numeri; tutti devono avere la stessa probabilit` a di essere scelti; • ogni numero deve essere scelto indipendentemente dagli altri; non si debbono “ricordare” i numeri gi` a scelti e cambiare le proprie decisioni in base ad essi. Cos`ı facendo si genera rumore bianco con distribuzione uniforme. Diverso ` e il caso gaussiano. Supponiamo di captare, con un’antenna, energia da tutte le sorgenti di segnali radio dell’Universo, sommando tali energie. La tensione risultante sar` a casuale, ma non uniforme: la maggior parte del tempo questi segnali tenderanno a cancellarsi l’un l’altro e genereranno tensioni prossime allo zero; una volta ogni tanto invece interferiranno costruttivamente e genereranno termini elevati. La distribuzione delle tensioni sar` a gaussiana; per generare rumore bianco gaussiano, le regole di scelta sono le seguenti: • i numeri devono essere estratti da una popolazione con distribuzione gaussiana; • devono essere scelti indipendentemente l’uno dall’altro. 16 Non

si pu` o assegnare lo stesso nome ad un M-file e ad una variabile.

22

CAPITOLO 1. ESERCITAZIONI GUIDATE

N=8192 T_c=5 Nsin=6 A=[1 1 1 1 1 1] f_sint=[6e-2 3.5e-2 1.5e-2 8e-3 4e-3 2e-3] t_ds=0:T_c:(N-1)*T_c; sigmar=0.5 ds=zeros(1,N); rand(’state’,0) (porta il generatore rand nel suo stato iniziale) for i=1:Nsin pharand=rand(1,1)*2*pi; ds=ds+A(i)*sin(pharand+2*pi*f_sint(i)*t_ds); end randn(’state’,0) (porta il generatore randn nel suo stato iniziale) rumb=sigmar*randn(1,N); ds=ds+rumb; L’istruzione for produce un loop sull’indice i, essendo, come gi`a accennato, la versione di MATLAB di un do loop del FORTRAN.

Generati cos`ı i dati, sar`a utile eseguire un grafico complessivo ed uno espanso, in una scala opportuna per vedere bene le fluttuazioni. Si noti che con Tc = 5 s, le sinusoidi hanno periodi di 16.7, 28.6, 66.7, 125., 250. e 500. s rispettivamente. Riflessione: rumore e segnale utile possono prevalere l’uno sull’altro, a seconda delle situazioni; pi` u avanti, nelle esercitazioni sull’analisi spettrale, si parler`a di rapporto segnale-rumore. Per ora potrebbe essere istruttivo tenere fisse le ampiezze delle sinusoidi e aumentare (diminuire) la varianza del rumore, osservando fino a quando `e possibile riconoscere le sinusoidi (il rumore).

Seguendo la stessa traccia, lo studente prepari ora altri tre programmi, che serviranno per le prove successive: 1. dat_rumb.m che generi N campioni di rumore bianco gaussiano a media nulla e con varianza σr ; 2. dat_sint_2sin.m che generi N campioni di rumore bianco gaussiano a media nulla e con varianza σr sovrapposto una sinusoide di ampiezza A, e frequenza fissata, con fase iniziale casuale; 3. dat_sint_2sin.m che generi N campioni di rumore bianco gaussiano a media nulla e con varianza σr sovrapposto a due sinusoidi di ampiezze A0 , A1 e frequenze diverse, con fasi iniziali casuali. I valori dei parametri σr , A ecc... possono per ora essere fissati arbitrariamente; in seguito editeremo questi prototipi di file per inserire i valori opportuni, a

1.2. TRASFORMATA DISCRETA DI FOURIER

23

seconda della necessit`a.

Concluso il lavoro, usciamo da MATLAB, con quit o selezionando Exit MATLAB dal menu File. Se al termine di una sessione si desiderasse salvare delle variabili, useremmo save e al login seguente potremmo ricaricare le variabili nel workspace con load. Nel caso di questa sessione tuttavia non serve salvare nulla.

1.2 1.2.1

Trasformata discreta di Fourier Premessa

Con questa sezione delle esercitazioni guidate si entra nel campo specifico delle applicazioni di elaborazione numerica dei segnali, che in MATLAB corrispondono a funzioni del Signal Processing (SP) Toolbox 17 . Lo scopo dell’esercitazione `e il calcolo della trasformata di Fourier discreta di una sequenza di dati, una quantit` a complessa di cui si esaminer`a il modulo (spettro di ampiezza). Per le prove pratiche useremo i dati sintetici ds e i dati “veri” pd. Prima di proseguire `e bene chiarire un punto concettualmente importante. La nozione di spettro di ampiezza si applica ai segnali deterministici, mentre per i segnali casuali si adotta un approccio statistico, che porta alla nozione di spettro di potenza del processo casuale (infinitamente persistente e di energia infinita) sotteso alla generazione dei dati stessi. Per tale processo casuale non `e definito alcun spettro di ampiezza, perch´e la DFT non esiste; esiste invece la DFT della sequenza di autocovarianza del processo, cio`e, appunto, lo spettro di potenza. I dati utilizzati nelle presenti esercitazioni sono da un lato “misure vere”, da un altro lato dati sintetici, “randomizzati” con l’inserimento di rumore bianco per farli assomigliare il pi` u possibile a dati veri (che sono quelli che ci interessano). A tutti gli effetti, la loro rappresentazione in frequenza va dunque data in termini di spettro di potenza. Tuttavia, a fini esercitativi pratici, per poter ripartire adeguatamente nel tempo le esercitazioni pratiche in rapporto alla trattazione teorica, parleremo inizialmente di spettro di ampiezza anche per dati di questo tipo; semplicemente, lo faremo consapevoli del fatto che allora stiamo guardando i dati in questione non come segmenti di durata finita di realizzazioni di processi casuali ma come singole sequenze deterministiche di durata finita. Al termine dell’esercitazione di questa sezione si eseguono anche alcune prove per visualizzare, nel dominio della frequenza ed in quello del tempo, il fenomeno dell’aliasing. Allo scopo si generano sequenze di dati sintetici discreti (sempre pensati come derivanti per campionamento, a passo Tc arbitrariamente scelto, 17 In realt` a l’algoritmo FFT ` e contenuto nel Toolbox di base, ma altre function pi` u specialistiche sono nel Toolbox SP.

24

CAPITOLO 1. ESERCITAZIONI GUIDATE

da un segnale a tempo continuo) 18 , contenenti ciascuna una sinusoide la cui frequenza in Hz sia esterna all’intervallo (0, fN y ). Successivamente viene stimato il relativo spettro di ampiezza; in questo modo `e possibile constatare che le frequenze esterne all’intervallo (0, fN y ) vengono tutte “riflesse” al suo interno.

1.2.2

DFT e spettro di ampiezza: caratteristiche

1. La DFT X[k] di una sequenza, x[n] (n = 0, N − 1), viene calcolata mediante la function che implementa l’algoritmo FFT. Per l’efficienza dell’algoritmo, `e bene lavorare su un numero di dati uguale ad una potenza di due, sia M = 2ν . Pertanto la sequenza di dati deve: (a) essere presa com’ `e, se M = N ; (b) essere allungata, aggiungendo al fondo degli zeri (padding di zeri), se si decide per M > N . L’eventuale allungamento con zeri si fa sempre dopo aver ridotto i dati disponibili a media nulla, sottraendo da essi il valore medio. Questa operazione di centratura dei dati si fa sempre e comunque prima di eseguire la trasformata, anche nel caso non sia necessario alcun padding, al fine di evitare che la media (trasformata a k = 0) influenzi i valori spettrali a bassa frequenza. La trasformata X[k] `e complessa in generale e di essa prendiamo il modulo |X[k]|, k = 0, M − 1, comprendente M valori. Per conoscere le frequenze a cui tali valori corrispondono (siano fk [Hz]) si deve tenere conto delle frequenze angolari discrete che corrispondono alle stime spettrali, ωk =

2πk , M

dove M `e la lunghezza della DFT, e del periodo di campionamento Tc dei dati. Infatti la relazione tra ωk e fk `e fk =

ωk 2πTc

fk =

k . M Tc

da cui

e da 0 Lo spettro `e dunque esteso su frequenze discrete da 0 a M−1 MTc , cio` alla frequenza analogica che precede la frequenza di campionamento T1c . In frequenze angolari discrete si va da 0 incluso a 2π escluso. 18 Ricordiamo

qui ancora una volta che nelle operazioni descritte si ` e voluto mantenere il riferimento al campionamento e al relativo passo temporale Tc , cio` e alla variabile frequenza f espressa in Hz, anche se, trattandosi di segnali a tempo discreto, sarebbe stato possibile l’uso della sola variabile ω (oppure ν), che ` e del tutto svincolata dall’idea di campionamento e dal Tc .

1.2. TRASFORMATA DISCRETA DI FOURIER

25

Il controllo del calcolo di |X[k]| va fatto verificando che sia soddisfatta la relazione di Parseval per la DFT: M−1 N X 1 X 2 |X[k]| = x2 [n], M n=0 k=1

dove N `e la lunghezza della sequenza utilizzata. Riassumendo, si dovr` a: (a) costruire il vettore di dati a media nulla da trasformare, • prendendo tal quale e centrando • oppure centrando e allungando con zeri la sequenza x[n]; (b) fare il calcolo del secondo membro della relazione di Parseval (quello che riguarda i dati e ne rappresenta l’energia); (c) eseguire la DFT; (d) prenderne il modulo; (e) con quest’ultimo calcolare il valore del primo membro della relazione di Parseval ed accertarsi che sia uguale al secondo (salvo errori di arrotondamento); (f) calcolare le frequenze in Hz corrispondenti alle stime effettuate; (g) graficare il risultato. 2. La X[k] ` e simmetrica, essendo la trasformata di una sequenza reale; di conseguenza anche lo spettro di ampiezza lo `e e, se M `e pari come di solito avviene, la seconda parte di esso (da f M +1 a fM−1 ) ripete la prima parte 2 (da f1 a f M −1 ) in modo speculare: 2

|X[k]| = |X ⋆ [M − k]|

k = 0, M − 1.

Alla frequenza zero (k = 0) e alla frequenza di Nyquist (k = M/2) la trasformata `e reale; il valore a k = 0 rappresenta la media dei dati, che sono stati centrati, e quindi deve risultare piccolissimo (idealmente, nullo). Pertanto l’informazione utile `e contenuta nella prima parte dello spettro, 1 da k = 1 a k = M e da f1 = MT a f M = fN y = 2T1 c , e quindi per dati 2 , cio` c 2 reali centrati e M pari `e sufficiente graficare lo spettro su quest’ultimo intervallo 19 . Il grafico spettrale si fa normalmente in scala log-log, ma anche scale lineari o semilineari sono talvolta utili (solo se l’asse f `e lineare si include la frequenza zero).

1.2.3

La function fft di MATLAB

Attenzione: d’ora in poi si consideri che nella teoria si fa uso di indici che partono dal valore 0 mentre in MATLAB gli indici partono da 1. M dispari la situazione ` e simile, per` o fNy cade tra due campioni (tra M2−1 e M2+1 ) M +1 e i campioni da 2 a M − 1 replicano in modo speculare quelli da 1 a M2−1 . D’ora in poi assumeremo che la lunghezza della DFT sia pari; se non lo fosse, si potr` a sempre aggiungere uno zero al fondo della sequenza. 19 Per

26

CAPITOLO 1. ESERCITAZIONI GUIDATE

Per la DFT dei dati via Fast Fourier Transform si usa la function fft; essa pu` o accettare in input un numero qualsiasi di dati, ma l’algoritmo veloce viene effettivamente applicato solo se la lunghezza della trasformata da calcolare (M = nfft) `e uguale ad una potenza di due; in caso contrario viene fatto il calcolo diretto della DFT, assai pi` u lento. Per la scelta di nfft pu` o essere d’aiuto la function nextpow2, che, dato un intero, calcola l’esponente della pi` u vicina potenza di due, per eccesso: ad esempio, nel caso dei dati ds, il digitare >>N=8192 >>enfft=nextpow2(N) >>nfft=2^enfft d` a semplice conferma del fatto che era gi`a stato scelto un N uguale ad una potenza di due. Invece per N = 25921, che `e la lunghezza dei dati pd, si ottiene il valore 215 = 32768. Per usare fft, ad esempio sui dati ds generati da dat_sint, se si vuole una FFT di lunghezza uguale alla lunghezza dei dati si scrive 20 DS=fft(ds); Se la si vuole di lunghezza diversa, specificata dal valore di nfft, si scrive invece DS=fft(ds,nfft); Ove necessario, il padding di zeri viene fatto automaticamente.

1.2.4

Prove con dati sintetici

Iniziamo coi i dati sintetici ds (N = 8192), scegliendo, per la lunghezza della FFT, M = N = 8192 = 213 . Si riduce a media nulla con ds=ds-mean(ds); Si calcola poi la DFT con nfft=N; DS=fft(ds,nfft); e di essa si prende il modulo con modDS=abs(DS); Questo `e lo spettro di ampiezza. In seguito si grafica il risultato in scala semilogaritmica su tutto l’intervallo di frequenze con i comandi: f_Ny=1/(2*T_c) deltf=1/(length(DS)*T_c) f=0:deltf:(2*f_Ny-deltf); semilogy(f,modDS) Si noti la simmetria del grafico. Poi si pu` o “zoomare” sui particolari dello spettro, o limitando l’intervallo di indici delle variabili, o dando specifici limiti per i valori sugli assi, o usando gli strumenti della finestra grafica. 20 Preparando uno script – sia spe amp.m – con le istruzioni date in questa sottosezione per il calcolo e la visualizzazione dello spettro di ampiezza dei dati ds, si verr` a a disporre di un prototipo modificabile, utile in seguito. Questo ` e conveniente anche per tutte le prove che seguono, e non verr` a ripetuto.

1.2. TRASFORMATA DISCRETA DI FOURIER

27

Per un grafico in scala log-log, da eseguire in un’altra figura, si scrive invece loglog(f,modDS) (la frequenza zero viene automaticamente esclusa), mentre per un grafico linearelineare, da fare ancora in un’altra figura 21 , si scrive plot(f,modDS) Infine notiamo che talvolta si usa anche rappresentare lo spettro in dB. In tal caso il comando `e plot(f,10*log10(modDS))

Riflessione: come mai i grafici in scala semilogaritmica (fatti con semilogy o in bB) appaiono cos`ı schiacciati? Come mai questo non succede col grafico fatto con loglog? La posizione dei picchi spettrali, i quali sono superiori a 1. × 103 , pu` o essere trovata coi comandi i=find(modDS>10^3); format long e fi=f(i)’ che danno le frequenze dei picchi che valicano il limite specificato, in forma ` cos`ı possibile verificare la simmetria di vettore-colonna facilmente leggibile. E attesa per la DFT e il fatto che i picchi cadono (approssimativamente) alle frequenze scelte per generare le sinusoidi 22 .

Se si desidera vedere anche lo spettro di fase, si opera cos`ı: per calcolare la fase angleDS=angle(DS); poi per “dispiegarla”, cio`e per rimuovere i salti di fase maggiori di π, riducendoli al loro complemento a 2π in modo da togliere le discontinuit` a fittizie introdotte dalla funzione arcotangente usata per il calcolo della fase, uangleDS=unwrap(angleDS); e infine per graficarla in scala lineare-lineare (in una figura a parte) plot(f,uangleDS)

Ricordiamo che talvolta pu` o essere utile ribaltare la parte della trasformata che sta oltre fN y sulle frequenze negative, tra 0 e −fN y . In questo modo i nuovi intervalli sono: in frequenze analogiche, da −fN y inclusa a +fN y esclusa; in M numeri d’armonica, M 2 ≤ k ≤ 2 − 1. La procedura `e la seguente: DSshift=fftshift(DS); modDSshift=abs(DSshift); Per il grafico di modDSshift occorre generare un vettore frequenze apposito: fnegpos=(-f_Ny:deltf:f_Ny-deltf)’; 21 D’ora in avanti ` e considerato implicito che sequenze diverse vadano graficate in figure diverse se non condividono almeno in parte i valori della variabile indipendente. 22 Alcuni picchi appariranno due volte nell’elenco, a causa della loro larghezza finita.

28

CAPITOLO 1. ESERCITAZIONI GUIDATE

plot(fnegpos,modDSshift) (oppure semilogy; non loglog, a causa della presenza di frequenze negative). Si ricordi di aprire una finestra separata anche questa volta.

Si osservi di nuovo la simmetria del grafico; per rendersi conto quantitativamente dell’accaduto si potrebbe anche effettuare la ricerca delle frequenze di massimo pure per modDSshift e confrontarle con quelle per modDS.

Osservazioni • Guardando il grafico in scala log-log, si nota bene uno “zoccolo” di valori spettrali rapidamente variabili, specialmente evidente alle frequenze pi` u alte. Tale caratteristica `e dovuta al rumore. Lo si pu` o constatare provando a generare un set di dati sintetici uguale al precedente ma senza rumore (con le sole sinusoidi) e vedendo che cosa cambia nello spettro. Riflessione: `e la linearit`a della DFT che ci consente di estendere il modello del segnale (segnale utile+rumore) dal dominio del tempo al dominio della frequenza. • I picchi spettrali corrispondenti alle sinusoidi discrete introdotte nei dati sintetici non appaiono infinitamente sottili, ma hanno piuttosto una certa larghezza finita (e infatti quando ne abbiamo determinato le posizioni, alcuni picchi sono apparsi due volte nella lista). Il fatto non sorprende, visto quanto appreso riguardo agli effetti del windowing e al campionamento spettrale e; inoltre nei dati vi `e anche del rumore. L’effetto del campionamento in frequenza pu` o essere studiato generando nuovi dati sintetici contenenti sinusoidi di frequenze esattamente uguali ad alcune delle frequenze discrete a cui lo spettro viene campionato e osservando come l’aspetto dello spettro si modifica. Riflessione: nel primo caso, con frequenze scelte come in Tabella 1.1, la sequenza generata `e periodica? Nel secondo caso `e periodica? Perch´e?

1.2.5

Prova coi dati di pressione

Eseguiamo ora una prova coi dati pd, la cui lunghezza `e N=25921 e il cui Tc `e di 5 s (lo stesso valore scelto arbitrariamente per i dati sintetici), facendo una fft su un numero di punti pari alla potenza di due immediatamente superiore a N . Prima di procedere sottrarremo ai dati la media. Calcoleremo lo spettro d’ampiezza e faremo il grafico, ad esempio con loglog. Osservando lo spettro ottenuto, come semilogy o loglog, lo studente vedr` a che esso ha una forma (tipica dei dati geofisici: atmosferici, marini, sismici....) che assegna molta potenza alle basse frequenze e poi sempre meno andando verso quelle alte. Come sappiamo, un segnale con uno spettro di questo tipo `e detto rumore di colore caldo (ad esempio rumore rosso). Esso `e tipico dell’ambiente

1.2. TRASFORMATA DISCRETA DI FOURIER

29

atmosferico e oceanico e la sua forma denuncia la memoria del sistema, ossia la persistenza del fenomeno fisico sotteso alla generazione dei dati (inerzia del sistema o processo che prosegue nel tempo). In altre parole, il rumore `e il risultato dell’interazione tra una “forzante” di rumore bianco e i componenti, a risposta lenta, del sistema fisico esaminato; ad es., in una serie climatica di temperature oceaniche, la persistenza `e dovuta al fatto che l’inerzia termica dell’oceano integra nel tempo il “forcing” dovuto al tempo atmosferico (che qui viene visto come rumore). Sovrapposti a uno spettro di questo tipo possono poi esserci, nei dati geofisici, picchi associati a specifiche periodicit`a.

1.2.6

Aliasing

Lo scopo dell’esercitazione `e la visualizzazione del fenomeno dell’aliasing. Ci`o si ottiene generando dati sintetici discreti (pensati come derivanti, tramite campionamento con un certo passo Tc arbitrario, da un segnale continuo), contenenti sinusoidi di frequenza esterna all’intervallo (0, fN y ). Sia f1 una frequenza in (0, fN y ). Si considerino poi le infinite frequenze f2 =

k ± f1 Tc

con k = (0, ∞) intero, che invece sono esterne all’intervallo in questione. Si pensi ora ad una sequenza contenente una sinusoide con una delle frequenze f2 , campionata a passo Tc : calcolando il relativo spettro di ampiezza `e possibile constatare che f2 viene “riflessa” in f1 , nel senso che nello spettro il picco compare a frequenza f1 .

Procedimento: 1. Generare quattro diverse sequenze sintetiche, tutte arbitrariamente riferite a Tc = 5 s, fN y = 10−1 Hz, contenenti ciascuna: • del rumore bianco gaussiano, con valor medio nullo e deviazione standard pari a 0.05, e • una sinusoide con frequenza f2 tale da riflettersi, secondo la formula data sopra, in f1 = 4. × 10−2 Hz. Ad esempio, applicare la formula per f2 , due volte con k = 1 e due volte con k = 2, una volta col segno meno ed una col segno pi` u nei due casi, ottenendo quattro valori di f2 da usare per costruire quattro sequenze diverse; 2. calcolare lo spettro di ampiezza 23 e verificare la riflessione nei quattro casi, con grafici in scala lineare (o anche semilogy, loglog oppure in dB). Poich´e la simmetria della DFT completa `e gi`a stata osservata nei grafici 23 Attenzione: da questo momento in poi non verr` a pi` u ricordata ogni volta l’opportunit` a del togliere la media ai dati prima di calcolarne lo spettro!

30

CAPITOLO 1. ESERCITAZIONI GUIDATE fatti in precedenza, d’ora in poi ci si pu` o limitare a riportare nei grafici spettrali solo i valori da k = 0 a k = M ; in termini di indici in Matlab, ci`o 2 significa graficare gli elementi del vettore “spettro di ampiezza” dall’indice 1 all’indice M 2 + 1 = nfft/2+1. Anzi, se usiamo semilogy o la scala di dB, visto che prima di effettuare la trasformata abbiamo tolto la media ai dati e quindi il modulo della trasformata alla prima frequenza, la frequenza zero, `e piccolissimo, `e meglio partire dall’indice 2: in questo modo si evita che la parte interessante del grafico appaia schiacciata. Il problema ovviamente non si presenta in scala lineare e nemmeno con loglog, perch´e con esso la frequenza zero viene automaticamente esclusa; 3. verificare l’aliasing anche mediante grafici temporali, in una scala di tempo adatta a visualizzare qualche ciclo della sinusoide aliased ; 4. generare una quinta sequenza derivante da un segnale continuo sinusoidale di frequenza pari alla quarta precedente (f2 = 4.4 × 10−1 Hz), ma con un passo di campionamento che sia dieci volte pi` u piccolo di quello usato prima, cio`e 0.5 s. Ovviamente cambia, rispetto ai casi precedenti, la frequenza di Nyquist (come diventa?). Perci`o una sinusoide di tale frequenza pu` o ora essere rivelata correttamente, perch´e inferiore alla nuova fN y (`e vero?...). Verificare questo con un grafico temporale ed uno spettrale.

1.3 1.3.1

Filtraggio nel dominio del tempo Premessa

Lo scopo dell’esercitazione `e effettuare, nel dominio del tempo, il filtraggio di una serie temporale di dati con un filtro FIR di cui si conosce la risposta all’impulso h[n]. Verranno impiegate, nei prossimi due paragrafi, tre funzioni tra quelle disponibili in MATLAB per operazioni in questo campo. La prima `e filter, che pu` o essere vista come una implementazione efficiente dell’equazione alle differenze; quindi essa pu` o servire per applicare sia filtri IIR, sia filtri FIR di cui si conoscano i coefficienti costanti dell’equazione alle differenze. Nel seguito chiameremo “di tipo a” i coefficienti del primo membro dell’equazione alle differenze (quelli che moltiplicano la sequenza di output, ritardata o no) e “di tipo b” i coefficienti del secondo membro (quelli che moltiplicano la sequenza di input, ritardata o no). In particolare, nel caso FIR, quello cui noi ci limiteremo, i coefficienti di tipo b sono i campioni della risposta all’impulso del filtro h[n] mentre quelli di tipo a sono rappresentati da un unico valore unitario, quello che moltiplica y[n]: gli altri sono nulli. La seconda function utilizzata `e conv, che invece implementa la convoluzione lineare della serie di dati con h[n].

31

1.3. FILTRAGGIO NEL DOMINIO DEL TEMPO

Infine, la terza function usata `e fftfilt, che implementa un efficiente algoritmo di filtraggio nel dominio della frequenza, basato sulla FFT e chiamato overlapadd. Sar` a fatto anche un cenno ad un metodo di filtraggio caratterizzato da ritardo nullo. Le operazioni di filtraggio verranno esemplificate utilizzando, come dati da filtrare, quelli sintetici ds con rumore e sei sinusoidi. Per quanto concerne il filtro, sono disponibili le risposte all’impulso di tre diversi filtri FIR passa-banda, tutte di lunghezza Mf = 55 (ordine Mf − 1 = 54); i nomi dei files sono bpf_h.mat, bpf_m.mat+,bpf_l.mat+;le corrispondenti variabili si chiamano hh, hm, hl. Nelle Fig. 1.1, 1.2 e 1.3 sono mostrati i moduli delle rispettive risposte in frequenza, in unit` a logaritmiche (moduli quadri) e lineari. 10 1.1

−10

1

−20

0.9

−30

0.8

−40

0.7

−50

|H |

20 ∗ log10 |H |

0

−60 −70 −80

0.5 0.4

−90

0.3

−100

0.2

−110

0.1

−120 −130 0

0.6

0.1

0.2

ν

0.3

0.4

0.5

0 0

0.1

0.2

ν

0.3

0.4

0.5

Figura 1.1: Filtro bpf h – Risposta in frequenza: modulo quadro in dB (a sinistra) e modulo in scala lineare (a destra), in funzione della frequenza adimensionale ν. Le linee verdi indicano l’attenuazione minima ed il ripple in banda passante. M −1

= 27 campioni: il senso La fase `e lineare e comporta un ritardo di f2 di questo ritardo `e che se si devono graficare insieme la serie originale e quella filtrata, in funzione del tempo, la seconda deve iniziare con un ritardo di 27 campioni rispetto al primo campione della serie originale. La serie di output, senza transitori, conta Nf = N − Mf + 1 campioni, per un ingresso composto da N campioni 24 . Le bande passanti dei tre filtri passa-banda, espresse in termini di frequenze adimensionali ν, sono indicate in Tabella 1.2. 24 Siano x[l ], con l = (0, N − 1), i dati di input. L’indice l e i successivi indici con lo 0 0 0 stesso pedice hanno valori che partono da zero.

32

CAPITOLO 1. ESERCITAZIONI GUIDATE

10 1.1

−10

1

−20

0.9

−30

0.8

−40

0.7

−50

|H |

20 ∗ log10 |H |

0

−60 −70 −80

0.5 0.4

−90

0.3

−100

0.2

−110

0.1

−120 −130 0

0.6

0.1

0.2

ν

0.3

0.4

0 0

0.5

0.1

0.2

ν

0.3

0.4

0.5

Figura 1.2: Filtro bpf m – Risposta in frequenza: modulo quadro in dB (a sinistra) e modulo in scala lineare (a destra), in funzione della frequenza adimensionale ν. 10 1.1

−10

1

−20

0.9

−30

0.8

−40

0.7

−50

|H |

20 ∗ log10 |H |

0

−60 −70 −80

0.5 0.4

−90

0.3

−100

0.2

−110

0.1

−120 −130 0

0.6

0.1

0.2

ν

0.3

0.4

0.5

0 0

0.1

0.2

ν

0.3

0.4

0.5

Figura 1.3: Filtro bpf m – Risposta in frequenza: modulo quadro in dB (a sinistra) e modulo in scala lineare (a destra), in funzione della frequenza adimensionale ν.

Se si scartano i transitori, la convoluzione con cui il filtro viene applicato, Mf −1

y[j0 ] =

X

h[k0 ]x[j0 − k0 ],

k0 =0

deve avere gli indici dell’output y[j0 ] compresi tra j0 = Mf − 1 e j0 = N − 1, in modo da avere j0 − k0 ≥ 0; j0 − k0 ≤ N − 1.

33

1.3. FILTRAGGIO NEL DOMINIO DEL TEMPO Filtro bpf l bpf m bpf h

Intervallo passante di ν 0.05 – 0.1075 0.1075 – 0.232 0.232 – 0.4

Tabella 1.2: Bande passanti dei filtri citati nel testo, espresse in termini di frequenza adimensionale ν. Ricordando che per i dati ds si `e assunto un passo di campionamento di 5 s, `e immediato calcolare le frequenze in Hz che limitano le bande passanti dei tre filtri, quando applicati a dati con quell’intervallo di campionamento. Quali frequenze, fra quelle contenute nei dati ds (Tabella 1.1), cadono nella banda passante del primo filtro? ...del secondo? ...del terzo? Lo studente, rispondendo a queste domande, si far` a un’idea dell’aspetto che dovr` a avere lo spettro dei dati ds filtrati con ciascuno dei tre filtri; poi filtrer`a effettivamente, ad esempio Per riferirsi, come in MATLAB, ad indici che corrono da 1 anzich` e da 0, l’input deve per` o essere riscritto come x[l], con l = (1, N ) e la convoluzione deve essere riscritta come M

y[j] =

f X

h[k]x[j − k + 1].

k=1

Escludendo i transitori, l’indice dell’output varier` a da Mf a N . Per riportare allora l’indice dell’output all’intervallo partente da 1, si deve passare a un indice i = j − Mf + 1, col quale si scriver` a la convoluzione come y[i] =

Mf X

h[k]x[j − k + 1],

k=1

dove i = 1, N − Mf + 1 senza i transitori. Ma come collocheremo temporalmente il primo campione dell’output rispetto a quello dell’input? Consideriamo che un dato y[i] ` e composto da una combinazione lineare di valori dell’ingresso x[l] aventi indici l compresi fra l1 = j − k + 1 = (i + Mf − 1) − Mf + 1 = i per k = Mf e l2 = j − k + 1 = (i + Mf − 1) − 1 + 1 = i + Mf − 1 per k = 1. Da ci` o si ricava l2 − l1

=

Mf − 1,

∆t

=

(l2 − l1 )Tc = (Mf − 1)Tc ;

pertanto si assegna y[i] al tempo ti = tl +

Mf − 1 ∆t = tl + Tc , 2 2

dove tl = (l − 1)Tc ` e il tempo di x[l]. M −1

campioni, un Si ha dunque, come previsto, un ritardo in tempo reale corrispondente a f2 numero che nel nostro caso ` e intero perch´ e Mf − 1 = 54 ` e pari; rispetto all’input, l’output della convoluzione priva di transitori presenta in meno in coda.

Mf −1 2

campioni in meno in testa e altrettanti

34

CAPITOLO 1. ESERCITAZIONI GUIDATE

con bpf_m, e verificher` a l’avvenuto filtraggio mediante l’esame dello spettro di ampiezza dei dati filtrati e il suo confronto con quello dei dati ds originali, calcolato nell’esercitazione della sottosezione 1.2.4. Infine, nell’ultima parte della presente sezione, si filtra nuovamente via convoluzione lineare, ma prima di filtrare si adotta una tecnica di decimazione dei dati, al fine di far corrispondere la banda passante del filtro usato, originariamente data in termini di frequenze adimensionali ν (Tabella 1.2), con un intervallo di frequenze in Hz diverso da quello su cui si cadrebbe mantenendo il passo di campionamento originale: si ricordi infatti che f = ν/Tc . La decimazione “sposta” la frequenza di Nyquist, riducendola di un fattore pari a quello di decimazione. Pertanto prima di decimare si effettua il necessario pre-filtraggio passabasso anti-aliasing, atto ad eliminare dai dati tutte le componenti di frequenza superiore alla nuova frequenza di Nyquist.

1.3.2

Filtraggio via equazione alle differenze

Supponiamo di voler filtrare una sequenza col filtro bpf_m. Il filtraggio si si esegue fornendo in input alla function filter i coefficienti hm, l’unico coefficiente di tipo a uguale a 1 ed i dati da filtrare: dsfed=filter(hm,1,ds); Il nome suggerito per il vettore dei dati filtrati richiama il fatto che provengono da dati ds e sono filtrati via equazione alle differenze. Il vettore di dati filtrati, come si verifica con length, `e lungo come l’input, cio`e ha una lunghezza di 8192 campioni. Per comprendere che cosa questo comporti, conviene innanzi tutto graficare i dati filtrati e specialmente la “testa” della sequenza: plot(dsfed(1:100)) Si nota chiaramente che `e presente un transitorio iniziale e questo `e in accordo col fatto che filter calcola l’output partendo dal primo passo temporale e assumendo condizioni iniziali nulle: i valori passati, cio`e antecedenti a n = 0, della sequenza di ingresso al filtro FIR sono presi uguali a zero; pertanto un numero di campioni dell’output pari all’ordine del filtro `e affetto dal transitorio iniziale. Al fondo della sequenza filtrata non si nota invece niente che abbia l’aspetto di un transitorio: lo studente verifichi questo con un grafico degli ultimi 100 punti (indici end-99:end). Ci`o significa che filter “si ferma” all’ultimo campione della sequenza di ingresso. La percezione dell’avvenuto filtraggio si ha calcolando e graficando lo spettro di ampiezza della sequenza di dati filtrati e confrontandolo con quello dei dati ds originali. Sceglieremo sempre nfft=N; calcoleremo come fatto nella sottosezione 1.2.4 lo spettro dei dati ds; poi faremo lo stesso con dsfed: DSFED=fft(dsfed,nfft); modDSFED=abs(DSFED);

1.3. FILTRAGGIO NEL DOMINIO DEL TEMPO

35

loglog(f,modDSFED) Il vettore frequenze `e lo stesso utilizzato per plottare modDS perch´e le due fft, di ds e dsfed, hanno la stessa lunghezza, che `e pari al numero di dati, ossia 8192. Si vede dal grafico fatto che i picchi, corrispondenti a frequenze non incluse nella banda passante del filtro usato, vengono considerevolmente attenuati: la sola componente frequenziale trasmessa `e quella a frequenza f = 3.5 × 10−2 Hz (periodo 28.6 s) e infatti la banda passante copre, per il filtro bpf_m e con Tc = 5 s, l’intervallo da 2.15 × 10−2 a 4.64 × 10−2 Hz (periodi da 21.6 a 46.5 s). Lo spettro permette di osservare periodi da 10 s a 11.4 ore, corrispondenti rispettivamente alla frequenza di Nyquist ed alla prima frequenza non nulla in assenza di padding di zeri, N1Tc (frequenza di Rayleigh). Suggerimento: graficare insieme modDS e modDSFED in colori diversi. Inoltre fare un grafico del modulo quadro dello spettro in dB (graficare 20 ∗ log 10(modDS), ecc...), per poter ragionare sull’attenuazione.

Scartando i primi Mf − 1 = 54 campioni dell’output (cio`e conservandone 819254=8138) e ricalcolando lo spettro su 8192 valori di frequenza, si pu` o notare che dal punto di vista spettrale quei 54 dati iniziali cambiano poco o nulla il risultato. Ecco il procedimento: dsfed_ok=dsfed(55:8192); DSFED_OK=fft(dsfed_ok,nfft); (DFT su 8192 punti; padding automatico) modDSFED_OK=abs(DSFED_OK); loglog(f,modDSFED_OK)

1.3.3

Filtraggio mediante convoluzione lineare

Abbiamo detto che escludendo dal risultato del filtraggio i transitori iniziale e finale, con Mf = 55 campioni per la risposta all’impulso del filtro e N = 8192 dati, la convoluzione lineare contiene N − Mf + 1 = 8192 − 55 + 1 = 8138 valori. Accettando invece i transitori iniziale e finale la convoluzione `e pi` u lunga: visto che ogni “coda” di transitorio dura quanto l’ordine del filtro, si avranno (N − Mf + 1) + (Mf − 1) = N = 8192 valori includendo il solo transitorio iniziale (`e il caso corrispondente all’uso di filter) e (N − Mf + 1) + 2(Mf − 1) = N + Mf − 1 = 8192 + 55 − 1 = 8246 valori includendo sia il transitorio iniziale, sia quello finale. Quest’ultimo caso rappresenta appunto il comportamento della function conv che implementa la convoluzione lineare: questo lo si

36

CAPITOLO 1. ESERCITAZIONI GUIDATE

vede dando i comandi

25

dsfconv=conv(hm,ds); length(dsfconv) il cui risultato `e proprio 8246. Il nome dsfconv ricorda che sono dati ds filtrati via convoluzione). Ora grafichiamo i primi 100 dati, notando il transitorio iniziale: plot(dsfconv(1:100)) Poi grafichiamo gli ultimi 100 dati, notando il transitorio finale: plot(dsfconv(end-99:end)) e infine i valori di dsfconv corrispondenti agli ultimi 100 di dsfed, sovrapposti a quelli, notando che sono uguali: plot(dsfconv(N-99:N),’m’,’LineWidth’,2) hold on plot(dsfed(end-99:end),’k) hold off Riassumendo, per tenere in considerazione solo la parte “pulita” dell’output, si dovr` a • usando conv, scartare Mf − 1 = 54 dati in testa e in coda alla serie filtrata, conservando cos`ı solo 8246-108 = 8138 dati (dal 55o al 8192o); • usando filter, scartare Mf −1 = 54 dati in testa, conservandone 8192-54 = 8138 (dal 55o al 8192o). Facoltativamente, lo studente ripeta ora il filtraggio con filter e/o conv ed il calcolo dello spettro di ampiezza dei dati filtrati utilizzando gli altri due filtri, bpf_h e bpf_l, e commenti i risultati.

1.3.4

Filtraggio nel dominio della frequenza

Teoricamente, questa via prevedrebbe di fare il prodotto, elemento per elemento, della trasformata dei dati con quella della risposta all’impulso del filtro (cio`e con la risposta in frequenza); in seguito, antitrasformando, si otterrebbero i dati filtrati. Le singole trasformate, per evitare l’aliasing nel dominio del tempo, dovrebbero essere calcolate su un numero di campioni sufficiente a contenere tutta la lunghezza della convoluzione. Esiste per` o in MATLAB una function che implementa questo metodo: si chiama fftfilt e filtra una sequenza usando un efficiente algoritmo, basato sulla FFT, detto overlap-add (una tecnica adatta solo a filtri FIR). Supponendo di voler filtrare i dati sintetici ds col filtro bpf_m in questo modo e controllare poi 25 Conviene, come argomenti di input a questa function, dare prima il vettore pi` u corto e poi il pi` u lungo: in questo modo essa lavora pi` u velocemente.

1.3. FILTRAGGIO NEL DOMINIO DEL TEMPO

37

il risultato ottenuto con un grafico temporale e uno spettrale, si proceder`a cos`ı: dsff=fftfilt(hm,ds,length(ds)); length(dsff) (risulta uguale a 8192: si tratta di un caso analogo a quello di filter, con transitorio iniziale); plot(dsff(1:100)) (visualizza il transitorio iniziale, che non ci preoccuperemo di scartare). Poi calcoleremo lo spettro di ampiezza come al solito DSFF=fft(dsff,nfft); modDSFF=abs(DSFF); e lo graficheremo, sovrapposto a quello dei dati ds, in colori diversi. Il vettore frequenze `e sempre lo stesso dei casi precedenti, con 8192 frequenze. Si pu` o vedere, dal grafico che si ottiene, che il risultato `e quello atteso, in base alle frequenze contenute nei dati sintetici ed alla banda passante del filtro usato.

1.3.5

Filtraggio a fase nulla

Accenniamo al fatto che in MATLAB `e implementato anche un metodo di filtraggio detto zero-phase forward and reverse (digital) filtering, tramite la function filtfilt (sintassi: y=filtfilt(b,a,x) con ovvio significato dei simboli). Dopo aver filtrato i dati “in avanti”, la sequenza filtrata viene rovesciata e filtrata nuovamente; l’output della function (y) `e il risultato del secondo filtraggio, rovesciato temporalmente. Il risultato `e uno sfasamento nullo, ossia nessun ritardo; lo spettro di ampiezza dell’input viene modificato secondo il quadrato del modulo della risposta in frequenza del filtro. Nella function vengono pure applicati accorgimenti volti a minimizzare i transitori iniziale e finale. L’ingresso deve essere pi` u lungo di tre volte l’ordine del filtro, che pu` o essere sia FIR, sia IIR. Con questo metodo non verranno eseguite prove.

1.3.6

Filtraggio con decimazione

Si voglia ora filtrare gli stessi dati sintetici ds, caratterizzati da Tc = 5 s, fN y = 10−1 Hz, in modo tale da preservare la componente di frequenza f = 4. × 10−3 Hz; tale frequenza dovr` a allora cadere entro la banda passante del filtro che si user`a. Si supponga inoltre di voler riutilizzare il filtro bpf_m, la cui banda passante, espressa in termini di frequenza adimensionale ν, va da 0.1075 a 0.232. Con Tc = 5 s ci` o implicherebbe frequenze da 2.15 × 10−2 Hz a 4.64 × 10−2 Hz, cio`e un intervallo da cui f `e esclusa.

38

CAPITOLO 1. ESERCITAZIONI GUIDATE

Se per` o si decimano i dati con un fattore K = 8, col che il passo di campionamento passa a Tc′ = KTc = 40 s, lo stesso intervallo di frequenze adimensionali viene riportato ad un intervallo di frequenze in Hz contenente f .

Verificare col calcolo: qual `e il nuovo intervallo? In particolare, quanto vale la nuova frequenza di Nyquist? Risposte: il nuovo intervallo va da 2.69 × 10−3 a 5.80 × 10−3 Hz; la nuova frequenza di Nyquist `e 1.25 × 10−2 Hz. Per il necessario pre-filtraggio anti-aliasing occorrerebbe un filtro ideale passabasso con frequenza di taglio uguale alla nuova frequenza di Nyquist dopo la 1 1 = 16 = 0.0625. decimazione, ossia, in termini adimensionali, νcth = 2K Non essendo realizzabile un tale filtro ideale, e dovendosi accontentare di un passa basso con una banda di transizione di larghezza non nulla, si progetta un filtro avente un limite di banda passante inferiore al cutoff teorico, in modo tale che alla frequenza νcth il modulo della risposta in frequenza del filtro anti-aliasing realizzabile sia gi` a scesa ad un valore accettabilmente basso. La risposta all’impulso di un filtro passa-basso di ordine 54 con le caratteristiche desiderate `e contenuta nel file lpf_dec.mat. Nella Fig. 1.4 `e riportato il modulo della corrispondente risposta in frequenza: il limite di banda `e νc = 0.05 (fc = 1. × 10−2 Hz con Tc = 5 s, contro 1.25 × 10−2 Hz del cutoff teorico) e ad una frequenza adimensionale di 0.0625 l’attenuazione `e gi` a di circa 11 dB (arriva a 30 dB a νc = 0.07). Esso rimuover`a dunque efficientemente tutte le componenti frequenziali di frequenza superiore alla nuova frequenza di Nyquist. Dopo aver copiato nella propria directory/cartella di lavoro il file e aver caricato nel workspace, con load, la corrispondente risposta all’impulso che si chiama haa, si dovr` a: • eseguire la convoluzione dei dati ds col filtro anti-aliasing, scartando i transitori: Mf= length(haa)% K=8% dsfaa=conv(haa,ds);% length(dsfaa) dsfaa_ok=dsfaa(Mf:N);% length(dsfaa_ok)

i filtri hannola stessa lunghezza fattore di decimazione dati filtrati con filtro anti-aliasing transitori scartati

• effettuare la decimazione, prendendo soltanto un dato ogni K partendo dal primo ed andando fino a...?

=

8,

Considerando che N = 8192 e Mf = 55 (ordine Mf −1 = 54), avendo scar-

39

1.3. FILTRAGGIO NEL DOMINIO DEL TEMPO

10 1.1

−10

1

−20

0.9

−30

0.8

−40

0.7

−50

|H |

20 ∗ log10 |H |

0

−60 −70 −80

0.5 0.4

−90

0.3

−100

0.2

−110

0.1

−120 −130 0

0.6

0.1

0.2

ν

0.3

0.4

0.5

0 0

0.1

0.2

ν

0.3

0.4

0.5

Figura 1.4: Filtro lpf dec – Risposta in frequenza: modulo quadro in dB (a sinistra) e modulo in scala lineare (a destra), in funzione della frequenza adimensionale ν. tato i transitori disponiano di N −Mf campioni su cui effettuare la decimaN −Mf +1 = 8192−54 zione con un fattore K = 8. La parte intera, sia NN, di K 8 `e 1017, quindi l’ultimo campione da prendere nella decimazione ha indice NN*K = 1017×8: NN=fix((N-Mf+1)/K) dsfdec=dsfaa_ok(1:K:NN*K);%decimazione length(dsfdec) Questi dati ds filtrati con filtro anti-aliasing e decimati saranno 1017; • eseguire la convoluzione dei dati decimati col filtro passa-banda: dsfdecf=conv(hm,dsfdec); length(dsfdecf) Questi dati ds filtrati con filtro anti-aliasing, decimati e nuovamente filtrati saranno di lunghezza 1017+54 = 1071 con i transitori; poi i transitori verranno scartati: dsfdecf_ok=dsfdecf(Mf:NN);%transitori scartati length(dsfdecf_ok) ottenendo una lunghezza di 1071-54*2 = 963 senza transitori; • calcolarne lo spettro di ampiezza e graficarlo nel modo usuale. Attenzione al fatto che il set di frequenze discrete non `e lo stesso: decimando cambia infatti la frequenza di Nyquist.

40

CAPITOLO 1. ESERCITAZIONI GUIDATE

Lo spettro che si otterr`a, confrontato con quello dei dati di partenza, mostrer`a con chiarezza il tipo di filtraggio effettuato. Si noti come la decimazione com1 = 18 sull’ampiezza della trasformata. porti, tra l’altro, un fattore K Riflessione: Nella pratica, l’eliminazione dei transitori in genere non `e strettamente necessaria, perch´e come gi`a detto dal punto di vista spettrale i transitori hanno un peso non determinante. Pertanto pi` u semplicemente si potrebbe procedere come segue: ...... Mf= length(haa) K=8 ......%dati di partenza e loro spettro di ampiezza su nfft=N frequenze dsfaa=conv(haa,ds); dsfdec=dsfaa(1:K:end); dsfdecf=conv(hm,dsfdec); dsfdecf=dsfdecf-mean(dsfdecf); nfft1=2048 SPE=fft(dsfdecf,nfft1); modSPE=abs(SPE); ff_Ny=1/(2*T_c*K); deltff=1/(nfft1*T_c*K); ff=0:deltff:2*ff_Ny-deltff; loglog(ff(1:nfft1/2+1),modSPE(1:nfft1/2+1),’r’) Si ottiene in questo modo un grafico da zero alla nuova frequenza di Nyquist e su 1025 frequenze, a cui sovrapporre un analogo grafico di modDS, da zero alla vecchia frequenza di Nyquist su 4097 frequenze. In questo caso i transitori non eliminati sono due perch´e conv viene usata due volte. Se si confronta lo spettro ottenuto per ultimo con quello precedente in cui i transitori venivano eliminati, si nota che il loro effetto `e visibile, ma non tale da alterare radicalmente il risultato.

Facoltativamente, lo studente ripeta ora il filtraggio con decimazione applicando gli altri due filtri.

1.4 1.4.1

Caratteristiche di un filtro numerico Premessa

Lo scopo dell’esercitazione `e lo studio, nei domini del tempo e della frequenza, delle caratteristiche di un filtro FIR di cui inizialmente supporremo di conoscere

41

1.4. CARATTERISTICHE DI UN FILTRO NUMERICO la risposta all’impulso h[n], di lunghezza Mf .

Si inizier` a col grafico (stem plot ) della h[n]. Seguir` a il calcolo della risposta in frequenza del filtro, data dalla DTFT di h[n], secondo la formula Mf −1

H(ejω ) =

X

h[n]e−jωn .

n=0

H(ejω ) verr`a valutato su un insieme sufficientemente fitto di frequenze angolari discrete in 0 ≤ ω < π, in modo da poterla graficare in modulo e fase (il che in pratica corrisponde a sostituire la DTFT con una DFT, calcolata via FFT). Supponendo poi, al contrario, di conoscere H(ejω ) ma non h[n], si vedr` a come `e possibile trovare la risposta all’impulso di un filtro FIR di cui sia nota la risposta in frequenza. La procedura verr`a applicata ai quattro filtri FIR a fase lineare utilizzati per l’esercitazione precedente. Come ultima fase dell’esercitazione, si studier` a come operare per dedurre la risposta all’impulso di un filtro, conoscendo l’input e l’output (deconvoluzione).

1.4.2

Risposta in frequenza

Prima di tutto si visualizzi l’andamento delle risposte all’impulso dei quattro filtri con degli stem plots: ad esempio stem(hm) Si vede bene la simmetria pari dei coefficienti attorno al punto n = (di che tipo (I, II, II o IV) `e questo filtro FIR a fase lineare?).

M−1 2

= 27

Lo studente operi analogamente sulle altre tre risposte all’impulso. Per il calcolo della risposta in frequenza sulla met`a superiore del cerchio unitario nel piano z, ad esempio su NF2F T = 512 punti, l’istruzione `e per il filtro bpf_m [Hm,wm]=freqz(hm,1,512); dove l’argomento 1 sta per l’unico coefficiente di tipo a, nel caso di un filtro FIR: infatti la routine pu` o calcolare la risposta in frequenza di un qualsiasi filtro, sia IIR sia FIR. Il secondo output, wm, `e il vettore di frequenze angolari discrete ω nell’intervallo 0 ≤ ω < π, su cui Hm viene campionata. La separazione fra i valori di ω `e 2π 2π NF F T = 1024 = 0.006134. Se si desiderasse invece in output il corrispondente vettore di frequenze adimensionali ν nell’intervallo da 0 ≤ ν < 0.5, si assegnerebbe una frequenza di campionamento unitaria:

42

CAPITOLO 1. ESERCITAZIONI GUIDATE

f_c=1 [Hm,num]=freqz(hm,1,512,f_c);

Ora si grafichi il modulo della risposta in frequenza: ad esempio, per un grafico del modulo quadro in dB in funzione di ω, una forma di rappresentazione molto usata, si scrive plot(wm,20*log10(abs(Hm))) oppure per un grafico del modulo in scala lineare-lineare plot(wm,abs(Hm))

Per la fase si scrive plot(wm,unwrap(angle(Hm))) dove il ruolo della function unwrap `e quello di “dispiegare” la fase, eliminando i salti di fase superiori a 2π, che sono discontinuit` a fittizie introdotte dall’uso della funzione arcotangente nel calcolo della fase stessa: la fase infatti `e calcolata proprio come arcotangente del rapporto tra la parte immaginaria e quella reale di Hm.

Lo studente ripeta via via la procedura anche per gli altri tre filtri, esaminando ogni volta i grafici ottenuti.

Riflessioni • Le figure per i moduli delle risposte in frequenza concordano con quelle date nella sezione 1.3? • Con quale metodo presumibilmente sono stati progettati i filtri? • Quale minima attenuazione si ha tra banda passante e banda oscura (si osservi, per ciascun filtro, il grafico in dB)? • Nello stesso grafico, quanti dB sono ampie all’incirca le oscillazioni in banda passante? • Il ripple δ (si veda il grafico in scala lineare) `e maggiore in banda passante (δp ) o attenuata (δs )? • Qual `e, approssimativamente, il rapporto

δp δs ?

• Qual’`e, approssimativamente, la larghezza delle bande di transizione? • A proposito della fase: si pu` o affermare che essa `e lineare? • Con quale limitazione?

1.4. CARATTERISTICHE DI UN FILTRO NUMERICO

43

• Come si dedurrebbe dal grafico il ritardo di fase in numero di campioni, introdotto dal filtro sul segnale in uscita?

1.4.3

Risposta all’impulso

Intendiamo qui ricavare, nota che sia la risposta in frequenza di un filtro, la corrispondente risposta all’impulso. A questo scopo occorre, anzich`e la risposta in frequenza su frequenze angolari discrete 0 ≤ ω < π (met`a superiore del cerchio unitario nel piano z), che nel nostro esempio `e composta da 512 campioni, l’analogo vettore con la lunghezza e le caratteristiche che sarebbero tipiche di una DFT ricavata via fft: un vettore, cio`e, esteso a frequenze angolari discrete nell’intervallo π ≤ ω < π e soddisfacente la condizione di simmetria della trasformata per la realt` a di h[n].

Nell’esempio con 512 campioni, la trasformata completa, sia Hm_trasf, ne conta N = 1024. Per averla basta usare freqz con l’opzione ’whole’: [Hm_trasf,wm_trasf]=freqz(hm,1,1024,’whole’); Ora baster`a prendere la trasformata inversa su 1024 punti, mediante la function ifft: hm_comp=ifft(Hm_trasf,1024); Il vettore ottenuto `e lungo 1024 punti ed `e complesso, ma si osserva che le parti immaginarie dei vari elementi sono trascurabili (quindi si tratta in realt` a di un vettore reale) ed inoltre solo i primi cinquantacinque campioni sono diversi da zero (entro gli errori di approssimazione numerica). Inoltre essi risultano, come ci si attendeva, uguali a quelli della risposta all’impulso hm, da cui Hm era stata originariamente calcolata. Ci`o `e verificabile anche con uno stem plot: hm_comp_r=real(hm_comp(1:55)); stem(hm_comp_r) che `e identico allo stem plot di hm.

1.4.4

Deconvoluzione

La deconvoluzione `e l’operazione inversa alla convoluzione. Proviamo ad utilizzarla per trovare la risposta all’impulso del filtro usato, conoscendo l’output e l’input (si noti che l’input deve contenere i transitori iniziale e finale, ossia la convoluzione completa). La function da usare `e deconv e la sintassi `e

44

CAPITOLO 1. ESERCITAZIONI GUIDATE

[Q,R]=deconv(B,A) dove Q `e il risultato e R il residuo, di modo che B=conv(A,Q)+R restituirebbe B. Infatti l’operazione `e in sostanza una divisione polinomiale, in cui B `e il dividendo, A `e il divisore, Q il quoziente e R il resto.

Per riottenere hm da dsfconv e ds quindi scriveremo [hm1,r]=deconv(dsfconv,ds); Cos`ı verificheremo che il resto `e nullo e hm1 `e uguale a hm.

1.5 1.5.1

Progetto di filtri FIR equiripple Premessa

Lo scopo dell’esercitazione consiste nel progettare filtri FIR equiripple a fase lineare, di tipo passa banda, passa alto e passa basso. Si inizia progettando un filtro che riproduca uno di quelli usati nelle esercitazioni precedenti, e precisamente bpf_m. Si tratta, ricordiamo, di un passa-banda di ordine Mf − 1 = 54, i cui limiti di banda passante sono 0.1075 ≤ ν ≤ 0.232. La fase `e lineare. Dall’esame della curva del modulo quadro della risposta in frequenza del filtro bpf_m, graficato in dB (cfr. sezione 1.4), si evince che l’attenuazione minima da richiedere in banda oscura `e rs = 30 dB. Il ripple (ampiezza dell’oscillazione ammessa in banda passante) `e invece meglio leggibile nel grafico del modulo della risposta in frequenza in scala lineare: si vede che esso deve essere inferiore a 0.1 (diciamo δp =0.095). Nello stesso grafico si vede abbastanza bene anche l’ampiezza delle bande di transizione, che deve essere pari a 0.02 unit` a di frequenza adimensionale ν. Abbiamo cos`ı definito le specifiche del filtro da progettare; riassumendo: • tipo di filtro (passa-banda con un’unica banda passante); • ordine pari e uguale a 54; • limiti di banda passante in unit` a adimensionali 0.1075 ≤ ν ≤ 0.232; • larghezza delle bande di transizione, 0.02 unit` a adimensionali;

1.5. PROGETTO DI FILTRI FIR EQUIRIPPLE

45

• fase lineare; • ampiezza della risposta desiderata in banda passante 1 e relativo ripple δp = 0.095 al massimo; • attenuazione minima in banda oscura rs = 30 dB (ampiezza desiderata nulla). In base a queste specifiche verr`a effettuato il progetto passa-banda; in seguito verranno effettuati anche progetti passa-basso e passa-alto.

1.5.2

Procedura di progetto: un passa-banda

La function di MATLAB che implementa il progetto equiripple `e firpm (infatti il metodo utilizzato si rif` a al cosiddetto algoritmo di Parks e McClellan). In input la function richiede, per un generico filtro multibanda: • l’ordine n scelto per il filtro; • un vettore f0 di frequenze, comprese tra 0 e 1 Hz inclusi, esprimente i limiti delle bande passanti e attenuate; i valori di tali frequenze sono, quindi, relativi al caso, di default in MATLAB, in cui si abbia fN y = 2T1 c = 1 Hz, cio`e Tc = 0.5 s, fc = 2fN y = 2 Hz (si tratta di un modo di normalizzare le frequenze) 26 . Per un filtro che, come il nostro, sia un passa-banda con una sola banda passante, il vettore frequenze conterr`a allora: – 0 come primo valore; – il limite superiore della prima banda attenuata (espresso secondo la normalizzazione di default in MATLAB) come secondo valore; – il limite inferiore dell’unica banda passante come terzo valore; – il limite superiore dell’unica banda passante come quarto valore; – il limite inferiore della seconda banda attenuata come quinto valore; – il limite superiore della seconda banda attenuata, cio`e 1 (la frequenza di Nyquist) come sesto ed ultimo valore. Lo studente verifichi che i valori numerici di frequenza da inserire in f0 sono 0, 0.1750, 0.2150, 0.4640, 0.5040, 1; • un vettore a0 di valori del modulo (ampiezze) della risposta in frequenza desiderata, in corrispondenza di ciascuno dei valori di frequenza prima specificati: nel caso del nostro passa-banda tali valori saranno 0 in corrispondenza dei limiti delle bande attenuate e 1 in corrispondenza dei limiti della banda passante, cio`e saranno 0, 0, 1, 1, 0, 0; 26 Finora abbiamo sempre utilizzato le ν citandole come frequenze adimensionali ottenute mediante prodotto delle frequenze f [Hz] per il passo di campionamento Tc [s]. Un altro modo di vedere le ν ` e come frequenze normalizzate espresse in Hz, riferite ad un Tc = 1 s: un modo di normalizzare diverso da quello qui usato da MATLAB.

46

CAPITOLO 1. ESERCITAZIONI GUIDATE • un vettore w0 di pesi per la minimizzazione dell’errore massimo nelle varie bande (uno per ogni banda). Nel nostro caso, fatto 1 il peso in banda passante, quelli nelle due bande attenuate saranno uguali fra loro e pari δ al rapporto δps , dove δp e δs sono le ampiezze del ripple in banda passante e nelle bande attenuate, rispettivamente. Ora, per` o, bisogna dire che `e noto direttamente δp ma non δs , il quale `e dato implicitamente come attenuazione minima rs in dB. Pertanto si dovr` a utilizzare la relazione che lega δs a rs e dedurre il valore del peso da inserire nella function di progetto: la relazione `e 20 log10 δs = −rs , ossia δs = 10−rs/20 . Lo studente verifichi che si ottiene δs = 0.0316, da cui il vettore w0 conterr`a 3, 1, 3.

δp δs

= 3.0. Pertanto

In definitiva il progetto richieder` a le assegnazioni di n e dei vettori f0, a0, w0, seguite dallo statement hm_pm=firpm(n,f0,a0,w0); che d` a in output la risposta all’impulso del filtro cos`ı progettato. Lo studente in seguito verifichi con uno stem plot di hm_pm e per confronto diretto dei valori che la risposta all’impulso ottenuta `e uguale (alla quarta cifra decimale!) 27 a quella a suo tempo proposta, hm.

1.5.3

Stima dell’ordine minimo

Nel caso particolare sopra presentato, si conosceva gi`a l’ordine del filtro da progettare. Normalmente per`o questo parametro non `e noto ed occorre, per evitare lunghi e faticosi tentativi, stimare a priori l’ordine minimo atto a soddisfare determinate richieste sul comportamento del modulo della H(ejω ), ossia determinate specifiche di progetto. Ci`o `e possibile, in MATLAB, con la function firpmord, il cui uso pu` o essere considerato preliminare a quello di firpm. In output a firpmord si ottengono i parametri di input per firpm; bisogna solo fare attenzione al fatto che talvolta, anzi spesso, si ha una sottostima dell’ordine, per cui occorrer` a una verifica a posteriori sul comportamento della risposta in frequenza del filtro progettato, che non `e detto si attenga effettivamente alle specifiche di partenza. Spesso sar`a necessario aumentare un poco l’ordine rispetto al valore pre-stimato, per ottenere i risultati voluti. La sintassi di firpmord `e la seguente: [n0,f0,a0,w0]=firpmord(f,a,dev,f_c) 27 Si

ricordi la possibilit` a di formati di visualizzazione diversi dei valori numerici.

1.5. PROGETTO DI FILTRI FIR EQUIRIPPLE

47

dove n0 `e appunto l’ordine stimato e gli altri parametri di output sono quelli da dare in input a firpm, nella forma discussa nella sottosezione precedente. In input a firpmord, le frequenze-limite f per le bande di interesse sono date in una forma pi` u comoda e flessibile di prima. Tanto per cominciare, con f_c si pu` o specificare una frequenza di campionamento diversa dal default (che `e f_c= 2fN y = 2 Hz e quindi corrisponde a Tc = 0.5 s come per firpm). Perci`o dando f_c=1 si possono poi usare per i limiti di banda i valori numerici in termini di ν, di cui ci siamo serviti nelle esercitazioni precedenti 28 . In secondo luogo, la frequenza zero e quella di Nyquist sono omesse e si danno solo, in questo caso passa-banda, gli estremi delle due bande di transizione: • limite inferiore della prima banda di transizione: 0.1075 - 0.02 = 0.0875; • limite superiore di essa, ossia limite inferiore della banda passante: 0.1075; • limite inferiore della seconda banda di transizione, ossia limite superiore della banda passante: 0.232; • limite superiore della seconda banda di transizione: 0.232 + 0.02 = 0.252. In altre parole, i valori 0 e fN y sono impliciti in questo caso. Le corrispondenti ampiezze a sono date in numero di una per ogni banda, quindi in questo contesto sono tre: 0, 1, 0. In generale la lunghezza del vettore f `e due volte la lunghezza a, meno due. Il vettore dev contiene infine i δ per le varie bande: per noi avr` a tre elementi, di cui il primo e l’ultimo uguali fra loro: 0.0316, 0.095, 0.0316. Lo studente provi ad usare firpmord, seguito da firpm, nel caso del filtro bpf_m, ed a correggere via via il valore dell’ordine, controllando ogni volta (anche solo con un grafico di |H(ejω )| da confrontare ad occhio con quello di riferimento del filtro bpf_m) le specifiche effettive cui soddisfa il filtro ottenuto, fino a riportarsi al valore precedentemente scelto e atto a soddisfare le specifiche prefissate, ossia n=54. Si rammenti che: • nel caso di un filtro passa-banda si possono avere soluzioni non equiripple, che pur soddisfacendo il criterio minimax sono irregolari e quindi ritenute non idonee; 28 Se si preferisse, nel caso in cui si conosca l’effettivo passo di campionamento dei dati cui il filtro verr` a applicato, dare limiti in termini di frequenze analogiche, basterebbe assegnare alla frequenza di campionamento un valore pari a T1 , dove Tc ` e il passo di campionamento c stesso.

48

CAPITOLO 1. ESERCITAZIONI GUIDATE • per rimanere nell’ambito dei filtri di Tipo I, si aumenta sempre l’ordine di 2 unit` a alla volta.

1.5.4

Progetto di filtri passa-basso e passa-alto

Il filtro passa-banda bpf_m ha una banda passante e due bande oscure. Un filtro passa-basso o passa-alto avr` a invece una sola banda passante e una sola banda oscura. Gli argomenti in ingresso a firpm vanno modificati in accordo con questo fatto. Per esercizio, lo studente provi a progettare: • un passa-basso di ordine 350, atto a rimuovere da dati campionati con Tc = 60 s tutte le componenti di periodo inferiore a 18 minuti; i pesi per la minimizzazione siano 1. in banda passante e 3. in banda attenuata e la banda di transizione sia ampia 0.003 unit` a di ν; • un passa-alto analogo, atto a rimuovere dagli stessi dati le componenti di periodo superiore a 1.5 ore. Allo scopo prepari in entrambi i casi un M-file apposito, prevedendo anche il grafico della risposta in frequenza in dB, utile per il controllo delle performances del filtro progettato. Generati poi dei dati sintetici con Tc = 60 s e quattro sinusoidi di periodi T = 6′ , 12′ , 120′ , 300′ , pi` u un fondo di rumore bianco gaussiano, provi a filtrare ed osservi la forma del segnale filtrato nel dominio del tempo, in confronto con quella del segnale originale.

1.6 1.6.1

Metodi di stima dello spettro di potenza Premessa

Lo scopo dell’esercitazione `e una panoramica dei principali metodi implementati in MATLAB per la stima dello spettro di potenza di una sequenza di dati casuali. Si esamineranno: • metodi non parametrici: – periodogramma semplice e modificato, – metodo di Welch, – metodo multitaper (MTM);

1.6. METODI DI STIMA DELLO SPETTRO DI POTENZA

49

• metodi parametrici: – AR (autoregressivo) alla Yule-Walker, – di Burg, – della covarianza, – della covarianza modificata. Verranno invece tralasciati i metodi ad alta risoluzione, come MUSIC e EV, che pure sono disponibili nel pacchetto software. Di ogni metodo si vedr` a la sintassi in MATLAB e si esamineranno brevemente le prestazioni. I dati, sintetici, verranno generati al momento dell’utilizzo; comprenderanno o rumore bianco gaussiano soltanto, o una sinusoide in rumore bianco, o due sinusoidi in rumore bianco. Sarranno utili gli M-file preparati all’inizio, dat_rumb e dat_sint_2sin, da modificare di volta in volta secondo le esigenze delle varie prove. Va benissimo (una scelta vale l’altra!) continuare a porre Tc = 5 s. Meglio mettere sempre “in testa” ai file le due istruzioni rand(’state’,0) randn(’state’,0) in modo da ricondurre ogni volta allo stato iniziale i generatori di numeri casuali. Si ricordi sempre che ai dati va tolta preliminarmente la media, specie se interessano le basse frequenze.

1.6.2

Metodi non-parametrici

Periodogramma Si tratta di una stima polarizzata, di elevata varianza e non consistente. Il periodogramma (alla Schuster) pu` o ottenersi semplicemente prendendo il modulo quadro della fft dei dati e dividendo per il numero dei dati stessi. In MATLAB `e per` o disponibile una function apposita: periodogram, che permette di stimare sia il periodogramma semplice, sia quello modificato, perch´e consente di applicare alla sequenza una finestra scelta dall’utente. La sintassi della function `e (in sintesi): [Pxx,f]=periodogram(x,window,nfft,fc,’range’); dove • Pxx e f sono, rispettivamente, densit` a spettrali e frequenze di output;

50

CAPITOLO 1. ESERCITAZIONI GUIDATE • x `e la sequenza di input di lunghezza N ; • window `e la finestra, che deve avere la stessa lunghezza N del segmento di dati impiegato; sono disponibili finestre – rettangolare (boxcar o rectwin), – di Hamming (hamming), – di Hann (hanning), ecc...; Il default `e una finestra rettangolare lunga come la sequenza. • nfft `e la lunghezza della fft; sar`a maggiore o uguale a N ; sceglieremo una potenza di due, per l’efficienza dell’algoritmo; • fc `e la frequenza di campionamento, pari a 2fN y =

1 Tc ;

il default `e 1 Hz;

• ’range’ pu` o essere ’twosided’ o ’onesided’; per dati reali il default `e ’onesided’. Se si desidera omettere uno o pi` u degli argomenti di input (per attenersi al default), bisogna ricordare che ad ogni argomento che non sia ’range’ e che cada in mezzo ad altri che invece vengono specificati, occorre “tenere il posto” con un vettore vuoto ([]). Facciamo un paio di esempi: • si vuole specificare solo x e window: [Pxx,f]=periodogram(x,window); • si vuole specificare x, nfft e fc: [Pxx,f]=periodogram(x,[],nfft,fc);

La normalizzazione spettrale pu` o variare. • Se si specifica un valore di fc, MATLAB assume che ci si voglia ricondurre alla nozione analogica di spettro, X(f ) con f [Hz]; pertanto divide |X[k]|2 /N per fc (cio`e moltiplica per Tc ). In questo caso le unit` a per il grafico spettrale sono [Hz] in ascisse, [potenza/(Hz)] in ordinate; potenza equivale a varianza, quindi a quadrato dell’unit` a di misura dei dati;

• se si vogliono usare le ν (νN y = 0.5) si deve assegnare fc = 1; questo si ottiene anche ponendo fc uguale al vettore vuoto, []; • se non si assegna fc, MATLAB assume che la variabile frequenziale in uso sia ω (in pratica assume fc= 2π) e normalizza il periodogramma di conseguenza, dividendo |X[k]|2 /N per 2π.

In questo caso le unit` a per il grafico spettrale sono: [radianti/campione] in ascisse, [potenza/ (radianti/campione)] in ordinate.

1.6. METODI DI STIMA DELLO SPETTRO DI POTENZA

51

Inoltre, si ricordi che lo spettro one-sided `e in sostanza il doppio di quello twosided.

1. Per iniziare, possiamo calcolare il periodogramma semplice di una sequenza di rumore bianco, attenendoci alla normalizzazione |X[k]|2 /N , spettro ’two sided’: • generiamo dunque 64 campioni di rumore bianco gaussiano, a media nulla e con deviazione standard σr = 1; calcoliamone poi lo spettro (nfft=1024); • ripetiamo con 256 campioni (nfft=1024);

• ripetiamo con 1024 campioni (nfft=1024). Facciamo grafici lineari e in dB in funzione di f in Hz (avendo assunto Tc = 5 s); la quantit` a da graficare nel secondo caso `e ovviamente 10 × log(|X[k]|2 /N ). Riflettiamo. • Quale andamento dovrebbe avere teoricamente lo spettro di potenza e in che cosa se ne discostano gli spettri stimati? • Le oscillazioni delle stime variano all’aumentare di N ? Come? Perch´e? • Il valore mediato in frequenza di ciascuno degli spettri si accorda col valore teorico? L’accordo varia con N ? • Qual `e il valore teorico espresso in dB?

• Il livello medio delle oscillazioni in un grafico in dB dovrebbe essere circa uguale al valore teorico in dB? In altre parole, media dei valori in dB e valore in dB della media sono uguali? 2. Proseguiamo aggiungendo al rumore con una sinusoide. Fissiamo i seguenti valori: • ampiezza della sinusoide A = 5, frequenza angolare ω0 = 0.4π, ω0 = 4 × 10−2 Hz; f0 = 2πT c • rumore bianco gaussiano con varianza unitaria.

(a) Eseguiamo prove con diversi valori di N . • Con N = 40, calcoliamo il periodogramma (e sia Pxx), ponendo ancora nfft=1024. Calcoliamo la potenza media, che in base al Teorema di Parseval coincider`a con la varianza del segnale (centrato). Se partiamo da uno spettro two-sided Pxx della variabile x in versione nor2 malizzata a |X[k]| scriveremo N Power=sum(Pxx)/nfft mentre per uno spettro one-sided includeremmo un fattore 2:

52

CAPITOLO 1. ESERCITAZIONI GUIDATE Power=sum(Pxx)/nfft Facciamo il grafico dello spettro in dB 29 . Da questo si vede bene che il picco `e basso e allargato. • Ripetiamo con 64 campioni (nfft=1024): vedremo il picco cominciare a restringersi. • Ripetiamo con 256 campioni (nfft=1024): il picco si restringe ancora. • Ripetiamo con 512 campioni (nfft=1024): ora il picco `e stretto e alto. La forma del picco `e legata alle ben note caratteristiche del periodogramma. Come sappiamo, il valore atteso del periodogramma IN (ω) non coincide col valore vero Pxx (ω) ma con l’integrale  di convoluzione di quest’ultimo con la trasformata WB ej(ω) della finestra triangolare di lunghezza 2N − 1. Cos`ı l’ideale delta di Dirac, che si avrebbe nello spettro vero in corrispondenza della frequenza f di una sinusoide contenuta nei dati, `e sostituita da una copia di WB ej(ω) , il cui lobo principale ha larghezza finita non nulla e i cui lobi laterali sono responsabili del leakage di potenza verso frequenze anche molto lontane da quella della sinusoide. Il picco rivelato 30 si innalza sopra 2 il fondo dovuto al rumore, σr2 , di una ampiezza N4A , dove A `e l’ampiezza della sinusoide reale di frequenza f ed il fattore 4 deriva dal fatto che essa corrisponde a due esponenziali complessi di ampiezza A/2, centrati su frequenze +f e −f . Ci`o vale anche se sono presenti contemporaneamente due o pi` u sinusoidi. (b) Ora esaminiamo l’influenza del rapporto segnale-rumore. Mantenendo gli stessi parametri per la sinusoide e nfft=1024 per avere curve lisce, • proviamo ad abbassare il rapporto segnale-rumore, portando σr al valore 10: ripetendo lo spettro con 64 dati, che in precedenza erano sufficienti per vedere il picco, si nota che il picco viene praticamente sommerso dal fondo. • Se proseguiamo portando σr a 100, il picco sparisce del tutto. Questo `e dovuto al declino del rapporto segnale-rumore in uscita, che inizialmente era maggiore della soglia prescritta di 25, mentre qui e nel caso precedente scende sotto 25 (quanto vale nei tre casi?). (c) Se per` o mentre alziamo σr contemporaneamente alziamo anche A, cos`ı da avere sempre lo stesso rapporto segnale-rumore assunto inzialmente, la sinusoide resta sempre visibile. 3. Ora occupiamoci di risoluzione, con un segnale fatto da due sinusoidi immerse in rumore. Assumiamo i valori seguenti: • ampiezza della prima sinusoide A0 = 5, frequenza angolare ω0 = 0.4π, ω0 = 4 × 10−2 Hz; f0 = 2πT c

29 Da 30 Ci

questo punto in poi, si intende che tutti i grafici vengano fatti in dB. riferiamo al periodogramma two-sided, cio` e alla quantit` a |X[k]|2 /N .

1.6. METODI DI STIMA DELLO SPETTRO DI POTENZA

53

• ampiezza della seconda A1 = 5, frequenza angolare ω1 = 0.45π, ω1 f1 = 2πT = 4.5 × 10−2 Hz; c • rumore bianco gaussiano con varianza unitaria.

Calcoliamo il periodogramma. • Fissiamo N = 40: constatiamo che la risoluzione `e insufficente;

• ripetiamo con N = 64: siamo al limite delle possibilit`a di risoluzione; • ripetiamo con N=256: ora le sinusoidi sono ben risolte.

Il periodogramma ha risoluzione ridotta rispetto al caso ideale: mentre due delta di Dirac sono sempre distinguibili, per quanto siano vicine, due picchi di larghezza finita non lo sono. Per risolvere due sinusoidi relativamente vicine in frequenza `e necessario che la loro separazione frequenziale  sia pi` u grande della semilarghezza del lobo principale della WB ej(ω) centrata su ciascuna frequenza. Tale semilarghezza `e in genere definita come semilarghezza a met` a altezza e risulta circa 2π N (fc /N = 1/(N Tc ) in termini analogici). In altre parole, per due sinusoidi di frequenze f0 e f1 , separate di ∆f = f1 − f0 , la condizione di risolvibilit`a `e ∆f > fc /N ossia N > fc /∆f che fornisce un limite inferiore approssimato per il numero di dati di cui disporre per risolvere due date sinusoidi: al crescere di N i picchi divengono pi` u alti e stretti e quindi vi `e maggiore risoluzione. Nei nostri esempi, il criterio `e soddisfatto, perch´e fc = 2 × 10−1 Hz, ∆f = 5 × 10−3 Hz, da cui N = 40; in effetti i due picchi sono appena distinguibili con N = 40, ma gi` a con N = 64 la risoluzione `e sufficiente.. Naturalmente, nei ragionamenti precedenti conta anche il rapporto di ampiezza delle due sinusoidi: se una sinusoide `e molto pi` u debole dell’altra, pu` o essere disturbata non solo dal lobo principale della pi` u forte, ma anche dai lobi laterali di questa, che nel periodogramma semplice non decrescono rapidamente allontanandosi da quello centrale. Inoltre, conta anche l’entit` a del rumore presente, ossia il rapporto segnale-rumore per ogni sinusoide di ampiezza A che si voglia rivelare. Per il periodogramma semA2 e nei nostri plice) sappiamo che si deve avere SN Ri = 4σ 2 ≥ 25/N ; poich´ r dati abbiamo posto A0 = A1 = A = 5 e σr2 = 1, abbiamo SN Ri = 6.25 e quindi con N = 40 campioni ci aspettiamo, come in effetti accade, di essere al limite di poter rivelare le singole sinusoidi. Concludiamo osservando che oltre i fatti descritti, ad allontanare lo spettro stimato da quello vero contribuiscono: • l’elevata varianza della stima, tipica del periodogramma, che non si ridurrebbe anche aumentando N ; • il fatto che si campiona la trasformata di Fourier della sequenza su un set discreto di valori di frequenza (il che significa, tra l’altro, che la

54

CAPITOLO 1. ESERCITAZIONI GUIDATE frequenza f della sinusoide presente nei dati in generale non coincide con una delle frequenze campionate fk ) 31 .

Significativit` a dei picchi Per testare la significativit` a di un particolare picco, occorre il suo valore di densit` a spettrale e uno spettro di rumore (ipotesi nulla; spettro di fondo) contro cui testarlo. Comunemente si assume che il fondo sia di rumore bianco (spettro piatto, valori spettrali indipendenti da f e pari alla varianza dei dati, se si definisce lo spettro come |X[k]|2 /N ); una ipotesi pi` u sofisticata, adatta a molti spettri di variabili geofisiche e, in generale, di variabili registrate in sistemi fisici dotati di memoria, `e che si tratti di rumore rosso (processo autoregressivo di ordine 1: AR(1)). Ricordiamo che lo spettro teorico AR(1) `e Prr [k] =

P0 (1 − α2 ) 1 + α2 − 2α cos(2πk/N )

dove P0 `e il valor medio spettrale, uguale alla varianza dei dati, e α `e l’unico parametro del modello. In letteratura si suggerisce di adottare per esso p ρ[1] + ρ[2] , α= 2 dove compaiono i valori del coefficiente di autocorrelazione, a lag 1 e 2, della sequenza di dati. Rappresentando sui grafici spettrali il limite superiore cui il fondo di rumore pu` o arrivare, ad un certo livello p % di confidenza, si giudicano significativi i picchi che superano questo livello, detto di significativit` a al 1 − p %. La formula `e χ2p,ν livello di signif. = spettro di fondo ; ν il risultato pu` o dipendere dalla frequenza (rumore rosso) oppure no (rumore bianco). Si noti che per trasformare, nel caso del rumore bianco, lo scalare “livello di significativit` a” in un vettore lungo come il vettore di frequenze e quindi agevolmente graficabile, si usa la function ones. Supponiamo che la significativit` a scelta sia del 5 % (confidenza al 95 %). Allora ci` o significa che scelte 100 frequenze a caso, solo 5 (una su 20) corrisponderebbero ad un valore spettrale pi` u alto del livello in questione, nell’ipotesi che si tratti di rumore. Quindi se si guarda lo spettro e si vede che parecchi picchi 31 Il picco spettrale si avviciner` a all’altezza prevista teoricamente, N A2 /4, solo se f ` e coincidente o molto vicina ad una delle fk , cosa che accadr` a o perch´ e si ` e scelta f opportunamente, o perch´ e la si ` e scelta senza tener conto di ci` o ma poi si ` e fatto un campionamento in frequenza molto fitto, mediante padding di zeri. Si ricordi comunque che il padding di zeri, in genere consigliabile per avere grafici lisci e vedere tutti i dettagli degli spettri calcolati, ` e solo un artificio che non altera la “sostanza” in fatto di risoluzione, la quale dipende dalla dimensione statistica del campione su cui basiamo la nostra stima, ossia da N .

1.6. METODI DI STIMA DELLO SPETTRO DI POTENZA

55

superano il livello, si pu` o essere ragionevolmente certi (“confidenti”) che si tratti di picchi veri e non di rumore. Applichiamo ora questi concetti. 1. Con fondo di rumore bianco, troviamo il livello di significativit` a per lo spettro dei dati stagionali di anomalie di SST nella regione NINO3 32 del Pacifico, contenute nel file anom_nino3_stag.dat. Chimamiamo anoms questa variabile; operiamo al 95 % ed al 99.9 % di confidenza. Allo scopo serve la function chi2inv (Chi-square inverse cumulative distribution function) che fa parte del Toolbox di Statistica di Matlab. Il programma per questo calcolo conterr`a le istruzioni load anom_nino3_stag.dat; anoms=anom_nino3_stag; anoms=anoms-mean(anoms); va=var(anoms) Tc=1/4;%years N=length(anoms); nfft=N; [pow,f]=periodogram(anoms,boxcar(N),nfft,1/Tc,’onesided’); power=pow/(2*Tc); Pbianco=va*ones(1,length(f)); fac_signif=chi2inv(.95,2)/2 semilogx(f,power,’b’,’LineWidth’,2) hold on semilogx(f,Pbianco,’k--’,’LineWidth’,2) semilogx(f,Pbianco*fac_signif,’k’,’LineWidth’,2) set(gca,’Xlim’,[min(f),max(f)]); set(gca,’Ylim’,[0,10]); hold off Tracciamo, con differenti stili e colori le linee del fondo e dei due livelli di significativit` a su un grafico, ad esempio semilogx (lineare in ordinate). Quali picchi o gruppi di picchi superano il test al 95 %? Quali al 99.9 %? 2. Ripetiamo la prova, usando ora come fondo il rumore rosso. A questo fine servono le function modpar.m, che calcola il parametro α in base ai dati, e fondorosso.m, che calcola lo spettro di rumore rosso con parametro α e varianza uguale a quella dei dati. Aggiungiamo dunque al programma precedente le seguenti istruzioni: [Prosso,nurosso]=fondorosso(anoms,nfft); semilogx(nurosso/Tc,Prosso,’r--’,’LineWidth’,2) semilogx(nurosso/Tc,Prosso*fac_signif,’r’,’LineWidth’,2) Grafichiamo sia la curva del fondo, sia quelle di significativit` a. 32 Maggiori

dettagli su NINO3 sono dati nelle Esercitazioni libere.

56

CAPITOLO 1. ESERCITAZIONI GUIDATE Riflessioni • Il rumore rosso appare un’ipotesi pi` u plausibile di quello bianco? • Vi sono picchi che passano il test con la presente ipotesi nulla? • Se abbiamo un certo numero di punti nello spettro, quanti di questi possiamo aspettarci che superino accidentalmente il livello al 95 %?

Periodogramma modificato Per ridurre il leakage si usano finestre pi` u graduali della rettangolare: questo `e il cosiddetto periodogramma modificato, in cui si riduce l’altezza dei lobi laterali. Si paga per` o un prezzo per questo: per queste finestre, P G assume valori minori di 1. Mentre sar`a ridotta la possibilit`a di mascheramento di componenti deboli da parte dei lobi laterali di componenti forti, la rivelabilit`a di ogni picco diminuir` a per il peggioramento del rapporto segnale-rumore in uscita. L’allargarsi/abbassarsi del lobo principale, responsabile in ultima analisi di tale diminuito rapporto, ridurr`a inoltre la risoluzione. D’ora in poi assumeremo di effettuare un consistente padding di zeri per avere curve spettrali ben lisce, senza per altro ripeterlo ogni volta. Nel caso two-sided, il periodogramma modificato viene normalizzato come 2 JN (ω) = X(ejω ) /(N U ), dove il fattore U `e la costante di normalizzazione per la finestra w[n], definita PN −1 2 come U = N1 n=0 w [n]; pertanto la scelta della finestra non influenza la potenza media. Come esempio, confrontiamo il periodogramma semplice di un segnale con due sinusoidi immerse in rumore con un periodogramma modificato con finestra di Hamming. Assumiamo N = 128 e: • ampiezza della prima sinusoide A0 = 0.1, frequenza angolare ω0 = 0.225π; • ampiezza della seconda A1 = 1, frequenza angolare ω1 = 0.3π; • rumore bianco gaussiano con σr = 0.05. Questo `e un caso in cui il rapporto segnale-rumore `e buono per entrambe le componenti; inoltre la loro separazione frequenziale sarebbe sufficiente a risolverle e vederle bene entrambe se fossero di ampiezza confrontabile. Invece una sinusoide `e molto pi` u debole dell’altra e con il periodogramma semplice il suo picco viene praticamente nascosto dai lobi laterali relativi alla sinusoide pi` u forte. I lobi laterali si abbassano nel caso del periodogramma modificato, permettendo la rivelazione della componente debole. Si vede bene anche l’allargamento dei picchi nel secondo caso, rispetto al primo.

1.6. METODI DI STIMA DELLO SPETTRO DI POTENZA

57

Metodi di Welch e Bartlett Con il metodo di Welch si divide la sequenza (supposta, come sempre, stazionaria) in sezioni e si mediano i corrispondenti periodogrammi, al fine di ridurre la varianza della stima spettrale e rendere la stima consistente. Sebbene l’overlapping (sovrapposizione) tra le sezioni tenda ad introdurre informazione ridondante, l’effetto `e ridotto dall’uso di finestre non rettangolari, che riducono il peso statistico dei campioni di bordo (proprio quelli che poi vengono sovrapposti). Il metodo di Bartlett `e solo un caso particolare di quello di Welch, in cui la finestra `e sempre rettangolare e non vi `e sovrapposizione delle sezioni. L’uso contemporaneo di sequenze pi` u corte della sequenza originale e di finestre non rettangolari riduce molto la risoluzione, a causa del notevole allargamento del lobo principale della finestra spettrale; tuttavia la riduzione di varianza permette talvolta di ottenere risultati superiori a quelli ottenibili col periodogramma, specialmente quando il rapporto segnale-rumore `e basso. Per vedere questo facciamo degli esempi; utilizziamo la function pwelch di MATLAB, la cui sintassi `e [Pxx,f]=pwelch(x,window,noverlap,nfft,fc,’range’); e per la quale il significato dei parametri `e lo stesso che per periodogram, salvo che • window, oltrech´e un vettore di pesi (campioni della finestra) pu` o anche essere un intero, nel qual caso viene usata di default una finestra di Hamming di lunghezza uguale a quell’intero; • noverlap `e il numero di campioni per la sovrapposizione; il default `e il 50 % della lunghezza della finestra e in genere quella `e la scelta pi` u consigliabile. Anche le scelte per la normalizzazione spettrale sono le stesse del periodogramma e del periodogramma modificato. 1. Iniziamo col caso di Bartlett. Lavoriamo su N = 512 dati di rumore bianco gaussiano a varianza unitaria e fissiamo: (a) M = 512, K = 1 (periodogramma semplice); (b) M = 128, K = 4; (c) M = 32, K = 16. Osserviamo la progressiva riduzione di varianza. 2. Ora passiamo al pi` u generale metodo di Welch. Analizziamo un segnale di N = 512 campioni, fatto da rumore bianco gaussiano e due sinusoidi, con i seguenti parametri:

58

CAPITOLO 1. ESERCITAZIONI GUIDATE • ampiezza della prima sinusoide A0 = 5, frequenza angolare ω0 = 0.4π, ω0 f0 = 2πT = 4 × 10−2 Hz; c • ampiezza della seconda A1 = 5, frequenza angolare ω1 = 0.45π, ω1 = 4.5 × 10−2 Hz; f1 = 2πT c

• rumore bianco gaussiano con varianza unitaria. 3. Confrontiamo tra loro (a) un periodogramma semplice, (b) una stima alla Bartlett con M = 128 e K =4, (c) una stima alla Bartlett con M = 64 e K =8,

(d) una stima alla Welch con finestra di hamming, overlap del 50 %, M = 128 e K =7. La riduzione di varianza rispetto al priodogramma `e evidente. Inoltre si vede che a parit` a approssimativa di K (un valore di 7 per il metodo di Welch contro il valore di 8 del metodi di Bartlett) si ha circa la stessa varianza. Infine, sebbene la larghezza del lobo spettrale principale della finestra di Hamming usata nel metodo di Welch sia circa 1.46 volte quella del lobo spettrale principale della finestra rettangolare usata nel metodo di Bartlett, la risoluzione `e circa la stessa. Ci`o `e dovuto al fatto che l’overlap del 50 % presente nel metodo di Welch consente a M di essere il doppio (128 anzich`e 64). Metodo MultiTaper Nel metodo MTM, si mediano stime spettrali relative a sequenze ottenute applicando ai dati finestre ortogonali ottimali ai fini della minimizzazione del leakage (discrete prolate spheroidal sequences o Slepian tapers). Il compromesso tra varianza delle stime e risoluzione avviene tramite la scelta del valore di un parametro, detto time-bandwidth product (sia nw ), direttamente connesso al numero di tapers usati per calcolare lo spettro (che `e 2nw + 1). Al crescere di nw , si mediano pi` u stime e la varianza scende; nel contempo, per`o, siccome la larghezza di banda di ogni taper `e anch’essa proporzionale a nw , i picchi nello spettro si allargano: c’`e maggiore polarizzazione e minore risoluzione; c’`e maggiore leakage. Per ogni set di dati esiste, in genere, il miglior compromesso (il problema `e trovarlo!). Valori comunemente usati per nw sono 3/2, 2, 5/2, 3, 7/2, 4. In MATLAB il metodo corrisponde alla function pmtm, la cui sintassi (riassumendo al massimo) `e [Pxx,Pxxc,f]=pmtm(x,p,nfft,fc,’method’,p,’range’); Il significato degli argomenti `e il solito, salvo che qui ’method’ specifica come vengono combinate le varie stime spettrali (periodogrammi modificati) da mediare tra loro: la combinazione pu` o essere lineare o no e precisamente • ’adapt’: default, combinazione adaptive non lineare di Thomson;

1.6. METODI DI STIMA DELLO SPETTRO DI POTENZA

59

• ’unity’: combinazione lineare con pesi unitari; • ’eigen’: combinazione lineare con pesi uguali agli autovalori del problema variazionale di minimizzazione del leakage; noi ci atterremo al default. Per tutte le altre questioni non esplicitamente descritte si faccia riferimento a quanto detto per il periodogramma o, relativamente agli intervalli di confidenza, per csd. Come esempio d’uso, possiamo rifare lo spettro di N = 512 campioni di rumore con due sinusoidi, usati prima (rumore: σr = 1; sinusoidi: A0 = 5, A1 = 5, ω0 = 0.4π, ω1 = 0.45π) e confrontare il risultato con quanto si ottiene coi metodi trattati in precedenza. Scegliendo nfft=1024 come al solito facciamo tre prove: (a) p = 2, (b) p = 3, (c) p = 4. Vedremo l’ottima risoluzione ottenibile, particolarmente elevata per p = 2, al prezzo di una varianza un po’ pi` u pronunciata. Lo studente verifichi che la potenza media `e conservata anche in questi casi.

1.6.3

Metodi parametrici

I metodi parametrici possono dare migliore risoluzione di quelli non-parametrici, quando il segnale `e corto: `e questa la caratteristica pi` u importante nelle applicazioni di nostro interesse. Gli spettri che si ottengono possono avere picchi molto acuti, come conseguenza dell’uso di modelli all pole (autoregressivi). Non banale `e la scelta dell’ordine ottimale per il modello. Esistono criteri automatici ma non sono implementati in MATLAB ai fini dell’analisi spettrale: nelle function di stima spettrale parametrica, l’ordine `e un parametro di input che va specificato dall’utente. Empiricamente, `e meglio fare varie prove, partendo da ordini bassi, che daranno spettri molto lisciati, e salendo via via, non oltrepassando per` o mai la met` a del numero di dati come ordine di grandezza. In MATLAB sono disponibili quattro metodi leggermente diversi tra loro nel dettaglio della stima dei parametri del modello: • autoregressivo alla Yule-Walker (pyulear), • di Burg (pburg), • della covarianza (pcov), • della covarianza modificata (pmcov).

60

CAPITOLO 1. ESERCITAZIONI GUIDATE

La documentazione on-line contiene una tabella che illustra le differenze tra questi metodi. A fini pratici, si consiglia di scegliere pyulear se si hanno molti dati; se i dati sono pochi (meno di 200, indicativamente) e non molto rumorosi, `e meglio usare pburg. Questo metodo d` a modelli sempre stabili ma ha un difetto: per ordini elevati si pu` o avere line splitting (comparsa di picchi spuri) e per sinusoidi immerse in rumore si pu` o avere bias nella determinazione della frequenza. In questi casi si pu` o allora ricorrere al metodo della covarianza modificata, anche se occasionalmente pu` o dare modelli instabili. Come regola generale, `e sempre meglio confrontare i risultati di pi` u metodi. Tutte le function citate applicano le normalizzazioni discusse per il periodogramma. Tutte hanno sintassi simili: ad esempio [Pxx,f]=pburg(x,p,nfft,fc,’range’); dove p `e l’ordine del modello. Per vedere una volta “in azione” questi metodi, possiamo calcolare con pburg lo spettro di quel segnale di 40 campioni per il quale il periodogramma non permise di risolvere le due sinusoidi (rumore: σr = 1; sinusoidi: A0 = 5, A1 = 5, ω0 = 0.4π, ω1 = 0.45π) sebbene il rumore fosse relativamente basso. Constateremo che elevando sufficientemente l’ordine, entro i limiti consentiti, si pu` o arrivare a distinguere i due picchi; salendo ulteriormente si pu` o vedere la comparsa di picchi spuri. Concluderemo ripetendo con pyulear e confrontando i risultati con quelli ottenuti da burg.

Capitolo 2

Esercitazioni libere 2.1 2.1.1

Analisi di una serie temporale Premessa

Lo scopo dell’esercitazione `e l’analisi di una tipica, breve serie temporale, dal ` prevista tutta una serie di punto di vista statistico (semplice) e spettrale. E operazioni, al termine di ciascuna delle quali si giunge ad almeno un grafico; per ognuna di esse, si consiglia di preparare un apposito script, in modo da potere agevolmente provarlo, eventualmente apportarvi modifiche, rilanciarlo, magari usarlo come base per impostare un successivo script, ecc... Al termine del lavoro, lo studente dovr` a preparare una concisa relazione, includendo i grafici prodotti, eventuali commenti personali e le risposte ai quesiti che verranno via via posti. Non `e invece n´e necessario, n´e richiesto includere nella relazione i testi degli script. I dati che useremo sono geofisici, climatologici per la precisione, e consistono nella serie temporale di medie mensili in gradi centigradi delle temperature superficiali del mare 1 , mediate spazialmente sulla cosiddetta regione NINO3 (tra 50 Sud e 50 Nord di latitudine; tra 900 e 1500 Ovest di longitudine). La serie si estende dal 1871 alla prima parte del 2012; non vi sono dati mancanti. I file di dati sono sst_nino3_mensili.dat e time_nino3_mensili.dat; digitando >>load sst_nino3_mensili.dat. >>load time_nino3_mensili.dat. 1 Per indicare temperature superficiali del mare si usa spesso l’acronimo SST, che sta per “sea surface temperature”.

61

62

CAPITOLO 2. ESERCITAZIONI LIBERE

carichiamo le variabili nel workspace 2 , chiamandole sstm e tm rispettivamente. Successivamente riduciamo la lunghezza di questi vettori, conservando solo i dati dal 1880 al 2011 compreso (132 anni *12 mesi = 1584 dati). Per trovare gli indici iniziale e finale dei dati da conservare si procede cos`ı: • usando il formato long per la visualizzazione dei numeri sullo schermo, si identifica il valore di t che interessa; • usando la function find si trova il corrispondente indice nel vettore t. Avremo cos`ı due vettori con 1584 campioni ciascuno.

2.1.2

Analisi statistica elementare

1. Eseguiamo, come prima cosa, un grafico delle SST. Mettiamo un titolo e le label degli assi con le unit` a di misura. Tipicamente, un grafico serve, oltre che per avere un’idea generale di quale andamento e di quali valori la variabile assume, per identificare ad occhio derive, bruschi cambiamenti di valor medio o varianza, dati molto discosti dalla media e perci`o sospetti (che ovviamente nei nostri dati NINO3 non ci sono, essendo gi` a il record frutto di elaborazione preliminare). Un grafico pu` o mettere in evidenza anche dati mancanti, perch´e questi di solito sono marcati con valori “fuori range” per la variabile in questione; ad esempio: -999 per una variabile che tipicamente assuma valori tra +1 e -1, ecc... Osserviamo l’andamento della nostra serie e commentiamolo. 2. Ad occhio, stimiamo la media e la deviazione standard ed annotiamoceli. 3. Creiamo un istogramma dei dati, raggruppandoli in circa 30 bins (in questo modo l’ampiezza del bin `e circa 0.2 0 C). In MATLAB ci`o si ottiene con la function hist: hist(sstm,30) (si vedano altre possibili opzioni con help). Mettiamo le label degli assi. Descriviamo la forma della distribuzione: appare normale (gaussiana)? Sembra avere una skewness da una parte o dall’altra? Variamo il numero di bins: che cosa cambia se si passa al doppio? Al quadruplo? Alla met`a? 2I

dati di SST e di anomalie fino al 1996 sono pubblici e scaricabili dal sito: http://paos.colorado.edu/research/wavelets/software.html sotto il nome di nino3data.asc. Per usarli come descritto nell’esercitazione occorrerebbe rimuovere l’intestazione (righe di commento iniziali). Gli ultimi 30 anni di dati sono invece reperibili su http://www.cpc.ncep.noaa.gov/data/indices/.

2.1. ANALISI DI UNA SERIE TEMPORALE

63

4. Calcoliamo la media, la varianza e la deviazione standard dei dati. Confrontiamole con le stime “ad occhio”: erano ragionevoli? Inseriamo nel grafico temporale le linee che rappresentano la media e -2, -1, 1, 2 deviazioni standard dalla media.

2.1.3

Autocorrelazione

Per l’autocorrelazione e l’autocovarianza di una sequenza di dati, in MATLAB si usano le due function xcorr e xcov. La prima stima l’autocorrelazione del processo casuale che genera la sequenza in esame, a partire dal segmento di lunghezza finita di cui si dispone (sia N la sua lunghezza); la seconda esegue la stessa operazione, sottraendo per`o prima ai dati la media (perci` o la stima ottenuta `e quella dell’autocovarianza). In assenza di specifiche in merito, l’output viene stimato per lag da −(N − 1) a +(N − 1), per un totale di 2N − 1 valori; l’N -esimo campione dell’output corrisponde dunque a lag zero. Ciascuna di queste function accetta in input, oltre al nome del vettore di dati su cui operare, una flag character (data tra apici) che specifica se si desidera in output una stima ’biased’ (cio`e del tipo cxx ), ’unbiased’ (cio`e del tipo c′xx ) o ancora del tipo ’coeff’ (ρxx = coefficiente di autocorrelazione). In quest’ultimo caso, la normalizzazione `e tale che • con xcorr, l’autocorrelazione a lag zero vale 1; • con xcov, l’autocovarianza a lag zero vale 1. Oltre che l’autocorrelazione o l’autocovarianza, in output si pu` o avere il vettore dei lag corrispondenti. Se lo si desidera, si pu` o specificare il lag massimo a cui estendere il calcolo: ad esempio, se scriviamo maxlags=100 [ro,lags]=xcov(sstm,maxlags,’coeff’); otteniamo la sequenza dei coefficienti di autocorrelazione stimata su lag da -100 a +100 (totale 201 valori), ed i corrispondenti lag (il lag zero `e il 1010 ). Facciamo ora il grafico di ro in funzione di lags: come appare? Vi sono delle oscillazioni, regolari o non regolari? Cade rapidamente o lentamente verso lo zero? Commentiamo.

2.1.4

Spettro di potenza

1. Facciamo un grafico parziale dei dati, dal 1880 al 1900. Si osserva una periodicit` a dominante? Se s`ı, che ampiezza ha in gradi Celsius? Che

64

CAPITOLO 2. ESERCITAZIONI LIBERE frequenza ha approssimativamente? Annotiamo queste osservazioni. 2. Togliamo ai dati la media e calcoliamo il periodogramma di tutta la serie, senza effettuare padding di zeri. Scegliamo una volta per tutte uno schema di normalizzazione spettrale. Le possibilit`a pi` u comuni, partendo da una sequenza x[n], sono le seguenti: • |X[k]|2 /N , (spettro two-sided ), oppure

• |X[k]|2 /(N σ 2 ), dove σ 2 `e la varianza dei dati, se vogliamo rapportare le nostre densit` a spettrali di potenza two-sided a quelle di una sequenza di rumore bianco con la stessa σ 2 , oppure • 2|X[k]|2 /N (spettro one-sided ), scelta giustificabile col fatto che poi faremo i grafici solo sull’intervallo di frequenza (0, fN y ), oppure ancora • 2|X[k]|2 /(N σ 2 ), se vogliamo rapportare le nostre densit` a spettrali di potenza one-sided a quelle di una sequenza di rumore bianco con la stessa σ 2 dei dati. Sebbene ai nostri fini una scelta valga l’altra, decidiamo di adottare la seconda convenzione, |X[k]|2 /(N σ 2 ). Notiamo che otterremmo lo stesso risultato adottando la prima, |X[k]|2 /N , e standardizzando i dati prima del calcolo: anzi, questa `e probabilmente la strada migliore per evitare errori. Facciamo un grafico del periodogramma in scala lineare-lineare, con le frequenze in Hz da 0 a fN y in ascisse. Mettiamo le label degli assi con le corrette unit` a. Osserviamo e commentiamo: qual `e il picco pi` u prominente? Ce ne sono altri? C’`e qualche traccia della periodicit` a prima osservata su un piccolo intervallo di tempo? 3. A causa dell’elevata ampiezza del ciclo annuale, `e difficile vedere gli altri picchi. Proviamo a fare un grafico log-log: che differenze ci sono tra i due metodi per graficare lo spettro? Quali sono i punti forti e deboli di ciascuno? 4. Proviamo anche a fare un grafico semilogaritmico, usando plot ma mettendo in ascisse il logaritmo in base 2 dei periodi (inversi delle frequenze) in anni: si tratta di una presentazione molto usata, che a volte `e di lettura pi` u immediata delle precedenti 3 . Per questo compito `e comodo rifare innanzi tutto lo spettro ponendo la frequenza di campionamento uguale a 12 anni−1 (cio`e esprimendola in anni−1 anzich`e in Hz). In seguito, usando come variabile in ascisse non f ma period=1.\f e prendendone il log2, si otterr`a il grafico voluto; naturalmente la frequenza zero dovr` a essere esclusa. Per maggiore chiarezza, nel grafico si usa poi spesso rovesciare l’asse delle ascisse (cos`ı l’ordine dei valori `e quello delle corrispondenti frequenze) e riportare nelle sue label il periodo, al posto del logaritmo in base 2 di esso. 3 Quanto alla scelta del modo di graficare lo spettro, (lineare, logaritmico...) non esiste un modo migliore in assoluto e tutto dipende sia dall’ampiezza dell’intervallo di valori che si deve riportare sugli assi, sia, per le ordinate, dalla forma dello spettro. Quindi il consiglio ` e: provare ogni volta vari modi!

2.1. ANALISI DI UNA SERIE TEMPORALE

65

Ci`o si ottiene con la sequenza di comandi che segue. Xticks=2.^(fix(log2(min(period))):fix(log2(max(period)))); set(gca,’XDir’,’reverse’); set(gca,’Xlim’,log2([min(period),max(period)])); set(gca,’XTick’,log2(Xticks(:))); set(gca,’XTickLabel’,Xticks); Esaminiamo il risultato ed assicuriamoci che il picco annuale sia all’ascissa di 1 anno! 5. Nell’ultimo grafico fatto, restringiamo il range di valori in ordinata, lasciando debordare il picco annuale per vedere meglio il resto, di ampiezza relativamente bassa. Ad esempio, aggiungiamo alle precedenti la riga set(gca,’Ylim’,[0,21.5]); Si vedono altri picchi o gruppi di picchi? Quali sono i pi` u pronunciati? Qual `e l’andamento generale dello spettro? Appare piatto?

2.1.5

Significativit` a dei picchi

Seguendo la traccia di quanto fatto nelle esercitazioni guidate, 1. con fondo di rumore bianco, troviamo il livello di significativit` a per lo spettro di NINO3, al 95 % ed al 99.9 % di confidenza; stiamo attenti al fatto che con la normalizzazione adottata, dobbiamo riferirci a rumore bianco a varianza unitaria. Tracciamo, con differenti stili e colori, le linee del fondo e dei due livelli di significativit` a sul grafico semilogaritmico (quello con asse dei periodi rovesciato); inseriamo una legenda per non confonderle. Quali picchi o gruppi di picchi superano il test al 95 %? Quali al 99.9 %? (Eventualmente ingrandire le figure, zoomare...) 2. Ripetiamo la prova, usando come fondo il rumore rosso e limitandoci al 95 % di confidenza: grafichiamo sia la curva del fondo, sia quella di significativit`a. Vi sono picchi che passano questo test oppure no? I picchi nel range di periodi 2-7 anni lo passano? Se la risposta `e no, quale effetto pu` o esserne responsabile?

2.1.6

Whitening

Si definisce whitening il processo di rimozione di certi segnali dominanti, per ottenere dati distribuiti pi` u gaussianamente.

66

CAPITOLO 2. ESERCITAZIONI LIBERE

Le variabili climatologiche come la nostra SST contengono al loro interno il ciclo stagionale, che per certi scopi occorre rimuovere: questa `e appunto una forma di whitening. Un modo semplice di farlo (una sorta di filtraggio empirico) consiste nel calcolare, per dati mensili, la media di tutti i Gennai, di tutti i Febbrai ecc... e poi sottrarre da ogni dato mensile la media opportuna. Si ottengono cos`ı le anomalie del campo. Ad esempio: anomalia di Ottobre 1991 uguale SST di Ottobre 1991 meno media di tutti i mesi di Ottobre. Il file, contenente le anomalie da cui il ciclo annuale `e stato filtrato via, `e anom_nino3_mensili.dat. Accorciamo anche questa nuova serie in modo che si estenda dal 1880 al 2011 compreso con 1584 campioni, chiamiamo la variabile anom ed esaminiamone l’andamento. 1. Rifacciamo il calcolo della media e della deviazione standard; ripetiamo l’istogramma con gli stessi valori del numero di bins, usati prima. La distribuzione `e molto diversa da prima? 2. Ricalcoliamo il coefficiente di autocorrelazione e descriviamo i cambiamenti avvenuti. 3. Ricalcoliamo lo spettro, grafichiamolo in scala semilogaritmica (ascisse: logaritmo in base 2 dei periodi in anni, asse rovesciato) assieme al fondo di rumore bianco gaussiano ed al relativo livello di significativit` a al 95 % ed al 99.9 % di confidenza. Essendo variato, rispetto al caso precedente, il valore assoluto dei picchi spettrali 4 , fissiamo un nuovo limite superiore per l’asse delle ordinate, ad esempio set(gca,’Ylim’,[0,46]); 4. Confrontiamo quanto ottenuto coi risultati dell’analisi delle SST originali. Che differenze si notano? Che `e successo al ciclo annuale ad alle sue armoniche? Che si pu` o dire della significativit` a dei picchi con periodi da 2 a 7 anni? C’`e altro da notare? 5. Calcoliamo il fondo di rumore rosso ed i corrispondenti livelli di significativit`a al 95 % ed al 99.9 % di confidenza; riportiamoli sul grafico spettrale semilogaritmico e facciamo considerazioni analoghe alle precedenti. Quali picchi risultano significativi ora al 95 %? E al 99.9 %?

2.1.7

Rumore rosso

Facoltativamente, si confronti lo spettro teorico AR(1) con con lo spettro calcolato per una sequenza di rumore rosso, generata artificialmente; si testi anche la formula per l’autocorrelazione del rumore rosso, che teoricamente `e del tipo ρl = ρl1 , dove ρ1 `e il coefficiente di autocorrelazione a lag l = 1. Allo scopo: 4 Questo innalzamento ` e un effetto secondario della sparizione dei prominenti picchi legati alla ciclicit` a annuale, associata alla standardizzazione scelta.

2.1. ANALISI DI UNA SERIE TEMPORALE

67

• si generi una lunga sequenza di rumore bianco, diciamo 216 dati 5 ; • si filtri la sequenza con un filtro IIR AR(1) con coefficiente a1 = −α (e, naturalmente, a0 = 1); il valore di α `e arbitrario, sia, per esempio, 0.72; per questo si usi la function filter, ottenendo cos`ı il rumore rosso; • si calcoli lo spettro con un metodo che consenta una buona riduzione della varianza della stima spettrale, come, ad es., il metodo di Welch con finestra hamming(128) e overlap del 50 %; essendovi molti dati, ci vorr`a probabilmente un poco di tempo per il calcolo; • si grafichi lo spettro e si sovrapponga al risultato della simulazione lo spettro teorico (attenzione alla normalizzazione: P0 deve essere uguale alla varianza dei dati di rumore rosso); • si valuti anche l’autocorrelazione (usando xcov con maxlags=100) e se ne confronti graficamente l’andamento con quello teorico, mettendo in ascissa solo lag positivi.

2.1.8

Stazionariet` a

Facoltativamente, lo studente esegua infine una semplice analisi spettrale evolutiva delle anomalie, prelevando, dalla serie di 1584 campioni, tre segmenti:

• Gennaio 1890 - Dicembre 1919 (dal dato n. 121 al n. 480); • Gennaio 1920 - Dicembre 1949 (dal dato n. 481 al n. 840); • Gennaio 1960 - Dicembre 1989 (dal dato n. 961 al n. 1320). Calcoli tre spettri separati, con padding di zeri fino a lunghezza 2048 per la trasformata. Tali spettri verranno graficati in scala semilogaritmica (con log2 del periodo in anni in ascisse; si mantenga lo stesso intervallo di valori dell’asse delle ordinate usato prima, anche se uno degli spettri dovesse debordare, per poter fare i dovuti confronti). Insieme a ciascun spettro si grafichi anche il fondo di rumore rosso ed i relativi livelli di significativit` a al 95 % e 99.9 % di confidenza. Si confrontino poi i tre spettri: i dati appaiono stazionari? Alla luce di quanto si nota, che considerazioni si possono fare a proposito dell’analisi condotta in precedenza? 5 Con

meno dati le basse frequenze cominceranno a deviare dall’andamento teorico.

68

CAPITOLO 2. ESERCITAZIONI LIBERE

2.2 2.2.1

Analisi spettrale evolutiva: la CWT Premessa

Lo scopo dell’esercitazione `e l’analisi di una serie temporale con marcate caratteristiche di non stazionariet` a, eseguita mediante la trasformata continua di wavelet o CWT. Anche in questo caso `e richiesta una breve relazione sul lavoro svolto. I dati da analizzare sono le stesse anomalie usate per l’esercitazione precedente, ma questa volta su base stagionale anzich`e mensile, cos`ı da presentare un numero ridotto di campioni, pur mantenendo una durata del record climaticamente significativa. I files sono anom_nino3_stag.dat e time_nino3_stag.dat e comprendono ciascuna 506 campioni. Chiameremo le variabili anoms e ts rispettivamente. Molte serie temporali mostrano caratteristiche di non stazionariet` a, in geofisica ed in altri campi. In esse possono essere presenti periodicit` a dominanti, che per` o possono variare nel tempo, in frequenza e/o ampiezza. Le anomalie di SST del Pacifico equatoriale ne sono un ottimo esempio: il modo dominante di variabilit` a `e El Ni˜ no-Southern Oscillation (ENSO), su scala temporale di 2-7 anni (interannual scale); sovrapposti a tale segnale vi sono fluttuazioni a scala molto pi` u lunga, dell’ordine dei decenni (interdecadal scale). Si desidera quindi studiare le oscillazioni di corto periodo separatamente da quelle di lungo periodo 6 e la CWT offre proprio questa possibilit`a. Scelta una wavelet a forma di pacchetto d’onda (ad esempio la wavelet di Morlet complessa), ed immaginando, diciamo, di partire da una scala alla quale il supporto temporale della wavelet `e di 15 anni, troveremo la correlazione tra essa ed i primi 15 anni della nostra serie; quest’unico numero complesso ci dar` a una misura della similarit` a tra il pacchetto d’onda ed i dati dei primi 15 anni (ossia ci dir` a, con il suo modulo, quanto i dati oscillano in modo simile ad una sinusoide della frequenza della wavelet e, con la sua fase, qual `e lo sfasamento tra le due oscillazioni). In seguito faremo avanzare il pacchetto lungo tutta la serie, ottenendo la serie temporale della correlazione complessa con la wavelet alla scala “15 anni”. Ripeteremo per tutte le scale di interesse. Variando la scala della wavelet varieremo automaticamente la sua frequenza, visto che il numero di oscillazioni contenuto nell’inviluppo gaussiano resta costante. Otterremo cos`ı una mappa nel piano tempo-scala, traducibile in una mappa nel piano tempo-frequenza o tempo-periodo, che soddisfa le nostre richieste di • alta risoluzione in frequenza a bassa frequenza (per studiare la variabilit` a di fondo), 6 La parola “oscillazione” ` e qui usata per indicare una qualsiasi fluttuazione nella serie, che tende a ripetersi, indipendentemente dal fatto che tale ripetizione avvenga ad intervalli regolari di tempo o no; nel nostro esempio, El Ni˜ no ` e senz’altro un segnale irregolare, ossia aperiodico.

2.2. ANALISI SPETTRALE EVOLUTIVA: LA CWT

69

• alta risoluzione in tempo ad alta frequenza (per isolare eventi rapidi, temporalmente localizzati).

Di questa mappa, che costituisce la CWT, in realt` a ci limiteremo qui ad esaminare il modulo quadro (scalogramma), ossia la potenza in funzione della frequenza (o, inversamente, del periodo) e del tempo, e di questa faremo un contour plot, per rivelare i modi dominanti di variabilit` a contenuti nei dati e come questi modi variano nel tempo. Valuteremo anche quali regioni del piano tempo-periodo corrispondano a potenza significativa, al 95 % di confidenza; ripeteremo la procedura con tre diverse wavelets madri, due complesse analitiche ed una reale. Seguir` a un esame dettagliato delle mappe ottenute: un esempio volto a fornire allo studente dele linee-guida da seguire nell’interpretazione di uno scalogramma. L’ultima parte dell’esercitazione riguarder`a il calcolo e la discussione dello spettro globale di wavelet. Ricordiamo qui che i calcoli per la CWT sono completamente indipendenti dal fattore dimensionale Tc (passo di campionamento dei dati); esso entra in gioco solo quando

• il fattore di scala a (adimensionale) deve essere tradotto in scala s, che `e un tempo, e quando

• il fattore di scala a deve essere tradotto in frequenza f (espressa in Hz, o anni−1 , ecc...) oppure in periodo P (espresso in secondi, o anni, ecc...).

2.2.2

Le function

Per svolgere l’esercitazione, lo studente dovr` a preparare uno script, descritto nella prossima sottosezione, nella quale verranno chiamate alcune function che fanno parte di un software scritto dall’autrice nel 2002 per scopi di ricerca e che svolgono, ciascuna, parte dei calcoli. La trasformata di wavelet viene eseguita nel dominio della frequenza, come trasformata DFT inversa del prodotto delle trasformate dei dati e della wavelet alle singole scale. Le function da usare sono w_transf.m, w_bases.m, w_param.m, w_signif.m, modpar.m. Vediamo ora quali operazioni svolge ciascuna (salvo l’ultima, della quale si parler`a nella sottosezione sul programma da scrivere).

70

CAPITOLO 2. ESERCITAZIONI LIBERE

w param.m Questa function fornisce parametri caratteristici di alcune wavelets. Essa viene chiamata da w_transf e w_signif e servir`a anche per lo script principale. La sintassi di w_param `e [consts]=w_param(mother,param); dove in input • mother `e il nome della wavelet madre ψ0 (θ) (θ =tempo continuo adimensionale), scelta tra Morlet, Paul e DOG, e • param `e il parametro che la caratterizza: ω0 nel caso della wavelet di Morlet complessa (default ω0 = 6), l’ordine m negli altri due casi (default: m = 4 per Paul, m = 2 per DOG; per quest’ultima `e possibile anche scegliere m = 6). In output, consts `e un vettore che contiene i valori di alcune costanti, tipici della wavelet. A noi interessano: • consts(1), che contiene dofmin (numero minimo di gradi di libert` a o degrees of freedom: 2 per le wavelets complesse e 1 per quelle reali), • consts(2), che contiene Cδ (costante che compare nella trasformata inversa), • consts(3), che contiene il cosiddetto time decorrelation factor γ, utile per il calcolo di significativit` a per lo spettro globale, • consts(5), che contiene ψ0 (0) (valore che a sua volta `e utilizzato per la trasformata inversa), • consts(6) che `e il rapporto, diverso per ogni wavelet, tra inverso della frequenza (periodo “di Fourier” P ) e scala s. Chiameremo questo rapporto anche k0 o fattore di Fourier ; e infine • consts(7), che contiene il rapporto (sia c) tra τs , il cosiddetto e-folding time che definisce il cono d’influenza, e la scala s.

w bases.m Questa function `e “trasparente” per l’utente; viene chiamata da w_transf ad ogni valore aa del fattore di scala a. La sintassi di w_bases `e [daughter] = w_bases(om,aa,mother,param); dove in input, oltre alle quantit` a mother e param gi`a note ed alla particolare

71

2.2. ANALISI SPETTRALE EVOLUTIVA: LA CWT

scala considerata aa, compare il vettore om delle frequenze discrete ωk impiegate per l’esecuzione della trasformata di wavelet nel dominio della frequenza. In output la function fornisce il vettore dei valori, campionati alle ωk , della trasformata analogica di Fourier della wavelet figlia, alla scala aa. Le ωk sono le stesse frequenze a cui viene campionata la fft dei dati, prese nello stesso ordine.

w trans Questa function `e la principale, quella in cui viene calcolata la CWT. A tal fine, in essa • si applica ai dati un padding di zeri, per evitare l’aliasing nel tempo quando si calcola la CWT; la lunghezza del vettore dati passa da 506 a N = 512; • si calcola la DFT dei dati via fft; • a partire dai valori, dati in input, di a0 , δj e J, si costruisce il vettore a dei fattori di scala come a = a0 2jδj , con j = 0, J; • si costruisce 7 il vettore om delle frequenze angolari ωk = (− N2 + 1, N2 );

2π N k,

con k =

• entro un loop sulle scale, ad ogni scala si chiama w_bases per calcolare la trasformata della wavelet figlia alle frequenze ωk ; la si moltiplica termine a termine per la trasformata dei dati e poi si fa la DFT inversa di questo prodotto per ottenere i valori della CWT alla data scala; `e qui che il padding di zeri effettuato protegge dall’aliasing nel tempo; • calcolata cos`ı tutta la matrice della CWT (wave), ci si libera dal padding, eliminando i valori con indice temporale superiore al numero di dati originario (506); • si calcola lo scalogramma (power) come abs(wave).^2; • si chiama w_param per ottenere i due scalari consts(6) e consts(7); • dal vettore a e dal fattore di Fourier (consts(6)) si calcola il vettore period dei periodi adimensionali (inversi delle frequenze adimensionali o normalizzate); • si calcola il cono d’influenza adimensionale (coi); a tal fine – si calcola il rapporto tra consts(6) e consts(7); – si moltiplica questo rapporto per il vettore degli indici temporali. Cos`ı si ottiene una serie temporale che ad ogni valore dell’indice riad porta il valore di period critico (sia Pcoi ). Esso costituisce, nel piano 7 Si ricordi che ` e del tutto arbitrario collocare, entro N valori di frequenza discreta, la o a −N . frequenza di Nyquist a + N 2 2

72

CAPITOLO 2. ESERCITAZIONI LIBERE tempo-periodo adimensionale, la linea che delimita il cono d’influenza 8 . In questo piano, si usa orientare l’asse dei periodi verso il basso; allora tutta la regione che sta sotto la linea di coi (contenente periodi pi` u grandi di coi) `e di dubbia affidabilit` a, perch´e entro essa power risulta ridotto rispetto al suo valore vero, a causa del padding di zeri applicato ai dati; • per controllo del calcolo di wave, si esegue la trasformata di wavelet inversa, ricostruendo il segnale originario in base ai campioni di wave; si grafica la serie ricostruita sovrapposta a quella originale, in una finestra separata; si calcola inoltre il mean square error ed il root mean square error di ricostruzione, nonch`e la varianza della serie ricostruita, da confrontarsi con quella dei dati di input (che post-standardizzazione vale 1).

La sintassi di w_transf `e [wave,period,a,coi,power,xcheck] = w_transf(y,dj,a0,J,mother,param);

dove y `e la sequenza di input, dj ( = δj ), a0 e J sono le costanti necessarie alla costruzione del vettore dei fattori di scala, i cui valori verranno suggeriti pi` u avanti, e le altre variabili sono gi`a state descritte.

w signif.m Questa function si occupa dei tests di significativit` a. La sintassi di w_signif `e [signif,P_red] = w_signif(y,a,sigtest,rolag1,conflev,dof,mother,param); In input, • y per certi usi della function `e la serie di input, per altri `e la varianza della serie stessa; se `e uno scalare, nella function si intende sia una varianza e questo `e il nostro caso; • a `e il vettore dei fattori di scala; • sigtest pu` o valere 0, 1 oppure 2; il valore 0 corrisponde ad un test del χ2 con dofmin gradi di libert` a (2 per wavelets complesse e 1 per wavelets reali) ed `e quindi adatto ai valori dello scalogramma, mentre il valore 1 conduce ad un test sui valori dello spettro globale di wavelet. Il valore 2 rimanda ad un test che qui non sar`a contemplato, relativo ad una procedura di media dello scalogramma su un certo intervallo di scale; 8 Posto k = P/s e c = τ /s, scriviamo che ad un dato istante t, P s 0 coi (dimensionale) corrisponde a quella scala (dimensionale) scoi tale che τs = cscoi = t = nTc , ossia scoi = ad = a adimensionale ` e Pcoi nTc /c, da cui Pcoi = k0 scoi = kc0 nTc . La corrispondente quantit` k0 n. c

2.2. ANALISI SPETTRALE EVOLUTIVA: LA CWT

73

• rolag1 `e il parametro α per il modello AR(1) (fondo di red noise); • conflev `e il livello di confidenza per il test (default 95 %, ottenibile anche ponendo conflev=-1); • dof `e il numero di gradi di libert` a, che dipende dal valore di sigtest (si veda la sottosezione che segue). L’uscita signif `e il livello di significativit` a cercato. In output, oltre a signif, si pu` o avere lo spettro di fondo, P_red (non `e per`o previsto di graficarlo in questa esercitazione, n`e di usarlo ulteriormente).

2.2.3

Il programma

In questa sezione verr`a descritta la struttura del programma in linguaggio MATLAB che lo studente dovr` a scrivere. In esso verranno svolti i calcoli necessari all’analisi in CWT, chiamando le function sopra descritte, e verranno graficati i risultati; per i comandi grafici `e disponibile lo script w_plot.m. La linea da seguire nel costruire lo script `e la seguente. 1. Fissare una wavelet madre mother (per iniziare, quella di Morlet complessa) ed il relativo parametro, param = 6. 2. Fissare, in base alla relazione scala-frequenza, il minimo fattore di scala di interesse, amin = a0 . In generale, P = k0 s e f = k10 s , dove k0 `e il fattore di Fourier. Pertanto fmax = fN y =

1 1 1 = = , 2Tc k0 s0 k0 a0 Tc

ossia a0 = k20 . Nel caso della wavelet di Morlet con ω0 = 6, k0 ≃ 1, quindi a0 = 2; per una wavelet diversa, come Paul o DOG, il valore di a0 sar`a diverso; nella Tabella 2.1 `e riportata l’espressione analitica di k0 per varie wavelets. Il criterio qui indicato per la scelta di a0 `e ulteriormente discusso al termine di questa sezione. 3. Caricare il set di dati. Il nome del file `e anom_nino3_stag.dat ed i tempi corrispondenti sono time_nino3_stag.dat; ribattezzare anoms e ts i vettori ottenuti. 4. Calcolare la deviazione standard e la varianza di anoms. 5. Ridurre i dati anoms a media nulla (anche se tale media `e gi`a molto vicina a zero).

74

CAPITOLO 2. ESERCITAZIONI LIBERE

Wavelet

Morlet(ω0 = 6)

Paul(m = 4)

DOG(m = 2)

k0

ω0 +

4π √

ω02 +2

4π 2m+1

2π m+1/2



Tabella 2.1: Espressioni analitiche del fattore k0 che lega il periodo di Fourier alla scala. 6. Standardizzare i dati dividendoli per la loro deviazione standard; la varianza dei dati diviene 1 (sia vari = 1); in questo modo si otterr`a uno scalogramma a sua volta “standardizzato” 9 . 7. Calcolare la lunghezza N del vettore anoms. 8. Dare l’intervallo di campionamento dei dati in anni, che `e Tc = 0.25 anni. 9. Fissare dj= δj = 0.05, che rappresenta l’inverso del numero di scale per ottava, e fissare J = J = 160, che `e il numero totale di scale considerate, meno una. In questo modo si esaminano Jδj = 8 ottave di scala, ciascuna suddivisa in δ1j = 20 parti; la scelta di questi valori `e giustificata al fondo di questa sezione. 10. Eseguire il calcolo della CWT, chiamando la function w_transf e ottenendo in uscita, come gi`a visto, • la trasformata (variabile complessa wave) che non verr`a utilizzata, in quanto in w_transf viene calcolato anche • lo scalogramma (power), cio`e il modulo quadro della trasformata;

• il set di fattori di scala a;

• il vettore period contenente i periodo di Fourier adimensionali associati ad ogni valore del fattore di scala; • il vettore coi che rappresenta la linea che disegna nel grafico, in funzione del tempo, i bordi del cono d’influenza; anche questa `e una quantit` a adimensionale.

9 Ricordiamo che a tempo fissato, una sezione verticale dello scalogramma ` e uno spettro di potenza, relativo al comportamento della serie nell’intorno di quell’istante. Per una serie non stazionaria, tale andamento spettrale varia da istante a istante attorno ad un andamento mediato temporalmente, che costituisce lo spettro globale di wavelet. Se i dati fossero di rumore bianco, con varianza σx2 , teoricamente si avrebbe ad ogni istante e scala (periodo) un valore costante ` e uguale a σx2 . Se i dati vengono standardizzati, tale costante di riferimento diviene 1.

2.2. ANALISI SPETTRALE EVOLUTIVA: LA CWT

75

11. Calcolare il parametro α =rolag1 del modello AR(1) adatto ai dati (utile per il calcolo del fondo di rumore rosso), chiamando la function modpar secondo la sintassi rolag1=modpar(anoms); α `e calcolato come indicato nella sottosezione 2.1.5. In questo modo si `e pronti per il calcolo del livello di significativit` a per lo scalogramma. 12. Calcolare il livello di significativit` a per lo scalogramma, in funzione della scala o periodo (vettore signif), chiamando w_signif; ulteriori dettagli sono dati tra poco. 13. Calcolare lo spettro globale di wavelet global_ws mediando, ad ogni scala, power sul tempo: global_ws=sum(power’)/N; 14. Calcolare il livello di significativit` a per lo spettro globale di wavelet (vettore global_signif) con una nuova chiamata a w_signif; per i dettagli vedere pi` u avanti. 15. Tradurre, mediante il Tc dei dati, le quantit` a adimensionali coi e period nei corrispondenti tempi in anni, senza cambiar loro il nome. Infatti il grafico (cfr. w_plot) viene fatto in base alle quantit` a dimensionali e non a quelle adimensionali: qui, in un contesto non pi` u esclusivamente numerico ma fisico, entra in gioco il passo di campionamento dei dati. 16. Eseguire lo script w_plot per ottenere i grafici voluti (serie di input, scalograma e GWS), che appariranno tutti in una medesima finestra-figura. Con la standardizzazione effettuata, i livelli per le linee di contorno che vengono fissati nello script grafico significano un valore spettrale locale da 2−8.0023 = 0.0039 a 2+4.1177 = 17.36 volte la varianza. Rivediamo ora le chiamate alla function w_signif nel caso dello scalogramma e del GWS. 1. Chiamata per la significativit` a nello scalogramma: [signif] = w_signif(variance,a,0,rolag1,conflev,-1,mother,param); In ingresso abbiamo • la varianza dei dati dopo standardizzazione, quindi uguale a vari = 1; • il vettore dei fattori di scala a;

• il valore della flag numerica sigtest che consente di scegliere il tipo di test da effettuare: 0 per il presente test dello scalogramma;

• il parametro rolag1 per il calcolo dello spettro di fondo;

76

CAPITOLO 2. ESERCITAZIONI LIBERE • il livello di confidenza scelto conflev, che nel nostro caso `e 0.95; poich´e in w_signif questo `e il default, va bene anche dare -1; • il numero di gradi di libert` a dof. Anche qui basta dare -1 in input, attenendosi cos`ı al default, che `e dof=dofmin nel caso presente di sigtest=0, con dofmin=2 per la wavelet di Morlet complessa. Infatti si assume che ogni valore dello scalogramma calcolato con una wavelet complessa sia distribuito come χ2 con ν = 2 gradi di libert` a; • la wavelet madre scelta ed il valore del suo parametro. Il vettore signif, in uscita, `e lungo come a (un valore per ogni scala); per ottenere una quantit` a graficabile con contour nel piano tempo-periodo bisogna espandere il vettore signif, trasformandolo in una matrice (sig) di dimensioni (J + 1) × N , mediante la function ones: sig = (signif’)*(ones(1,N)); inoltre `e pi` u comodo ai fini grafici fare un passo ulteriore, ridefinendo sig come rapporto tra power e sig stesso: sig=power./sig In questo modo nel grafico viene tracciato, dove sig raggiunge il valore 1, il contorno del livello di significativit` a, che include l’area con sig ≥ 1. 2. Chiamata per la significativit` a nel GWS: rispetto al caso precedente in cui valutavamo la significativit` a per lo scalogramma, qui in input a w_signif cambiano sigtest, che ora deve valere 1, e dof, che adesso vedremo come fissare. Il livello di confidenza resta al 95 %. • Per prima cosa occorre dare il numero di stime indipendenti che sono state mediate ad ogni scala per ottenere il campione corrispondente dello spettro globale. Per questa variabile nel presente software viene usato lo stesso nome (dof) adottato per i gradi di libert` a. Pertanto si chiama w_param per ottenere consts: [consts]=w_param(mother,param); e poi si inserisce l’istruzione dof=N-consts(7)*a; dove il secondo termine (-consts(7)*a) costituisce una correzione empirica, volta a tener conto della distorsione legata al padding di zeri ed al cono d’influenza; nel contempo, questa istruzione fa anche s`ı che dof divenga un vettore di lunghezza J + 1, cosa che `e utile in ingresso a w_signif, dove dof verr`a ulteriormente elaborato per trasformarlo nella vera e propria espressione dei gradi di libert` a per

2.2. ANALISI SPETTRALE EVOLUTIVA: LA CWT

77

il test di significativit` a dello spettro globale; si avr` a un valore per ogni scala. • Si calcola il livello di significativit` a (global_signif), chiamando la function w_signif: [global_signif] = ... w_signif(variance,a,1,rolag1,conflev,dof,mother,param); dove di nuovo variance = vari = 1. Tale livello avr` a un valore per ogni scala, ossia per ogni periodo di Fourier.

2.2.4

Interpretazione dello scalogramma

Osservando i grafici ottenuti lanciando il programma sopra descritto, lo studente, prima di procedere nella lettura, rifletta sulle seguenti questioni. 1. Quali sono gli intervalli temporali di elevata attivit`a di El Ni˜ no? 2. Quale intervallo fu relativamente calmo? 3. Il cono d’influenza che ruolo gioca in questi ragionamenti? 4. Lo scalogramma conferma la preponderanza di pseudo-periodicit` a con periodi da 2 a 7 anni nella serie esaminata? 5. Sono visibili nello scalogramma caratteristiche che possano suggerire oscillazioni di periodo diverso, pi` u lungo di 2-7 anni? 6. Lo scalogramma d` a anche informazioni su eventuali shift di frequenza, nel tempo, della pseudo-periodicit` a studiata? Ed ecco quanto si pu` o in effetti evincere dal grafico: 1. Vi `e significativamente pi` u potenza nella banda 2-7 anni, localmente, dal 1875 al 1920 e dal 1960 al 2000, mentre l’intervallo 1920-1960 `e caratterizzato da potenza minore (solo un paio di regioni significative, isolate, allineate su circa 2 anni di periodo, cio`e al margine della banda 2-7 anni, tipica del fenomeno ENSO). 2. Pare esserci qualche evidenza di una modulazione di varianza su 15 anni circa, ma senza significativit` a al 95 %. 3. A causa del cono d’influenza, non `e chiaro se la decrescita della potenza che si nota nella banda dei 15 anni dopo il 1995 sia vera o sia un artefatto dovuto al padding di zeri, per cui pu` o essere interessante, eventualmente, ripetere l’analisi con una diversa wavelet madre, tale da dare un cono d’influenza pi` u ridotto; si veda pi` u avanti.

78

CAPITOLO 2. ESERCITAZIONI LIBERE 4. Se si calcola il numero di punti dello scalogramma che cadono sopra il livello di significativit` a al 95 % di confidenza, si trova che esso corrisponde a circa il 5 % del totale. Pertanto, su questa base, la serie non pu` o essere distinta dal rumore; per`o vi sono altre caratteristiche da considerare a proposito della casualit`a (randomness) della serie. Se si calcola lo scalogramma di una serie di rumore bianco, si osserva una distribuzione casuale di regioni significative nel piano tempo-scala. Se si ripete rumore rosso, con parametro uguale a quello dedotto dai dati di SST, si osserva una graduale crescita di potenza con il periodo, cio`e col diminuire della frequenza, con distribuzione random di massimi e minimi di potenza attorno a questo spettro medio. Invece nello scalogramma delle SST le regioni significative sono organizzate in tempo e scala, il che indica una minore casualit`a del processo sotteso alla generazione dei dati. 5. L’analisi dello scalogramma consente di apprezzare le variazioni temporali della frequenza con cui si verificano gli eventi caldi (El Ni˜ no) e freddi (La Ni˜ na). Tra il 1875 ed il 1920 si verificarono molti eventi caldi e freddi di notevole ampiezza, mentre tra il 1920 ed il 1960 ve ne furono pochi, in accordo con quanto si evince dallo scalogramma delle SST. In quest’ultimo grafico si osserva inoltre che dal 1875 al 1915 si verific` o uno shift della potenza significativa da circa 4 anni di periodo a circa 2 anni di periodo, mentre dal 1960 al 2000 lo shift fu dai periodi pi` u corti ai pi` u lunghi: da un periodo dominante di circa 3 anni (1960-65) ad uno di circa 5 anni (dal 1980 in poi).

2.2.5

Prove con wavelets diverse

Vediamo se l’utilizzo di wavelet diverse modifica, oppure no, le conclusioni del nostro lavoro. • Si ripeta l’analisi con la wavelet complessa di Paul con m = 4. Per questo occorre cambiare mother e param e calcolare il nuovo valore di a0 in base alla relazione periodo-scala per questa wavelet (Tab. 2.1), arrotondando poi alla pi` u vicina potenza di due per eccesso: ad es., trovando 0.8 si porrebbe a0 = 20 = 1; trovando 1.4 si porrebbe a0 = 21 = 2). Si osservino le differenze rispetto al caso della wavelet di Morlet. L’essere la wavelet di Paul pi` u stretta nel tempo conduce ad una migliore localizzazione nel tempo degli eventi, al prezzo di una peggiore localizzazione in frequenza. Possiamo comunque dire che all’incirca si ritrovano le stesse caratteristiche riscontrate nello scalogramma con wavelet di Morlet complessa, nelle stesse zone del piano tempo-scala e con la stessa potenza. • Si ripeta nuovamente l’analisi con la wavelet reale DOG di ordine m = 2 (Mexican Hat ) e si osservino le differenze. La fine struttura di scala (periodo) che si osserva in questo caso `e dovuta al fatto che la wavelet reale cattura le oscillazioni positive e negative della serie come picchi separati nella potenza di wavelet. Nel caso della wavelet

2.2. ANALISI SPETTRALE EVOLUTIVA: LA CWT

79

di Morlet, invece, non solo questa `e complessa, ma contiene sei oscillazioni sotto la cupola gaussiana e quindi combina picchi positivi e negativi della serie in un singolo picco pi` u allargato. Se si graficassero separatamente la parte reale e la parte immaginaria della trasformata eseguita con la wavelet di Morlet, si otterrebbe una figura molto pi` u simile a quella del caso presente. Inoltre, la DOG(m = 2) `e, rispetto alla wavelet di Morlet complessa, pi` u stretta in tempo e pi` u larga in frequenza e infatti nello scalogramma i picchi sono molto allungati in periodo o scala ma molto stretti temporalmente. Infine, vi `e una grande differenza nella relazione tempo-scala: mentre per la wavelet di Morlet complessa si ha che il periodo di Fourier e la scala sono circa uguali, qui il periodo `e circa quattro volte la scala. Anche in questo caso la sostanza di quanto si pu` o “leggere” nello scalogramma resta circa inalterata, anche se il grafico nell’insieme appare di lettura meno immediata rispetto al caso delle wavelet complesse. Per contro, dal punto di vista del cono d’influenza questa wavelet va meglio, essendo pi` u stretta nel tempo delle altre: si noti il cono d’influenza pi` u ridotto nella figura.

2.2.6

Spettro globale di wavelet

Esaminiamo lo spettro globale di wavelet delle SST ottenuto usando la wavelet di Morlet complessa ed il relativo livello di significativit` a. ` E interessante confrontare lo spettro globale di wavelet con lo spettro ottenuto da metodi di Fourier, che `e stato oggetto dell’esercitazione precedente. Per questo confronto `e utile preparare un secondo script, che svolga le funzioni di seguito descritte. 1. Cominciamo col vedere che cosa cambia nell’analisi spettrale di Fourier sostituendo ai dati mensili, usati nell’esercitazione precedente, quelli stagionali. A questo scopo, rifacciamo con i dati stagionali la figura relativa all’ultimo punto della sottosezione 2.1.6 (spettro delle anomalie con fondo di rumore rosso e livelli di significativit` a, con logaritmo in base 2 del periodo in anni sulle ascisse ed asse delle ascisse rovesciato); questa volta la frequenza di campionamento sar`a 4 anni−1 ; confrontiamo le due figure (quella dei dati mensili e quella degli stagionali). Poi passiamo al confronto dello spettro di Fourier con quello di wavelet. 2. Prendiamo la media corrente su 5 campioni dello spettro di Fourier dei dati stagionali calcolato al punto precedente e riportiamo il risultato su un altro grafico, assieme allo spettro globale di wavelet con la sua curva di significativit` a. Sia lo spettro globale global_ws, sia global_signif andranno, allo scopo, esportati con un save dal programma principale nel quale vengono calcolati; essi verranno poi caricati nel workspace qui, nel secondo script 10 . Anche questo grafico avr` a sulle ascisse, rovesciate, il logaritmo in base 2 dei periodi. 10 Ci` o non ` e strettamente necessario, se si pensa di operare in sequenza con i due programmi all’interno della stessa sessione di lavoro, visto che in questo caso le variabili in questione, gene-

80

CAPITOLO 2. ESERCITAZIONI LIBERE Attenzione: le due curve corrispondono a due diversi set di periodi. Osserviamo analogie e differenze fra le due curve spettrali. Quale `e pi` u smooth? Quale intervallo di periodi risulta significativo nello spettro globale di wavelet? 3. Ripetiamo con media corrente su 9 punti, 11 punti ecc... ed osserviamo i cambiamenti. Ed ecco ci` o che si pu` o evincere dai grafici. 1. Al crescere dello smoothing applicato al periodogramma, questo spettro tende allo spettro globale di wavelet; l’entit` a dello smoothing richiesto decresce al crescere della scala, cio`e al diminuire della frequenza. Ci`o `e evidente nella pratica e pu` o essere dimostrato teoricamente. 2. Nello spettro globale di wavelet, solo il largo picco ENSO (2-4 anni) risulta significativo al 95 % di confidenza; va per`o ricordato che a periodi diversi da questi vi `e nello scalogramma potenza che, pur essendo localmente e globalmente meno che significativa, emerge comunque come struttura caratteristica nello scalogramma stesso (ad es. attorno ai 15 anni).

2.2.7

Scelta delle scale

Ridiscutiamo qui il criterio di scelta dell’intervallo di scale. Quello dato nella sottosezione 2.2.3 per a0 `e un criterio di semplice applicazione, ma molto approssimato. Pi` u sensatamente, si potrebbe scegliere a0 richiedendo che la wavelet a quella scala sia limitatata in banda a ω = π; naturalmente si tratterebbe di una limitatezza in banda approssimata, imposta richiedendo che solo una percentuale trascurabile del modulo quadro della trasformata analogica della wavelet cada oltre π. Detto infatti a∗0 il valore fissato in base a quest’ultimo criterio, se si sceglie a0 < a∗0 si avranno scale per le quali il prodotto X[k]Ψ(aωk ) (input alla fft inversa che produce la trasformata di wavelet) vedr` a utilizzata solo una parte della campana che costituisce Ψ(aωk ), perch´e il resto deborda oltre π, che `e il valore di ω di Nyquist per la trasformata dei dati 11 . Un altro criterio, non slegato dal precedente, potrebbe basarsi sul richiedere per la wavelet a scala a0 una durata (in qualche modo definita quantitativamente) di almeno 2 passi temporali (che `e diverso dal chiedere che sia k0 a0 = 2). In considerazione del fatto che la valutazione di a∗0 per le varie wavelets non `e immediata, e soprattutto del fatto che la scelta di a0 non `e cruciale per la nostra analisi, si `e deciso in questa esercitazione di adottare il criterio approssimato dato nel testo. rate dal primo programma, saranno comunque presenti nel workspace quando il secondo pro` per` gramma verr` a lanciato. E o consigliabile, per maggiore flessibilit` a nell’uso dei programmi stessi. 11 Si ricordi che al diminuire della scala la wavelet nel dominio della frequenza si allarga.

2.2. ANALISI SPETTRALE EVOLUTIVA: LA CWT

81

Anche il fattore di scala massimo (amax ) dipende dalla wavelet scelta; i criteri potrebbero essere che la wavelet a scala massima non duri pi` u del record di dati o di una frazione di questo e/o che il suo spettro copra almeno due intervalli fra le frequenze discrete su cui lo spettro stesso `e campionato. Limitandosi anche qui ad un criterio pi` u semplice, richiediamo che sia, diciamo, 1 ad = νmin = N2 = k0 amax , da cui fmin = N2T c , quindi νmin = N2 ; allora Pmax N . Nel contempo, abbiamo fissato a0 = k20 ; quindi amax = 2k 0 amax N 506 = = = 126.5 ≃ 128 = 27 , a0 4 4 indipendentemente dalla wavelet. Quindi, poich´e amax = a0 2Jδj , si ottiene, con δj = 0.05,   amax log a0 1 J= δj log 2

=

140

=

costante,

che `e appena un po’ inferiore alla scelta fatta nel costruire il programma: abbiamo semplicemente abbondato un po’ e questo non comporta errori di sorta. Un valore di δj pi` u piccolo (e quindi un J pi` u grande) darebbe una struttura di scala pi` u fine ma anche un tempo di calcolo maggiore.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF