http://tomasella.altervista.org/it/matlab/

Matlab

Icona di Matlab

Presentazione

Questa pagina riassume alcuni comandi matlab attraverso alcuni esempi pratici. Alcune informazioni contenute in questa guida sono state tratte da altre guide che ho avuto modo di vedere in passato, molte altre dall'esperienza fatta con l'uso diretto di matlab, nonché dall'help che esso fornisce. Naturalmente per una spiegazione più dettagliata dei comandi e dei vari parametri che essi accettano, si rimanda all'help di Matlab.

Struttura della guida

Questa guida è strutturata in paragrafi. Se non conoscete ancora niente di questo programma è consigliabile che leggiate questa guida nell'ordine con cui viene presentata, almeno per i paragrafi introduttivi dove vengono spiegate le basi; dopodichè potrete saltare alle sezioni di vostro interesse. I paragrafi sono:

Introduzione

Matlab è l'abbreviazione di Matrix Laboratory. Si tratta di un programma di simulazione che permette di effettuare calcoli anche molto complessi. La sua prima versione risale agli anni '80 e quindi vanta di un'estesa libreria di funzioni, le quali sono perciò molto collaudate. E' basato sul calcolo matriciale di dati e quindi è ottimizzato per effettuare calcoli su matrici. L'interfaccia, specie nelle ultime versioni, risulta essere molto intuitiva, infatti presenta una serie di finestre dalle quali si posso impartire comandi, visualizzare le variabili che sono state generate, stampare grafici e così via. Inoltre l'utente ha la possibilità di definire delle funzioni proprie, raccogliere più comandi all'interno di un unico file in modo da poterli richiamare tutti assieme con un'unico comando, eccetera. Matlab fornisce la guida in linea relativa ai suoi comandi, la quale è spesso utile per capire il loro reale comportamento.

L'utente Matlab, per eseguire i comandi, ha a disposizione una finestra denominata "Command Window". Questa stessa finestra viene impiegata da Matlab per restituire alcuni risultati, perciò, per indicare che Matlab non è occupato ed è in attesa di istruzioni dall'utente, mostra un cosiddetto prompt costituito dal carattere "»". L'aspetto tipico della Command Window all'avvio del programma è del tipo:

  To get started, select "MATLAB Help" from the Help menu.

» |

Comandi base

Per poter lavorare efficacemente su Matlab è necessario conoscere perlomeno alcuni comandi base. Di estrema importanza risultano essere gli strumenti per la ricerca di aiuto in linea. Essi sono:

help
mostra l'elenco delle procedure disponibili. help nome_comando restituisce l'aiuto in linea del comando desiderato, assieme alla sua sintassi;
helpwin
apre una nuova finestra nella quale è possibile navigare tra i comandi messi a disposizione da Matlab;
helpdesk
apre una finestra di ipertesto per la guida in linea e la risoluzione dei problemi;
lookfor parola_chiave
elenca tutte le procedure che fanno riferimento a parola_chiave.

Altri comandi utili sono quelli che permettono di fare "pulizia" nell'ambiente di lavoro. Ad esempio:

clear
ripulisce le variabili e le funzioni dalla memoria;
clc
ripulisce la finestra dei comandi.

Faccio notare che esiste un comando apposta per chi di Matlab non conosce ancora nulla e vuole avere un'idea delle sue potenzialità. Trattasi di demo.

Matlab inoltre tiene traccia di tutti i comandi che vengono editati nella Command Window e rende accessibile all'utente la lista dei comandi in un'altra finestra denominata "Command History". Se si clicka due volte su un comando nella Command History, esso viene rieseguito, come se lo avessimo rieditato nella Command Window.

Le variabili

Nell'ambiente Matlab l'assegnazione di un dato valore ad una variabile si effettua utilizzando l'operatore "=". Ad esempio per assegnare il valore numerico "3" alla variabile "A" è sufficente scrivere:

