FONDAMENTI DI SEGNALI E TRASMISSIONE 4° Laboratorio Paolo Mazzucchelli [email protected] MATLAB: generazione di numeri casuali Il comando che permette di generare una matrice (nr,nc) composta da numeri casuali, con distribuzione di probabilità uniforme nell’intervallo 0…1 è: U=rand(nr,nc); (dove nr e nc rappresentano il numero di righe e di colonne della matrice). Esiste un analogo comando per generare una matrice (nr,nc) composta da numeri casuali, con distribuzione di probabilità gaussiana, a media nulla e varianza unitaria: N=randn(nr,nc); Per generare una matrice (nr,nc) composta da numeri casuali, con distribuzione di probabilità gaussiana, a media m e varianza v: N=m+randn(nr,nc)*sqrt(v); MATLAB: stima e visualizzazione di distribuzioni di probabilità Data un’insieme di numeri casuali, la distribuzione di probabilità da cui sono generati si può approssimare calcolando l’istogramma della sequenza di realizzazioni. Il comando MATLAB per calcolare l’istogramma di un vettore x è: H=hist(x,b); (dove b è un vettore che contiene i centri delle celle rispetto alle quali è calcolato l’istogramma). Per poter calcolare correttamente la frequenza relativa frR delle estrazioni x, è necessario scalare il risultato per il numero di prove N, e per la dimensione della cella dell’istogramma (una variabile casuale continua): frR=hist(x,b)/N/bin; L’istogramma della frequenza relativa così calcolata, che approssima la distribuzione di probabilità, può essere visualizzata con il comando: bar(b,frR); : Esercizio Si generi una sequenza di N=10000 numeri casuali che simulino il lancio di un dado. Si simuli poi il lancio di due dadi. Si visualizzino nei due casi le frequenze relative. N=10000; % numero di prove x=rand(1,N); % distribuzione uniforme dado=floor(x*6)+1; frR=hist(dado,[1:6])/N; figure, subplot(1,2,1), bar([1:6],frR); dadi=floor(rand(2,N)*6)+1; frR=hist(sum(dadi),[2:12])/N; % somma per colonne subplot(1,2,2), bar([2:12],frR); 1 : Esercizio Si generi una sequenza di N=100000 numeri casuali estratti da una distribuzione gaussiana a media nulla, con varianza σ2=100. Si confronti la distribuzione di probabilità stimata con la distribuzione di probabilità gaussiana. N=100000; % numero di prove y=randn(1,N)*sqrt(100); % distribuzione gaussiana frR=hist(y,[-40:40])/N; % attenzione, scalare per la dim. della cella dell’istogramma x=[-40:.1:40]; ddp=1/sqrt(2*pi*100)*exp(-x.^2/(2*100)); figure, bar([-40:40],frR); hold on, plot(x,ddp,’r’); 2 Calcolo di media e varianza La funzione MATLAB che calcola la media di una sequenza di numeri casuali è: m=mean(x); La funzione MATLAB che calcola la varianza di una sequenza di numeri casuali è: v=var(x); è anche possibile calcolare la deviazione standard di un vettore di numeri casuali: s=std(x) Si ricorda che vale la relazione s=sqrt(v)! Se i numeri casuali x sono generati da una distribuzione di probabilità, i valori stimati m e v approssimano media e varianza vere all’aumentare del numero di realizzazioni (lunghezza del vettore x) : Esercizio Si stimino media e varianza della distribuzione di probabilità uniforme nell’intervallo 0…1, al variare del numero N di prove a disposizione. Si confronti con il risultato noto dalla teoria. Si utilizzi: N=[10:50:10000]; N=[10:50:10000]; t=length(N); varianza=zeros(1,t); media=zeros(1,t); for m=1:t, x=rand(1,N(m)); varianza(m)=var(x); media(m)=mean(x); end, figure, subplot(2,1,1), plot(N,varianza,’r’,N,ones(1,t)/12,’--b’); subplot(2,1,2), plot(N,media,’r’,N,ones(1,t)*0.5,’--b’); 3 Teorema del limite centrale Si vuole verificare sperimentalmente il teorema del limite centrale. Si sommino 50 variabili indipendenti con distribuzione uniforme (N=10000 prove) e si confronti la frequenza relativa della distribuzione somma, con il risultato teorico (distribuzione gaussiana con media e varianza note dalla teoria). Quante variabili indipendenti è necessario sommare per approssimare la distribuzione gaussiana? Np=10000; % numero di prove Nv=50; % numero di variabili indipendenti y=rand(Nv,Np); % distribuzione uniforme Sy=sum(y); % distr. somma media =Nv*.5; varianza=Nv*1/12; x=[-4*sqrt(varianza):.5:4*sqrt(varianza)]+media; frR=hist(Sy,x)/Np/.5; ddp=1/sqrt(2*pi*varianza)*exp(-(x-media).^2/(2*varianza)); figure, bar(x,frR); hold on; plot(x,ddp,'r'); Processo casuale attraverso un filtro lineare Un processo casuale stazionario x(t), può essere descritto nel dominio delle frequenze dalla densità spettrale di potenza Sx(f), definita come trasformata di Fourier della funzione di autocorrelazione del processo x(t). La densità spettrale di potenza può essere stimata come: Sx(f)=Px(f)/∆f Ö |X(f)|2/ Ν∆t La densità spettrale di un processo bianco è una costante di ampiezza σ2 (autocorrelazione impulsiva). Questo non significa che la Sx(f) stimata sia costante per una realizzazione, anzi! È una costante la media di infinite realizzazioni della densità spettrale di potenza! Se il processo casuale x(t) viene filtrato da un filtro con risposta in frequenza H(f), La densità spettrale di potenza in uscita sarà: 4 Sy(f)=|H(f)|2 Sx(f) : Esercizio Si generi una realizzazione (N=1000 campioni) di un processo casuale bianco (discretizzato con passo dt=1 ms), con distribuzione gaussiana (di varianza σ2=50 ). Si stimi la densità spettrale di potenza. Si stimi nuovamente la densità spettrale di potenza mediando 50 realizzazioni. Si filtrino ora le diverse realizzazioni con un filtro con risposta impulsiva h(t) rettangolare (durata T=0.05 sec). Si stimi la densità spettrale di potenza in uscita, e la si confronti con il risultato teorico noto. N=1000; dt=0.001; t=[0:N-1]*dt; x=randn(1,N)*sqrt(50); % processo casuale Sx=fftshift(abs(fft(x)).^2)/N; % stima della d.s. di pot. df=1/(N*dt); f=[-N/2+[0:N-1]]*df; Sm=zeros(1,N); for k=1:50, x=randn(1,N)*sqrt(50); Sm=Sm+(fftshift(abs(fft(x)).^2)/N)/50; % stima della d.s.p. mediata end, figure, subplot(2,1,1); plot(f,Sx,'b'); axis([-500 500 0 200]); subplot(2,1,2); plot(f,Sm,'b'); axis([-500 500 0 200]); xlabel('Frequenza [Hz]') 5 Si vuole ora costruire il filtro rettangolare (T=0.05 sec.). Si stimerà la densità spettrale di potenza Sy(f) sempre come media di 50 realizzazioni. Si consiglia di visualizzare il risultato in scala logaritmica (comando semilogy) T= 0.05; M= T/dt; h=ones(1,M)/T; Sy=zeros(1,N); for k=1:50, x=randn(1,N)*sqrt(50); y=conv(x,h)*dt; Sy=Sy+(fftshift(abs(fft(y(1:N))).^2)/N)/50; end, figure, Hf=(1/M*sin(pi*f*dt*M)./sin(pi*f*dt)); % trasformata del rettangolo % discreto di durata M camp. Hf(find(f==0))=1; % -> H(f)=sinc.Per.(f) semilogy(f,abs(Hf).^2*50,'-r'); % Sy(f) teorica hold on; semilogy(f,Sy,'.b'); % Sy(f) stimata axis([-500 500 1e-3 1e2]); grid; xlabel('Frequenza [Hz]'); 6 Campionamento di segnali In MATLAB, qualunque segnale continuo è approssimato da una sequenza campionata. Si può simulare il campionamento di un segnale continuo, semplicemente riducendo il suo passo di campionamento (decimazione della sequenza). Il comando che permette di decimare un vettore, che approssima il segnale y(t) è: tc=t(1:step:end); yc=y(1:step:end); (dove step rappresenta il rapporto tra il nuovo e il vecchio passo di campionamento) La visualizzazione più adatta ai segnali campionati è ottenuta con il comando: stem(tc,yc); : Esercizio Il segnale y(t) (somma di due sinusoidi di frequenza f1=5 Hz f2=20 Hz, e ampiezza A1=2, A2=1) originariamente campionato con passo dt=1 ms, viene sottocampionato con passo dt=10 ms. Si disegni il segnale originale ed il segnale sottocampionato. La durata dell’osservazione è T=1 sec. dt=0.001; t=[0:dt:1-0.001]; 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); Campionamento ed equivocazione L’effetto della discretizzazione di un segnale continuo è replicare la risposta in frequenza del segnale a passo fc=1/dt. In prima approssimazione quindi le uniche frequenze rappresentabili sono limitate 7 all’intervallo ±1/(2*dt). Frequenze più elevate vengono interpretate come altre frequenze nell’intervallo definito in precedenza (equivocazione). Date due sinusoidi campionate con freq. di campionamento fc=20 Hz, la prima a frequenza f1 minore di fc/2 (non equivocata) e l’altra a frequenza f2=f1+fc, si può verificare come i campioni delle due sinusoidi si sovrappongono perfettamente (equivocazione). fc=20; dt=1/fc; t=[0:dt:2]; f1=2; f2=f1+fc; % % % % % freq. campionamento intervallo campionamento asse campione tempi freq. non aliasata freq. aliasata figure subplot(2,1,1), plot(t,sin(2*pi*f1*t),'*',t,sin(2*pi*f2*t),'o') xlabel('tempo') subplot(2,1,2), t1=[0:dt/10:2]; plot(t1,sin(2*pi*f1*t1),t1,sin(2*pi*f2*t1),t, sin(2*pi*f1*t),'*') xlabel('tempo') 8 Ricostruzione di segnali Il segnale può essere ricostruito correttamente, se il segnale campionato, definito nei soli istanti y(n*dt), (e quindi con trasformata periodica di periodo fc=1/dt), viene filtrato con un filtro passa-basso nell’intervallo –1/2dt , 1/2dt. Questo può essere fatto convolvendo con la risposta all’impulso del filtro ideale, ovvero il sinc(t). Quindi, per poter effettuare la ricostruzione: % spettro del segnale continuo N =length(t); df=1/(N*dt); f=[N/2+[0:N-1]]*df; % N è pari Y =fftshift(fft(y))*dt; % spettro del segnale impulsivo yi=zeros(size(y)); yi(1:10:end)=yc; YI =fftshift(fft(yi))*dt; % ricostruzione sinc th=[-1:dt:1]; h =sin(pi*100*th)./(pi*100*th); h(find(th==0))=1; yr=conv(yi,h); tr=th(1)+t(1)+[0:length(yr)]*dt; set=find(tr>=0 & tr<1); yr=yr(set); YR=fftshift(fft(yr))*dt; figure, subplot(3,1,1), plot(t,y,'--r',t,yr,'b'); subplot(3,1,2), semilogy(f,abs(YI),'b'); grid, axis([-500 500 1e-3 1]); subplot(3,1,3), semilogy(f,abs(YR),'b',f,abs(Y),'--r'); grid, axis([-500 500 1e-3 1]); Possiamo interpretare l’esempio presentato come simulazione del comportamento del filtro analogico necessario per la ricostruzione, ma anche come sovracampionamento numerico (esempio, il classico sovracampionamento 8:1 utilizzato nei cd-player), che permette di semplificare lo stadio analogico successivo comunque necessario. Infatti, il sovracampionamento (o interpolazione) numerico, permette di allontanare le repliche spettrali (per il sovracampionamento 8:1, il periodo diventa 8fc!) e quindi di richiedere la realizzazione di filtri analogici con piccole pendenze. Ovviamente nella ricostruzione di segnali continui si impiegheranno filtri di breve durata, per rendere l’operazione possibile in tempo reale. Ad esempio si potranno utilizzare il mantenitore, l’interpolatore lineare, cubico. In MATLAB, questo tipo di ricostruzione può essere simulata con il comando interp1. La risposta in frequenza del corrispondente filtro di ricostruzione sarà 9 un’approssimazione tanto peggiore del filtro passa-basso ideale, quanto più bassa è la lunghezza della risposta impulsiva del filtro. % ricostruzione pratica di segnali yr=interp1(tc,yc,t,'nearest'); % provare anche con ‘linear’, % ’v5cubic’,’spline’ yr(find(isnan(yr))=0; YR=fftshift(fft(yr))*dt; figure, subplot(2,1,1), plot(t,y,'--r',t,yr,'b'); subplot(2,1,2), semilogy(f,abs(YR),'b',f,abs(Y),'--r'); grid, axis([-500 500 1e-3 1]); : Esercizio Si analizzi la risposta impulsiva dei diversi interpolatori nel dominio delle frequenze (si calcoli la trasformata di Fourier della sequenza ottenuta interpolando 10:1 un singolo impulso) 10