Probabilità e processi in Matlab - home page risorse

annuncio pubblicitario
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
Scarica