» A=3
e premere il tasto "Invio" (che d'ora in avanti verrà abbreviato con il simbolo "<--"), ottenendo il risultato seguente:
» A=3

A =

    3

»
In questo modo abbiamo creato una variabile di nome "A", le abbiamo assegnato il valore numerico "3" e abbiamo stampato sulla Command Window il suo valore. Se, infatti, al termine del comando avessimo aggiunto un ";", avremo generato la stessa variabile, ma non avremo stampato a video il suo valore. L'utilità di questa possibilità stà nella comodità di non vedersi riempire di dati la Command Window quando vengono eseguiti degli script o quando si lavora con matrici di dati molto estese. Questo concetto risulterà più chiaro in seguito.

Per i nomi delle variabili è possibile utilizzare una combinazione di al massimo 19 caratteri alfanumerici. Matlab distingue le maiuscole dalle minuscole, pertanto la variabile "A" è diversa dalla variabile "a". È possibile scegliere qualsiasi combinazione di caratteri, pertanto potremo definire ad esempio una variabile di nome "exp". In questo modo, però, non ci sarà più possibile richiamare la funzione esponenziale definita da Matlab, che si chiama appunto "exp"; per questo che si sconsiglia questa pratica, a meno che non si intenda proprio ottenere tale risultato o ridefinire la funzione.

Tra le finestre di Matlab ce n'è una denominata "Workspace". È quì che Matlab visualizza tutte le variabili tuttora esistenti che abbiamo creato in precedenza. Dopo aver generato la variabile "A", in questa fiestra è comparsa una riga dove viene visualizzato il nome della variabile, la sua dimensione ed altri parametri che la riguardano. Con un doppio click sulla variabile "A" viene aperta una nuova finestra dove viene visualizzato il valore contenuto nella variabile.

Esistono alcune funzioni di utilità nella gestione delle variabili, quali:

who
restituisce l'elenco delle variabili residenti in memoria;
whos
fornisce informazioni più dettagliate per ogni variabile;
clear
ripulisce le variabili e le funzioni dalla memoria.

Matlab, inoltre, possiede al suo interno delle variabili predefinite che non vengono visualizzate nel Workspace ma che possono essere usate in ogni momento, come, ad esempio:

eps
epsilon (rappresenta l'accuratezza);
i
unità immaginaria;
inf
infinito (risultato della divisione di un numero non nullo per 0);
j
unità immaginaria;
NaN
Not A Number (risultato della divisione 0/0);
pi
pi-greco.
Sebbene sia possibile ridefinire queste variabili assegnando loro un nuovo valore, è comunque consigliabile mantenerle inalterate ed impiegarle per lo scopo per il quale sono state generate.

Le matrici

Come già accennato in precedenza, Matlab è un programma di calcolo matriciale. Infatti esso lavora trattando i dati come fossero matrici. Esse sono vettori bidimensionali formate da m righe e n colonne di elementi. Visivamente una matrice di 2 righe e 3 colonne può essere vista così:
- matrice 2×3 -

n colonne
m righe 56 -12 2+3i
sqrt(2) 9.4 exp(4)
Anche quelle che sopra venivano chiamate col nome di variabili sono dunque matrici. Infatti possono essere pensate come matrici degeneri 1×1 e per Matlab esse sono matrici a tutti gli effetti.

Una matrice viene creata in quattro occasioni:

  • indicando esplicitamente i valori dei suoi elementi tramite un comando di assegnazione;
  • come risultato di comandi o funzioni predefiniti;
  • come risultato di uno script;
  • tramite il caricamento da file esterni (aventi estensione .mat).

L'assegnazione diretta di una matrice, ad esempio quella indicata nella tabella sopra, viene effettuata digitando l'istruzione seguente:

» a=[56, -12, 2+3i; sqrt(2), 9.4, exp(4)]     <--

a =

  56.0000           -12.0000             2.0000 + 3.0000i
   1.4142             9.4000            54.5982

»
Lo stesso effeto si può ottenere con la scrittura:
» a=[56 -12 2+3i     <--
sqrt(2) 9.4 exp(4)]     <--

a =

  56.0000           -12.0000             2.0000 + 3.0000i
   1.4142             9.4000            54.5982

»
Naturalmente la virgola indica la separazione tra le colonne (e può essere omessa, separando gli elementi semplicemente con spazi), il punto e virgola la separazione tra le righe e il punto è il separatore decimale. Di default i numeri vengono visualizzati con quattro cifre decimali in virgola fissa. È comunque possibile modificare le preferenze di visualizzazione tramite la funzione format.

Analogamente una matrice può essere generata, come accennato sopra, da uno script Matlab. Per farlo dovremo creare un file testo contenente le seguenti righe di codice:

a=[56 -12 2+3i;
   sqrt(2) 9.4 exp(4)]
e salvarlo con il nome "matrice_a.m". Digitando poi sulla Command Window la riga:
» matrice_a     <--

a =

  56.0000           -12.0000             2.0000 + 3.0000i
   1.4142             9.4000            54.5982

»
avremo eseguito il codice contenuto nello script appena editato, creando così la matrice. Se dopo il nome del file avessimo inserito un punto e virgola, avremo generato la matrice senza però vedere il suo contenuto sulla Command Window. Sarà comunque sempre possibile, dopo aver creato la matrice, visualizzare il suo contenuto semplicemente scrivendo:
» a     <--

a =

  56.0000           -12.0000             2.0000 + 3.0000i
   1.4142             9.4000            54.5982

»
Anche per i nomi dei file valgono le stesse regole elencate per il nome delle variabili.

È possibile salvare le variabili in un file attraverso l'istruzione:

save nome_file variabile1 variabile2 ...

per poi poterle richiamare all'occorrenza attraverso l'istruzione:

load nome_file

Il file che viene generato assume automaticamente estensione .mat ed il formato di salvataggio può essere scelto (per maggiori informazioni si consulti l'help save).

Naturalmente gli elementi di una matrice possono essere sia numeri che espressioni qualsiasi. Ad esempio:

» a = [-56.3 13e-9 2^8 sin(2*pi*5.3)]     <--

a =

  -56.3000    0.0000  256.0000    0.9511

»
La matrice appena creata può anche essere vista come un vettore riga. Ogni elemento di una matrice è accessibile direttamente indicando le coordinate di riga (prima coordinata) e colonna (seconda coordinata) di tale elemento. Volendo accedere al terzo elemento della matrice appena creata potremo scrivere:
» a(1,3)     <--

ans =

  256

»
o equivalentemente a(3).

Avrete certamente notato che in questo caso è stata creata una nuova variabile denominata ans (= answer, ovvero risposta). Questa è la variabile che MATLAB utilizza quando viene prodotto un risultato per il quale non viene specificata la destinazione. A questo proposito è utile ricordare che l'ambiente MATLAB alloca le variabili in modo dinamico, quindi non viene generato un conflitto se ad una matrice 2×3 viene successivamente assegnata una matrice 5×9, oppure la funzione di trasferimento di un filtro, o altro. Si osservi il seguente esempio:

» a = [1 2 3]     <--

a =

     1     2     3

» a(6) = 5     <--

a =

     1     2     3     0     0     5

» a(3,3) = 3     <--

a =

     1     2     3     0     0     5
     0     0     0     0     0     0
     0     0     3     0     0     0

»
Alla prima assegnazione è stata creata una matrice 1×3; con la seconda assegnazione è stato dichiarato l'elemento nella sesta colonna, ottenendo una matrice 1×6, dove gli elementi non specificati sono stati posti per default a zero; infine, con la terza assegnazione è stato specificato l'elemeto della terza riga e terza colonna, ottenendo una matrice 3×6.

Alcuni comandi che possono risultare utili sono:

zeros
crea una matrice di dimensioni specificate, i cui elementi sono tutti degli zero;
ones
crea una matrice di dimensioni specificate, i cui elementi sono tutti degli uno;
eye
crea una matrice di dimensioni specificate avente 1 sulla diagonale principale e 0 altrove;
rand e randn
creano una matrice di dimensioni specificate, i cui componenti sono casuali;
size
ritorna la dimensione della matrice;
end
indica l'ultimo elemento di un vettore;
find
ritorna gli indici degli elementi non nulli di un vettore;
max
ritorna il massimo elemento di un vettore oppure ritorna un vettore riga contenente i valori massimi di ogni colonna della matrice.

Un altro modo per definire matrici è accostando più matrici (o vettori) uno di seguito all'altro (oppure uno sopra l'altro) nel modo seguente:

» a = [1 2 3; 4 5 6]     <--

a =

     1     2     3
     4     5     6

» b = [7 8 9]     <--

b =

     7     8     9

» c = [a;b]     <--

c =

     1     2     3
     4     5     6
     7     8     9

»
Per farlo è necessario che le matrici siano compatibili, cioè se si vuole mettere una matrice sotto l'altra esse devono avere lo stesso numero di colonne, mentre se si vuole metterle una accanto all'altra dovranno avere lo stesso numero di righe. Analogamente si può estrarre una sottomatrice da una matrice più grande:
» d = c([1 2],[2 3])     <--

d =

     2     3
     5     6

»
dove si è estratta la matrice costituita dagli elementi delle righe 1 e 2 e colonne 2 e 3.

Se si ha l'esigenza di estrarre una serie di colonne dalla matrice a, ad esempio dalla 5 alla 19, è possibile far uso di un operatore speciale, ovvero ":". Infatti esso serve per generare delle sequenze, quindi in questo esempio è sufficiente scrivere a(:,5:19). In questo modo avremo estratto tutte le righe e le colonne dalla 5 alla 19 come desiderato, senza aver dovuto specificare tutte le righe e le colonne desiderate. Per capire meglio come lavora questo operatore si vedano i seguenti esempi:

» t = 1:10     <--

t =

     1     2     3     4     5     6     7     8     9    10

» t = 2:2:10     <--

t =

     2     4     6     8    10

» 
Se infatti sono presenti due coefficienti, viene generata una sequenza che parte dal primo valore e arriva al secondo con passi di una unità. Se invece sono presenti tre coefficienti la sequenza va dal primo al terzo valore con passi di ampiezza specificata dal secondo valore.

È utile dire che è possibile generare anche matrici vuote col comando a = []. Ad esempio il comando a([3:6],:) = [] cancella da a le righe dalla terza alla sesta. Si può anche ottenere facilmente un vettore colonna composto dalla sovrapposizione delle colonne della matrice di partenza scrivendo

» a (:)     <--

ans =

     1
     4
     2
     5
     3
     6

»
Operazioni fra matrici

Le operazioni ammesse fra matrici sono:

+
addizione;
-
sottrazione;
*
moltiplicazione;
/
divisione a destra (1/2=0.5);
\
divisione a sinistra (1\2=2);
^
elevamento a potenza;
' (apostrofo)
trasposizione;
inv(·)
inversione;
det(·)
determinante.

L'addizione e la sottrazione possono essere effettuate tra matrici della stessa dimensione, oppure tra una matrice ed uno scalare (matrice 1×1).

La moltiplicazione e la divisione possono essere effettuate tra due matrici, tra una matrice ed un vettore o tra una matrice ed uno scalare, naturalmente rispettando le dimensioni. Se si desiderasse effettuare operazioni "elemento per elemento", sarà sufficiente anteporre all'operatore il simbolo "." (punto).

L'elevamento a potenza viene effettuato tra una matrice quadrata A ed uno scalare p. Se lo scalare è un valore intero il risultato sarà dato dal valore della matrice A moltiplicata per se stessa p volte, altrimenti sarà V*D.*p/V, dove V è la matrice degli autovettori e D la matrice di autovalori di A.

L'operatore "'" (apice) fornisce la matrice trasposta (o coniugata).

» A = [1 2 3];     <--
» A'     <--

ans =

     1
     2
     3
»
Nel caso la matrice fosse complessa il risultato prodotto è invece la matrice coniugata trasposta. Per ottenere solo la matrice trasposta di A si dovrà scrivere conj(A'):
» A = [1+2i 4; 4i 2+i]     <--

A =

   1.0000 + 2.0000i   4.0000          
        0 + 4.0000i   2.0000 + 1.0000i

» A'     <--

ans =

   1.0000 - 2.0000i        0 - 4.0000i
   4.0000             2.0000 - 1.0000i

» conj(A')     <--

ans =

   1.0000 + 2.0000i        0 + 4.0000i
   4.0000             2.0000 + 1.0000i

»

Le funzioni di Matlab possono operare sui singoli elementi delle matrici oppure sulle matrici nella loro interezza. A titolo di esempio vediamo questo comportamento rispetto alla radice quadrata:

» A = [1 2; 4 8];     <--
» sqrt(A)     <--

ans =

    1.0000    1.4142
    2.0000    2.8284

» sqrtm(A)     <--

ans =

    0.3333    0.6667
    1.3333    2.6667

»

Operatori relazionali e logici

In Matlab sono definiti i seguenti operatori relazionali:

<
minore
>
maggiore
<=
minore o uguale
>=
maggiore o uguale
==
uguale
~=
diverso
Questi operano una comparazione elemento per elemento e danno come risultato un numero diverso da zero se il risultato della comparazione è "VERO" ("TRUE"), oppure zero se il risultato della comparazione è "FALSO" ("FALSE"). Si noti inoltre la sifferenza tra l'operatore relazionale uguale "==" e il simbolo di assegnazione "=".

Analogamente agli operatori relazionali, in Matlab sono definiti anche i seguenti operatori logici:

&
AND
|
OR
~
NOT
Essi permettono di combinare tra loro più condizioni relazionali e, come prima, anche qui allo stato "FALSO" viene associato il valore zero, allo stato "VERO" viene associato un valore diverso da zero e viceversa.

Strutture di controllo

Come per i tradizionali linguaggi di programmazione, anche in Matlab sono definite delle strutture di controllo. Esse sono:

  • if
  • for
  • while

Per capire meglio come essi funzionano riportiamo alcuni esempi. Il primo si serve della struttura if per generare la funzione segno nella variabile x:

if x > 0
   y = 1;
elseif x == 0
   y = 0;
else
   y = -1;
end
Il secondo fa uso della struttura for per creare una matrice che rappresenta la tavola pitagorica:
for r = 1:10
   for c = 1:10
      T(r,c) = r*c;
   end
end
Il terzo invece inpiega la struttura while per creare un vettore delle potenze di due che hanno un valore inferiore al milione:
i = 1;
while i < 1e6
   i(length(i)+1) = i(length(i))*2;
end
Nel caso si avesse la necessità di uscire da un ciclo senza attendere la normale uscita dovuta alla non verificata condizione, è possibile utilizzare il comando break.

Creazione di grafici

MATLAB è in grado di produrre facilmente grafici sia monodimensionali, sia a più dimensioni. Il comando fondamentale per creare grafici bidimensionali è plot. plot(t,x) disegna il grafico di x in funzione di t. Volendo disegnare un periodo di sinusoide potremo scrivere:


» t = 0:0.01:2*pi;
» plot(t,sin(t))

Se scrivessimo semplicemente plot(x) otterremo il grafco di x in funzione dei suoi indici, a meno che x non sia complesso, nel qual caso si avrebbe l'equivalente di plot(real(x),imag(x)). plot(t, [x1;x2]) disegna sullo stesso grafico x1 e x2 in funzione di t, mentre plot(t1,x1,t2,x2) disegna sullo stesso grafico x1 in funzione di t1 e x2 in funzione di t2. Si possono anche impostare i colori e il tipo di linea visualizzata con plot(t,x,'+b').

Comandi utili sono:

grid on/off
per visualizzare la griglia;
title('titolo')
per impostare il titolo;
xlabel('etichetta x') e ylabel('etichetta y')
per impostare l'etichetta degli assi;
axes
per impostare la scala e l'aspetto;
axis
per selezionare le proprietà dell'asse;
xlim e ylim
per settare i valori iniziale e finale degli assi;
gtext e text
per inserire del testo all'interno del grafico;
ginput
per risalire alle coordinate di un punto del grafico;
patch
per colorare le aree del grafico;
line
per aggiungere delle linee sul grafico.
Per aggiungere il disegno di una nuova funzione su un grafico già esistente bisogna prima abilitare hold on; per aprire una nuova finestra grafica si dovrà digitare figure mentre per chiuderlo il comando è close. Per creare più grafici separati ma sulla stessa finestra è utile il comando subplot. Nel caso si debbano graficare funzioni a valori discreti si usi stem, mentre per ottenere un'interpolazione a gradini dei punti si usi stairs.

Naturalmente è possibile scegliere il tipo di scala da impiegare, logaritmica (loglog), semilogaritmica (semilogx o semilogy) o diagrammi polari (polar).

Per la stampa il comando principale è print, ma rimando al manuale per la descrizione completa dei parametri.

Input/Output interattivo

input
restituisce all'utente il prompt per introdurre dati. La sintassi è: y=input('string') dove string può essere una qualsiasi sequenza. Dopo questa riga di comandi ritorna il prompt di MATLAB e il numero scritto da tastiera viene memorizzato in y. Se si vuole introdurre una sequenza di caratteri è necessario specificare input(string,'s').
Keyboard
richiama la tastiera dall'interno di un m-file. Quindi interrompe l'esecuzione dell'm-file, e ritorna al prompt del MATLAB. Lo stato speciale viene indicato dal fatto che il prompt è "K»". In tale stato si possono valutare e cambiare le variabili. Si esce digitando RETURN e schiacciando il tasto di invio. Il controllo torna quindi all'm-file.
pause
interrompe l'esecuzione fino a che l'utente non preme un tasto. (pause(n): la interrompe per n secondi).
menu
genera una finestra di menu di scelte per l'utente. Ad esempio: K = menu('Choose a color','Red','Blue','Green') genera una finestra con tre bottoni (red, blue, green), e restituisce alla variabile K un valore equivalente al numero del bottone cliccato. Si possono inserire al massimo 32 valori.
disp(x)
mostra il messaggio contenuto nella stringa x.

Funzioni varie

Funzioni Matlab di tipico impiego sono:

  • sin
  • sinh
  • asin
  • cos
  • cosh
  • acos
  • tan
  • tanh
  • atan
  • exp
  • log
  • log10
  • sqrt
  • abs
  • angle
  • complex
  • real
  • imag
  • fix
  • floor
  • ceil

Altre funzioni utili sono:

error(message)
se si verifica un errore termina l'esecuzione mostrando il messaggio e ritornando il prompt
nargchk
controlla che il numero degli ingressi ad una funzione sia corretto e ritorna un errore in caso contrario
return
termina l'esecuzione ritornando il prompt
num2str, int2str, str2num
convertono numeri in stringhe e viceversa
fopen, fprintf, ...
funzioni di input/output da file in tutto simili a quelle del linguaggio di programmazione C
exist
verifica l'esistenza di una variabile, di un file o di una funzione
any
ritorna TRUE se almeno uno degli elementi della variabile d'ingresso è TRUE
all
restituisce TRUE se tutti gli elementi della variabile d'ingresso sono TRUE

Script

Gli script sono sequenze di istruzioni MATLAB raggruppate in un file esterno avente estensione .m. Per editare uno script è sufficiente digitare il comando edit, mentre per modificare un file esistente il comando è edit nomefile. Alternativamente, digitando type nomefile viene visualizzato il contenuto del file. Per eseguire il codice contenuto all'interno dello script è sufficiente digitare il nome dei file (senza estensione) e premere "invio". Nel caso un comando ecceda la lunghezza di una riga, è possibile interrompere il comando con tre punti consecutivi e continuarlo nella riga successiva. Tutto ciò che compare in una riga dopo il caratter "%" viene interpretato come commento.

Funzioni

All'utente viene data la possibilità di definire delle proprie funzioni. Il codice che le costituisce deve essere contenuto ancora una volta in un file con estensione .m ed il nome del file sarà il nome della funzione. La prima riga di codice all'interno del file costituisce la definizione della sintassi della funzione, ovvero la parola chiave function, i dati che la funzione retituisce, il nome della funzione (che deve essere uguale al nome del file) e i dati che la funzione richiede in ingresso. Ad esempio, volendo creare una funzione che calcola il perimetro e l'area di un rettangolo, creeremo il file di nome rett.m contenente il codice:

% RETT calcola il perimetro e l'area di
% un rettangolo dati la base e l'altezza.

function [p,a] = rett(b,h)
p = 2*(b+h);                 % perimetro
a = b*h;                     % area

Ora, per calcolare il perimetro e l'area di un rettangolo di base 4 e altezza 6 basterà scrivere [perim,area] = rett(4,6). È importante dire che i parametri vengono passati per valore, quindi non verranno modificati. Eventuali variabili interne alla funzione verranno distrutte al termine della sua esecuzione e in ogni caso non interferiscono con eventuali altre variabili esterne aventi lo stesso nome.

All'interno del file contenente la funzione che intendiamo creare, è possibile creare altre funzioni, le quali però non saranno visibili dall'esterno e possono essere invocare solamente all'interno di quel file.

Per forzare l'uscita da una funzione (prima della fine dei comandi contenuti nel file) è possibile utilizzare la parola chiave return.

Nel caso le prime righe del file siano dei commenti, essi vengono considerati da MATLAB come facenti parte del manuale per l'utilizzo di quella stessa funzione. Tali informazioni possono essere richiamate attraverso il comando help nomefile.

Signal Processing



torna all'inizio     Stampa

Valid HTML 4.01 Transitional    Valid CSS