Appunti Matlab - Sequenze
Table of Contents
1. Argomenti
2. Lezioni
- flie video 04.mp4 minuto 42 file pdf 12 Sequenze Elementari;
- file pdf 11Sequenzeelementari.odf
- file video 06.mp4 minuto 1.59.00 file pdf 13 Processi aleatori;
- file video 07.mp4 inizio video file pdf 12 Campionamento TrasformataFourier
- file video 08.mp4 minuto 1.55.00 file pdf 13 Processi aleatori
- file video 09.mp4 inizio video file pdf 14 quantizzazione
- file video 10.mp4 script matlab
- file video 11.mp4 inizio video file pdf 21 trasformata z
3. Sequenze Elementari
3.1. Impulso unitario
3.1.1. Uso della funzione \(dirac\) di mathlab
N = -20:1:20; x = ( dirac(N-1)); idx = x == Inf; % find Inf x(idx) = 1; % set Inf to finite value stem(N,x); ax = gca; exportgraphics(ax,'./img/dirac.png');
Figure 1: \(\delta[n]\)
3.1.2. Definizione dell'impulso unitario con \(u[n]\)
L'esempio che segue simula l'impulso unitario mediante:
\(\delta[n]=u[n]-u[n-1]\).
Come si vede dal codice è possibile effettuare anche uno shift dell'impulso
\(\delta[n-k]=u[n-k]-u[n-k-1]\)
n=[-20:20]; % si definisce l'intervallo
k=10; %% si definisce uno shift verso dx
k1=-10; %% shift verso sx
x=u(n,k)-u(n-k-1); % definizione del gradino unitario
x1=u(n,k1-1)-u(n,k1); % definizione del gradino unitario
% [____________|^^^^^^^^^^^^^^^^^^^^^^^^^^^^^] u(n,k-1)
% [_____________|^^^^^^^^^^^^^^^^^^^^^^^^^^^^] u(n,k)
% [____________|_____________________________] x=u(n,k-1)-u(n,k)
figure; % definisce una nuova finestra di plot dove verrano disegnati i plot seguenti
hold on; % blocca il riquadro appena creato
stem(n,x,'r');
figure; % definisce una nuova finestra di plot dove verrano disegnati i plot seguenti
hold on; % blocca il riquadro appena creato
stem(n,u(n,k1),'b');
stem(n,u(n,k1-1),'g');
stem(n,x1,'r');
legend('u(n,k1)','u(n,k1-1)','u(n,k1-1)-u(n,k1)');
ax=gca; % associa l'oggetto grafico figure ad una variabile
exportgraphics(ax,'./img/du.png');
Figure 2: \(u(n,k1-1)-u(n,k1)\)
3.2. Funzione segno
In matlab esiste la funzione sign(x) la quale restituisce 1 o -1 in relazione al segno dei singoli valori dell'array x. Per praticita e' stata definita una funzione segno personalizzata.
3.2.1. sgm - Funzione segno alternativa
% definizione di sgn[n]
% La funzione modella il gradino come segue
% - u[n] = u(n);
% - u[n-k] = u(n,k);
% - u[n+k] = u(n,k);
% in cui n è l'intervallo di definizione definibile come intervallo rappresentato
%
%
function y=sgm(n,k)
if nargin == 1
k=0;
end
% shift del vettore dell'intervallo
n=n+k;
% creazione del vettore sgn
% find(n<0) trova tutti gli indici con valori negativi
% n(.........) trova tutti i valori negativi
% (n(.........)<0) crea una array di 1 quanti sono i valori negativi trovati
% (................)*-1 se i valori cercati sono quelli negativi si moltiplica l'array precedente per -1
% |<---val negativi-->| 0 |<val positivi>|
y=[((n(find(n<0))<0)*-1) 0 (n(find(n>0))>0)];
end
3.2.2. Uso di sign(x) e sgm(m,n)
addpath('./m/');
n=[-20:20]; % si definisce l'intervallo
k=-10; % si definisce uno shift verso dx
x1=sign(n); % shifth utilizzando la funzione segno
x2=sgm(n,k); % utilizzo della funzione personalizzata
x3=sgm(n-k); % altro esempio di shift con la funzione personalizzata
figure;
ax=gca; % associa l'oggetto grafico figure ad una variabile
subplot(2,2,1);
stem(n, x1,'r');
legend('sign[n]');
subplot(2,2,2);
stem(n, x2,'b');
legend('sgm(n,10)');
subplot(2,2,3);
stem(n,x3,'g');
legend('sgm(n-10)');
saveas(gcf,'./img/sgm.png');
Figure 3: Esempi di utilizzo della funzione segno
3.3. Gradino unitario u[n]
% definizione di u[n]
% La funzione modella il gradino come segue
% - u[n] = u(n);
% - u[n-k] = u(n,k);
% - u[n+k] = u(n,k);
% in cui n è l'intervallo di definizione definibile come intervallo rappresentato
%
%
function y=u(n,k)
if nargin == 1
k=0;
end
y=[(n-k)>0];
% [------------------------------------------------] n
% [..............k.................................] k
% [--------------0+++++++++++++++++++++++++++++++++] n-k
% [000000000000000111111111111111111111111111111111] test (n-k)>0
end
3.3.1. Esempio
n=[-20:20]; % si definisce l'intervallo
k=3; %% si definisce uno shift verso dx
k1=-10; %% shift verso sx
x=u(n); % definizione del gradino unitario
y=u(n,k); % definizione del gradino unitario con shift a dx
z=u(n,k1); % definizione del gradino unitario con shift a sx
figure; % definisce una nuova finestra di plot dove verrano disegnati i plot seguenti
subplot(2,2,1);
stem(n,x,'r');
legend('u[n]');
subplot(2,2,2);
stem(n,y,'g');
legend('u[n-3]');
subplot(2,2,3);
stem(n,(x-y),'b');
legend('u[n]-u[n-3]');
subplot(2,2,4);
stem(n,(y-x),'r--');
legend('u[n-3]-u[n]');
saveas(gcf,'./img/u.png');
Figure 4: Esempio di plotting della funzione u[n]
3.3.2. Definizione della funzione gradino mediante la funzione segno
n=-20:20; % si definisce l'intervallo
k=-10; % si definisce uno shift verso dx
y=0.5 * sign(n);
y1=y + 0.5;
y2=y1 + 0.5*dirac(n);
ax=gca; % associa l'oggetto grafico figure ad una variabile
figure;
subplot(2,2,1);
stem(n, y,'r');
legend({'$\frac{1}{2} sign[n]$'}, 'Interpreter','latex');
subplot(2,2,2);
stem(n, y1,'b');
legend({'$\frac{1}{2}sign[n] + \frac{1}{2}$'},'Interpreter','latex');
subplot(2,2,3);
stem(n, y2,'g');
legend({'$\frac{1}{2}sign[n] + \frac{1}{2} + \frac{1}{2} \delta [n]$'},'Interpreter','latex');
saveas(gcf,'./img/usgm.png');
Figure 5: Definizione di \(u[n]\) tramite la funzione \(sgn[n]\)
3.4. Campionamento di sin
3.4.1. sinsignal
La funzione sinsignal campiona un segnale sinusoidale restiuendo il vettore [[valori di sin],[base dei tempi]].
%funzione di campionamento di un segnale sinusoidale
% f0: frequenza
% phi : fase
% A: ampiezza
% fc : frequenza di campionamento
% N : numero di campioni
function [y,t]=sinsignal(f0, phi, A, fc, N)
Tc=1/fc; % passo di campionamento
t=(0:N-1)*Tc; % base dei tempi - array di valori della grandezza della sin
% crea un vettore con i valori assunti dalla funzione sin
% in questo modo si simula un campionamento fatto con la delta di D.
y=A*sin(2*pi*f0*t + phi);
end
3.4.2. Esempio di campionamento
f0=100; A=10; phi=0; fc=2000; N=200; [x,t]=sinsignal(f0,phi,A,fc,N); figure; subplot(2,1,1); stem(t,x); subplot(2,1,2); plot(t,x); saveas(gcf,'./img/sin.png');
Da notare che il massimo contributo lo porta il picco della sinc ma per la ricostruzione esatta e' necessario anche il contributo della coda.
Figure 6: Valori campionati di sin e base dei tempi
3.4.3. Esempio di ricostruzione di campioni
f0=100; % frequenza del segnale
A=10; % ampiezza del segnale
phi=0; % fase del segnale
fc=2000; % frequenza di campionamento
N=200; % numero di campioni
% campionamento del segnale
[x,t]=sinsignal(f0,phi,A,fc,N);
% ricostruzione del segnale
T=1/fc ; % passo di campionamento
durata = N*T;
t=0:1.e-5:durata;
figure;
hold on;
xr_prev= xr;
plot(t,xr_prev,'b',t,A*sin(2*pi*f0*t+phi),'b');
xr=0;
for n=0:N-1
s=x(n+1)*sinc(fc*(t-n*T));
plot(t,s,'r'); % disegno del punto della sinc
xr=xr+s; % picco ottenuto dalla somma di tutte le sinc
pause(0.2);
plot(t,s,'w'); % disegno del punto della snc
plot(t,xr_prev,'b',t,A*sin(2*pi*f0*t+phi),'b');
end
plot(t,xr_prev,'b',t,A*sin(2*pi*f0*t+phi),'b');
Di seguito l'animazione e' prodotta eseguendo il codice precedente.
3.5. Esponenziale Reale
% La funzione modella a^n
%
% a = base
% N = lunghezza della sequenza
%
function y=esp(a,N)
y = a.^N;
end
N = 50; % lunghezza della sequenza
a = 0.9; % base reale dell'esponente
b = [-20:20]; % si definisce l'intervallo
k = 10; % si definisce uno shift verso dx
x = esp(a,b);
y = u(b,k);
z = y.*x;
figure;
hold on;
%subplot(2,2,1);
stem(b,x,'b');
%subplot(2,2,2);
stem(b,y);
%subplot(2,2,3);
stem(b,z);
legend({'$a^b$','$u[n-10]$','$a^b * u[n-10]$'},'interpreter','latex');
saveas(gcf,'./img/esp.png');
Figure 7: Funzione Esponenziale
3.6. Esponenziale complesso
Figure 8: come rappresentare un exp complesso
N = 50; % lunghezza della sequenza
a = 0.9*exp(1j*pi/8); % base complessa
b = [-20:20]; % si definisce l'intervallo
k = 10; % si definisce uno shift verso dx
x = esp(a,b);
%y=u(b,k);
%z=x.*y;
figure;
subplot(2,2,1);
stem(b,x);
label("Exp complesso");
%stem(b,y);
%stem(b,z);
subplot(2,2,2);
stem(b,real(x));
xlabel("Base");
%xlabel("sample");
ylabel("real");
subplot(2,2,3);
stem(b,imag(x));
xlabel("base");
ylabel("imaginary");
saveas(gcf,'./img/espc.png');
Figure 9: andamento dell'esponenziale complesso
3.7. Esponenziale invertito
int = [-20:20]; % intervallo dell'esponenziale
int_inv = -1.*int; % intervallo invertito
base = 2; % base dell'esponenziale
exp_inv = base.*int_inv; % esponenziale invertito
u1 = u(b,-1);
exp_inv_trc = exp_inv.*u1;
exp_neg = -1.*exp_inv;
u2 = u(int_inv,-1);
exp_neg_trc = exp_neg.*u2;
figure;
subplot(2,2,1);
stem(b,exp_inv_trc);
legend({'$a^{-n}u[n-1]$'},'interpreter','latex');
subplot(2,2,2);
stem(b1,exp_neg_trc);
legend({'$-a^{-n}u[-n-1]$'},'interpreter','latex');
saveas(gcf,'./img/espi.png');
Figure 10: andamento dell'esponenziale complesso
4. Esercizi
4.1. Calcolo energia e potenza
Scrivere uno script che calcoli energia e potenza del segnale \(x[n] = cos(2π0.15n)\) con \(n \in \{0, 1, . . . , 49 \}\)
- Input: una sequenza x
- Output: energia E e potenza P della sequenza
n=[-20:20]; % si definisce l'intervallo k=10; %% si definisce uno shift verso dx k1=-10; %% shift verso sx x=u(n-k)-u(n-k-1); % definizione del gradino unitario x1=u(n-k1)-u(n-k1-1); % definizione del gradino unitario figure; % definisce una nuova finestra di plot dove verrano disegnati i plot seguenti hold on; stem(n,x,'r'); stem(n,x1,'g'); saveas(gcf,'./img/es1.png');
Figure 11: Calcolo energia potenza