laboratorio di telecomunicazioni 2017

94
Laboratorio di Telecomunicazioni Francesco Zampognaro Cesare Roseti MATLAB™ Laboratorio di Segnali e Trasmissione

Upload: others

Post on 02-Jan-2022

7 views

Category:

Documents


0 download

TRANSCRIPT

Laboratorio di Telecomunicazioni

Francesco Zampognaro

Cesare Roseti

MATLAB™ Laboratorio di

Segnali e Trasmissione

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

2

Revisioni del documento:

V1.0 2/2012 Prima edizione

V1.1 2/2013 Formattazione, traduzioni dall’inglese ed aggiunta sezioni nel capitolo 2

V1.2 4/2014 Rimosse sezioni superflue. Aggiunta/aggiornamento di symbolic toolbox ed esercizi.

V2.0 7/2014 Impaginazione libro.

V2.1 2015/2016/2017 Errata corrige.

email: [email protected]

A.A. 2016/2017

Sommario

1. INTRODUZIONE ....................................................................................................................................... 7

2. INTRODUZIONE A SCILAB .................................................................................................................... 8

2.1. OPERAZIONI BASE ..................................................................................................................................... 8

2.2. ESEMPIO DI UTILIZZO DI VARIABILI ......................................................................................................... 9

2.3. GESTIONE DI VARIABILI COMPLESSE ........................................................................................................ 9

2.4. TIPOLOGIE DI DATI ................................................................................................................................. 10

2.5. VETTORI ED OPERAZIONI TRA VETTORI ............................................................................................... 10

2.5.1. VETTORI “INCREMENTALI” ............................................................................................................................... 11

2.6. MATRICI ................................................................................................................................................... 12

2.7. PRIMITIVE DI BASE ................................................................................................................................. 14

3. INTRODUZIONE A MATLAB ............................................................................................................... 15

3.1. IL DESKTOP DI MATLAB ...................................................................................................................... 15

3.2. IL WORKSPACE DI MATLAB ................................................................................................................. 16

3.3. VISUALIZZARE LE VARIABILI NEL WORKSPACE: COMANDO “WHOS” ................................................... 16

3.4. SALVARE E CARICARE IL CONTENUTO DEL WORKSPACE ....................................................................... 17

3.5. DEFINIZIONE VARIABILI ......................................................................................................................... 17

3.6. CANCELLARE VARIABILI .......................................................................................................................... 17

3.7. TERMINAZIONE DI UN COMANDO CON “;” O “,” ..................................................................................... 17

3.8. FILES DI MATLAB.................................................................................................................................. 18

4. LAVORARE CON MATLAB ................................................................................................................... 18

4.1. CREAZIONE MATRICI E VETTORI ........................................................................................................... 19

4.2. L’OPERATORE COLON “:”, LINSPACE E LOGSPACE ................................................................................. 21

4.3. OPERAZIONI ELEMENTARI PER MATRICI/VETTORI .............................................................................. 21

4.4. VARIABILI COMPLESSE ............................................................................................................................ 22

4.5. VARIABILI SPECIALI ................................................................................................................................ 22

4.6. OPERAZIONI MATEMATICHE .................................................................................................................. 23

4.6.1. TRIGONOMETRICHE............................................................................................................................................ 23

4.6.2. ARITMETICHE ...................................................................................................................................................... 23

4.6.3. CONVERSIONE ED ALTRE OPERAZIONI ............................................................................................................ 24

4.7. ESTRAZIONE VALORI DA UNA MATRICE ................................................................................................. 24

4.8. TEST DI VARIABILI .................................................................................................................................. 25

4.1. COMANDO “FIND” .................................................................................................................................... 26

5. FILE ESTERNI .......................................................................................................................................... 27

5.1. FUNZIONE ................................................................................................................................................ 27

5.2. SCRIPT ..................................................................................................................................................... 29

5.3. CONTROLLO DELL’ESECUZIONE DI UNO SCRIPT / FUNZIONE ................................................................ 29

6. LA GRAFICA IN MATLAB ..................................................................................................................... 31

6.1. LA FUNZIONE “PLOT” .............................................................................................................................. 31

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

4

6.2. PROPRIETÀ DEL GRAFICO ....................................................................................................................... 34

6.3. LA FUNZIONE “PLOTYY” .......................................................................................................................... 36

6.4. FORMATTAZIONE DI UN GRAFICO .......................................................................................................... 37

6.5. LA FUNZIONE “STEM” .............................................................................................................................. 37

6.6. LA FUNZIONE “AREA” .............................................................................................................................. 39

6.7. CENNI ALLA GRAFICA TRIDIMENSIONALE .............................................................................................. 40

7. GENERALITÀ SUI SEGNALI ................................................................................................................. 41

7.1. ENERGIA E POTENZA DELLE SEQUENZE .................................................................................................. 42

7.2. OPERAZIONI ELEMENTARI SUI SEGNALI................................................................................................. 43

7.3. CREAZIONE FUNZIONE SINC() ................................................................................................................. 43

7.4. ESERCITAZIONE 1.................................................................................................................................... 44

7.4.1. ESERCIZIO 1 ......................................................................................................................................................... 44

7.4.2. ESERCIZIO 2 ......................................................................................................................................................... 45

7.4.3. ESERCIZIO 3 ......................................................................................................................................................... 46

7.4.4. ESERCIZIO 4 ......................................................................................................................................................... 46

7.4.1. ESERCIZIO 5 ......................................................................................................................................................... 46

7.5. ESERCITAZIONE 2.................................................................................................................................... 46

7.5.1. ESERCIZIO 1 ......................................................................................................................................................... 46

7.5.2. ESERCIZIO 2 ......................................................................................................................................................... 46

7.5.3. ESERCIZIO 3 ......................................................................................................................................................... 46

7.5.4. ESERCIZIO 4 ......................................................................................................................................................... 47

7.5.5. ESERCIZIO 5 ......................................................................................................................................................... 47

7.6. ESERCITAZIONE 3.................................................................................................................................... 48

7.6.1. ESERCIZIO 1 ......................................................................................................................................................... 48

7.6.2. ESERCIZIO 2 ......................................................................................................................................................... 49

7.6.3. ESERCIZIO 3 ......................................................................................................................................................... 49

7.6.4. ESERCIZIO 4 ......................................................................................................................................................... 49

7.6.5. ESERCIZIO 5 ......................................................................................................................................................... 49

7.6.6. ESERCIZIO 6 ......................................................................................................................................................... 50

7.6.7. ESERCIZIO 7 ......................................................................................................................................................... 50

7.6.8. ESERCIZIO 8 ......................................................................................................................................................... 50

8. PROPRIETÀ DEI SEGNALI ................................................................................................................... 51

8.1. SEGNALI PERIODICI: LA FUNZIONE “REPT0” ........................................................................................... 51

8.2. ESEMPIO .................................................................................................................................................. 51

8.3. AFFINITÀ TRA SEGNALI DI ENERGIA ....................................................................................................... 55

8.4. AFFINITÀ TRA SEQUENZE ........................................................................................................................ 55

8.5. CORRELAZIONE TRA SEGNALI ................................................................................................................. 56

8.5.1. ESEMPIO ............................................................................................................................................................... 57

8.6. ESERCITAZIONE 4.................................................................................................................................... 61

8.6.1. ESERCIZIO 1 ......................................................................................................................................................... 61

8.6.2. ESERCIZIO 2 ......................................................................................................................................................... 62

8.6.3. ESERCIZIO 3 ......................................................................................................................................................... 62

8.6.4. ESERCIZIO 4 ......................................................................................................................................................... 62

8.6.5. ESERCIZIO 5 ......................................................................................................................................................... 62

8.6.6. ESERCIZIO 6 ......................................................................................................................................................... 62

9. SYMBOLIC MATH TOOLBOX .............................................................................................................. 63

9.1. REALIZZAZIONE DI UNA FUNZIONE ........................................................................................................ 63

9.2. VARIABILI SIMBOLICHE REALI ED IMMAGINARIE .................................................................................. 64

9.3. OPERAZIONE SI SOSTITUZIONE (SUBS) .................................................................................................. 64

9.4. DERIVATE ................................................................................................................................................ 65

9.5. INTEGRALI ............................................................................................................................................... 65

9.1. FATTORIZZAZIONE ED ESPANSIONE ....................................................................................................... 66

9.2. GRAFICO DI FUNZIONI SIMBOLICHE (EZPLOT) ...................................................................................... 66

9.1. RECT SIMBOLICA ..................................................................................................................................... 67

9.2. INTEGRAZIONE CON ERFC E CALCOLO AREA .......................................................................................... 68

9.3. LIMITI (LIMIT) ........................................................................................................................................ 69

9.4. SOLUZIONI (SOLVE) ................................................................................................................................ 69

9.5. SOMMATORIE (SYMSUM) ........................................................................................................................ 70

9.6. TAYLOR .................................................................................................................................................... 70

10. CONVOLUZIONE TRA SEGNALI ......................................................................................................... 71

10.1. CONVOLUZIONE DISCRETA ................................................................................................................... 71

10.1.1. ESEMPIO ............................................................................................................................................................ 71

10.2. CONVOLUZIONE NEL CONTINUO (SYMBOLIC TOOLBOX) .................................................................... 73

10.3. ESERCITAZIONE 5 ................................................................................................................................. 74

10.3.1. ESERCIZIO 1 ...................................................................................................................................................... 74

10.3.2. ESERCIZIO 2 ...................................................................................................................................................... 74

10.3.3. ESERCIZIO 3 ...................................................................................................................................................... 74

10.3.4. ESERCIZIO 4 ...................................................................................................................................................... 74

11. TRASFORMATA DI FOURIER ............................................................................................................. 75

11.1. TRASFORMATA DI FOURIER DISCRETA ............................................................................................... 75

11.2. OSSERVAZIONI SUL CALCOLO DELLA FFT ............................................................................................. 77

11.2.1. ESEMPIO E CONFRONTO CON LA TRASFORMATA ........................................................................................ 78

11.3. ESERCITAZIONE 6 ................................................................................................................................. 81

11.3.1. ESERCIZIO 1 ...................................................................................................................................................... 81

11.3.2. ESERCIZIO 2 ...................................................................................................................................................... 81

11.3.3. ESERCIZIO 3 ...................................................................................................................................................... 81

11.3.4. ESERCIZIO 4 ...................................................................................................................................................... 81

12. TEOREMA DEL CAMPIONAMENTO .................................................................................................. 82

12.1. ENUNCIATO ........................................................................................................................................... 82

12.2. CONSIDERAZIONI RELATIVE AL TEOREMA DEL CAMPIONAMENTO .................................................... 82

12.3. RAPPRESENTAZIONE IN SERIE DI FUNZIONI ORTOGONALI ................................................................. 84

12.4. ESEMPIO ................................................................................................................................................ 87

12.5. ESERCITAZIONE 7 ................................................................................................................................. 92

12.5.1. ESERCIZIO 1 ...................................................................................................................................................... 92

12.5.2. ESERCIZIO 2 ...................................................................................................................................................... 92

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

6

13. MODULAZIONE: UN ESEMPIO ........................................................................................................... 93

Indice delle Figure

Figura 1: Il Desktop di MATLAB .............................................................................................................................. 15

Figura 2: Il Workspace di MATLAB ........................................................................................................................ 16

Figura 3: Esempio di plot su valori “discreti” .................................................................................................... 31

Figura 4: Esempio di plot di funzione “continua” ............................................................................................. 32

Figura 5: Più curve rappresentate sullo stesso grafico .................................................................................. 33

Figura 6: Più curve tramite subplot ....................................................................................................................... 34

Figura 7: Variazione stile di una curva, aggiunta di legende e testo ........................................................ 35

Figura 8: Esempio di curve con asse Y differente nella stessa figura ...................................................... 36

Figura 9: Editor visuale proprietà .......................................................................................................................... 37

Figura 10: Esempio grafico con Stem .................................................................................................................... 38

Figura 11: Stem con stile modificato ..................................................................................................................... 39

Figura 12: Plot grafico con Area .............................................................................................................................. 39

Figura 13: Plot grafico tridimensionale................................................................................................................ 40

Figura 14: Plot segnale sinc(t) ................................................................................................................................. 44

Figura 15: Rect mediante Stem ................................................................................................................................ 45

Figura 16: Funzione di base ...................................................................................................................................... 52

Figura 17: Prima replica a destra ............................................................................................................................ 53

Figura 18: Due repliche ............................................................................................................................................... 54

Figura 19: Tutte le repliche da sommare ............................................................................................................. 54

Figura 20: Somma delle repliche e segnale base .............................................................................................. 55

Figura 21: Segnale x(t) e y(t) sovrapposti (su cui si effettuerà la correlazione)................................. 58

Figura 22: Correlazione analitica (grafico di 3 contributi) .......................................................................... 60

Figura 23: Confronto correlazione analitica e “conv” Matlab ..................................................................... 61

Figura 24: ezplot di funzione in x e y ..................................................................................................................... 67

Figura 25: ezplot di funzione per rect simbolico (heaviside) ..................................................................... 67

Figura 26: ezplot di gaussiana .................................................................................................................................. 68

Figura 27: Funzione e suo sviluppo di Taylor nel punto 3 ........................................................................... 70

Figura 28: Esempio convoluzione discreta ......................................................................................................... 72

Figura 29: Risultati convoluzione discreta con differente campionamento ......................................... 73

Figura 30: Convoluzione con Symbolic toolbox e MATLAB 2016 ............................................................. 73

Figura 31: Risultato della FFT di esempio ........................................................................................................... 77

Figura 32: Rappresentazione campionata del segnale x(t)=rect(t) con stem(t,x) ............................. 78

Figura 33: FFT della funzione rect (parte Re ed Im) ....................................................................................... 79

Figura 34: Confronto FFT e sinc(x) ........................................................................................................................ 80

Figura 35: FFT della funzione rect con dt=0.01 e N= 401 ............................................................................. 80

Figura 36: Ricostruzione segnali tempo-frequenza ........................................................................................ 84

Figura 37: Segnale non adeguatamente-campionato ..................................................................................... 87

Figura 38: Segnale ricostruttore in tempo .......................................................................................................... 88

Figura 39: Zoom del segnale sovracampionato (con aggiunta di zeri) ................................................... 89

Figura 40: Ricostruzione non adeguata ............................................................................................................... 90

Figura 41: Ricostruzione adeguata ........................................................................................................................ 90

Figura 42: Dettaglio errore di ricostruzione ...................................................................................................... 91

Figura 43: Valore assoluto errore di ricostruzione ......................................................................................... 91

Figura 44: Ricezione simboli 4QAM attraverso canale Gaussiano bianco ............................................. 94

1. Introduzione Le presenti dispense sono state realizzate come integrazione didattica al corso di Segnali e

Trasmissione, per un’attività di laboratorio supportata da uno specifico Software di simulazione. Il

software Scilab è introdotto, e può essere adottato per completare tutte le esercitazioni proposte.

Ciononostante, nella seconda parte si farà riferimento solamente a Matlab™, della Mathworks. Tale

scelta è stata dettata dall’esigenza manifestata dagli studenti di maturare un’esperienza concreta con

il Matlab prima dello svolgimento della tesi di laurea, per cui risulta spesso uno strumento

indispensabile. In generale, nel resto del documento, le sezioni riquadrate riportano comandi che

possono essere direttamente eseguiti nel linguaggio del simulatore:

Codice

Le parti invece marcate sul bordo sinistro sono da considerarsi particolarmente importanti e pertanto

sono evidenziate rispetto al resto del testo.

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

8

