PARTE 9 INTRODUZIONE A MATLAB E ANALISI DEL SEGNALE Il Matlab, prodotto dalla Mathworks Inc. un programma per lelaborazione di dati numerici e la presentazione grafica dei risultati. Questo programma utilizzato estensivamente per lanalisi di sistemi e per il progetto di controllori. Queste note presentano alcune caratteristiche di base del programma. AVVIO
Lanciare la finestra di MATLAB cliccando sulla relativa icona. FINESTRA DI COMANDO
E' la finestra che si utilizza per comunicare con l'interprete di comandi di MATLAB. Quando l'interprete e' pronto per accettare comandi, e' visibile il prompt >> e di possono digitare istruzioni che vengono terminate premendo il tasto ENTER. Laspetto principale del programma la semplicit concettuale con cui vengono rappresentati i dati. I dati vengono introdotti nel programma in maniera molto semplice, mediante assegnamento. Ad esempio, con listruzione: >> a =4 definiamo la variabile a assegnandole il valore 4 .Occorre notare che il programma ribadisce il risultato della istruzione precedente, visualizzandolo sullo schermo. Il programma non richiede definizioni particolari di tipo durante linizializzazione di variabili, ma il tipo viene assegnato automaticamente in funzione del dato inserito. Ad esempio, listruzione: >> b =4+5i definisce ed inizializza la variabile b al valore complesso 4+5i. A seguito dellassegnazione, il programma esegue lecho del dato introdotto: b = 4.0000 + 5.0000i INSERIRE MATRICI E VETTORI
MATLAB lavora sempre con matrici. Gli scalari sono trattati come matrici 1x1. I vettori sono matrici con una sola riga o una sola colonna. MATLAB alloca automaticamente le matrici in memoria pertanto non e' necessario dichiararne le dimensioni (al contrario del Fortran per esempio). Le matrici si inseriscono come segue: separando gli elementi con virgole o spazi separando le righe con punto e virgola delimitando la matrice tra parentesi quadre Ad esempio, listruzione: A=[1 2 3; 4 5 6; 7 8 9] produce il risultato: A = 1 2 3 4 5 6 7 8 9 La matrice disponibile in una memoria locale di MATLAB denominata workspace per uso successivo. Si noti inoltre che il programma case sensistive, distingue, cio fra maiuscole e minuscole. I vettori sono particolari matrici con 1 colonna e n righe (oppure n colonne ed 1 riga), introducibili in modo analogo a quanto fatto per le matrici. Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 2 Ad esempio, listruzione: >> v = [1; 2; 56] produce il risultato: v = 1 2 56 Loperazione di trasposizione (sia di vettori che di matrici) lapice (). Ad esempio, listruzione: >> v produce il risultato: ans = 1 2 56 dove ans labbreviazione di answer, ovvero risposta , vale a dire la variabile che contiene il risultato della elaborazione richiesta. Volendo conservare tale risultato si pu scrivere: >> vt = v; Il punto e virgola alla fine della linea viene usato per sopprimere lecho. Se per il vettore (o la matrice) complesso loperatore apice esegue la trasposta coniugata. La semplice trasposizione si ottiene con loperatore punto apice (.): >> v.' ELEMENTI DI MATRICI
Gli elementi di matrici possono essere espressioni di MATLAB Ad esempio, listruzione: x=[-1.3 sqrt(3) (1+2+3)*4/5] produce il risultato: x = -1.3000 1.7321 4.8000 I singoli elementi possono essere individuati mediante indici racchiusi tra parentesi tonde. Ad esempio, listruzione: x(5)= abs(x(1)) produce il risultato: x = -1.3000 1.7321 4.8000 0 1.3000 Come si vede la dimensione di x viene automaticamente incrementata in modo da inglobare il nuovo elemento e gli elementi indefiniti (in questo caso il quarto) viene posto uguale a zero. Le matrici possono essere costruite a partire da matrici di dimensioni minori. Ad esempio, listruzione: r=[10 11 12]; A=[A; r] produce il risultato: A = 1 2 3 4 5 6 7 8 9 10 11 12 Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 3 USO DEI DUE PUNTI
L'operatore due punti molto importante e di uso frequente in MATLAB. Pu essere usato per creare vettori, per isolare righe o colonne di matrici e per controllare i loops. Esempio: creare un vettore di punti equispaziati 1:4 produce il risultato 1 2 3 4 1:3:8 produce il risultato 1 4 7 In generale j:k produce il risultato j j+1 j+2 ... k j:i:k produce il risultato j j+i j+2i ... k I due punti e le matrici A(:,j) la j-ma colonna di A A(k,:) la k-ma riga di A A(:,:) coincide con A A(j,k) l'elemento (j,k) A(:,j:k) il vettore A(:,j) A(:,j+1) A(:,j+2) ... A(:,k) ISTRUZIONI, VARIABILI E ESPRESSIONI
Le istruzioni di MATLAB sono frequentemente nella forma: variabile=espressione o semplicemente: espressione Espressioni comprendono variabili, operatori, funzioni e caratteri speciali. Una espressione, una volta valutata, produce una matrice. Di default la matrice visualizzata sulla finestra di comando di MATLAB, ma l'output sullo schermo pu essere soppresso terminando l'espressione con il punto e virgola (;). Se il nome della variabile e il segno = sono omessi, MATLAB crea automaticamente la matrice ans. Ad esempio, listruzione: 1900/81 produce il risultato: ans = 23.4568 MATLAB distingue le minuscole dalle maiuscole. Pertanto le variabili name, Name e NAME sono differenti. Matrici aventi le stesse dimensioni possono essere combinate usando gli operatori + e - La moltiplicazione di matrici (aventi dimensioni congruenti) si effettua usando l'operatore * C=A*B Matlab prevede due simboli per la divisione: / e \. Supponendo che A sia una matrice quadrata e non singolare, con: A = [10 37 64; 13 39 61; 22 61 100] B = [1 2 3 ] listruzione: >> X =B /A Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 4 fornisce come risultato X= -0.0833 0 0.0833 che `e soluzione di X *A = B. Infatti: >> E = X *A E = 1.0000 2.0000 3.0000 coincide con B . Mentre la divisione X = A \ B , >> X = A \ B X = 0.1593 0.1324 -0.0858 soluzione di B = A * X . Infatti: >> A * X ans = 1.0000 2.0000 3.0000 coincide con B . L'inversa di una matrice si effettua come segue: inv(B) Per valutare una operazione "termine per termine", per esempio moltiplicare ogni termine del vettore A=[1 3 2] per ogni termine del vettore B=[-1 2 1] in modo da ottenere il risultato C=[-1 6 2], si usa l'operatore .* Ad esempio: C=A.*B WORKSPACE E HELP
In ogni momento si pu visualizzare quali sono le variabili contenute nel Workspace (una sorta di memoria locale di MATLAB). Si usa il comando who oppure whos (per avere informazioni pi dettagliate). Esiste un help in linea. Sul prompt di MATLAB sufficiente digitare help con il nome del comando specifico. Se non si conosce il nome del comando per eseguire una certa operazione si pu tentare con l'istruzione lookfor. Ad esempio: help fft Visualizza l'help del comando che esegue la trasformata di Fourier mentre: lookfor interpolation un esempio di ricerca di funzioni per eseguire l'interpolazione COMANDI UTILI E ISTRUZIONI DOS-LIKE
Per verificare il contenuto della directory di lavoro, basta digitare il comando DOS-like >> dir e verr mostrato il contenuto della directory di lavoro. Per visualizzare la directory corrente di lavoro, si utilizza il comando >> pwd Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 5 Le istruzioni DOS pi utilizzate in ambiente Matlab sono: dir elenca i files contenuti nella directory corrente. type filename visualizza il contenuto del file filename . delete filename elimina il file filename dalla directory corrente. (freccia s della tastiera) richiama le istruzioni digitate in precedenza. ! command invia listruzione command al sistema operativo. ISTRUZIONI PER LA GRAFICA
Esempio t=[0:0.01:10]; crea un vettore [0, 0.01, 0.02, ..., 10] ys=sin(2*pi*t); crea un'onda sinusoidale con frequenza di 1 Hz plot(t,y); plotta l'onda sinusoidale yc=cos(2*pi*2*t); crea un coseno avente frequenza pari a 2 Hz plot(t,ys,t,yc) plotta le due onde contemporaneamente axis([0 10 -1.5 1.5]) forza gli estremi degli assi title('Onda sinusoidale') scrive il titolo della figura xlabel('Tempo [s]') scrive la label delle ascisse Esempio f=[0:0.01:3]; crea un vettore "di frequenze" z=0.01; fattore di smorzamento H=1.0./sqrt((1-f.^2).^2+(2*z*f).^2); e' la risposta in frequenza di un sistema SDOF plot(f,H) plotta il grafico in scala lineare semilogy(f,H) plotta le ordinate in scala logaritmica loglog(f,H) plotta entrambi gli assi in scala logaritmica OPERAZIONI MATRICIALI
det(A) calcola il determinante di A inv(A) calcola l'inversa di A trace(A) somma gli elementi sulla diagonale eig(A) calcola gli autovalori di A rank(A) calcola il rango di A VARIABILI COMPLESSE
sqrt(-9) MATLAB pu valutare questa espressione z1=2+3*j definisce un numero complesso z2=-2-9*i MATLAB usa indifferentemente i o j abs(z1) valuta il modulo angle(z1) valuta la fase real(z1) parte reale imag(z1) parte immaginaria Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 6 SCRIPT FILES
Invece di inserire i comandi dal prompt di MATLAB possibile eseguire una serie di comandi scritti in files. Questi files sono chiamati m-files perche' hanno estensione .m Ci sono due tipi di m-files: gli script files e i function files. Gli script files contengono una serie di comandi per l'interprete di MATLAB. Un set di comandi pu essere inserito in un file di testo (ascii) usando un editor (ad esempio il "blocco note" di Windows; le versioni 5.0 e successive di MATLAB hanno un editor dedicato). Esempio: se lo script file si chiama pippo.m i comandi che esso contiene si eseguono digitando il nome del file senza estensione (pippo) dal prompt di MATLAB. Le istruzioni contenute in uno script file lavorano sulle variabili contenute nello workspace globale. Tutte le variabili utilizzate dallo script file rimangono disponibili una volta terminata lesecuzione. FUNCTION FILES
Sono m-files che iniziano con la parola function. Consentono, in ambiente Matlab, la definizione di funzione simili a quelle previste nei linguaggi di programmazione standard. Le variabili vengono passate per valore. Differiscono dagli script files perch tutti gli argomenti sono passati alla funzione attraverso una lista di parametri e tutte le variabili contenute nella funzione sono locali. Esempio function y=mean(x) % Calcola il valor medio. % Per i vettori, mean(x) restituisce il valor medio. % Per le matrici, mean(x) restituisce un vettore riga contenente il valor medio di ogni colonna. [m,n]=size(x); if m==1 m=n; end y=sum(x)/m; return La prima linea dichiara il nome della funzione e gli argomenti in input e output. Le successive tre righe documentano il file (sono commenti) e sono mostrate quando si digita help mean dal prompt di MATLAB. Questa ultima caratteristica e' molto utile perch consente di ottenere automaticamente un help in linea per le funzioni nuove. Una function differisce da uno script perch lavora su variabili locali e per il fatto che non accede alle variabili globali. Nellesempio, le variabili m, n e y sono locali e non esisteranno nel Workspace dopo che la funzione mean ha terminato il proprio compito. Al contrario, le variabili negli script files sono disponibili nel Workspace ad esecuzione dello script file conclusa. Esempio z=1:99; vettore di interi da 1 a 99 mz=mean(z); istruzione per calcolare il valor medio di z e attribuirlo alla variabile mz. Il vettore viene passato alla funzione mean dove diventa la variabile locale x. Non e' necessario che i vettori z e x abbiano lo stesso nome. Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 7 ISTRUZIONI DI CONTROLLO
for ripetizione di un insieme di istruzioni per un numero predeterminato di iterazioni. Deve terminare con end. while ripetizione di un insieme di istruzioni fino a quando una condizione rimane era. Deve terminare con end . if istruzione condizionale. Deve terminare con end. Si possono utilizzare anche else e elseif. break interruzione di un ciclo. Esempio for i=1:m, for j=1:n, A(i,j)=1/(i+j-1); end end Esempio while i < 100 i=i+1; end Esempio if a>max max=a; end Gli operatori relazionali sono: > maggiore < minore >= maggiore o uguale <= minore o uguale == uguale ~= diverso Nota: l'operatore per testare l'uguaglianza == (non =). ISTRUZIONI LOAD E SAVE
Si utilizzano per caricare (salvare) dati da (su) files esterni. Di seguito si riporta un estratto dellhelp on line di MATLAB per queste due istruzioni. LOAD LOAD Load workspace variables from disk. LOAD FNAME retrieves the variables from the MAT-file 'fname.mat'. LOAD FNAME -ASCII or LOAD FNAME -MAT can be used to force LOAD to treat the file as either an ASCII file or a MAT file. SAVE SAVE Save workspace variables to disk. SAVE fname saves all workspace variables to the binary "MAT-file" named fname.mat. The data may be retrieved with LOAD. Omitting the filename causes SAVE to use the default filename "matlab.mat". SAVE fname X saves only X. SAVE fname X Y Z saves X, Y, and Z. SAVE fname X Y Z -ASCII uses 8-digit ASCII form instead of binary. SAVE fname X Y Z -ASCII -DOUBLE uses 16-digit ASCII form. SAVE fname X Y Z -ASCII -DOUBLE -TABS delimits with tabs. Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 8 Esercizio 1 % Segnale con una componente T=1; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento freq=10; % Frequenza del segnale t=[0:N-1]'/fs; % Vettore tempi signal=sin(2*pi*freq*t); % Segnale %signal=signal+3; % Valor medio ~= 0 figure,plot(t,signal); % Plot f=[0:N-1]'/T; % Vettore frequenze S = fft(signal); % FFT del segnale figure,plot(f,abs(S)); % Plot del modulo return % Sistema la FFT S=fftshift(S); S=S*2/N; S(N/2+1)=S(N/2+1)/2; figure,plot(f,abs(S)); % Plot del modulo Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 9 Esercizio 2 % Segnale con UNA componente - LEAKAGE T=0.93; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento freq=10; % Frequenza del segnale t=[0:N-1]'/fs; % Vettore tempi signal=sin(2*pi*freq*t); % Segnale %signal=signal+3; % Valor medio ~= 0 figure,plot(t,signal); % Plot f=[0:N-1]'/T; % Vettore frequenze S = fft(signal); % FFT del segnale figure,plot(f,abs(S)); % Plot del modulo %return % Sistema la FFT S=fftshift(S); S=S*2/N; S(N/2+1)=S(N/2+1)/2; figure,plot(f,abs(S)); % Plot del modulo Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 10 Esercizio 3 % Segnale con UNA componente % Riduzione del Leakage con FINESTRA T=0.93; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento freq=10; % Frequenza del segnale t=[0:N-1]'/fs; % Vettore tempi s=sin(2*pi*freq*t); % Segnale %s=s+3; % Valor medio ~= 0 win=0.5*(1 - cos(2*pi*(1:N)'/(N+1))); % Finestra Hanning sw=s.*win; % Segnale "finestrato" figure,plot(t,s,t,sw,t,win); f=[0:N-1]'/T; % Vettore frequenze S = fft(s); % FFT del segnale SW = fft(sw); % FFT del segnale "finestrato" figure,plot(f,abs(S),f,abs(SW)); % Plot del modulo return % Sistema la FFT S=fftshift(S); S=S*2/N; S(N/2+1)=S(N/2+1)/2; SW=fftshift(SW); SW=SW*2/N; SW(N/2+1)=SW(N/2+1)/2; figure,plot(f,abs(S),f,abs(SW)); % Plot del modulo Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 11 Esercizio 4 % Segnale con TRE componenti T=0.93; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento t=[0:N-1]'/fs; % Vettore tempi nc=3; % Numero di componenti s=zeros(N,1); % Inizializza il vettore FREQ=[10 16 28]'; % Frequenza delle tre componenti % Costruzione del segnale for k=1:nc, s=s+sin(2*pi*FREQ(k)*t); end figure,plot(t,s); f=[0:N-1]'/T; % Vettore frequenze S = fft(s); win=0.5*(1 - cos(2*pi*(1:N)'/(N+1))); % Finestra Hanning sw=s.*win; % Segnale "finestrato" figure,plot(t,sw); SW = fft(sw); figure,plot(f,abs(S),f,abs(SW)); return % Sistema la FFT S=fftshift(S); S=S*2/N; S(N/2+1)=S(N/2+1)/2; SW=fftshift(SW); SW=SW*2/N; SW(N/2+1)=SW(N/2+1)/2; figure,plot(f,abs(S),f,abs(SW)); % Plot del modulo Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 12 Esercizio 5 % Segnale modulato in ampiezza T=2; % Durata segnale N=1024; % Numero di punti fs=N/T; % Frequenza di campionamento t=[0:N-1]'/fs; % Vettore tempi freq=15; % Frequenza portante fm=5; % Frequenza modulante A=1; % Ampiezza portante ee=0.3; % Rapporto tra Ampiezza modulante e Ampiezza portante s=A*sin(2*pi*freq*t); % Segnale non modulato modul=ee*A*cos(2*pi*fm*t); % Modulante sm=(A+modul).*sin(2*pi*freq*t); % Segnale modulato figure,plot(t,s,t,sm,t,A+modul,t,-modul-A,'b'); axis([0 1 -1.4 1.4]); f=[0:N-1]'/T; % Vettore frequenze S = fft(s); SM = fft(sm); % Sistema la FFT S=S*2/N; S(1)=S(1)/2; SM=SM*2/N; SM(1)=SM(1)/2; figure, subplot(211),plotfft(f,abs(S)), axis([0 40 0 1.2]) subplot(212),plotfft(f,abs(SM)); axis([0 40 0 1.2]) Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 13 Esercizio 6 % Segnale con due componenti a frequenze vicine % (fenomeno del BATTIMENTO) T=10; % Durata segnale N=1024; % Numero di punti fs=N/T; % Frequenza di campionamento t=[0:N-1]'/fs; % Vettore tempi f1=15; f2=16.5; s=0.6*sin(2*pi*f1*t)+0.4*sin(2*pi*f2*t); figure,plot(t,s); axis([0 2 -1 1]); f=[0:N-1]'/T; % Vettore frequenze S = fft(s); % Sistema la FFT S=S*2/N; S(1)=S(1)/2; figure,plot(f,abs(S)), axis([0 fs/2 0 1]) Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 14 Esercizio 7 % Segnale con due componenti % Impiego del FILTRO T=0.93; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento t=[0:N-1]'/fs; % Vettore tempi f=[0:N-1]'/T; % Vettore frequenze nc=2; % Numero di componenti s=zeros(N,1); % Inizializza il vettore FREQ=[15 49]'; % Frequenza delle tre componenti % Costruzione del segnale for k=1:nc, s=s+sin(2*pi*FREQ(k)*t); end % Costruzione del filtro B=fir1(32,0.5); sf=filtfilt(B,1,s); [H,F] = freqz(B,1,N,fs); figure,plot(F,abs(H)); figure,plot(t,s,'r',t,sf,'b'); S = fft(s); Sf = fft(sf); figure,plot(f,abs(S),'r',f,abs(Sf),'b'), axis([0 fs/2 0 80]) Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 15 Esercizio 8 % Impulso T=1; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento t=[0:N-1]'/fs; % Vettore tempi f=[0:N-1]'/T; % Vettore frequenze g=[0.001 0.005 0.01]; b=0.5; for k=1:3, s=exp(-(t-b).^2/g(k)); subplot(['23',num2str(k)]),plot(t,s); S = fft(s); subplot(['23',num2str(k+3)]),semilogy(f,abs(S)); axis([0 50 1.e-12 100]); end Esercizio 9 % Segnale sinusoidale con impulso T=1; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento t=[0:N-1]'/fs; % Vettore tempi f=[0:N-1]'/T; % Vettore frequenze freq=20; g=0.0002; b=0.5; s=sin(2*pi*freq*t); si=s+exp(-(t-b).^2/g); S = fft(s); SI = fft(si); figure,plot(t,s,t,si) figure,plot(f,abs(S),f,abs(SI)) axis([0 fs/2 0 80]) Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 16 Esercizio 10 % Finestra esponenziale T=1; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento t=[0:N-1]'/fs; % Vettore tempi f=[0:N-1]'/T; % Vettore frequenze g=[0.02 0.05 0.1]; for k=1:3, win=exp(-t/g(k)); subplot(['23',num2str(k)]),plot(t,win); axis([0 1 0 1]); S = fft(win); subplot(['23',num2str(k+3)]),plot(f,abs(S)); axis([0 fs/2 1e-12 15]); end Esercizio 11 % Seno smorzato T=1; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento t=[0:N-1]'/fs; % Vettore tempi f=[0:N-1]'/T; % Vettore frequenze g=0.4; freq=10; s=sin(2*pi*freq*t); win=exp(-t/g); sw=s.*win; figure,plot(t,s,t,sw); S = fft(s); SW = fft(sw); figure,plot(f,abs(S),f,abs(SW)); axis([0 fs/2 0 80]); Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 17 Esercizio 12 % Segnale con una componente % Fenomeno Aliasing T=1; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento (128 Hz) t=[0:N-1]'/fs; % Vettore tempi f=[-N/2:N/2-1]'/T; % Vettore frequenze % -------------------------------------- % Segnale correttamente interpretato freq=30; % Frequenza del segnale signal=sin(2*pi*freq*t); % Segnale figure,plot(t,signal); % Plot title('Frequenza 30 Hz') S = fft(signal); % FFT del segnale figure,plot(f,abs(fftshift(S))); % Plot del modulo title('Frequenza 30 Hz') % -------------------------------------- % Segnale male interpretato (viene visto a 18 Hz) freq=110; signal=sin(2*pi*freq*t); % Segnale figure,plot(t,signal); % Plot title('Frequenza 110 Hz') S = fft(signal); % FFT del segnale figure,plot(f,abs(fftshift(S))); % Plot del modulo title('Frequenza 110 Hz') return Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 18 Esercizio 13 % Segnale con una componente % Si aggiunge rumore random in banda T=0.93; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento t=[0:N-1]'/fs; % Vettore tempi f=[0:N-1]'/T; % Vettore frequenze freq=15; % Costruzione del segnale s=sin(2*pi*freq*t); figure,plot(t,s); S = fft(s); % ----------------------------------- % Rumore in banda (30-60 Hz) noise=randn(N,1); % Costruzione del filtro fs2=fs/2; B=fir1(32,[30 60]/fs2); noisef=filtfilt(B,1,noise); %[H,F] = freqz(B,1,N,fs); %figure,plot(F,abs(H)); figure,plot(t,noise,'r',t,noisef,'b'); Nf=fft(noisef); figure,plot(f,abs(Nf)), axis([0 fs/2 0 80]) % ----------------------------------- sn=s+noisef; SN=fft(sn); figure,plot(t,s,'r',t,sn,'b'); %figure,plot(f,abs(S),'r',f,abs(SN),'b'), Parte 9 Introduzione a Matlab e Esercizi Meccanica delle Vibrazioni II modulo 9 19 Esercizio 14 % Segnale con due componenti % Impiego del FILTRO T=0.93; % Durata segnale N=128; % Numero di punti fs=N/T; % Frequenza di campionamento t=[0:N-1]'/fs; % Vettore tempi f=[0:N-1]'/T; % Vettore frequenze nc=2; % Numero di componenti s=zeros(N,1); % Inizializza il vettore FREQ=[15 49]'; % Frequenza delle tre componenti % Costruzione del segnale for k=1:nc, s=s+sin(2*pi*FREQ(k)*t); end S = fft(s); fs2=fs/2; % ----------------------------------- % Filtro la seconda componente B=fir1(32,32/fs2); sf=filtfilt(B,1,s); [H,F] = freqz(B,1,N,fs); figure,plot(F,abs(H)); figure,plot(t,s,'r',t,sf,'b'); Sf = fft(sf); figure,plot(f,abs(S),'r',f,abs(Sf),'b'), axis([0 fs/2 0 80]) % ----------------------------------- % Filtro la prima componente B=fir1(32,32/fs2,'high'); sf=filtfilt(B,1,s); [H,F] = freqz(B,1,N,fs); figure,plot(F,abs(H)); figure,plot(t,s,'r',t,sf,'b'); Sf = fft(sf); figure,plot(f,abs(S),'r',f,abs(Sf),'b'), axis([0 fs/2 0 80])