2. Introduzione a Scilab Scilab è un’applicazione distribuita gratuitamente (http://www.scilab.org) che consente di effettuare

operazioni sui segnali rappresentati come “vettori di campioni”. Molte delle primitive disponibili sono

simili a quelle utilizzate in MATLAB. Quindi, tutte le operazioni e procedure descritte in seguito

possono essere eseguite, con leggere variazioni, anche su Matlab (e viceversa).

2.1. Operazioni base All’avvio la schermata di comandi si presenterà in questo modo:

___________________________________________

scilab-4.1.2

Copyright (c) 1989-2007

Consortium Scilab (INRIA, ENPC)

___________________________________________

Startup execution:

loading initial environment

-->

L’operazione più semplice che si può eseguire è l’inizializzazione di variabili su cui effettuare

operazioni algebriche:

-->var1 = 1;

-->var2 = 4;

-->var1 + var2

ans =

5.

Comandi impartiti senza il “;” stamperanno il risultato a schermo. Grazie all’operatore “;” è possibile

eseguire più operazioni sulla stessa riga. I vettori vengono indicati con [ a b … n]. Nel seguente esempio

seguito viene visualizzato il valore dell’ultima variabile assegnata in quanto non è stato inserito il “;”

finale:

-->a = [1 2]; b = 3.5; c = 2

c =

2.

Un’operazione può essere anche scritta su più righe usando “…” come terminazione della riga:

-->u=11000000*a+...

-->2

u =

11000002. 22000002.

Il risultato è un vettore di due componenti, poiché “a” ha due componenti e quindi definisce le

dimensioni complessive dell’operazione.

Il comando “who” consente di visualizzare tutte le variabili create (oltre ad alcune variabili

d’ambiante):

-->who

your variables are...

u c b a ans var2 var1

scicos_pal %scicos_menu %scicos_s

hort %scicos_help

%scicos_display_mode modelica_libs scicos_pal_libs

%scicos_lhb_list %CmenuTypeOneVector

%helps WSCI home

SCIHOME CreateScilabHomeDir PWD TMPDIR MSDOS SCI

guilib sparselib xdesslib

(continua…)

2.2. Esempio di utilizzo di variabili Le variabili create possono essere usate congiuntamente in modo da ottenere particolari strutture

dati ed effettuare operazioni complesse come illustrato di seguito.

Creazione di un vettore di indici

-->I=1:3 //l’operatore “:” consente di definire un intervallo di interi

tra 1 e 3

I =

1. 2. 3.

Creazione di una matrice 2x4 composta di valori “random” tra 0 e 1

-->W=rand(2,4)

W =

0.2113249 0.0002211 0.6653811 0.8497452

0.7560439 0.3303271 0.6283918 0.6857310

Selezionare solo i primi tre elementi della prima riga (estrazione sottomatrice):

-->W(1,I)

ans =

0.2113249 0.0002211 0.6653811

Estrarre il valore della matrice nell’ultima riga e nella penultima colonna:

-->W($,$-1) //l’operatore “$” indica l’ultimo elemento di un vettore!

ans =

0.6283918

2.3. Gestione di variabili complesse Scilab consente di lavorare con variabili complesse. La parte complessa di una variabile va indicata con

l’operatore “%i”:

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

10

-->a=2+%i*6

a =

2. + 6.i

-->sqrt([2 -2])

ans =

1.4142136 1.4142136i

2.4. Tipologie di dati Scilab contempla diverse strutture dati: costanti, booleani, polinomiali, stringhe e razionali. Essi

consentono a loro volta di definire matrici/vettori. Vi sono in particolare una serie di valori interni che

possono essere richiamati con il carattere %.

Costante Significato

%i

%pi %e e=2,7182818…

%eps Rappresenta la precisione del calcolatore (numero più piccolo)

%s Rappresenta la variabile indipendente di un polinomio

%t Costante booleana che sta per “vero”

%f Costante booleana che sta per “falso”

2.5. Vettori ed Operazioni tra vettori Una variabile vettore, come già visto nei primi esempi, è definita tra parentesi quadre [ a b … n ]. Il

modo più semplice per creare un vettore è mediante la separazione di valori con “spazio” o “,”. Per

creare un vettore colonna occorre separare gli elementi con l’operatore “;”.

Esempio

-->a = [1 2 3]

a =

1. 2. 3.

-->b=[4 1+%i 1]

b =

4. 1. + i 1.

-->c=[1;-1+%i*2;3]

c =

1.

- 1. + 2.i

3.

Ci sono diversi modi per definire un vettore, come negli esempi successivi. Per una trattazione

completa si rimanda alla documentazione di Scilab o all’ help da riga di comando.

-->v= [3 6 9]

v =

3. 6. 9.

-->ones(v)

ans =

1. 1. 1.

-->ones(1:4)

ans =

1. 1. 1. 1.

-->3*ones(1:4)

ans =

3. 3. 3. 3.

-->zeros(v)

ans =

0. 0. 0.

-->zeros(1:5)

ans =

0. 0. 0. 0. 0.

Somma tra due vettori

Per le operazioni tra vettori valgono le regole dell’algebra delle matrici. Quindi, la somma tra due

vettori è possibile solo se essi hanno la stessa dimensione (da distinguere anche vettori riga da vettori

colonna).

-->a+b

ans =

5. 3. + i 4.

Differenza tra due vettori

-->a-b

ans =

- 3. 1. - i 2.

Prodotto scalare tra due vettori (Vettore riga * Vettore colonna)

-->b*c

ans =

4. + i

Prodotto elemento per elemento (notare il punto “.” insieme al segno *)

-->a .* b

ans =

4. 2. + 2.i 3.

2.5.1. Vettori “incrementali” Si possono creare vettori i cui elementi sono valori che vanno da un “minimo” ad un “massimo” e

spaziati di un certo valore incrementale/decrementale. Come già visto quando non viene specificato

il passo, il valore utilizzato è 1 (ad esempio provare il comando I=0:3).

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

12

-->x = 8:-0.5:1

x =

8. 7.5 7. 6.5 6. 5.5 5. 4.5 4. 3.5 3.

2.5 2. 1.5 1.

-->x = 1:2:10

x =

1. 3. 5. 7. 9.

2.6. Matrici La matrici posso essere viste come un vettore di vettori. I vettori colonna sono separati da “;”.

-->A=[2 1 4; 4 -2 4]

A =

2. 1. 4.

4. - 2. 4.

-->B=ones(2,3)

B =

1. 1. 1.

1. 1. 1.

-->Binv=B'

Binv =

1. 1.

1. 1.

1. 1.

-->A.*B

ans =

2. 1. 4.

4. - 2. 4.

-->A*Binv

ans =

7. 7.

6. 6.

Si può definire una matrice come unione di altre matrici. Nel caso mostrato in seguito, la matrice D

ottenuta come vettore riga delle matrici A, B e C.

-->A=[1 2;3 4]

A =

1. 2.

3. 4.

-->B=[4 5;6 7]

B =

4. 5.

6. 7.

-->C=[7 8;9 10]

C =

7. 8.

9. 10.

-->D=[A,B,C]

D =

1. 2. 4. 5. 7. 8.

3. 4. 6. 7. 9. 10.

La primitiva matrix() consente di ridimensionare una matrice, a patto di lasciare invariato il numero

degli elementi.

-->E=matrix(D,3,4)

E =

1. 4. 5. 9.

3. 4. 7. 8.

2. 6. 7. 10.

La primitiva “eye()” ritorna una matrice diagonale.

-->F=eye(E)

F =

1. 0. 0. 0.

0. 1. 0. 0.

0. 0. 1. 0.

-->G=eye(3,3)

G =

1. 0. 0.

0. 1. 0.

0. 0. 1.

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

14

2.7. Primitive di base Scilab fornisce una serie di primitive che consentono di svolgere operazioni note. Per informazioni

riguardanti una particolare funzione si può consultare la guida online tramite il comando “help”

<nome funzione>.

Funzione Descrizione

Funzioni Elementari sum Effettua la somma degli elementi del vettore/matrice passato in ingresso

prod Effettua il prodotto degli elementi del vettore/matrice passato in ingresso

sqrt Effettua la radice quadrata degli elementi del vettore/matrice passato in ingresso

diag Se in ingresso si ha una matrice ritorna un vettore colonna costituito dagli elementi

sulla diagonale della matrice. Se in ingresso si ha un vettore crea una matrice

diagonale utilizzando i valori della matrice

cos Calcola il coseno

sin Calcola il seno

tan Calcola la tangente

atan Calcola l’arcotangente

max Seleziona il valore all’interno di un vettore o di una matrice

round Arrotonda all’intero più vicino

sign Ritorna il segno di un valore (1 o -1)

fft Effettua la FFT (Fast Fourier Transform)

Ordinamento sort ordina in “ordine” decrescente

find Trova un elemento all’interno di un vettore

Grafica plot Grafico 2D

xset Consente di impostare le opzioni del grafico

xgrid Aggiunge una griglia nel grafico

plot3d Grafico 3D

3. Introduzione a MATLAB MATLAB è l’acronimo di MATrix LABoratory ed è un tool di programmazione basato su strutture dati

costituite essenzialmente da array (monodimensionali, bi-dimensionali, n-dimensionali). In

particolare, MATLAB costituisce uno strumento di analisi numerica complesso che consente all’utente

le seguenti operazioni:

• Eseguire complessi calcoli matematici;

• Visualizzare i dati della propria analisi attraverso grafici;

• Utilizzare il codice fornito dalle molteplici librerie di MATLAB (Toolbox), e modificarlo per creare

le proprie funzioni.

3.1. Il Desktop di MATLAB Il desktop di MATLAB è mostrato in Figura 1 (rif. Versione 2008), ed è suddiviso principalmente in tre

aree:

1. Current directoryCurrent directoryCurrent directoryCurrent directory: consente di sfogliare le cartelle locali e quindi di gestire M-files

precedentemente salvati;

2. Command HistoryCommand HistoryCommand HistoryCommand History: elenca i comandi utilizzati più di recente;

3. CoCoCoCommand windowmmand windowmmand windowmmand window: contiene una linea di comando in cui è possibile inserire variabili,

espressioni o chiamate a funzioni. Nel resto del documento, nei riquadri, sarà riportato il

codice che può essere direttamente eseguito nel “Command Window”, al prompt “>>”:

>>

Figura 1: Il Desktop di MATLAB

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

16

3.2. Il Workspace di MATLAB Il workspaceworkspaceworkspaceworkspace contiene tutte le variabili utilizzate nella sessione corrente. Il workspace può essere

visualizzato con il workspace browserworkspace browserworkspace browserworkspace browser e modificato con l’array editarray editarray editarray editorororor.

Figura 2: Il Workspace di MATLAB

È possibile inoltre eseguire le seguenti operazioni sul workspace interagendo col mouse:

• Salvare e ricaricare il workspace di una sessione;

• Cancellare una variabile dal workspace;

• Creare grafici dal workspace.

3.3. Visualizzare le variabili nel workspace: comando “whos” È possibile visualizzare il contenuto del workspace da linea di comando attraverso i comandi who

(sommario) e whos (dettaglio). Il comando:

>> whos <variabile>

visualizza la dimensione e il tipo di dato solamente per le variabili specificate.

>> who

Your variables are:

S S1 t

>> whos

Name Size Bytes Class Attributes

S 0x0 192 struct

S1 1x1 414 struct

t 1x41 328 double

3.4. Salvare e caricare il contenuto del workspace Oltre che dal menu, le variabile utilizzate in una sessione MATLAB possono essere salvate in un file

.mat e in seguito ricaricate attraverso i seguenti comandi (speciricando opzionalmente quali variabili

considerare nell’operazione):

>> save <filename> [<lista_variabili>]

>> load <filename> [<lista_variabili>]

3.5. Definizione Variabili In MATLAB tutte le variabili sono in forma matriciale (il caso limite è la matrice 1x1). Una matrice è

costituita da elementi omogenei. I principali tipi di elementi contenuti in una matrice sono:

• Numeri reali;

• Numeri complessi;

• Caratteri;

• Strutture;

• Cell array.

Una matrice è semplicemente un array rettangolare, di numeri reali o complessi. La matrice è un

elemento fondamentale di MATLAB da quando tutti gli operatori interni al Matlab sono stati

ottimizzati per lavorare con le matrici.

Un esempio di creazione di una variabile ed assegnazione ad essa di un valore (intero) è dato dal

comando:

>> a = 5

Notare che nello spazio delle variabili ora comparirà anche “a”. Il suo tipo non deve essere definito,

MATLAB lo interpreta in automatico come intero (mancanza dei decimali).

3.6. Cancellare variabili Si possono cancellare tutte (oppure opzionalmente specificare quali) le variabili presenti nel

workspace attraverso il seguente comando:

>> clear [<lista_variabili>]

E’ possibile inoltre anche ripulire la schermata dei comandi eseguiti con il comando “clc”, combinabile

quando si inizia una nuova attività con “clear” come segue:

>> clear, clc

3.7. Terminazione di un comando con “;” o “,” Il “;” serve per indicare che non deve essere stampato il risultato dell’operazione su quella riga, ed è

opzionale. Se viene omesso (sia su riga di comando che in un file .m), produce la stampa esplicita del

risultato dell’operazione effettuata.

>> X= 5 *6

X = 30

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

18

Se si eseguono assegnazioni il cui valore non è interessante, il “;” deve essere incluso per evitare

confusione sulla visualizzazione dei risultati.

>> X= 5 *6; % il risultato non viene stampato!

Il “;” permette anche di specificare più comandi sulla stessa riga, separandoli. Ad esempio:

>> X= 5 *6; Y = X*2

Y = 60

In alternativa, la “,” serve per separare più comandi senza rinunciare alla stampa a schermo >> X= 5 *6, Y = X*2

X = 30

Y = 60

3.8. Files di MATLAB I principali files interpretati da MATLAB sono di tipo testo/ASCII con estensione .m.m.m.m. Possono essere

generati da un text editor e eseguiti da MATLAB semplicemente digitandone il nome sulla linea di

comando, o direttamente dall’editor interno del Matlab. Sono differenti dai file .mat per il salvataggio

del workspace, contemplano una esecuzione ex-novo di tutti i comandi per ricreare il workspace e gli

eventuali grafici/risultati.

È possibile inserire commenti su file .m o al termine di comandi facendo precedere il commento con

il simbolo %.

Dall’interfaccia grafica, nella visuale dei file nella cartella di lavoro, è possibile selezionare “new”

script/function se si vuole creare un nuovo file .m che contenga solo comandi (script) o una (o più)

funzioni (function) ed accedere quindi al file con l’editor interno. L’uso dettagliato dei file esterni per

definire nuove funzioni è descritto in Sezione 5.

Dopo aver preso confidenza con l’interfaccia grafica e la gestione dei files di base, vediamo come

vengono definite le variabili e le operazione sulla riga di comando (“Command window”).

4. Lavorare con Matlab Come detto, tutte le operazioni eseguite con Matlab coninvolgono variabili che sono considerate

matrici (anche se rappresentano un singolo valore, o scalare). Tutte le operazioni sulle matrici e tutte

le altre variabili speciali, di creazione ed elaborazione di matrici, descritte nelle seguenti sezioni,

possono essere consultate (oltre che dal menu help visuale) con il comando:

>> help elmat

Ulteriori dettagli per la funzione di interesse si ottengono con una richiesta di help specifica, ad

esempio:

>> help length

length Length of vector.

length(X) returns the length of vector X. It is equivalent

to MAX(SIZE(X)) for non-empty arrays and 0 for empty ones.

See also numel.

La sezione del manuale restituita col commando help comprende solitamente

- La descrizione a parole del comando

- I parametri che possono essere passati alla funzione e cosa ritorna

- Altre funzioni correlate

Nella riga di comando è possibile iniziare a scrivere un comando e premere il tasto tab, per ottenere

l’auto-completamento o un elenco di funzioni o comandi che iniziano come specificato. Con la freccia

in alto nelle ultime versioni di matlab è possibile accedere allo storico dei comandi già eseguiti.

4.1. Creazione Matrici e Vettori Le matrici possono essere create in diversi modi. Vettori possono essere considerati matrici con una

sola riga. Sono in seguito riportati alcuni esempi:

• Creazione di Vettore riga (uso della “,” e parentesi quadre):

>> x=[1, -2, 3];

• Vettore colonna (uso del “;” e parentesi quadre):

>> y=[1; 2; 2];

• Matrice (uso in alternativa alla “,” dello spazio per definire le righe):

>> A=[1 2 3; 4 5 6; 7 8 9];

MATLAB fornisce alcune funzioni “built-in” per la creazione di matrici particolari, dove è possibile

specificare un parametro “args” che può essere uno dei seguenti tipi:

o (n) (n) (n) (n) = = = = matrice n x n;

o (n,m)(n,m)(n,m)(n,m) = matrice nxm;

o (1,n(1,n(1,n(1,n)))) = vettore-riga lungo n (caso particolare di matrice 1 x n);

o (n,1) (n,1) (n,1) (n,1) = vettore-colonna lungo n (caso particolare di matrice n x 1)

• oooonesnesnesnes ((((args)))): matrice composta da “1”

>> ones(3)

ans =

1 1 1

1 1 1

1 1 1

>> ones(2,3)

ans =

1 1 1

1 1 1

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

20

• eyeeyeeyeeye ((((args)))): matrice diagonale di “1”

>> eye(4)

ans =

1 0 0 0

0 1 0 0

0 0 1 0

0 0 0 1

• zeroszeroszeroszeros ((((args)))): matrice di zeri

>> zeros(1,3)

ans =

0 0 0

• randrandrandrand ((((args)))): matrice casuale di valori tra 0 e 1

>> rand(3,1)

ans =

0.9649

0.1576

0.9706

Vi sono ulteriori funzioni di creazione ed elaborazione di matrici, tra le quali si citano:

• diagdiagdiagdiag (X)(X)(X)(X): diagonale di una matrice o creazione di matrice diagonale. Se X è un vettore-riga di n

elementi, produce una matrice quadrata n x n con gli elementi di X sulla diagonale. Se X è una

matrice quadrata di dimensione n x n, produce un vettore-colonna di n elementi coincidenti

con quelli nella diagonale di X.

>> A = [0 3 2 ; 2 3 2; 1 0 3];

>> diag(A)

ans =

0

3

3

>> D = [1 3 -4];

>> diag(D)

ans =

1 0 0

0 3 0

0 0 -4

• repmatrepmatrepmatrepmat (X,n,m)(X,n,m)(X,n,m)(X,n,m): ripete la matrice X (appendendola) n volte a destra e m volte in basso

A =

1 0

0 1

>> repmat(A,2,2)

ans =

1 0 1 0

0 1 0 1

1 0 1 0

0 1 0 1

Altre funzioni sono descritte sulla documentazione di riferimento:

http://www.mathworks.it/it/help/matlab/elementary-matrices-and-arrays.html

http://www.mathworks.it/it/help/matlab/array-manipulation.html

4.2. L’operatore colon “:”, linspace e logspace Si può ricorrere all’operatore “:” per generare vettori-riga equispaziati. L’operatore due-punti, colon

(“:”) è molto importante in MATLAB in quanto consente di creare facilmente vettori per l’asse delle x

(con spaziatura unitaria o non unitaria). L’utilizzo del “:” è del tipo:

vvvvarararar = = = = valore_inizialevalore_inizialevalore_inizialevalore_iniziale : : : : [passo:] valore_finale valore_finale valore_finale valore_finale

Usando il “:” le parentesi quadre esterne […] per specificare la creazione di un vettore possono essere

omesse, ma non generano errore se incluse. I valori iniziali e finali fanno parte del vettore.

Se non viene specificato il passo (utilizzando quindi i “:” una sola volta), questo viene assunto pari ad

1, come nel seguente esempio:

>> F = 0 : 4

F =

0 1 2 3 4

Per concludere è riportato un esempio di creazione di un vettore con elementi spaziati di compresi

tra 0 e (estremi inclusi):

>> X = 0 : pi/2 : 2*pi

X =

0 1.5708 3.1416 4.7124 6.2832

Ci sono altri due modi per creare vettori di elementi spaziati seguendo un particolare passo lineare

(quindi riconducibile ad un equivalente operazione con “:”) o logaritmico: linlinlinlinspacespacespacespace e logspacelogspacelogspacelogspace.

var var var var ==== linlinlinlinspacespacespacespace (start, stop, N(start, stop, N(start, stop, N(start, stop, N)))) crea un vettore di N elementi compresi tra start e stop spaziati

linearmente �N.B. il passo risultante è (stop-start)/(N-1)

var var var var ==== logspacelogspacelogspacelogspace (start, sto(start, sto(start, sto(start, stop, Np, Np, Np, N)))) crea un vettore di N elementi compresi tra start e stop spaziati

logaritmicamente.

4.3. Operazioni elementari per matrici/vettori Gli operatori elementari sono i seguenti:

+ - * / ^ \ .* ./ .^

Gli operatori sono validi anche per operazioni tra valori scalari (ad esempio, banalmente, 5 +3).

L'operazione di somma (+) o di sottrazione (-) è definita tra matrici aventi le stesse dimensioni.

L’operazione di prodotto (*) è definita solo tra matrici di dimensioni (NxM) e (MxN). In tutti questi

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

22

casi, se uno dei due operandi è uno scalare (ossia matrice 1x1), esso viene sommato, sottratto o

moltiplicato a tutti gli elementi della matrice.

X = B/A è la soluzione dell'equazione X*A = B

X = A\ B è la soluzione dell'equazione A*X = B

Nella divisione vale per le dimensioni degli operandi la stesso delle moltiplicazioni associate, così come

la possibilità di dividere matrici e scalari.

L’operazione esponenziale (^) è solo ammessa tra matrici quadrate e scalari (e, ovviamente, tra

scalari).

Gli operatori .˽ effettuano le corrispondenti operazioni sui singoli elementi delle matrici coinvolte,

delle stesse dimensioni, non seguendo la regola geometrica “riga-colonna” (altrimenti utilizzata). Nel

caso di operazione con numeri scalari, l’operatore .˽ è superfluo (ma non restituisce errore).

Ad esempio, due matrici di pari dimensioni possono essere moltiplicate solo per elemento (.*):

>> x=[1, -2, 3]; y=[0, 1, -2];

>> x .* y

ans =

0 -2 -6

>> x * y

Error using *

Inner matrix dimensions must agree.

Notare che x.^2 è diverso da 2.^x. (restituisce una matrice di dimensioni pari a quelle di x con gli

elementi di x al quadrato nel primo caso, oppure 2 elevato agli elementi di x).

Ulteriori operazioni matriciali:

Matrice trasposta: A'

Matrice inversa: inv(A)

B = inv (A) se esiste, la matrice tale che A*B=B*A = I (identità diagonale, in Matlab “eye()”)

4.4. Variabili complesse I tipi di dati non devono essere definiti precedentemente al loro uso (interi, reali, etc). MATLAB

consente di definire numeri complessi nella loro forma classica grazie alla variabile “unità

immaginaria” (“i”):

>> z=a+i*b;

4.5. Variabili speciali Variabile Significato

ans Risposta più recente

pi � i Unità immaginaria

Inf Infinito (con segno)

NaN Not a Number, per operazioni indefinite (ad es. ��)

eps Il più piccolo intervallo tra due numeri reali (es. 10-16)

4.6. Operazioni Matematiche Sulle variabili definite nel workspace, è possibile effettuare molteplici operazioni matematiche.

Maggiori dettagli in generale sulle funzioni integrate (“bult-in”) in Matlab si possono ottenere con:

>> help elfun

4.6.1. Trigonometriche Funzione Funzione inversa

sin(x) asin(y)

cos(x) acos(y)

tan(x) atan(y)

- atan2(y,x)

sinh(x) asinh(y)

cosh(x) acosh(y)

tanh(x) atanh(y)

In tutte le funzioni trigonometriche “x” è espresso in radianti. Le funzioni matematiche

trigonometriche, quando applicate alle matrici, si riferiscono ai singoli elementi della matrice. Ad

esempio:

>> A = [pi/2, pi ; pi/4, -pi/4]

A =

1.5708 3.1416

0.7854 -0.7854

>> sin(A)

ans =

1.0000 0.0000

0.7071 -0.7071

4.6.2. Aritmetiche Istruzione Significato Istruzione Significato

exp(x) �� abs(x) �����(�) log(x) �(�) imag(x) ��(�)

log10(x) ����(�) angle(x) ����(�)

log2(x) ���(�) real(x) ��(�)

sqrt(x) √� sign(x) �����(�)

xey � ∙ 10� conj(x) �∗

x^y ��

Quando possibile, queste operazione sono applicate a tutti gli elementi di una matrice.

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

24

4.6.3. Conversione ed altre operazioni Istruzione Significato

double(x) Interpreta x come valore in virgola mobile

round(x) Ritorna l’intero arrotondando x

floor(x) Ritorna l’intero arrotondando x all’intero inferiore

ceil(x) Ritorna l’intero arrotondando x all’intero superiore

fix(x) Ritorna l’intero rimuovendo i decimali da x

str2num('str') Ritorna il numero interpretando la stringa str

mod(x,y) Ritorna il numero intero di volte che x contiene y

res(x,y) Ritorna il resto dopo la divisione intera tra x e y

sum(A) Somma gli elementi del vettore A

Esempi di conversione:

>> a = 1.6; round(a)

ans =

2

>> floor(-a)

ans =

-2

>> fix(-a)

ans =

-1

>> double(true) %true è la variabile booleana di verità

ans =

1

>> str2num('2.76')

ans =

2.7600

4.7. Estrazione valori da una matrice Una volta creata una matrice “A” con i metodi sopra descritti, un generico elemento di tale matrice è

indirizzato come “A(n,m)”.

A(2,3) ritorna il valore collocato nella riga 2 della colonna 3. Tutta la riga n-esima è indicizzata come

“A(n,:)”, e la colonna m-esima è indicizzata come “A(:,m)”:

A =

1 3 3

2 1 4

1 2 -1

>> A(2,3)

ans =

4 >> A(3,:)

ans =

1 2 -1

E’ possibile indicare un array per specificare le righe o colonne di interesse, al posto del numero intero.

Ad esempio A([1 3],3) restituisce il terzo elemento-colonna delle righe 1 e 3 (matrice risultante 1 x 2).

Lo stesso si può fare per l’intera colonna con ad esempio A([1 2],:). L’operazione è anche possibile

indicando più volte tra [] lo stesso indice di riga o colonna. E’ inoltre possibile indicizzare una

sottomatrice con intervalli attraverso il seguente comando: “A(n1:n2,m1:m2)”, che ritorna la

sottomatrice compresa tra le righe n1 ed n2 e le colonne m1 ed m2 (ricordare la definizione di intervalli

con il comando “:” , omettendo il passo).

La scrittura A(i), ritorna l’elemento in posizione i-esima considerando una scansione della matrice per

colonne e poi righe. Considerando A dell’esempio precedente, A(4) restituisce 3. Infine, il comando

A(:) restituisce la matrice riorganizzata su un unico vettore colonna, come nel seguente esempio

(include esempio di prelievo campione singolo dalla matrice):

>> b

b =

3 5 1

3 6 1

3 7 1

>> b(6)

ans =

7

>> b(:)

ans =

3

3

3

5

6

7

1

1

1

4.8. Test di variabili Nella realizzazione di comandi, o laddove sia richiesto un test su variabili, è possibile ricorrere ad

espressioni booleane e test di uguaglianza o disuguaglianza, che ritornano 0 (false) in caso di

condizione non verificata ed 1 (true) altrimenti. Sono disponibili gli operatori seguenti (nel caso di

operazione booleana qualsiasi valore diverso da 0 viene considerato 1, cioè true).

Operatori logici e condizioni

== uguale

~= diverso

< minore

<= minore uguale

> maggiore

>= maggiore uguale

& and

| or

~ not

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

26

In generale tali test saranno eseguiti su ciascuna delle componenti delle matrici coinvolte, restituendo

una matrice delle stesse dimensioni, con 1 dove la condizione è soddisfatta. Il test può essere solo

fatto tra matrici delle stesse dimensioni, oppure con un valore scalare. Nel caso di test tra vettore e

scalare ad esempio si ha:

>> A = [0:10]

A =

0 1 2 3 4 5 6 7 8 9 10

>> B = A > 4

B =

0 0 0 0 0 1(1)1 1 1 1 1 1

Su ciascun elemento di A viene eseguito il test se esso risulta maggiore di 4, e viene inserito 1 in caso

affermativo nel vettore B. E’ possibile combinare più test con l’operatore booleano AND (&) oppure

OR (|), oppure negare il risultato NOT (~). In questo modo è possibile controllare la generazione di

vettori composti da valori uguali in posizioni volute.

C = ~[(A >= 3) & (A <= 8)] * 5

C =

5 5 5 0 0 0 0 0 0 5

4.1. Comando “find” E’ possibile, tramite la combinazione di test di variabili, ricavare un sottoinsieme di indici di un vettore/matrice. Al contrario del test su vettore visto in precedenza, il risultato è il vettore degli indici che soddisfano il test indicato. Ad esempio, per determinare su quali indici il vettore assume come valore 1, per poi sostituirlo con un nuovo valore, ad esempio “0”:

>> A = [5 1 3 2 1 3 4 4 1 9]

A =

5 1 3 2 1 3 4 4 1 9

>> B = find (A == 1) %indici di A che soddisfano il test A == 1

B =

2 5 9

>> A(B) = 0 % equivalente a: A ([2 5 9]) = 0

A =

5 0 3 2 0 3 4 4 0 9

(1) Notare che i valori “1” di B rappresentano la condizione “true”: conviene convertirli forzandoli a double o intero se B deve essere utilizzata per operazioni algebriche, ad esempio con double(B).

5. File esterni Un file .m può essere uno script (sequenza semplice di comandi visti in precedenza) o contenere una

funzione principale (ed eventuali funzioni locali aggiuntive, chiamate sotto-funzioni). Vi sono altre

estensioni associate al Matlab (come il .mat già discusso in sezione 2.4) per cui si rimanda alla

documentazione ufficiale.

5.1. Funzione Una funzione viene utilizzata per arricchire ed estendere il parco di funzioni già disponibili (built-in)

nel Matlab descritte in precedenza.

Una funzione può accettare parametri di input e di output, al fine di effettuare le sue operazioni e

restituire un risultato. I parametri passati come input non vengono alterati dalla funzione ma

processati localmente (passaggio per valore). Per poter ottenere un riferimento ad eventuali variabili

locali interne ad una funzione fare riferimento alla documentazione MATLAB (ultimo esempio di

http://www.mathworks.it/it/help/matlab/matlab_prog/nested-functions.html , passaggio per

riferimento).

La dichiarazione di una funzione deve essere la prima riga di un file MATLAB *.m, che deve avere lo

stesso nome della funzione ed il suffisso .m.

La funzione può poi essere direttamente chiamata dalla linea di comando o da altri file .m allo stesso

modo di una funzione interna (ad esempio zeros() ).

Sintassi del comando

function [out1, out2, ...] = myfun(in1, in2, ...)

[…]

[end] %Senza “;”

Descrizione

function [out1, out2, ...] = myfun(in1, in2, ...) dichiara la funzione myfun, indicando

i parametri di ingresso e di uscita previsti.

Il nome di una funzione MATLAB deve iniziare per un carattere alfabetico, ed avere lo stesso nome del

file .m che la descrive. MATLAB cercherà la funzione nel file relativo nelle cartelle di sistema (finestra

“Current Directory”). E’ possibile andare ad indicare ulterori percorsi dove le funzioni possono essere

caricate tramite i rispettivi vile .m, con il comando:

>> addpath(‘function_folder’);

Le variabili utilizzate all’interno della funzione sono visibili solo ad essa, sono quindi variabili locali. E’

possibile specificare nello stesso file .m ulteriori funzioni (sotto-funzioni) oltre alla prima (che dà il

nome al file), sia di seguito che annidate. Anche tali sotto-funzioni non sono visibili dall’esterno e sono

chiamate locali.

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

28

Una funzione può essere terminata con il comando end anche se non richiesto obbligatoriamente, a

meno di presenza di altre sotto funzioni. In tal caso infatti gli “end” servono per separare i diversi tipi

di funzioni possibili (principale, annidata, sotto-funzione) senza ambiguità.

Esempio di uso di “end” e di funzione annidata. Il file su cui scrivere quanto segue sarà main1.m

function main1

x = 5;

nestfun1;

function nestfun1

x = x + 1;

end

end

La funzione termina con il comando end (o al termine del file in mancanza di end). La variabile X è

utilizzabile dalla funzione annidata ma non da chi chiama la funzione! Si può usare il comando return

per uscire dalla funzione in anticipo se necessario. La funzione nestfun1 non è richiamabile da riga

di comando, al contratio di main1.

Il MATLAB quando non riconosce una funzione da utilizzare (ad esempio la cos(x) è una funzione delle

librerie interne “built-in” quindi viene direttamente usata), cerca un file nella cartella di lavoro con lo

stesso nome della funzione ed il suffisso .m. Se la trova, il file viene compilato dal MATLB anche per

utilizzi futuri. Ulteriori dettagli sulle funzioni, la visibilità delle variabili, ed i tipi di funzioni sono

disponibili sulla guida ed online:

http://www.mathworks.it/it/help/matlab/matlab_prog/types-of-functions.html

http://www.mathworks.it/it/help/matlab/matlab_prog/function-precedence-order.html

Come detto, tutte le funzioni hanno uno spazio di lavoro (workspace) separato e locale rispetto alle

altre funzioni. Per poter utilizzare dall’esterno variabili passate e/o elaborate in una funzione occorre

restituirle come parametro di output.

Per concludere, le funzioni locali (sotto-funzioni) vengono utilizzate prima di ricorrere ad eventuali

funzioni presenti su altri file esterni .m. Questo permette di creare versioni alternative di funzioni già

esistenti, mantenendo l’implementazione originale per altri programmi. I comani built-in vengono

sempre considerati per primi.

Per accertarsi di quale funzione viene utilizzata effettivamente di volta in volta, è possibile utilizzare il

comando “which”:

>> which max(10)

% double method

built-in (matlabroot\toolbox\matlab\datafun\@double\max)

Esempio di uso funzione

Nella cartella di lavoro creare un file stat.m che contiene il seguente codice:

function [mean,stdev] = stat(x)

n = length(x);

mean = sum(x)/n;

stdev = sqrt(sum((x-mean) .^ 2/n));

end

E’ possibile dal menu del Matlab, ricorrere a File� New� Function per crearla correttamente (al

momento del salvataggio sarà proposto un nome del file pari a quello scelto per la funzione).

Questo codice definisce una funzione chiamata stat che calcola e restituisce media e deviazione

standard di un vettore, che accetta come argomento (x). Chiamando la funzione passando tra

parentesi un vettore, ed assegnando il risultato che ritorna la funzione a delle variabili locali

(attenzione al numero di argomenti previsti e al vettore dei risultati), saranno restituiti i due valori

previsti (la mancanza del “;” produce una stampa esplicita dei valori):

>> [m s] = stat([12.7 45.4 98.9 26.6 53])

m =

47.3200

s =

29.4085

5.2. Script Come detto, un file .m può in alternativa ad una funzione contenere uno script (sequenza semplice di

comandi). Si può creare ad esempio un file di testo script_es_1_1.m ed inserirvi i comandi da

eseguire. Una volta aperto tramite l’editor Matlab, è possibile eseguirlo con il tasto play (triangolo

verde). Questo tipo di file è comodo per tenere da parte l’esecuzione di una serie di comandi, che

altrimenti al variare di un parametro dovrebbero essere ri-eseguiti manualmente tutti in ordine.

E’ possibile dividere un comando su più linee per migliorare la leggibilità dello script, aggiungendo tre

punti ‘. . .’ alla fine della riga del comando che prosegue alla riga successiva.

E’ possibile dal menu del Matlab, ricorrere a File� New� Script, per creare direttamente un file di

script nell’editor interno. Il nome del file non deve contenere caratteri speciali, come segni -, o punti

addizionali oltre al .m finale.

5.3. Controllo dell’esecuzione di uno script / funzione Nella realizzazione di uno script o una funzione su file .m, è possibile fare ricorso alle strutture di

controllo condizionato tipiche della programmazione, poiché il MATLAB è un vero e proprio linguaggio

di programmazione/scripting.

Gli operatori di controllo, in combinazione con i test logici descritti precedentemente (&, | ,==,

ecc.) permettono di eseguire parti di codice al soddisfacimento di condizioni, iterare un ciclo al variare

di valori ed altro. Sono disponibili comandi di controllo classici di tutti i linguaggi procedurali come IF,

SWITCH, WHILE, FOR, ecc.

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

30

Sintassi IF: if expression

statements

elseif expression

statements

else

statements

end

Esempio: if r == c

myData = 2;

elseif abs(r - c) == 1

myData = -1;

else

myData = 0;

end

Sintassi For: for index = values

statements

end

Esempio:

for c = 1 : 5

sin (c*pi)

end

for s = 1.0 : -0.1 : 0.0

myfunc(s)

end

6. La grafica in MATLAB Si mostrano i principali metodi per graficare insiemi di variabili discrete che rappresentano vettori di

campioni ed istanti temporali.

6.1. La funzione “plot” Il più semplice comando messo a disposizione da MATLAB per generare grafici è:

plotplotplotplot (vettore_x(vettore_x(vettore_x(vettore_x ,,,, vettorevettorevettorevettore_y_y_y_y [,properties]))))

I primi due vettori rappresentano rispettivamente i valori della variabile indipendente e i valori della

variabile dipendente. Devono essere composti da un numero uguali di elementi come ad esempio:

>> x =1:5 % dominio numeri interi

x =

1 2 3 4 5

>> y = (x-2).^2 % valori

y =

1 0 1 4 9

Il terzo parametro della plot properties invece rappresenta le proprietà, che agiscono sull’aspetto del

grafico (colore, tipo di linea, ecc.), sono opzionali e dettagliate in seguito.

La plot utilizzerà le coppie di valori nella stessa posizione dei relativi vettori per definire un punto nel

grafico, unendolo al precedente e successivo con un segmento. Il risultato è il seguente.

Figura 3: Esempio di plot su valori “discreti”

Come si vede la curva è discontinua, per cui solitamente per rappresentare una funzione si utilizza un

dominio più dettagliato, con un conseguente aumento delle dimensioni anche per il vettore y. Le

stesse assegnazioni con un adeguato passo di discretizzazione porteranno infatti a:

>> x =1:0.01:5; % dominio “reale”

>> y = (x-2).^2; % valori

>> whos x y

Name Size Bytes Class Attributes

x 1x401 3208 double

y 1x401 3208 double

1 1.5 2 2.5 3 3.5 4 4.5 50

1

2

3

4

5

6

7

8

9

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

32

La plot quindi sarà più accurata, composta da 401 coppie di punti, ed il risultato è il seguente:

Figura 4: Esempio di plot di funzione “continua”

Operazioni che coinvolgono solamente i valori y assunti dalla funzione potranno essere eseguite sul

vettore y, mentre operazioni che coinvolgono solamente l’asse x (es. traslazione) andranno a

modificare solo il vettore x. In genere una operazione su una funzione può coinvolgere entrambi i

vettori.

Non ci sono differenze sostanziali tra funzioni definite su un dominio intero (che chiameremo in

seguito sequenze numeriche) o su un dominio più fitto, ovvero con un passo di campionamento << 1

(a rappresentare funzioni continue). Tutte le operazioni che saranno presentate in seguito si

riferiranno sempre ad indici di vettori, per l’asse x oppure y, e quindi potranno essere

opportunamente utilizzate su entrambe.

Gli assi del grafico vengono impostati automaticamente. Se si vuole specificare un intervallo di

dettaglio specifico, si può ricorrere al comando “axis”, specificando un vettore di 4 componenti con

xmin, xmax, ymin ed ymax rispettivamente, da applicare al grafico attivo:

>> axis ([1 4 -1 6]);

Se la lista dei vettori nel comando plot è maggiore di 2 (a coppie di vettori x-y, con opzionalmente

anche le proprietà), tutte le curve vengono rappresentate sullo stesso piano cartesiano ma con colori

diversi.

>> x = 0 : pi/100 : 2*pi;

>> y = sin(x);

>> y1 =sin(x-0.25);

>> y2 =sin(x-0.5);

>> plot (x,y,x,y1,x,y2);

Allo stesso modo è possibile rappresentare diversi valori x-y sullo stesso grafico costruendo la matrice

Y con le righe dei valori da graficare, come nel seguente esempio.

1 1.5 2 2.5 3 3.5 4 4.5 50

1

2

3

4

5

6

7

8

9

>> x = 0 : pi/100 : 2*pi;

>> y = [sin(x); sin(x-0.25);sin(x-0.5)];

>> plot (x,y)

Figura 5: Più curve rappresentate sullo stesso grafico

Un eventuale secondo comando “plot” eseguito successivamente (anche su file script .m) va a

sovrascrivere l’output già visualizzato.

Per poter visualizzare più funzioni a schermo contemporaneamente, definendole in sequenza e non

tramite la stessa chiamata a plot è possibile utilizzare:

1. Il comando:

>> hold on

Che permette di mantenere la figura attuale ed inserirvi altre curve; quando finito si può

specificare hold off (default);

2. La funzione “figure(i)” che permette di applicare le plot e le azioni di grafica successive ad una

figura con indice “i”. Si genera un nuovo spazio di plot per generare un nuovo grafico

identificato dalla “i”, come nel seguente esempio:

>> x= 0:pi/100:2*pi;

>> y=sin(x);

>> y1=sin(x-0.25);

>> y2=sin(x-0.5);

>> figure (1);

>> plot(x,y,x,y1);

>> figure (2);

>> plot(x,y,x,y2);

3. La funzione “subplot(MNP)” che permette di specificare un numero di grafici sulla stessa

finestra (M=indice riga, N = indice colonna ed N è il numero di grafico), specificando di volta

in volta su che posizione P graficare (P <= M*N), partendo dalla posizione in alto a sinistra, per

poi proseguire a destra e poi in basso.

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

34

>> subplot (211); % due righe, una colonna - posizione 1 = ...

primo quadro (in alto)

>> plot(x,y,x,y1);

>> subplot (212); % due righe, una colonna - posizione 2 = ...

secondo quadro (in basso)

>> plot(x,y,x,y2);

In questo caso la schermata della figura sarà composta da due grafici :

Figura 6: Più curve tramite subplot

6.2. Proprietà del grafico Le proprietà possono essere assegnate a ciascuna serie da graficare, e possono essere specificate nella

chiamata plot. Devono essere utilizzate (anche in ordine sparso) i seguenti parametri, creando una

stringa da 1, 2 o tre caratteri come ad esempio:

• 'r': Colore linea Rosso

• 'g:': Colore linea verde (green), stile linea puntini

• 'b-x': Colore linea blu, linea continua, marcatore croce (x)

COLORE

‘c’ Ciano

‘m’ Magenta

‘y’ Giallo

‘r’ Rosso

‘g’ Verde

‘b’ Blu

‘w’ Bianco

‘k’ Nero

0 1 2 3 4 5 6 7-1

-0.5

0

0.5

1

0 1 2 3 4 5 6 7-1

-0.5

0

0.5

1

STILE LINEA

‘-’ Continua

‘--’ Tratteggiata

‘none’ Senza linea

‘-.’ Tratto-punto

‘:’ Punteggiata

MARCATORI ‘+’ ‘o’ ‘x’ ‘*’ Come da simbolo

‘s’ Quadrato

‘d’ Diamante

‘p’ Pentagono

‘h’ Esagono

‘^’ Triangolo in alto

‘v’ Triangolo in basso

‘<’ Triangolo a sinistra

‘>’ Triangolo a destra

>> x= 0 : pi/10 : 2*pi;

>> plot(x, sin(x), 'r-x', x, cos(x), 'g:h')

Successivamente, la legenda, la descrizione degli assi e il titolo possono essere inserite come segue:

>> legend('sin(x)', 'cos(x)')

>> ylabel ('y')

>> xlabel ('x')

>> title ('Test plot')

Figura 7: Variazione stile di una curva, aggiunta di legende e testo

0 1 2 3 4 5 6 7-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

x

y

Test plot

sin(x)

cos(x)

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

36

6.3. La funzione “plotyy” In MATLAB è possibile combinare due grafici aventi un asse ‘y’ differente mediante il comando

“plotyy”:

PPPPlotyylotyylotyylotyy (x,y1,x,y2,<type>)(x,y1,x,y2,<type>)(x,y1,x,y2,<type>)(x,y1,x,y2,<type>)

dove il parametro “type” permette di specificare quale funzione eseguire per ottenere il grafico

(l’unica vista ora è la plot). I seguenti comandi creano ed impostano alcune opzioni per la creazione di

un plot a due scale. I comandi possono essere inclusi in un file .m (script) oppure eseguiti manualmente

da riga di comando.

Il comando “grid on” abilita la griglia sul grafico corrente attivo.

>> x= 0:.1:20;

>> y1 = 200*exp(-0.05*x).*sin(x);

>> y2 = 0.8*exp(-0.5*x).*sin(10*x);

>> [AX,H1,H2] = plotyy(x,y1,x,y2,'plot');

>> xlabel('Tempo (s)');

>> title('Esempio di plotyy');

>> set(get(AX(1),'Ylabel'),'String','Asse-Y di sinistra');

>> set(get(AX(2),'Ylabel'),'String','Asse-Y di destra');

>> set(H1,'LineStyle','--');

>> set(H2,'LineStyle',':');

>> grid on;

Il grafico che risulta dall’esecuzione dei comandi precedenti è il seguente.

Figura 8: Esempio di curve con asse Y differente nella stessa figura

6.4. Formattazione di un grafico MATLAB consente di migliorare la leggibilità di un grafico attraverso una serie di elementi grafici,

dopo che il grafico è stato visualizzato:

• titolo del grafico (“title”);

• etichette degli assi (“xlabel” e “ylabel”);

• legenda del grafico (“legend”);

• nota di testo (“text”);

• linee e/o frecce sul grafico;

• Aggiunta di statistiche elementari.

Tutti questi elementi possono essere gestiti attraverso il “Properties Editor”. L’editor per modificare

l’aspetto del grafico compare cliccando 2 volte sulla figura o sull’elemento della figura su cui si vuole

agire (ad es. asse X).

Figura 9: Editor visuale proprietà

6.5. La funzione “stem” La funzione “stem” consente di graficare la serie di dati come linee a partire da una linea-base

orizzontale. Un circolo (forma di default) o altri marcatori rappresentano il valore sull’asse y

rappresentato da una singola linea. E’ utilizzato tipicamente per le sequenze numeriche o il

campionamento di segnali quando il dominio è composto da numeri interi.

stem(Y) grafica la sequenza associata alle componenti del vettore Y come segmenti verticali

equispaziati sull’asse x sui valori 0,1,…n;

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

38

stem(X,Y) grafica Y con posizioni dettate dal vettore X. X e Y devono essere due vettori della stessa

lunghezza; Y può avere più righe che rappresentano altrettanti valori da graficare;

stem(...,'fill') specifica se colorare e riempire il circolo alla fine del segmento;

stem(... ,LineSpec) specifica lo stile della linea ed i colori per il segmento ed il marker. LineSpec è lo

stesso formato visto per la plot (ad esempio ‘r--‘).

Anche il marker può essere modificato (vedere esempio seguente).

Un utilizzo di base è dato dai seguenti comandi, e produce il grafico riportato sotto.

>> n = -3:5;

>> c = (n-1).^2;

>> stem (n,c)

Figura 10: Esempio grafico con Stem

X come Y può anche essere una matrice. Ulteriori dettagli su trovano su:

http://www.mathworks.it/it/help/matlab/ref/stem.html

h = stem(...) restituisce un riferimento (handle) nella variabile h, composto da un vettore con “i”

elementi (uno per ogni serie graficata, o riga di Y) e delle proprietà modificabili:

• h(1) – riferimento alla prima serie (per modifica opzionale del Marker)

• h(i) – riferimento alla alla i-ma serie

• get(h,'Baseline'); - riferimento alla linea “asse-x” (Baseline) su cui è possibile specificare:

o 'Color'

o 'LineWidth'

o 'BaseValue'

o 'Visible' (‘on’/ ‘off’)

Ad esempio eseguendo il codice seguente si ottiene il grafico di Figura 11:

-3 -2 -1 0 1 2 3 4 5

0

2

4

6

8

10

12

14

16

>> x = linspace(0,2*pi,10); % 10 valori equispaziati tra 0 e 2pi

>> %(9 intervalli) equivalente a x = 0: 2*pi/(10-1) : 2*pi;

>> h = stem(cos(x),'fill','-.');

>> set (h(1), 'Marker', '*' );

>> handle_b = get(h,'Baseline'); %riferimento alla proprietà “linea base”

>> set(handle_b, 'Color','r','LineWidth',2) % Imposta rosso bold

Figura 11: Stem con stile modificato

6.6. La funzione “area” La funzione “area”, similmente alla plot, permette di graficare i valori associati al vettore delle y associandoli ad un area colorata sottostante alla curva (compresa tra i valori e l’asse delle x). Ad esempio i seguenti comandi: >> x = 0:0.01:10;

>> area(x, sin(2*x) .* exp(-x) );

visualizzano il seguente grafico, utilizzando tutti i parametri standard della “area”. E’ possibile specificare colori e proprietà dell’area con maggior dettaglio rispetto alla plot (e quindi con maggiori parametri, non compatibili con la plot), e si rimanda alla documentazione del Matlab. A titolo di esempio, il colore dell’area verde si specifica dopo x ed y con ,'FaceColor','g'.

Figura 12: Plot grafico con Area

1 2 3 4 5 6 7 8 9 10-1

-0.8

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

0 2 4 6 8 10

-0.2

-0.1

0

0.1

0.2

0.3

0.4

0.5

0.6

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

40

6.7. Cenni alla grafica tridimensionale Matlab include ulteriori e potenti funzionalità di grafica. A titolo di esempio, si presenta uno script che

definisce una funzione z=f(x,y) graficata mediante la chiamata surface (surf). E’ possibile ricorrere

alla funzione meshgrid per definire automaticamente il dominio in x ed y.

>> x = -10:0.2:10;

>> y = -10:0.2:10;

>> X = repmat(x,length(x),1);

>> Y = repmat(y',1, length(y)); % Vedi comando meshgrid in alternativa

>> R = sqrt(X.^2 + Y.^2) + eps; % eps evita divisione per zero

>> Z = sin(2*R)./ R;

>> surf(X,Y,Z)

Figura 13: Plot grafico tridimensionale

-0.5

10

0

0.5

5 10

1

5

1.5

0

2

0-5

-5

-10 -10

7. Generalità sui segnali Un segnale, indicato con x(t), è una grandezza fisica, funzione reale della variabile indipendente reale

tempo:

�(�), ∀� ∈ ", ∀� ∈ #

x(t) è valida sul dominio temporale T (che può estendersi a tutto l’asse dei tempi). Il codominio X è

costituito da tutti i valori reali assunti da x(t). Un segnale solitamente rappresenta un’informazione

che passa attraverso un mezzo fisico, varia con continuità nel tempo assumendo tutti i valori del

codominio.

Anche se i segnali complessi non esistono in natura, essi vengono utilizzati per descrivere in modo

compatto coppie di segnali reali, in due componenti indipendenti. Con un’estensione matematica

quindi, un segnale può essere considerato una funzione complessa della variabile indipendente

temporale, per cui si ha una notazione in parte reale e parte immaginaria:

�(�) = �%(�) + '�((�), ∀� ∈ "

In generale, sono valide le seguenti relazioni (* denota il complesso coniugato):

)*+�%(�) ≅ ℜ.�(�)/ = 12 1�(�) + �∗(�)2

�((�) ≅ ℑ.�(�)/ = 12' 1�(�) − �∗(�)2

x(t) si può anche esprimere nelle componenti:

�(�) = |�(�)|�6∙7891�(:)2 dove:

);*;+ |�(�)| = <�%�(�) + �(�(�) = =�(�)�∗(�)

�>�1�(�)2 = ���� ?�((�)�%(�)@ + �2 ∙ ?1 − �%(�)|�%(�)|@

Rilevanti nello studio dei sistemi di telecomunicazione per il costante sviluppo delle cosiddette

tecniche numeriche, i segnali a tempo discreto sono rappresentati su un insieme discreto numerabile .�A/ di istanti temporali. Tali istanti possono essere in numero finito o infinito, distribuiti nel tempo in

modo generico oppure con equispaziatura tra elementi adiacenti.

Il caso più frequente ed interessante è quello di istanti discreti equispaziati, con generico intervallo

T, per i quali si può stabilire la seguente corrispondenza biunivoca con l’insieme dei numeri interi ℵ :

�A = � ∙ "

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

42

Il segnale a tempo discreto è allora denominato sequenza, e viene indicato con la notazione x(n)

(oppure x[n]), dove il generico n-esimo elemento, o campione della sequenza, assume un valore (reale

o complesso) per ogni n intero.

Alle sequenze sono applicabili le operazioni elementari di moltiplicazione per una costante e di

traslazione temporale, così come quelle di coniugazione e di ribaltamento temporale, con esecuzione

da compiersi campione per campione in modo “numerico”.

Il primo elementare esempio di sequenza è il campione unitario:

B(�) = C1, �� � = 00, ∀� ≠ 0

A partire da un segnale certo x(t), si possono estrarre con passo di campionamento T i valori �E =FE = �(G"). Tutti i campioni xk o ck hanno valori noti, ottenendo quindi una sequenza determinata o

certa. Servendosi di una serie di campioni unitari traslati B(�) si ottiene la seguente rappresentazione

di una generica sequenza a lunghezza illimitata, denominata sequenza bilatera, con campioni che

possono essere non nulli per qualsiasi valore di k:

�(�) = H �(G") ∙ B(� − G)E

= H �E ∙ B(� − G)E

Dove la sommatoria si estende da −∞ a +∞. Nel caso in cui i campioni sono nulli per ogni k minore

di un numero intero km e maggiore di un altro intero kM>km, si ha una sequenza a lunghezza limitata.

Le sequenza periodiche sono caratterizzate dal continuo ripetersi di una sequenza di lunghezza

limitata:

�(� − ℎK�) = �(�)

con h intero e con passo di ripetizione N0, che deve essere un numero intero finito maggiore di 1.

L’intervallo temporale "� = K� ∙ " è il periodo della sequenza.

7.1. Energia e potenza delle sequenze Una sequenza x(n), in quanto diversa da zero solo in un insieme numerabile di istanti, non possiede

né energia né potenza, secondo la definizione adottata per i segnali a tempo continuo (integrale nel

tempo). È possibile tuttavia definire in modo convenzionale queste grandezze anche per le sequenze,

facendo riferimento al segnale a gradini corrispondente (ottenuto da quello a tempo discreto

mediante l’operazione di tenuta dei campioni).

Le grandezze convenzionali energia della sequenza e potenza della sequenza, che sono finite e diverse

da zero rispettivamente nel caso si sequenza di energia e di sequenza di potenza, sono ottenute come

segue, dove T è l’intervallo di campionamento del segnale x(t) con cui ho estratto i ck:

L�� = " ∙ H|FE|�E

M�� = limQ→S12K + 1 H |FE|�Q

ETUQ

La potenza di una sequenza periodica può essere espressa in base all’energia L��("�) della sequenza

troncata in un generico intervallo che corrisponde al periodo "� = K� ∙ " , ottenendo:

M�� = L��("�)"� = 1K� H|FE|�QV

ET�

Tali relazioni sono vere sia per sequenze numeriche (avendo definito T) rappresentate dalla serie xk

per k intero, che per approssimazioni di segnali reali su intervalli “fitti” (ad es: t=[0:0.001:10];). In

entrambi i casi, il valore ottenuto è una approssimazione dell’energia (o potenza) del segnale di

partenza calcolato con gli integrali. Questo valore sarà tanto più vicino al valore vero quanto più il

tempo di campionamento è “adeguato” a rappresentare il segnale. Su questo argomento si ritornerà

in seguito quando si parlerà di convoluzione e teorema del campionamento.

7.2. Operazioni elementari sui segnali I segnali e le sequenze numeriche sono solitamente rappresentati in Matlab da vettori riga di pari

numero di elementi, per il dominio (asse n o asse t) e per i valori. E’ possibile operare su di essi

utilizzando quindi le operazioni definite per i vettori riga. Operazioni differenti saranno necessarie sui

vettori dei valori e su quelli dei domini, a seconda del caso. Ad esempio se si hanno due sequenze

numeriche da sommare così definiti:

>> n1 = [-3:3]; x1 = [2,1,-1,0,1,4,3];

>> n2 = [-3:3]; x2 = [3,7,1,4,-1,10,2];

poiché i valori del dominio (vettore n1 ed n2) nei due casi sono gli stessi, posso costruire la somma (o

il prodotto, o qualunque altra operazione che coinvolga i due segnali) semplicemente, ponendo:

>> n = n1; %oppure n2, da usare per una eventuale “stem (n,y)”

>> y = x1 + x2;

Se invece le due sequenze fossero definite su domini diversi, o addirittura avessero lunghezze

differenti, la somma non si potrebbe fare così semplicemente, ma bisognerebbe in qualche modo

“allineare” i segnali e renderli di uguale lunghezza prima di sommarli. Nel seguito, quando operiamo

su due segnali, li definiremo sullo stesso dominio temporale (o aggiustandoli in seguito

appropriatamente in modo che lo siano). In questo modo opereremo esclusivamente sui valori dei

segnali, senza dover ricorrere a traslazioni. Lo stesso discorso vale per sequenze numeriche e per

segnali “reali”.

7.3. Creazione funzione sinc() In alcune versioni di Matlab, ed in accordo ad i toolbox installati, la funzione sinc() potrebbe non essere

disponibile. A tal fine creeremo una funzione sinc equivalente e che potrà essere utilizzata nel seguito

delle dispense se necessario. La nuova funzione andrà scritta nel file sinc.m, che avrà il seguente

contenuto

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

44

function [ x ] = sinc( t )

%SINC(t)

% Ritorna i valori della sinc sul dominio t

x = sin (pi*t) ./ (pi*t);

x (find (t==0)) = 1;

end

Il comando find serve per sostituire il valore in t=0 con 1 (risultato del limite notevole sen(x)/x per x =

0) e che altrimenti da Matlab viene identificato come NaN (divisione tra 0 e 0). Eseguendo:

>> t= -10:0.1:10;

>> plot (t, sinc(t));

si ottiene la seguente figura:

Figura 14: Plot segnale sinc(t)

7.4. Esercitazione 1 Sequenze numeriche di base (rect, impulso). Estensione ai segnali x(t).

7.4.1. Esercizio 1 Finestra rettangolare a tempo discreto. Generate e diagrammate una finestra rettangolare a tempo discreto RN(n) per -10 ≤ n ≤ 10 di N=5 campioni a partire da 0. E` possibile sicuramente scrivere un codice per questo esempio basato su un ciclo for, ma sarebbe una soluzione inefficiente. Possiamo pensare ad una soluzione che sfrutta le potenzialità di Matlab per il trattamento di vettori e le operazioni logiche, con un codice del tipo: >> n = [-10:10];

>> y = fix ((n >= 0) & (n <= 4) );

>> stem(n,y);

La prima istruzione genera un vettore di valori interi (tempi) da -10 a 10. La seconda genera un vettore che vale 1 se n è compreso tra 0 e 4 (estremi inclusi), zero altrimenti. Viene usata l’aritmetica booleana e l’operatore “end” &. Poiché le operazioni booleane hanno come risultato 0 oppure 1 logici, il vettore

-10 -5 0 5 10

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

y risultante sarebbe di tipo booleano. E’ possibile quindi opzionalmente forzare il risultato in y a valori interi (cast effettuato con fix(.) ) poiché alcune funzioni non interpretano correttamente l’1 logico come valore. Il terzo comando disegna il segnale generato, come di seguito.

Figura 15: Rect mediante Stem

Poiché la generazione di una “rect” tornerà utile in seguito, si può trasformare questo esempio in una function, generalizzando la larghezza (B=base) ed il centro (N0) del rettangolo, sul dominio specificato dal vettore “n” come segue: function [y] = rett_td(n,N0,B);

y = fix(n >=(N0-B/2) & n<= (N0+B/2));

end

per generare una qualsiasi finestra rettangolare sul dominio n centrata in N0 e di lunghezza B. La function va memorizzata in un M-file, con il nome rett_td.m, e restituisce i valori assunti dal gradino; essa potrà essere richiamata dalla linea di comando come un qualunque comando Matlab. Ad esempio, la generazione ed il grafico dell’esempio precedente possono essere effettuati come: >> n = [-10:10];

>> y = rett_td (n , 2 , 5);

>> stem (n,y);

Per ultimare l’esercizio, tramite la funzione appena creata, graficare un rect su un intervallo t

compreso tra 0 e 10, con step 0.01, centrato in 4 e largo 2. Notare che in questo caso (approssimazione

di funzione continua e non sequenza numerica) conviene usare la funzione plot al posto della stem.

Tale considerazione è valida anche per gli esercizi seguenti.

7.4.2. Esercizio 2 Gradino a tempo discreto. Generare e diagrammare un gradino unitario a tempo discreto u(n-N0) per -20 ≤ n ≤ 20. Costruire una funzione grad_td per la generazione del gradino centrata in N0.

-10 -8 -6 -4 -2 0 2 4 6 8 100

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

46

7.4.3. Esercizio 3 Esponenziale a tempo discreto. Generare e diagrammare un esponenziale monolatero a tempo discreto x(n) = anu(n) per -20 ≤ n ≤ 20 e per vari valori di a (positivi, negativi, maggiori o minori di 1 in modulo). Ricorrere alla funzione grad_td appena definita. N.B. In Matlab non si può utilizzare tra vettori l’operatore * (che effettua il prodotto scalare), ma occorre utilizzare l’operatore .* che effettua la moltiplicazione elemento per elemento di due vettori di uguale lunghezza.

7.4.4. Esercizio 4 Impulso a tempo discreto. Generare e diagrammare un impulso ideale a tempo discreto δ(n-N) centrato in N per -20 ≤ n ≤ 20. Costruite una funzione delta_td per la generazione dell’impulso a tempo discreto.

7.4.1. Esercizio 5 Finestra triangolare a tempo discreto. Generare e diagrammare una finestra triangolare a tempo discreto T2B(n) per -20 ≤ n ≤ 20 centrata in 1 e con larghezza complessiva 2B = 8. Costruite una funzione triang_td simile a rett_td per la generazione di una finestra triangolare arbitraria.

7.5. Esercitazione 2 Operazioni elementari tra sequenze.

7.5.1. Esercizio 1 Somma di due sequenze numeriche. Calcolare la somma di una sinusoide di ampiezza 3 e di un impulso δ(n) su un opportuno intervallo temporale, che includa almeno un periodo completo della sinusoide. Il dominio sarà compreso tra -10 e 10, solo per valori interi.

7.5.2. Esercizio 2 Prodotto di due sequenze Calcolate il prodotto di due sinusoidi con frequenze differenti, su un opportuno intervallo temporale.

7.5.3. Esercizio 3 Traslazione di una sequenza. Data una sequenza x(n), calcolate la sequenza traslata y(n) = x(n - n0), per n0 = N0 positivo o negativo. In questo caso, non si può trascurare il vettore dei tempi n, che è coinvolto direttamente nella trasformazione. Ad esempio, consideriamo il seguente segnale: >> n = [-3:3]; y = [2,1,-1,0,1,4,3];

Per ritardarlo di 5 posti, ottenendo il segnale y(n) = x(n - 5), basta effettuare la seguente operazione: >> n_t1 = n + 5; y_t1= y;

mentre per anticiparlo di 3 posti, ottenendo il segnale y(n) = x(n + 3), si ha: >> n_t2 = n - 3; y_t2= y;

Rappresentare il segnale di partenza e quello ritardato (o anticipato) nella stessa finestra utilizzando il comando subplot nel modo seguente:

>> subplot(211); stem(n_t1,y_t1);

>> subplot(212); stem(n_t2,y_t2);

P.S. attenzione in questo caso il dominio della funzione originaria e di quelle traslate sono differenti (stesso numero di punti ma riferiti ad un intervallo del dominio differente), quindi le repliche così ottenute non possono essere direttamente sommate per la sequenza somma (y_t1+y_t2 è sbagliato!). Traslazioni di un segnale riferite ad un dominio comune saranno affrontate in seguito per i segnali “rep”.

7.5.4. Esercizio 4 Riflessione di un segnale. Premessa

Dato una sequenza “a rampa” x(n) (valori crescenti tra 0 e 8) definita tra -5 e 3, calcolare il segnale y(n) = x(-n). In questo caso si può ricorrere alla funzione fliplr che effettua un ribaltamento da destra a sinistra di un vettore. Per vedere come funziona, provare nel modo seguente: >> n = [-5:3]; x = [0:8]; stem (n,x);

>> xr = fliplr(x);

>> figure; stem (n,xr)

Queste operazioni effettuano il ribaltamento da destra a sinistra (riflessione) dei valori del segnale, ma non opera sulla scala dei tempi. Ciò non è corretto, se si pensa all’interpretazione dell’operazione di riflessione. Infatti i tempi devono subire anch’essi un ribaltamento, in accordo alla trasformazione n � -n. In questo caso il segnale riflesso deve partire da -3, non da -5. Quindi, per effettuare tale operazione in modo corretto, è necessario allora effettuare in aggiunta:

a) un ribaltamento da destra a sinistra del vettore n; b) un cambiamento di segno del vettore n.

Pertanto, il codice Matlab completo per la riflessione è il seguente: >> nr = - fliplr(n);

>> stem (nr,xr)

Esercizio

Sulla base di questa premessa, scrivere una funzione rifletti_td il cui prototipo è il seguente: function [nr,xr] = rifletti_td(n,x)

ed utilizzarla per fare la stem di una sequenza a scelta e della sua riflessa. Utilizzare questa funzione per un segnale “reale”, inteso come approssimazione con passo sull’asse dei tempo molto piccolo (es. dt=0.001). In tal caso utilizzare la plot al posto della stem.

7.5.5. Esercizio 5 Decimazione / espansione Scrivere il codice MATLAB per effettuare la decimazione e l’espansione per un fattore N di una sequenza arbitraria. Nel primo caso deve essere creata una nuova serie con un valore prelevato ogni N. Nel secondo, ogni valore deve essere ripetuto N volte. L’estremo sinistro e destro del dominio viene mantenuto nelle due operazioni (ma avrà un numero di elementi differente).

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

48

Premessa

In questo esercizio, il dominio risultante presenterà interruzione o nuovi valori (non interi), per tener conto della decimazione e dell’espansione nello stesso dominio. La decimazione verrà utilizzata successivamente su segnali “reali” per il campionamento. Entrambe le operazioni possono essere realizzate con un attento uso delle capacità di indicizzazione di MATLAB e di cicli “for”. Per l’operazione di decimazione, si propone però di ricorrere alla seguente scrittura, che di fatto realizza il prelievo dei campioni di t e di y con passo “step”, rendendo il codice più efficiente rispetto all’uso di cicli: t_dec=t(1:step:end);

Provarlo con il seguente esempio (prelievo sullo stesso dominio di un elemento ogni 10), cercando di capire cosa viene realizzato dal codice. >> dt=0.001;

>> t=[0:dt:1];

>> y=3*sin(2*pi*5*t)+sin(2*pi*20*t);

>> tc=t(1:10:end);

>> yc=y(1:10:end);

>> figure;

>> plot(t,y,'r');

>> hold on;

>> stem(tc,yc);

Per la seconda funzione di espansione, provare ad utilizzare le nozioni di elaborazione di matrici (sezione 3.6), o in alternativa usare un ciclo “for” con indici. L’asse x/dominio del risultato, dovrà risultare riorganizzato e con un numero maggiore di punti (ma con gli stessi estremi).

Esercizio

Si chiede di organizzare i comandi realizzati costruendo due function in Matlab, i cui prototipi sono: function [nd,y] = decima_td(n,x,N);

function [ne,y] = espandi_td(n,x,N);

che accettano in ingresso un segnale generico (definito da due vettori) e restituiscono i nuovi valori per l’asse dei tempi (come detto modificato anch’esso durante il processo) e per i valori assunti dal segnale. Si chiede infine di:

• Provare le vostre funzioni con un segnale semplice e verificare il risultato con quello che si ottiene analiticamente o graficamente.

• Provare poi ad applicare le operazioni espandi e decima in cascata con lo sesso N, e verificate se il risultato è il segnale di partenza stesso. Che succede se si applicano in ordine inverso?

7.6. Esercitazione 3 Rappresentazione di segnali reali x(t).

7.6.1. Esercizio 1 Rappresentare i seguenti segnali x(t):

1. �(�) = �� cos Z15�� + \]^ �(�)

2. �(�) = �U_̀ ∙ >�F� Z:U��a ^

3. �(�) = 100 sin Z4�� + \d^ >�F� Z:U�d ^

4. �(�) = cos Z2�� + \�^ �U|:|

Per ogni segnale selezionare un “adeguato” intervallo per la variabile indipendente t (considerare le

caratteristiche di periodicità o di attenuazione del segnale) e configurare le proprietà della figura in

modo da renderla leggibile.

N.B.: Considerare per l’equazione 1. come intervallo di campionamento due valori: il primo

abbastanza grande (rispetto alla durata del segnale e alla sua eventuale periodicità) e uno

sufficientemente piccolo (alcuni ordini di grandezza più piccolo della durata del segnale)

Sovrapporre sullo stesso grafico i segnali 1. e 3. (considerare la primitiva plotyy, viste le diverse scale

dei segnali!)

7.6.2. Esercizio 2 Rappresentare il segnale dato dalla somma di sue sinusoidi: una a 50 Hz e l’altra a 25 Hz con ampiezza

doppia:

�(�) = sin(2�50�) + 2 sin(2�25�)

Considerare un intervallo temporale finito da 0 a 1 secondi e un passo di discretizzazione di 1 ms.

Visualizzare nel dettaglio il sottoinsieme di punti corrispondenti ai primi 100 campioni.

7.6.3. Esercizio 3 Si supponga di avere un segnale x(t) dato dal prodotto di due segnali: x(t)=x1(t)x2(t). In particolare:

��(�) = �U|:| ��(�) = sin(2��)

Rappresentare sullo stesso grafico i seguenti segnali: x1(t), -x1(t), x2(t) e x(t). Considerare un intervallo

da 0 a 5 secondi e un passo di 10 ms. Stimare l’energia di x(t).

7.6.4. Esercizio 4 Definire i seguenti segnali, con un opportuno passo di campionamento:

��(�) = cos(4��), ��(�) = �>e(� − 1), f(�) = ��(�) ∙ ��(�)

Sovrapporre i tre grafici. Verificare le proprietà dei segnali (ampiezze, durata, posizione, fase). Infine

stimare l’energia del segnale y(t) con le operazioni tra matrici del Matlab.

7.6.5. Esercizio 5 Definire il vettore y ed il corrispondente vettore dei tempi t che rappresenta il seguente segnale

nell’intervallo (0,5) con passo dt=10 ms:

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

50

f(�) = 2�>e g�2 − 1h − �>e(� − 2)

Ragionare a priori sulla forma di y(t), quindi verificare il ragionamento fatto attraverso il grafico.

Calcolare l’energia.

7.6.6. Esercizio 6 Considerare il seguente segnale analitico:

�(�) = 1−4�� ∙ cos(4��) + sin(4��)2�i�i ∙ �6��\:

Rappresentare: a(t), Arg[a(t)] e |a(t)|.

7.6.7. Esercizio 7 Calcolare l’energia dei seguenti segnali:

1. �(�) = �\: ∙ >�F� Z:U�d ^;

2. �(�) = 12 − (� − 8)�2 ∙ >�F� Z:U]� ^;

3. �(�) = cos Z2�� + \�^ ∙ �U|:| ∙ >�F� Z:a^

7.6.8. Esercizio 8 Graficare la seguente funzione in un adeguato dominio dei tempi.

�(�) = �e�F(�)

8. Proprietà dei segnali

8.1. Segnali periodici: la funzione “repT0” I segnali periodici rispettano la seguente proprietà di ripetizione:

�(� − G"�) = �(�), C∀� ∈ "∀G ∈ k

Dove con Z è indicato l’insieme dei numeri interi e l’intervallo T0 di ripetizione dell’andamento della

forma d’onda è denominato periodoperiodoperiodoperiodo del segnale.

Gli esempi più classici di segnale periodico sono offerti dai segnali armonici (armonica complessa):

l ∙ �6(mV:noV) = l ∙ cos(p�� + q�) + 'l ∙ sin(p�� + q�)

Dato un segnale g(t) e definita la funzione di replica a intervallo T0 (l’assenza degli estremi della

sommatoria sta ad indicare che essa si estende da +∞ a -∞):

>�rsV.�(�)/ = H �(� − G"�)E

È immediato costatare che si genera un segnale periodico �(�) = >�rsV.�(�)/ di periodo T0.

Si noti che solo nel caso in cui g(t) sia limitata in un intervallo di durata t9 ≤ "�, l’andamento del

segnale periodico coincide con quello della funzione generatrice, g(t), nell’intervallo in cui

quest’ultima è diversa da zero.

8.2. Esempio Disegnare l’andamento temporale del segnale f(�) = >�r�.f�(�)/ dove:

f�(�) = v(2 + �)� − 2 ≤ � ≤ 0(2 − �)� 0 < � ≤ 2 0 ��>�x�

1) Disegnare f�(�)

Definire per prima cosa l’intervallo di campionamento (prendere sufficientemente piccolo -> dove per

ora sufficientemente piccolo è da intendere molto più piccolo della durata del segnale di 2 o 3 ordini

di grandezza):

>> dt=0.001;

Quindi ora si può passare alla definizione i rami che costituiscono la funzione rappresentante il

segnale. Occorre prendere l’intervallo dei tempi abbastanza grande sulla base del numero di repliche

che si vorranno considerare:

>> t1 = -10:dt:-2 ;

>> y1 = zeros(1,length(t1));

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

52

>> t2 = -2+dt:dt:0;

>> y2 = (2+t2).^2;

>> t3 = dt:dt:2;

>> y3 = (2-t3).^2;

>> t4 = 2+dt:dt:10;

>> y4 = zeros(1,length(t4));

Quindi, unendo i vari rami possiamo ottenere la f�(�):

>> t = [t1 t2 t3 t4];

>> y = [y1 y2 y3 y4];

Graficando con plot (t,y) si ottiene:

Figura 16: Funzione di base

1 bis)

E’ possibile giungere allo stesso risultato esprimendo la funzione (poiché è simmetrica in 0) usando il

modulo di t, e moltiplicandola per un rect adeguato (funzione rett_td() ottenuta dalla esercitatone

precedente).

>> t = -10:dt:10 ;

>> y = ((2-abs(t)).^2) .* rett_td(t,0,4);

2) Creazione di repliche traslate

Una volta definita f�(�) è possibile definire le repliche applicando delle opportune traslazioni

Replica traslata a destra:

Per prima cosa definiamo una costante di traslazione “delta” che indica di quanti campioni occorre

spostare la f�(�). Si noti che occorre ragionare per numero di campioni.

-10 -8 -6 -4 -2 0 2 4 6 8 100

0.5

1

1.5

2

2.5

3

3.5

4

>> delta=2/dt;

Quindi si può definire un vettore di zeri di lunghezza “delta”

>> yr=zeros(1,delta);

Si può definire un nuovo vettore y1 come l’unione di yr e y:

>> y1=[yr y];

Poiché y1 dovrà essere graficato sullo stesso asse dei tempi “t” definito per y, si definisce una variabile

“index” che verrà utilizzata per dare la giusta dimensione al vettore y1:

>> index=1:1:length(y);

Quindi la sequenza di campioni rappresentante la replica del segnale traslata verso destra è:

>> y1=y1(index);

Figura 17: Prima replica a destra

Replica traslata a sinistra:

Questa volta il vettore di zeri lungo “delta” viene unito al vettore y da destra:

>> y2=[y yr];

Il vettore di indice deve fare in modo di tagliare y2 di “delta” campioni a sinistra

>> index2=length(yr)+1:1:length(y2);

Quindi la replica del segnale traslata a sinistra è data da:

>> y2=y2(index2);

Eseguendo la plot si ottiene

>> plot(t,y,t,y1,t,y2)

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

54

Figura 18: Due repliche

Ulteriori repliche sia a destra che a sinistra possono essere ottenute ricorsivamente. Ad esempio

traslando a destra y1 si ottiene un ulteriore replica traslata verso destra mente traslando y2 verso

sinistra si ottiene un’ulteriore replica verso sinistra.

Figura 19: Tutte le repliche da sommare

2 bis) Relizzare le repliche ricorrendo al segnale definito direttamente (modulo e rect), come ad

esempio per la replica a destra (stesso dominio t):

>> y1= ((2-abs(t-2)).^2) .* rett_td(t,2,4);

3) Combinare repliche per ottenere Rep2 f(�), che sono tutte riferite allo stesso domunio t:

>> rep_y=y+y1+y2+y3+y4+y5+y6+y7+y8+y9+y10;

>> plot(t,y,t,rep_y)

Figura 20: Somma delle repliche e segnale base

8.3. Affinità tra segnali di energia Considerando due segnali di energia, x(t) e y(t), aventi rispettivamente energie Exx e Eyy, si definisce la

funzione di intercorrelazione temporale dei due segnali mediante la seguente espressione:

y��(z) = { �(� + z) ∙ f∗(�) ∙ ��SUS

I valori assunti nell’origine (per τ=0) dalle due funzioni di intercorrelazione si denominano energie

mutue (L�� = L��). L’intercorrelazione gode della seguente proprietà:

|y��(z)|� ≤ L�� ∙ L��

La corrispondente funzione adimensionale normalizzata è definita funzione di indice di

intercorrelazione:

}��(z) ≜ y��(z)=L�� ∙ L��

La funzione di intercorrelazione è in grado di evidenziare l’affinità in senso lato tra due segnali di

energia, intendendo che tale tipo di affinità sia misurata dal massimo del valore assoluto della

funzione di indice di intercorrelazione.

Correlando un segnale d’energia con se stesso si ottiene la funzione di autocorrelazione temporale.

La funzione di autocorrelazione evidenzia per ogni τ la diminuzione dell’affinità in senso stretto, ossia

la memoria del segnale, rispetto alla piena correlazione che si ha per τ=0.

8.4. Affinità tra sequenze Per una data coppia di sequenze x(n) e y(n), si definiscono le sequenze della variabile indipendente

interna ν:

y��(�) ≡ �⨂f = " ∙ H �(G + �) ∙ f∗(G)E

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

56

Denominate sequenze di intercorrelazione temporale di energia.

Da notare che T rappresenta l’intervallo di campionamento

Nel caso x(n) y(n) si ottengono le corrispondenti sequenze di autocorrelazione.

8.5. Correlazione tra segnali Matlab mette a disposizione la primitiva “conv” (in Scilab è “convol”) che consente di effettuare la

convoluzione discreta tra due segnali (i dettagli sull’operazione di convoluzione verranno trattati

ulteriormente in seguito) come segue:

fA = H ℎE ∙ �AUEnS

ETUS

L’operazione di convoluzione viene solitamente indicata nella letteratura con l’operatore × oppure

“*”, quest’ultimo da non confondersi con il * del Matlab (moltiplicazione semplice). Per utilizare

l’operatore conv al fine di calcolare la correlazione, si può facilmente dimostrare che:

���(�) = �(�) ∗ �∗(−�) = � ∙ ������∗(�), �(−�)�

In particolare la prima uguaglianza è data dalla relazione tra correlazione e convoluzione, e l’ultima

uguaglianza è dovuta al passaggio da un’operazione di integrazione nel continuo alla sommatoria

(“conv” del matlab), a cui, come già introdotto, si deve moltiplicare l’intervallo di campionamento T.

NoteNoteNoteNote

1- È molto importante ricordare la proprietà: Cxy(τ)=Cyx*(-τ) dove la prima lettera nel pedice del

simbolo di intercorrelazione indica il segnale che si trasla2.

2- Considerando che si utilizza la primitiva “conv”, vale la seguente proprietà: se nel calcolo

analitico viene traslata la “x”, nel calcolo della “conv” occorre invertire la “y” e viceversa.

A questo punto rimane da associare al vettore di intercorrelazione “Cxy” dei valori ottenuti con la

“conv”, il vettore della variabile “τ” corretto. A tale proposito possono essere fatte alcune

considerazioni:

• La cosa più importante è determinare il primo punto per cui Cxy(τ) è definita. Tale

valutazione deve essere effettuata graficamente.

• La “Cxy” inizia ad assumere valori non nulli quando il fronte sinistro del segnale che viene

traslato coincide con il fronte destro del segnale mantenuto fisso .

• La durata della funzione “Cxy” è data dalla somma delle durate dei due segnali “x” e “y”.

• La lunghezza del vettore “τ” deve essere uguale a quella del vettore “Cxy”.

• Il passo deve essere uguale a quello dei segnali “x” e “y”.

2 Dimostrazione proprietà della intercorrelazione:

y��(�) ≡ �⨂f = " ∙ H �(G + �) ∙ f∗(G)E

= " ∙ �H f(G) ∙ �∗(G + �)E

�∗ ≝ " ∙ �H f(G� − �) ∙ �∗(G�)E

�∗

= �y��(−�)�∗

SuggerimentoSuggerimentoSuggerimentoSuggerimento

Per semplificare l’operazione di calcolo e verifica dell’inizio A dell’intervallo di validità del dominio

della correlazione, si può ricorrere alla considerazione che se le due funzioni sono definite sullo stesso

identico dominio simmetrico, la correlazione si estenderà sempre su un dominio dall’estensione

doppia. Quindi se x e y sono definite entrambe tra -10 e 10 (eventualmente assumendo anche valori

nulli), la loro correlazione sarà definita tra -20 e 20.

In generale per impostare il vettore tau che occorre per effettuare il plot della correlazione si ha:

>> tau = A + (0:length(Cxy)-1)*T;

A sarà un valore scalare da valutare a seconda dei domini coinvolti. Nella pratica, A è la somma

dell’estremo sinistro del dominio del primo segnale e dell’estremo destro, cambiato di segno, del

secondo. In particolare supponendo che il segnale x sia definito su tx, il segnale y su ty, la correlazione

Cxy inizierà a partire da tau = A con:

>> A = tx(1) - ty(end)

8.5.1. Esempio

Dati i seguenti segnali �(�) = >�F� Z:U�� ^ e f(�) = �U|_|� :

1. Disegnare i due segnali;

2. Calcolare analiticamente la correlazione incrociata e disegnarne l’andamento (evidenziare i

diversi contributi con colori diversi);

3. Calcolare la correlazione incrociata tramite Matlab e verificarne la coincidenza con la funzione

ottenuta analiticamente.

Punto 1)

Rappresentazione del segnale y(t)

Scelta dell’intervallo di campionamento “dt”: sufficientemente piccolo da non distorcere il segnale

>> dt=0.001;

Il segnale ha durata infinita. Occorre considerare un intervallo sufficientemente grande da

comprendere la parte del segnale a cui è associabile la quasi totalità della sua energia (i.e. 98%). Si

sceglie l’intervallo tra -20 e 20. Inoltre il segnale può essere suddiviso in due parti sulla base del segno

del modulo (o può essere rappresentato in un unico comando usando abs()).

>> ty1 = -20:dt:0;

>> y1 = exp(ty1/2);

>> ty2 = dt:dt:20;

>> y2 = exp(-ty2/2);

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

58

Si può ottenere il segnale complessivo unendo i due vettori corrispondenti alle due parti del segnale:

sia il vettore temporale sia il vettore del segnale:

>> ty = [ty1 ty2]; y=[y1 y2];

Si può quindi graficare il segnale y(t) per verificare che sia stato correttamente definito.

Successivamente, si può passare alla rappresentazione del segnale “x(t)”, che è una “rect” di ampiezza

unitaria tra 0 e 2. Si decide di rappresentare la rect solamente dove è definita diversa da 0.

>> tx = 0:dt:2;

>> x = rett_td(tx,1,2);

Rappresentazione dei due segnali sovrapposti applicando stili diversi (utilizzo della funzione di plot

con area, per maggiori dettagli consultare l’help):

>> area(tx, x,'FaceColor','g')

>> axis ([-20 20 0 1.5])

>> hold on

>> grid

>> plot(ty, y);

Figura 21: Segnale x(t) e y(t) sovrapposti (su cui si effettuerà la correlazione)

Punto 2)

y��(z) = { �(� + z) ∙ f∗(�) ∙ ��

si deve traslare la “rect” e sulla base del valore di “ ” è possibile individuare tre diversi casi.

Caso 1: z > 2

y��(z) = { � :� ∙ �� = 2 ∙ �� :��U�U�n� = 2 ∙ g�U�n�� − �U��h = 2 ∙U�n�

U��U�� ∙ (� − 1)

Caso 2: 0 < z < 2

y��(z) = { � :� ∙ �� + { �U:� ∙ ��U�n��

= 2 ∙ ��:��U�� − 2 ∙ ��U:���

U�n� = 4 − 2 ∙�U�

�U�� − 2 ∙ ���U�

Caso 3: z < 0

y��(z) = { �U:� ∙ �� = −2 ∙ ��U:��U�U�n� = −2 ∙ g��U�� − ���h = −2 ∙U�n�

U���� ∙ (�U� − 1)

A questo punto si può graficare la funzione di intercorrelazione risultante composta da tre “pezzi”:

>> clear, clc, dt=0.001;

� < �

>> t1 = -40:dt:0;

>> x1 = -2 * exp(t1/2)*(exp(-1)-1);

� < � < �

>> t2 = dt:dt:2;

>> x2 = 4-2*exp(-t2/2)-2*exp((t2/2)-1);

� > �

>> t3 = dt+2:dt:40;

>> x3 = 2*exp(-t3/2)*(exp(1)-1);

Quindi, è possible disegnare i tre segmenti della funzione di intercorrelazione con colori diversi:

>> plot(t1,x1,t2,x2,t3,x3)

>> xlabel('tau');

>> grid

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

60

Figura 22: Correlazione analitica (grafico di 3 contributi)

Punto 3)

Calcolo dell’intercorrelazione tramite Matlab.

Poiché si vuole sfruttare la primitiva dell’operazione “convoluzione”, occorre considerare la proprietà

per cui:

Cxy(tau) = x(t)*y*(-t)

Quindi la prima operazione da fare è ribaltare e coniugare il secondo segnale. Ma essendo y(t) pari e

reale, non occorre fare nulla. Se questa caratteristica dovesse averla invece la x(t), potremmo fare la

Cyx(tau), e solo dopo utilizzare le proprietà della correlazione (che comunque prevede il ribaltamento

e coniugazione).

>> dt = 0.001; % molto piccolo per avere errore limitato

>> ty1 = -20:dt:0;

>> y1 = exp(ty1/2);

>> ty2 = dt:dt:20;

>> y2 = exp(-ty2/2);

>> ty = [ty1 ty2]; y=[y1 y2];

Definizione del segnale “x”

>> tx = 0:dt:2; x = rett_td(tx,1,2);

Ora si può passare al calcolo della convoluzione:

>> Cxy = dt*conv(x,y);

Quindi rimane da definire il nuovo intervallo della variabile indipendente:

>> A = -20; % primo valore per cui il rect ribaltato e traslato incontra la

curva, ovvero somma dell’estremo sinistro del rect e di quello destro

dell’esponenziale cambiato di segno (0 – 20)

>> tau = A + (0:length(Cxy)-1) * dt;

Si può quindi andare a sovrapporre il risultato ottenuto ora con quello ottenuto analiticamente in

precedenza (3 segmenti), comparandolo (superficie piena) con la curva, che risultano coincidenti:

>> hold on;

>> area(tau, Cxy, 'FaceColor', 'g');

Figura 23: Confronto correlazione analitica e “conv” Matlab

8.6. Esercitazione 4 Segnali ripetizione e correlazioni.

8.6.1. Esercizio 1 1) Disegnare l’andamento temporale e calcolare la potenza del segnale f(�) = >�rs.f�(�)/

dove: f�(�) = v(4 & ��� 44 u � u 0

4 4 ��� 0 u � u 4

0 ��>�x�

Nei seguenti casi:

1. T = 4;

2. T = 8.

2) calcolare la correlazione incrociata (funzione di intercorrelazione y��V(z) ) di f�(�) con la funzione

�(�) = >�F� Z:d^ sia analiticamente sia tramite le primitiva “conv”. Inoltre, disegnare la funzione di

indice in intercorrelazione G��V(z).

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

62

8.6.2. Esercizio 2 Disegnare l’andamento temporale del segnale f(�) = >�r� d� .f�(�)/ dove:

f�(�) =);*;+g12 + �h� − 12 ≤ � ≤ 0

g12 − �h� 0 ≤ � ≤ 120 ��>�x�

Calcolare quindi la correlazione incrociata (funzione di intercorrelazione y��V(z) ) di f�(�) con la

intercorrelazione y��V(z) tramite le primitiva “conv”. Come sarà la funzione di intercorrelazione y��(z) ?

8.6.3. Esercizio 3

Dato il segnale: f(�) = cos Z\:� ^ ∙ >�F� Z:�^, se ne disegni l’andamento. Graficare la correlazione

incrociata y��(z) con �(�) = � ∙ >�F�(2� − ��) tramite le primitiva “conv”. Calcolare il valore

dell’energia mutua L��

8.6.4. Esercizio 4

Dato il segnale �(�) = (1 − ��) ∙ >�F�(:�): se ne disegni l’andamento e si calcoli l’autocorrelazione y��(z) tramite le primitiva “conv”. Che valore assume tale autocorrelazione in 0?

8.6.5. Esercizio 5 Disegnare l’andamento temporale e calcolare la potenza del segnale: f(�) = >�ri.f�(�)/ dove:

f�(�) = �U|:Ud|� ∙ >�F�(� − 48 )

8.6.6. Esercizio 6 Disegnare l’andamento temporale del segnale: �(�) = (1 − ��) ∙ >�F�(� − 1)

Quindi calcolare la correlazione incrociata : �(�) con la funzione f(�) = >�F�(� − 1) tramite le

primitiva “conv”. Inoltre, disegnare la funzione di indice in intercorrelazione.

9. Symbolic Math Toolbox Il “Symbolic Toolbox” fornisce gli strumenti per gestire il calcolo simbolico in ambiente MATLAB. In

particolare, consente di svolgere diverse operazioni matematiche.

Tipo di operazioni Operazioni

Calcolo Derivate, integrali, limiti, sommatorie, sviluppi in serie di Taylor

Algebra Lineare Operazioni sulle matrici: calcolo matrice inversa, calcolo del determinante, ecc.

Semplificazioni Metodi per la semplificazione di espressioni algebriche

Soluzioni di equazioni Soluzioni di equazioni numeriche e differenziali

Trasformate Fourier, Laplace, Trasformata Z, e le corrispondenti trasformate inverse

Funzioni matematiche speciali Le più importanti funzioni speciali applicate in matematica: Bessel, Beta, Binomiale, ecc.

Per informazioni dettagliate sul “Symbolic Toolbox” consultare l’”help”, ad esempio:

>> help <function>;

dove “function” è il nome della funzione, ad esempio

>> help subs

Poiché molte funzioni simboliche “overload” funzioni numeriche di MATLAB, si può digitare in

alternativa:

>> help sym/<function>;

Gli oggetti simbolici, rappresentati con “sym”, sono una nuova struttura dati fornita da MATLAB a cui

vengono associati un riferimento di tipo stringa (simbolo). Il comando “sym” consente quindi di creare

variabili ed espressioni simboliche. Vengono in seguito riportati alcuni esempi per evidenziare le

proprietà e le potenzialità degli oggetti simbolici, per alcune delle funzionalità previste.

9.1. Realizzazione di una funzione Supponiamo di voler agire sulla generica funzione quadratica: . L’espressione:

>> f = sym('a*x^2 + b*x + c');

consente di assegnare alla variabile “f” l’espressione simbolica , considerata come

una stringa. Ovviamente, in questo caso le variabili simboliche corrispondenti ai termini

dell’espressione non sono state create e verranno considerate come parametri “costanti”. Se si

vogliono effettuare operazioni matematiche su “f” (sostituzione di variabili, valori reali, integrazione,

derivazione, ecc.) conviene esplicitamente dichiarare le variabili come variabili simboliche:

>> a= sym('a');

>> b= sym('b');

>> c= sym('c');

>> x= sym('x');

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

64

oppure:

>> syms a b c x

In questo modo possiamo assegnare le variabili simboliche e dichiarare la funzione senza apici:

>> c = sym(5); % equivalente a x = 5.

>> f = sym(a*x^2 + b*x + c) %notare scrittura senza apici/stringa

f =

a*x^2 + b*x + 5

9.2. Variabili simboliche reali ed immaginarie Il comando “sym” consente di specificare le proprietà matematiche della variabile simbolica,

utilizzando l’opzione “real”. In particolare le seguenti espressioni:

>> x= sym('x', 'real');

>> y= sym('y', 'real');

oppure:

>> syms x y real;

crea variabili simboliche “x” e “y” simboliche. Quindi, definendo la variabile complessa

>>z=x+iy;

I comandi “conj(x)”, “conj(z)”, expand(z*conj(z)” ritornano rispettivamente: “x”, “x-iy”, “x2+y2”.

9.3. Operazione si sostituzione (subs) Tramite gli oggetti simbolici è possibile creare funzioni astratte del tipo “f(x)”:

>> syms f(x);

Si definisce un questo modo una funzione simbolica (nel workspace f è una “symfun”), rappresenta

dalla “f(x)” che può essere manipolata come una funzione. Come esempio possiamo calcolare il

differenziale “df”:

>> df = (subs(f(x),'x','x+h')-f(x))/'h'

Gli apici sono necessari in quanto i parametri h ed x non sono definiti a loro volta come variabili

simboliche (o valori reali) per cui si devono specificare come “stringhe”. Se avessimo definito tutti i

simboli, il risultato equivalente può essere ottenuto anche con:

>> syms f(x) x h;

>> df = (subs(f,x,x+h)-f)/h

df =

(f(x+h)-f(x))/h

Senza passare per la definizione formale di una f(x), possiamo scrivere in questo altro esempio di

sostituzione:

>> syms f x a;

>> f = 2*x + a;

>> f2 = subs(f,x,x+3)

f2 =

a + 2*x + 6

Infine, la subs può essere utilizzata per restituire il valore di una funzione in un punto:

>> syms F x;

>> F = 2*x + atan(x);

>> subs(F,x,1)

ans =

2.7854

9.4. Derivate Data una funzione “f” creata per mezzo di oggetti simbolici, MATLAB consente l’operazione di derivata

attraverso un semplice comando: “diff(f)”. Per chiarire la procedura di derivazione è in seguito

riportato un esempio completo, riguardante la derivata della funzione “sin(a*x)”.

>> syms a x;

>> f=sin(a*x); %f è simbolica per assegnazione

>> df=diff(f)

la variabile “df” ritorna:

df =

cos(a*x)*a

“x” viene considerata per default la variabile indipendente. Se si vuole effettuare la derivata rispetto

alla variabile “a”:

>> dfa=diff(f,a);

dfa =

cos(a*x)*x

9.5. Integrali Se “f” è un’espressione simbolica, il comando “int(f)” consente di determinare un’altra espressione

simbolica “F”, che rispetta la seguente condizione:

diff(F)=f;

La variabile “+c” che solitamente si include negli integrali indefiniti viene omessa nel risultato.

Sono validi i seguenti comandi:

- int(f,v): ritorna l’integrale indefinito di “f” usando come variabile di integrazione “v”;

- int(f,v,a,b): calcola l’integrale di “f” per “v” che va da “a” a “b”.

Ad esempio l’integrale indefinito rispetto alla x:

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

66

>> f=(x+2)^(1/3);

>> F=int(f)

F =

(3*(x + 2)^(4/3))/4

Per un integrale definito, rispetto alla t, nell’intervallo tra 0 ed x, scriveremo:

>> syms f x t;

>> a = 2;;

>> f=a*x^2 + a*t*x-t^2 ;

>> F=int(f,t,0,x)

F =

(8*x^3)/3

9.1. Fattorizzazione ed espansione E’ possibile forzare una variabile simbolica ad una versione fattorizzata (semplificata) o espansa,

qualora possibile. I comandi da usare sono expand e simplify:

>> syms f x

>> f=(x+2)^3

f =

(x + 2)^3

>> expand(f)

ans =

x^3 + 6*x^2 + 12*x + 8

>> %%%%%%%%%%%%%%%%%%%%%

>> clear;clc

>> f=(x^4 - 2*x^2)

f =

x^4 - 2*x^2

>> simplify(f)

ans =

x^2*(x^2 - 2)

9.2. Grafico di funzioni simboliche (ezplot) Il comando ezplot disegna variabili simboliche (o stringhe), assumendo per prima come variabile

dipendente la x e successivamente la y, la z e poi altri parametri lasciati non definiti nella funzione. E’

possibile come secondo parametro specificare un vettore di coordinate per gli assi (simile al comando

axis):

>> syms f x y

>> f = sym('x^2+y^2 - 4'); ezplot(f,[-3,3,-2.5,2.5])

Figura 24: ezplot di funzione in x e y

Provare successivamente i seguenti comandi di esempio per sovrapporre più curve:

>> f = sym('x^2+y^2 - 4'); ezplot(f,[-3,3,-2.5,2.5])

>> hold on

>> f = sym('(x-1)^2+(y-0.4)^2 - 0.2'); ezplot(f)

>> f = sym('(x+1)^2+(y-0.4)^2 - 0.2'); ezplot(f)

>> f = sym('(x^2+ (y-0.4)^2 - 2) * heaviside(-y-0.6)'); ezplot(f)

9.1. Rect simbolica Segnale e-|x| moltiplicato per una rect centrata in 1 e di base 2 (ricorso alla funzione gradino ideale che

si chiama heaviside per ottenere una rect tra 0 e 2):

>> syms f x y

>> f=(heaviside(x) - heaviside (x-2)) * exp(-abs(x))

>> ezplot(f,-3,3)

Figura 25: ezplot di funzione per rect simbolico (heaviside)

x

y

x2 + y2 - 4

-3 -2 -1 0 1 2 3-2.5

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

2.5

-3 -2 -1 0 1 2 3

0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

x

-exp(-abs(x)) (heaviside(x - 2) - heaviside(x))

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

68

9.2. Integrazione con Erfc e calcolo area Si consideri la seguente espressione:

�U(E�)�

Rappresentante la generica curva “gaussiana” che tende a 0 per � → ±∞, ∀G reale. Si può definire

“k” come una costante reale (assegnata ad una variabile simbolica). Ad esempio:

G = 1√2

È possibile generare la corrispondente funzione “f(x)” con i seguenti comandi:

>> syms x;

>> k = sym(1/sqrt(2));

>> f = exp(-(k*x)^2);

>> ezplot(f)

Dove “ezplot(f)” è il comando che consente di graficare funzioni simboliche già visto in precedenza.

Figura 26: ezplot di gaussiana

Come noto, l’integrale non è risolvibile in forma chiusa, ma tramite la definizione della funzione “Erfc”:

L>�F(�) = �√\ � �U��S 

Coerentemente con quanto detto, l’integrale calcolato simbolicamente, dà come risultato:

>> F = int(f, x);

Fi =

1/2*pi^(1/2)*2^(1/2)*erf(1/2*2^(1/2)*x)

Mentre il valore dell’integrale da −∞ a +∞ può essere calcolato tramite:

>> F = int(f, x,-inf,inf);

Se è necessario risalire al valore numerico dell’integrale, si può forzare il risultato a double(.):

>> area = double(int(f, x,-inf,inf))

9.3. Limiti (limit) Dato il seguente limite, si può risolvere simbolicamente come segue:

lim�→� gsin (��)� h

>> syms x a; value = limit(sin(a*x)/x,x,0)

value =

a

Un ulteriore esempio di limite da sinistra o destra:

>> tan_destra = limit(tan(x),x,pi/2,'right')

Limite ad infinito:

lim�→S Z1 + ��^�

>> syms x a; value = limit((1+a/x)^x,x,inf)

9.4. Soluzioni (Solve) Trovare la soluzione di ��� + ¡� + F = 0

>> syms x a b c; eq = 'a*x^2+b*x+c = 0', [x]=solve(eq,x)

Trovare la soluzione di ��� = 3f

>> syms x y; eq = 'exp(2*x) = 3*y', [x] = solve(eq, x)

Trovare la soluzione dell’iniseme di equazioni lineari seguenti:

v 2� − 3f + 4£ = 0f + 4£ + � = 0−2£ + 3� + 4f = 0

>> syms x y z;

>> eq1 = '2*x-3*y+4*z = 5'

>> eq2 = 'y+4*z+x = 10'

>> eq3 = '-2*z+3*x+4*y = 0'

>> [x,y,z] = solve(eq1,eq2,eq3,x,y,z)

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

70

9.5. Sommatorie (symsum)

>> clear; clc; syms k x; symsum((1/k^2), k, 1, Inf)

∑∞

=

+

+−

0k

1k2k

)!2k2(

x)1(

>> syms k x; symsum((-1)^k*x^(2*k + 1)/sym('(2*k + 1)!'), k, 0, Inf)

9.6. Taylor Sviluppo in serie di Taylor di ex nell’intorno di x = 3 fino al quinto ordine:

>> syms x; Tay_expx = taylor(exp(x), x, 'ExpansionPoint', 3, 'Order', 5)

E’ possibile quindi graficare la funzione originale ed il suo sviluppo polinomiale appena ottenuto

(Taylor):

>> ezplot(Tay_expx), hold on, ezplot(exp(x)), hold off

Figura 27: Funzione e suo sviluppo di Taylor nel punto 3

-4 -3 -2 -1 0 1 2 3 4 5 6

0

50

100

150

200

250

x

exp(x)

∑∞

=12

1

kk

10. Convoluzione tra segnali L’operazione di convoluzione è un’operazione fondamentale nella teoria dei segnali. In particolare,

qualsiasi sistema lineare tempo invariante LTI si può caratterizzare completamente tramite la sua

risposta all’impulso “h(t)”. Di conseguenza, la risposta ad una qualsiasi generica sollecitazione “x(t)” si

può calcolare come:

f(�) = �(�) ∗ ℎ(�) = { ℎ(z) ∙ �(� − z)nSUS �z

MATLAB consente di rappresentare segnali discreti tramite la definizione di vettori. Quindi segnali

continui possono essere semplicemente approssimati tramite sequenze di campioni. In seguito è

mostrato come svolgere l’operazione di convoluzione tra due segnali campionati ottenendo in tal

modo la versione campionata del segnale in uscita.

Inoltre, determinando analiticamente gli estremi di integrazione sarà calcolata la convoluzione tramite

integrazione delle funzioni rappresentanti i segnali.

10.1. Convoluzione discreta L’operazione di convoluzione discreta è realizzata in matlab con l’operatore conv già adttato per le

correlazioni: conv(x,h)con “x” (segnale), “h” (risposta impulsiva del filtro) vettori. Tale operazione

effettua la convoluzione discreta tra le sequenze “xk” e “hk”, secondo la definizione:

fA = H ℎE ∙ �AUEnS

ETUS

In realtà, i due vettori MATLAB “x” e “h” saranno finiti, quindi tutti gli elementi della sommatoria non

definiti vengono posti uguali a 0. Inoltre se “x” contiene N elementi e “h” ne contiene M, il vettore “y”

restituito sarà di lunghezza pari a N+M-1.

Poiché vengono trattati segnali continui campionati con passo δT, la relazione di convoluzione può

essere riscritta come segue:

L’uguaglianza diventa esatta a patto di utilizzare un passo di discretizzazione T sufficientemente

piccolo. Si può dimostrare che occorre:

Dove Bh e Bx sono le bande di h(t) e x(t) rispettivamente. Per l’utilizzo della conv, così come per la

correlazione, occorre quindi moltiplicare il risultato per l’intervallo δT di discretizzazione.

10.1.1. Esempio Considerando i segnali rappresentati in figura (h(t) e x(t)) calcolare y(t)=h(t)*x(t).

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

72

Figura 28: Esempio convoluzione discreta

Il primo passo è quello di definire i vettori dei tempi per i due segnali. Si prenda come periodo di

campionamento T, un valore arbitrario (bisognerebbe conoscere la banda dei due segnali per una

scelta adeguata). Per iniziare si consideri T=1 ms.

>> th = 1:0.001:2;

>> tx = 3:0.001:4;

Occorre quindi ricavare le equazioni delle due rette in funzione di “th” e “tx” rispettivamente:

>> h = -2*th+4;

>> x = 4*tx-12;

A questo punto, considerando il passo di campionamento scelto, si ottiene y(ty) attraverso il

comando “ *conv(x,h)”:

>> y = 0.001*conv(x,h);

A questo punto rimane da associare a “y” il suo asse dei tempi corretto “ty”. Il primo campione di “y”

corrisponde all’istante “th(1)+tx(1)” (vedi similmente il parametro A della correlazione), il passo di

campionamento per “y” rimane sempre e la lunghezza di “y” è N+M-1. Quindi:

>> ty = (th(1)+tx(1))+(0:length(y)-1)*0.001;

Tale procedura è stata ripetuta per altri due valori di T: 10 ms e 100 ms ed in seguito graricato il

risultato. Quello che emerge dal grafico è che:

- =10 ms < intervallo di Nyquist, la rappresentazione di “y” è soddisfacente;

- =100ms > intervallo di Nyquist, la rappresentazione di “y” non è soddisfacente.

Figura 29: Risultati convoluzione discreta con differente campionamento

10.2. Convoluzione nel continuo (Symbolic toolbox) Sebbene il calcolo simbolico semplifichi la realizzazione di operazioni complesse su funzioni, il suo

funzionamento per il calcolo di convoluzioni o correlazioni (molto più complesso degli esempi di

calcolo simbolico visti in precedenza) è solo garantito a partire dal MATLAB 2016 e successivi.

Ad esempio la convoluzione del segnale �(�) = >�F�(:U�� ) con sé stesso (ossia un “Tri” centrato in 2),

mediante l’uso del symbolic toolbox, si può esprimere come:

>> syms t tau

>> f = heaviside(t) - heaviside (t-2);

>> z = int(subs(f,tau)*subs(f,t-tau),tau,-inf,inf);

>> z = simplify(z)

>> ezplot(z)

Solo se si dispone di MATLAB 2016 o successivi, eseguendo tali comandi si ottiene: z =

heaviside(t - 4)*(t - 4) - 2*heaviside(t - 2)*(t - 2) + t*heaviside(t)

ed il seguente grafico.

Figura 30: Convoluzione con Symbolic toolbox e MATLAB 2016

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

74

Se si tenta di eseguire una convoluzione ad esempio con MATLAB 2012, nella migliore delle ipotesi si

ottiene il Messaggio Warning: Explicit integral could not be found; eseguendo il codice precedente, il

risultato non viene trovato e z risulta NaN. Se una delle funzioni per eseguire il calcolo della

convoluzioni non è banale, ad esempio �(�) = ��n: ∗ >�F�(:U�� ) , il MATLAB 2012 addirittura si può

bloccare senza restituire nulla.

In ogni caso, questo calcolo è molto impegnativo anche per il MATLAB 2016, che impiega alcune

decine di secondi su un PC fisso per completare. Per questo motivo e per lo scopo della presente

dispensa, orientata sì ai segnali ma nella applicazione specifica nel mondo numerico, si considera per

l’operazione di convoluzione il solo equivalente numerico presentato in sezione 10.1.

10.3. Esercitazione 5 Convoluzione di segnali in ingresso a filtri.

10.3.1. Esercizio 1 Determinare la risposta y(t) di un sistema lineare con risposta impulsiva pari a:

al segnale in ingresso attraverso la convoluzione discreta.

10.3.2. Esercizio 2 Calcolare e graficare la convoluzione discreta di x con y definiti come segue:

10.3.3. Esercizio 3

Dato il segnale , disegnarne l’andamento. Quindi calcolare la convoluzione

con il segnale .

10.3.4. Esercizio 4

Dato il segnale �(�) = (1 − ��) ∙ >�F�(:d) che transita nel filtro con risposta impulsiva ℎ(�) =>�F�(:U�d ), determinare il segnale all’uscita del filtro.

11. Trasformata di Fourier Un segnale x(t), funzione del tempo, può essere associato ad un segnale X(f), funzione della frequenza,

che serve a rappresentare x(t) come combinazione lineare di armoniche complesse. L’operatore che

calcola X(f) a partire da x(t) si chiama Trasformata di Fourier:

L’operatore Trasformata di Fourier Inversa, o Antitrasformata, consente di ottenere x(t) a partire da

X(f):

11.1. Trasformata di Fourier discreta Come visto in precedenza, MATLAB consente soltanto di approssimare segnali continui con sequenze.

Quindi è possibile calcolare, a partire dalla sequenza x(n ), una sequenza X(kν) che descrive la X(f)

su un vettore di punti equispaziati in frequenza con passo ν. Analogamente a quanto visto per le

convoluzioni, occorre approssimare un integrale con una sommatoria; tale somma sarà poi di durata

finita, in quanto il segnale x(t), avendo durata limitata sarà rappresentato da un vettore di N campioni:

Occorrerà valutare quale passo di frequenza è adeguato, e se l’approssimazione dell’integrale con una

somma finita genera un errore trascurabile oppure no. In definitiva, i gradi di libertà a disposizione

sono: il passo di discretizzazione e l’intervallo N* su cui si osserva il segnale x(t).

L’operazione di sommatoria finita può essere realizzata facilmente con MATLAB, sfruttando una

funzione predefinita, “FFT”, che restituisce la Trasformata Discreta di Fourier di una sequenza xn:

Per ricavare X(kν), è quindi sufficiente calcolare Xk alla sequenza x(nT) e moltiplicare per . Si ottiene

così X(kν) con passo . In definitiva, la Trasformata Discreta di Fourier si basa sul fatto che

sequenze di impulsi con passo , periodiche di periodo N , hanno come trasformate sequenze di

impulsi di passo , periodiche di periodo .

Analogamente è possibile calcolare la Trasformata Discreta di Fourier Inversa “FFTI”:

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

76

MATLAB mette a disposizione due funzioni predefinite per eseguire le suddette operazioni: “fft.m” e

“ifft.m” che implementano (in modo “efficiente”= “fast”) rispettivamente la trasformata e la

trasformata inversa di Fourier discreta. La convenzione assunta da “fft.m” e “ifft.m” è che il primo

campione di x, x(1), è quello che corrisponde a t=0 e che il primo campione di X, X(1) è quello che

corrisponde a f=0.

La prima operazione da effettuare con MATLAB è definire il vettore tempo t e definire il rispettivo

vettore dei valori del segnale campionato x. Ad esempio:

>> dt = 0.01;

>> t = [-3: dt: 3];

>> x = triang_td(t, 0, 1.5);

Entrambe le sequenze sono lunghe “N” = 601. Occorre simulare la versione periodica di “x” e

considerare la finestra tra t=0 e t=(N-1)dt: tale sequenza può essere definita come “xshift”. Si consiglia

di visualizzare il grafico di tutte le sequenze intermedie ottenute prima di arrivare alla FFT.

Occorre individuare il campione che corrisponde a t=0, per rendere periodico il segnale a partire da 0:

>> N =length(x);

>> i0 =find(t==0);

>> xshift =[x(i0:N) x(1:(i0-1))];

Applicando la FFT a xshift e moltiplicando per il passo di campionamento dt si ottiene la sequenza X(f)

campionata, periodizzata, e nella finestra da 0 a Hz:

>> Xshift = fft(xshift)*dt;

Infine, è possibile spostare la finestra da - a tramite la funzione MATLAB “fftshift”:

>> X = fftshift(Xshift);

Rimane da definire il vettore delle frequenze associato a X. A tal proposito occorre calcolare il passo

di campionamento in frequenza ν, e quindi considerare la convenzione della “fftshift”, che in caso di

lunghezza pari della sequenza assegna un campione in più alle frequenze negative:

>> v = 1/N/dt;

>> f = (-N/2+(0:N-1))*v;

altrimenti se N è dispari (come nell’esempio presente), si ha un ugual numero di campioni per le

frequenze negative e positive:

>> f =(-(N-1)/2+(0:N-1))*v;

A questo punto non resta che visualizzare il risultato, che in generale sarà dato da un vettore X

complesso:

>> subplot(2,1,1), plot(f,abs(X));

>> subplot(2,1,2), plot(f,angle(X));

Ottenendo di fatto la trasformate del triangolo di esempio (tra -50 e 50 Hz), in modulo e fase:

Figura 31: Risultato della FFT di esempio

O in alternative se si è interessati alle parti reali ed immaginarie:

>> subplot(2,1,1), plot(f,real(X));

>> subplot(2,1,2), plot(f,imag(X));

Per l’antitrasformazione si procede in maniera analoga a partire dalla coppia f,X:

>> N=length(X);

>> i0=find(f==0);

>> Xshift=[X(i0:N) X(1:(i0-1))];

Nel calcolo della “x” è necessaria una moltiplicazione per N in quanto nella formula vista per il calcolo

dell’ “ifft” la sommatoria è divisa per N:

>> xshift =ifft(Xshift)*N*ν;

>> x =fftshift(xshift);

>> dt =1/N/ν;

>> t =(-N/2+(0:N-1))*dt; % se N è pari

>> t =(-(N-1)/2+(0:N-1))*dt; % se N è dispari

11.2. Osservazioni sul calcolo della fft La prima scelta da compiere riguarda il valore della variabile “dt” (passo di campionamento). Tale

valore deve essere sufficientemente piccolo, ma non eccessivamente da compromettere le capacità

di calcolo del Matlab. Il risultato può essere “sporcato” dal contributo delle repliche dello spettro che

sono fuori dall’intervallo considerato. Diminuire “dt” significa distanziare le repliche dello spettro, e

quindi mitigare questi effetti.

-50 -40 -30 -20 -10 0 10 20 30 40 500

0.5

1

1.5

-50 -40 -30 -20 -10 0 10 20 30 40 50-1

-0.5

0

0.5

1

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

78

Un altro grado di libertà è il numero di campioni “N” del segnale. Infatti, indipendentemente dalla

durata di x(t) (cioè dall’intervallo temporale in cui assume valori diversi da 0), è possibile ampliare la

lunghezza del vettore t aggiungendo campioni nulli di x. “N” impatta sul passo di discretizzazione delle

frequenze ν, e quindi sull’accuratezza con cui la sequenza X descrive la funzione continua X(f)

separandone le repliche “virtuali” del segnale periodico in tempo.

È possibile notare la dualità di “dt” e “N”: aumentare “N” significa spaziare maggiormente le repliche

nel tempo (per le proprietà della DFT il segnale processato viene sempre considerato periodico) e

ridurre il passo di frequenza ν; mentre ridurre “dt” significa spaziare maggiormente le repliche nelle

frequenze.

11.2.1. Esempio e confronto con la Trasformata Calcolo della trasformata della funzione (campionata) rect(t).

Ovviamente la prima cosa da fare è definire il segnale x(t)=rect(t) campionato, scegliendo un passo di

campionamento “dt” e il numero di campioni totali “N”.

>> dt=0.1;

>> t=-2:dt:2; % scegliendo di utilizzare 41 campioni

Quindi per ottenere i campioni del segnale x(t) (inclusi i campioni nulli necessari per separare le

repliche dello spettro della DFT):

>> x=rett_td(t,0,1);

Figura 32: Rappresentazione campionata del segnale x(t)=rect(t) con stem(t,x)

Quindi è possibile trasformare questo segnale seguendo la procedure descritta in precedenza:

>> N =length(x);

>> i0 =find(t==0);

>> xshift=[x(i0:N) x(1:i0-1)];

>> Xshift=fft(xshift)*dt;

>> X=fftshift(Xshift);

>> v=1/N/dt;

-2 -1.5 -1 -0.5 0 0.5 1 1.5 20

0.2

0.4

0.6

0.8

1

>> f=(-(N-1)/2+(0:N-1))*v;

>> figure

>> subplot(2,1,1), plot(f,real(X),'.-')

>> ylabel ('Re(X)')

>> subplot(2,1,2), plot(f,imag(X),'.-')

>> ylabel ('Im(X)')

Il risultato è mostrato in Figura 13.

Figura 33: FFT della funzione rect (parte Re ed Im)

Analizzando la componente immaginaria (Im[X]), è possibile rilevare una piccola presenza di

distorsione (10-16) dovuta alle approssimazioni introdotte per il calcolo della Trasformate di Fourier

mediante FFT.

Come verifica, è possibile confrontare il risultato ottenuto con il calcolo analitico della trasformata,

che nello specifico è una “sinc(x)” ,con la FFT come segue (solo modulo):

>> plot(f,real(X),'.-')

>> hold on

>> plot (f, sinc(f), 'r:')

>> legend('FFT', 'sinc(x)')

-5 -4 -3 -2 -1 0 1 2 3 4 5-0.5

0

0.5

1

1.5

Re(x

)

-5 -4 -3 -2 -1 0 1 2 3 4 5-1

-0.5

0

0.5

1

Im(x

)

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

80

Figura 34: Confronto FFT e sinc(x)

Tale errore è maggiore sulle frequenze più alte, data la periodicità della FFT. Andando ad intervenire

sul numero di campioni e/o il passo di campionamento, è possibile ottenere via via risultati più

accurati, come mostrato di seguito (notare che il massimo con dt=0.01 è ora pari ad 1, valore corretto

della sinc in 0).

Figura 35: FFT della funzione rect con dt=0.01 e N= 401

-5 -4 -3 -2 -1 0 1 2 3 4 5-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

1.2

FFT

sinc(x)

11.3. Esercitazione 6 Trasformate di Fourier discrete.

11.3.1. Esercizio 1 Graficare la trasformata di Fourier dei seguenti segnali, scegliendo un passo di campionamento ed una

finestratura del segnale adeguati. Verificarne la correttezza con l’andamento previsto della

trasformata, facendo riferimento alle proprietà della trasformata (ad es. il triangolo è dato dalla

convoluzione di due rect, e quindi dal prodotto di due sinc in frequenza). Infine stimare la banda del

segnale.

• x1(t)=tri(2t);

• x2(t)=tri(t/2);

• x3(t)=tri(t)*tri(t).

11.3.2. Esercizio 2 Graficare la trasformata di Fourier del seguente segnale:

11.3.3. Esercizio 3 Graficare la trasformata di Fourier del segnale:

11.3.4. Esercizio 4 Graficare l’antitrasformata di Fourier del seguente spettro:

Fare delle assunzioni circa il dominio delle frequenze.

Facoltativo: verificare la correttezza del grafico ottenuto confrontandolo con l’espressione analitica

dell’antitrasformata.

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

82

12. Teorema del campionamento

12.1. Enunciato “Un segnale a banda limitata da può essere univocamente ricostruito dai suoi campioni

presi a frequenza , se ”.

Il teorema del campionamento definisce la frequenza minima di campionamento di un segnale,

necessaria per evitare distorsioni dello stesso.

Dato un segnale, con larghezza di banda finita e nota, la frequenza minima di campionamento di tale

segnale deve essere almeno il doppio della sua massima frequenza

Il campionamento è un passo del processo di conversione analogico-digitale di un segnale. Consiste

nel prelievo di campioni (samples) da un segnale analogico e continuo nel tempo ogni Δt secondi. Δt

è l’intervallo di campionamento, mentre è la frequenza di campionamento. Il risultato è un

segnale analogico in tempo discreto.

12.2. Considerazioni relative al teorema del campionamento Nel caso in cui un segnale non sia limitato in banda, è sempre possibile limitarlo mediante un filtro

passa basso avente una frequenza di taglio pari a

Valutazione della frequenza di taglio :

• Si varia la frequenza di un filtro passa alto;

• Quando il rilevatore di potenza rileva il 2% (ad esempio) della potenza del segnale non filtrato,

si sceglie quella frequenza di taglio come banda del segnale .

Una volta determinata la frequenza di taglio è quindi possibile campionare correttamente il segnale

con un periodo di campionamento pari a:

.

Si noti che i campioni di un segnale limitato in banda non sono mai finiti. Quindi si può limitare il

segnale nel tempo per un rettangolo di durata T.

Di conseguenza, i campioni del segnale “tagliato” nel tempo:

Per convenzione si considera T come un multiplo di e non si considera il campione .

Ad un prodotto nel tempo corrisponde una convoluzione in frequenza, per cui:

Quindi l’operazione di finestratura nel tempo limita la risoluzione spettrale a . Quindi occorre

scegliere T in modo da contenere una porzione consistente del segnale. In particolare occorre

prendere , in modo tale che la risoluzione spettrale risulti molto minore di .

La convoluzione con la “sinc” porta ad una piccola perdita di risoluzione ed un leggero allungamento

dello spettro (con delle piccole code).

Con il campionamento nel tempo si passa da , moltiplicando per una sequenza di

“delta”:

L’integrale del treno dei “delta” è così fatto:

Dove:

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

84

Pertanto non c’è un’interferenza significativa tra le varie repliche.

Figura 36: Ricostruzione segnali tempo-frequenza

Per ottenere una versione discreta dello spettro X(f), basta eseguire un campionamento in frequenza

a cui corrisponde un segnale periodico nel tempo.

12.3. Rappresentazione in serie di funzioni ortogonali In analogia al caso dei segnali periodici (rappresentazione in serie di Fourier), sono possibili anche per

i segnali di energia rappresentazioni in serie temporali tramite l’uso di opportune funzioni ausiliarie.

Casi di particolare interesse si hanno quando le funzioni utilizzate appartengono ad un insieme

discreto, come nel caso dello sviluppo in serie di Fourier per segnali periodici

.

Lo spazio funzionale dei segnali d’energia, indicato con L2(T) dove il dominio di definizione T può

estendersi anche all’intero asse dei tempi, oltre che lineare e normale risulta uno spazio metrico una

volta definita la distanza tra due segnali generici x(t) e y(t) ad esso appartenenti:

Si supponga di disporre di un insieme discreto di funzioni , con pedice k=1,2,3,…N,

appartenenti a L2(T) e per cui valga la relazione di ortonormalità:

Considerando un segnale x(t), appartenente a L2(T) e definito per ogni valore di t nel dominio di T, a

partire dall’insieme si può ricostruire una sua rappresentazione in serie temporale, in

generale imperfetta, tramite la combinazione lineare delle funzioni ortonormali :

Dove i coefficienti , determinabili sulla base del criterio di minimizzare l’errore quadratico medio,

ossia di rendere minimo il quadrato della distanza , risultano dai prodotti scalari:

Si noti che per calcolare i coefficienti il segnale x(t) deve essere conosciuto sull’intero dominio T,

ossia la rappresentazione riguarda i segnali determinati.

L’insieme è ritenuto soddisfacente per rappresentare una certa classe di segnali x(t) se

l’accuratezza della rappresentazione migliora indefinitivamente all’aumentare del numero N delle

funzioni utilizzate; l’insieme ortonormale costituisce allora una “base” per la classe dei segnali

considerati. Si usa pertanto scrivere per N che tende all’infinito:

dove il passaggio dalla notazione a quella indica il verificarsi della situazione soddisfacente e il

segno di uguaglianza nella rappresentazione va inteso nel senso della approssimazione lineare in

media (si può asserire che i punti dove la rappresentazione non converge al valore del segnale sono

contenuti in un insieme di misura nulla rispetto a T). Si ha inoltre la proprietà:

Si pone in evidenza che per particolari classi di segnali può accadere che si ottenga la situazione

soddisfacente con un numero finito N di funzioni ortonormali; in tale caso l’insieme

costituisce un sistema completo, il numero finito N è denominato dimensione della base e la

rappresentazione assume la forma:

Nello spazio funzionale L2 si consideri l’insieme ortogonale delle funzioni reali, con durata illimitata e

parametro Tc generico:

Aventi il medesimo valore dell’energia . Con riferimento a qualsiasi segnale di energia

reale a durata illimitata, ossia appartenente al medesimo spazio L2, si ottiene la rappresentazione in

serie temporale in generale imperfetta:

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

86

Dove i coefficienti risultano reali e dati da:

Grazie alla particolare proprietà delle funzioni ortogonali considerate, per cui nell’istante la k-

esima funzione assume valore unitario e tutte le altre con hanno valore nullo. Quindi si ottiene

che per :

I coefficienti sono pertanto i valori istantanei della rappresentazione negli istanti equispaziati

Nell’intento di individuare le condizioni per cui la rappresentazione considerata diviene soddisfacente,

si evidenzia preliminarmente che bisogna assumere un numero N infinito di funzioni ortogonali, stante

la durata illimitata dei segnali da rappresentare. Con N infinito, si ottiene poi facendo tendere a 0

che la rappresentazione sia soddisfacente. Si ottiene infatti:

E poiché grazie alle proprietà delle funzioni considerate si ha anche , risulta che la

rappresentazione ha in istanti estremamente ravvicinati gli stessi valori del segnale x(t), così da

consentire di porre (almeno per ):

Dove i coefficienti reali sono i valori del segnale x(t), o campioni del segnale:

Negli istanti di campionamento equispaziati .

La rappresentazione sopra considerata, dovuta a Nyquist, è soddisfacente con non infinitesimo per

una classe assai ampia di segnali di energia reali a durata illimitata, purché si scelga non maggiore

di un determinabile valore limite superiore , denominato intervallo di Nyquist. La suddetta

rappresentazione in serie temporale ricostruisce dunque il segnale per interpolazione dei campioni

ad intervallo di campionamento , tramite infinite funzioni ottenute dall’impulso sinc per

traslazione temporale .

12.4. Esempio Supponiamo di campionare con ( ) il segnale:

per , e zero altrove. Decidiamo di campionare il segale su un intervallo tra -2 e 3.

>> dt=0.001;

>> t=-2:dt:3;

>> x=(sin(6*pi*t)+4*sin(3*pi*t)).^2;

>> x(find(t<0 | t>1))=0;%Stesso effetto moltiplicazione per rect

>> plot(t,x,':g');

>> Tc=0.25;

>> tc=t(1:(Tc/dt):end);

>> xc=x(1:(Tc/dt):end);

>> hold on

>> stem (tc,xc,'.r')

Figura 37: Segnale non adeguatamente-campionato

Indubbiamente la frequenza di campionamento scelta non sarà sufficiente per riuscire a ricostruire il

segnale di partenza (teorema del campionamento non rispettato).

Verifichiamo che infatti la ricostruzione fallisce, utilizzando il filtro pass-basso ideale.

Scegliamo il passo di discretizzazione del segnale ricostruito pari a quella del segnale di

partenza x(t), ovvero dt=0.001.

La funzione interpolante h(t) è un filtro passa-basso ideale con banda e sarà definita con lo stesso

passo dt di discretizzazione del segnale di partenza e di quello ricostruito:

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 30

2

4

6

8

10

12

14

16

18

20

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

88

Sappiamo che tale forma d’onda si estende molto a lungo nei tempi, e darà contributi alle somme per

ricostruire il segnale. Prendiamola limitata ad un intervallo molto esteso, ragionevolmente col tempo

di campionamento :

>> th=-50*Tc:dt:50*Tc;

>> h=sinc(th/Tc);

>> figure

>> plot(th,h)

>> axis ([-10 10 -0.3 1.2])

>> grid on

Figura 38: Segnale ricostruttore in tempo

Al fine di poter effettuare la convoluzione tra x(n ) e h(t), occorre sovra campionare x(n ) per

portarlo ad avere lo stesso passo di discretizzazione di h(t). Negli istanti che aggiungiamo si può porre

xc a zero (in modo da dare contributo nullo) prima di operare con la ricostruzione.

>> xc2=zeros(1,length(t));

>> xc2(1:(Tc/dt):length(xc2))=xc;

>> figure(3)

>> stem(t,xc2,'.r')

>> axis ([0.25 1.2 0 20])

>> grid on

-10 -8 -6 -4 -2 0 2 4 6 8 10

-0.2

0

0.2

0.4

0.6

0.8

1

Il risultato di questa operazione di sovracampionamento (inserendo zeri) è mostrata di seguito. E’

necessaria poiché abbiamo dovuto “forzatamente” definire una sinc per la ricostruzione con maggiore

risoluzione rispetto al tempo di campionamento del segnale.

Figura 39: Zoom del segnale sovracampionato (con aggiunta di zeri)

Una volta ottenuta la versione sovracampionata di xc, con zeri dove xc non era definita, è possible

effettuare la convoluzione (non occorre moltiplicare per dt, vedi sezione teoria):

>> xr =conv(h,xc2);

Non rimane che calcolare il nuovo vettore dei tempi del segnale ricostruito:

>> tr =th(1)+t(1)+(0:length(xr)-1)*dt;

Per visualizzare il tutto, riportando l’asse delle x sul dominio del segnale originario, tra -2 e 3 (la

versione ricostruita, data la lunghezza del sinc utilizzato, sarà molto maggiore):

>> figure(4)

>> hold on

>> plot(tr,xr)

>> stem(tc,xc,'.r')

>> plot(t,x,':g');

>> axis ([-2 3 -5 20])

0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.20

2

4

6

8

10

12

14

16

18

20

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

90

Figura 40: Ricostruzione non adeguata

Come si vede il segnale di partenza (tratteggiato), non adeguatamente campionato (stem), ha

prodotto una ricostruzione “ideale” estremamente differente (linea blu continua).

Ora riapplichiamo lo stesso procedimento al segnale campionato a 20 Hz. In sostanza l’unico

parametro che deve essere modificato è Tc che in questa seconda esecuzione viene impostato quindi

a 0.05. Tutto il resto dei comandi (inclusa la definizione della sinc e della risoluzione del segnale di

partenza e della sinc stessa) dovranno essere eseguiti nuovamente con questo nuovo valore,

producendo il seguente grafico.

Figura 41: Ricostruzione adeguata

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3

-2

0

2

4

6

8

10

12

14

16

18

20

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3

-2

0

2

4

6

8

10

12

14

16

18

20

Ora il segnale di partenza e la sua ricostruzione a partire dai campioni sono molto simili. Si può notare, come nei dettagli proposti di seguito, che:

• sul fronte sinistro, dove il segnale originario presenta una discontinuità, vi sono delle oscillazioni percettibili, che possono essere limitate diminuendo ulteriormente il tempo di campionamento.

• Il primo picco di massimo è pressochè fedelmente riprodotto, anche in assenza di un campione sul massimo (rispettata la condizione di Nyquist)

Figura 42: Dettaglio errore di ricostruzione

Viene infine riportato per completezza lo scarto assoluto tra il segnale di partenza e la sua ricostruzione basata su campioni estratti a 20 Hz. Questo valore risulta sempre minore di 0.4, valore relativamente basso rispetto ad un ampiezza massima del segnale di circa 19.

Figura 43: Valore assoluto errore di ricostruzione

-0.25 -0.2 -0.15 -0.1 -0.05 0

-0.6

-0.4

-0.2

0

0.2

0.4

0.6

0.8

1

0.05 0.06 0.07 0.08 0.09 0.1 0.11 0.12 0.13 0.14 0.159

10

11

12

13

14

15

16

17

18

19

-2 -1.5 -1 -0.5 0 0.5 1 1.5 2 2.5 3-0.4

-0.3

-0.2

-0.1

0

0.1

0.2

0.3

0.4

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

92

12.5. Esercitazione 7

12.5.1. Esercizio 1 Dato il segnale:

,

definito per tracciarne il grafico nel dominio del tempo e rappresentarlo nel dominio della

frequenza in modo da stimarne la banda. Quindi stimare la frequenza di Nyquist (fN).

Campionare il segnale alle seguenti frequenze:

1. ;

2. ;

3.

In tutti e tre i casi, ricostruire il segnale x(t) attraverso un filtro passa-basso ideale con banda limitato

all’intervallo .

12.5.2. Esercizio 2 Dato il segnale:

Tracciarne il grafico nel dominio del tempo e rappresentarlo nel dominio della frequenza in modo da

stimarne la banda. Quindi stimare la frequenza di Nyquist (fN).

Campionare il segnale alle seguenti frequenze:

1. ;

2.

In entrambi i casi ricostruire il segnale x(t) attraverso un filtro passa-basso ideale con banda limitato

all’intervallo .

13. Modulazione: un esempio Per quanto riguarda la trasmissione di un segnale del tipo Xn, Matlab con il tool Simulink mette a

disposizione una serie di blocchi che realizzano le principali modulazioni e demodulazioni. In ogni caso,

o qualora si voglia analizzare nel dettaglio un nuovo modello non presente, è possibile realizzare uno

script Matlab che processi “manualmente” il segnale con una serie di comandi associati alla

modulazione di interesse.

In tal senso, considerando l’elevato numero di modulazioni possibili, di modelli di rumore e di canale,

non è possibile affrontare l’argomento in maniera esaustiva in questo contesto.

Viene proposta a titolo di esempio una funzione che realizza la modulazione QAM di un segnale

campionato, a cui viene aggiunto rumore gaussiano bianco sulle componenti I/Q e successivamente

demodulato (ovvero viene valutata la posizione del simbolo, per la successiva decisione di

demodulazione). La funzione dovrà essere definita nel file in “Current Folder” qam.m:

function [seq_ric,decisione]=qam(L,sequenza,SNR);

% trasmissione QAM a L livelli.

% -----------------------------

L = floor(sqrt(L));

noise =(randn(size(sequenza))+i*randn(size(sequenza)))/SNR*sqrt(2);

seq_ric =(sequenza-(L-1)*(1+i)/2)*sqrt(2)+noise;

decisione=zeros(size(sequenza));

Simboli=( repmat([0:L-1],L,1)-(L-1)/2+i*(repmat([0:L-1]',1,L)-(L-1)/2)

)*sqrt(2);

for k=1:length(sequenza);

[val,pos]=min(abs(seq_ric(k)-Simboli(:)));

decisione(k)=Simboli(pos)/sqrt(2)+(L-1)*(1+i)/2;

end;

return;

La funzione può essere richiamata dal seguente script, che realizza una sequenza di partenza casuale

di 10000 simboli, grafica i simboli ricevuti e valuta le differenze tra simboli trasmessi e ricevuti

(decisione), espressa in termini di % di Simboli errati. La visualizzazione grafica risultante viene

riportata di seguito. E’ possibile intervertire su L (dimensione alfabeto dei simboli) e SNR (in ricezione)

per ottenere grafici e risultati differenti (script di Paolo Mazzucchelli).

% disegno della costellazione M-QAM

% ---------------------------------

L=2;

SNR=3.8;

Len=10000;

colmap=hsv(L^2);

cols=zeros(size(colmap));

for k=1:2:L^2-1;

cols(k,:)=colmap(k,:);

cols(k+1,:)=colmap(L^2-k+1,:);

end;

sequenza=floor(rand(1,Len)*L)+i*floor(rand(1,Len)*L);

[seq_ric,decisione]=qam(L^2,sequenza,SNR);

figure;

hold on;

for k=0:L-1;

for h=0:L-1;

Laboratorio di Segnali e Trasmissione – Zampognaro Roseti

94

X=find(real(sequenza)==k & imag(sequenza)==h);

plot(real(seq_ric(X)),imag(seq_ric(X)),'Marker','.','LineStyle','none','Col

or',cols(k*L+h+1,:));

end;

end;

plot((sequenza-(L-1)*(1+i)/2)*sqrt(2),'ko');

errori=length(find((decisione-sequenza)>1e-6));

title(['Simboli Errati [%]:',(num2str(errori/Len*100))]);

Figura 44: Ricezione simboli 4QAM attraverso canale Gaussiano bianco

-2.5 -2 -1.5 -1 -0.5 0 0.5 1 1.5 2-2.5

-2

-1.5

-1

-0.5

0

0.5

1

1.5

2

2.5Simboli Errati [%]:1.4