In questo articolo sono presenti simulazione effettuate con Simulink e codice scritto in MATLAB.
Introduzione
In questa breve introduzione, è utile evidenziare alcune importanti distinzioni tra i segnali che si studiano.
In questo articolo si utilizzano i termini segnale e funzione come sinonimi. In questo contesto è accettato: una funzione può (o meno) rappresentare un segnale che si vuole studiare, trasmettere, ricevere o manipolare.
Funzioni pari e dispari
è una funzione pari se , ad esempio .
è una funzione dispari se , ad esempio .
Segnale Monodimensionale
Il segnale è:
- tempo-continuo se , ovvero se ,
- tempo-discreto se , ovvero se .
Inoltre, in base al codominio B, il segnale è:
- a valori reali (continui) se
- a valori discreti se
Ad esempio, un segnale analogico è tempo-continuo e a valori continui (reali); mentre un segnale digitale è tempo-discreto e a valori discreti. Inoltre, per non lasciare spazio ad ambiguità, i segnali tempo-discreti si esprimono nella forma con che sostituisce la lettera t per convenzione. Un segnale tempo-discreto si può così definire:
Un segnale è determinato quando è noto a priori. Un segnale è aleatorio (o stocastico) quando invece non è noto a priori e si deve condurre un esperimento aleatorio per descriverlo. Questo articolo tratta segnali determinati.
Segnale Periodico
A prescindere dal dominio di definizione, un segnale si dice periodico se presenta una ripetizione periodica dei suoi valori.
Dato il periodo per un segnale tempo-continuo e per un segnale tempo-discreto:
Valore Medio
Il valore medio di un segnale periodico tempo-continuo con periodo è:
Osservazione: dato un rettangolo di altezza e lunghezza , allora l’area sottesa è:
Il valore medio di un segnale non periodico tempo-continuo è:
Presa una finestra temporale arbitraria di ampiezza T, si allarga tale finestra facendola tendere all’infinito. In questo modo si ottiene il valore medio di tutta la funzione.
Il valore medio di un segnale periodico tempo-discreto con periodo è:
Ovvero, è la media aritmetica calcolata nel periodo.
Il valore medio di un segnale non periodico tempo-discreto è:
Presa una finestra temporale arbitraria di ampiezza N, si allarga tale finestra facendola tendere all’infinito. Per effettuare una corretta media aritmetica, poiché i numeri tra ed sono , bisogna dividere la sommatoria per tale valore prima di calcolare il limite.
Energia e Potenza Media
A prescindere dal fatto che un segnale sia periodico o meno, si distinguono segnali di energia da segnali di potenza.
La potenza di un segnale tempo-continuo è il suo quadrato e si indica con la lettera p minuscola e il nome del segnale in pedice. L’energia dissipata è l’integrale della potenza e si indica con la lettera E maiuscola e il nome del segnale in pedice:
Se , ovvero se esiste ed assume un valore finito, allora rappresenta l’energia del segnale.
Esempio: Se il segnale è costante, anche la sua potenza lo sarà. L’energia invece assumerà un valore infinito, dunque non potrà essere chiamata tale:
Poiché la potenza di un segnale è essa stessa un segnale, vi si può calcolare il valore medio. Presa una finestra temporale arbitraria di ampiezza T, come sopra. La potenza media si indica con la lettera P maiuscola e il nome del segnale in pedice:
La formula dell’energia dissipata si può riscrivere come:
Se il segnale (tempo-continuo) è periodico, si può togliere l’operazione di limite:
Un segnale di energia è tale se esiste finito e, di conseguenza, . Un segnale di potenza è tale se e, di conseguenza, .
I concetti espressi sono validi anche per segnali tempo-discreto. Per non appesantire troppo l’articolo, si forniscono direttamente le formule:
Seno Cardinale
Il seno cardinale è così definito:
In MATLAB si può formalizzare questa funzione in diversi modi. Il codice che segue ne illustra quattro e crea un immagine contenente i relativi grafici.
% function graphs of sinc(t/T)
% for t == 0, function x(t) = sinc(t) returns NaN (Not a Number)
function plot_sinc()
T=1;
t=linspace(-3,3,101);
t_size = zeros(size(t));
% install Signal Processing Toolbox
% https://www.mathworks.com/products/signal.html
x=sinc(t/T);
% the figure is made up by 4 tiles
tiledlayout(2, 2)
% add a tile to the figure
nexttile
plot(t,x, 'LineWidth', 2.5, 'Color', 'b');
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.5 1.2])
hold off
% ---
nexttile
x=zeros(1,length(t));
for n=1:length(t)
if t(n)==0
x(n)=1; % avoid NaN result
else
x(n)=sin(pi*t(n)/T)/(pi*t(n)/T);
end
end
plot(t,x,'LineWidth', 2.5, 'Color', 'r');
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.5 1.2])
hold off
% ---
% if t is equal zero, add a very small quantity epsilon (eps) in order to
% avoid discontinuity and the subsequent NaN value (Not a Number)
t2=t+eps.*(t==0);
x=sin(pi*t2/T)./(pi*t2/T);
nexttile
plot(t,x,'LineWidth', 2.5, 'Color', 'g');
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.5 1.2])
hold off
% ---
% Definition provided from the formula within the blog post
x=zeros(1,length(t));
x(t==0)=1;
x(t~=0)=sin(pi*t(t~=0)/T)./(pi*t(t~=0)/T);
nexttile
plot(t,x,'LineWidth', 2.5, 'Color', '#000000');
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.5 1.2])
hold off
end
function seno_cardinale()
N = 2; % durata sul semiasse positivo
% --- sinc tempo continuo --- %
t = linspace(-N, N, 1001);
t_size = zeros(size(t));
xt = cardinal_sin(t);
tiledlayout(1, 2)
nexttile % aggiuge un grafico alla figura
plot(t, xt, 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.3 1.1])
title('Sinc tempo continuo', FontSize=20)
% --- sinc tempo discreto --- %
n = -N:0.1:N; % vettore temporale (discreto)
xn = cardinal_sin(n);
nexttile % secondo grafico
stem(n, xn, 'filled', 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.3 1.1])
title('Sinc tempo discreto', FontSize=20)
end
function y = cardinal_sin(x)
y=zeros(1,length(x));
y(x==0)=1;
y(x~=0)=sin(pi*x(x~=0))./(pi*x(x~=0));
end
Proprietà
La sua trasformata di Fourier è:
Il valore medio del seno cardinale tempo-continuo è:
La potenza media del seno cardinale tempo-continuo è:
L’energia dissipata tende ad essere infinita:
Funzione Segno
La funzione segno è definita come:
function segno()
N = 5; % durata sul semiasse positivo
% --- segno tempo continuo --- %
t = linspace(-N, N, 1001);
t_size = zeros(size(t));
x_t = sgn(t);
tiledlayout(1, 2) % la figure è composta da 2 "piastrelle" (tile)
nexttile % aggiunge una "piastrella" alla figura
plot(t, x_t, 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-1.1 1.1])
title('Segno tempo continuo', FontSize=20)
% --- gradino tempo discreto --- %
n=-2*N:2*N; % vettore temporale (discreto)
x_n = sgn(n);
nexttile
stem(n, x_n, 'filled', 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-1.1 1.1])
title('Segno tempo discreto', FontSize=20)
end
function y = sgn(x)
% fill the array with 1s
y=ones(1, length(x));
y(x < 0) = -1;
y(x == 0) = 0;
end
Proprietà
La sua trasformata di Fourier è:
Nel calcolo degli integrali, si può trascurare il valore che il segnale assume per .
Il valore medio del segno tempo-continuo è:
La potenza media del segno tempo-continuo è:
Senza effettuare altri calcoli, è noto che:
Per scrupolo però:
Si dimostra che tali parametri assumono gli stessi valori anche nel caso in cui il segnale sia tempo-discreto:
Il valore medio del segno tempo-discreto è:
La potenza media del segno tempo-discreto è:
Si osserva che:
Il segno è un segnale di energia, dunque:
Gradino Unitario
La funzione gradino unitario tempo-continuo è comunemente indicata con . Strettamente legata alla funzione segno , è una funzione di grande interesse nello studio dei segnali poiché usata per comporre il rettangolo unitario.
Si noti che il valore di che le funzioni assumono rispettivamente in e è puramente convenzionale. Si noti inoltre che:
Il gradino può essere rappresentato sia in forma continua che in forma discreta. Il gradino unitario tempo-discreto è indicato con con . L’insieme dei numeri interi è dato da .
La funzione è un’astrazione matematica. Il segnale fisicamente realizzabile che approssima il gradino, indicato con , è caratterizzato da un tempo di salita finito.
Il segnale , in , è una retta con pendenza .
Dunque è in realtà un’astrazione di in cui è sufficientemente minore rispetto all’intervallo di tempo osservato. Si può affermare che per ( che tende a ), il gradino reale tende a quello ideale:
Il tempo di salita si approssima ad una discontinuità ed il gradino sale in modo verticale.
function gradino()
N = 5; % durata sul semiasse positivo
% --- gradino tempo continuo --- %
t = linspace(-N, N, 1001);
t_size = zeros(size(t));
grad = u(t);
% metodo alternativo per definire il gradino
% util = utility;
% grad_v2 = 0.5*(util.sgn(t)+1);
tiledlayout(1, 2) % la figure è composta da 2 "piastrelle" (tile)
nexttile % aggiunge una "piastrella" alla figura
plot(t, grad, 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.1 1.1])
title('Gradino tempo continuo', FontSize=20)
% --- gradino tempo discreto --- %
n=-2*N:2*N; % vettore temporale (discreto)
grad = u(n);
nexttile
stem(n, grad, 'filled', 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.1 1.1])
title('Gradino tempo discreto', FontSize=20)
end
function y = u(x)
y=zeros(1, length(x));
y(x >= 0) = 1;
y(x == 0) = 0.5;
end
Gradino Reale
% calcolare gli andamenti del gradino "reale" e della sua derivata
% in base a diversi valori di epsilon
function gradino_reale
figure(1);
hold on; grid on;
figure(2);
hold on; grid on;
epsilon=[0.05 0.1 .2];
color=[0.0 0.4 0.6];
for i=1:length(epsilon)
deltaT=epsilon(i)/100; % spaziatura tra i vari istanti temporali [s]
tempo=-1:deltaT:+1; % vettore temporale;
delta=1/(2*epsilon(i))*rectpuls(tempo/(2*epsilon(i)));
u=deltaT*cumsum(delta);
figure(1);
plot(tempo,delta,'Color',color(i)*ones(1,3),'LineWidth',2.5);
figure(2);
plot(tempo,u,'Color',color(i)*ones(1,3),'LineWidth',2.5);
end
figure(1);
axis([-.4 .4 -1 11]);
legend('\epsilon=0.05','\epsilon=0.1','\epsilon=0.2','FontSize',20);
xlabel('Tempo (s)','FontSize',20);
ylabel('\delta_\epsilon(t)','FontSize',20);
title('Limite della derivata del gradino "reale"','FontSize',20);
figure(2);
axis([-.4 .4 -0.2 1.2]);
legend('\epsilon=0.05','\epsilon=0.1','\epsilon=0.2','FontSize',20);
xlabel('Tempo (s)','FontSize',20);
ylabel('u_\epsilon(t)','FontSize',20);
title('Limite del gradino "reale"','FontSize',20);
end
Proprietà
La sua trasformata di Fourier è:
Il valore medio del gradino tempo-continuo è:
La potenza media del gradino tempo-continuo è:
L’energia del gradino tempo-continuo è:
Esponenziale monolatero
Il comportamento dell’esponenziale per viene azzerato grazie alla moltiplicazione per la funzione gradino.
La sua trasformata e anti-trasformata di Fourier è:
function exp_mono()
N = 2; % durata sul semiasse positivo
T = 1;
% --- tempo continuo --- %
t = linspace(-N/2, 2*N, 1001);
t_size = zeros(size(t));
xt = exp(-t./T) .* u(t);
tiledlayout(1, 2)
nexttile % aggiuge un grafico alla figura
plot(t, xt, 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.1 1.1])
xlim([-0.5 3.5])
title('Esponenziale monolatero tempo continuo', FontSize=20)
% --- tempo discreto --- %
n = -N/2:0.1:2*N; % vettore temporale (discreto)
xn = exp(-n./T) .* u(n);
nexttile % secondo grafico
stem(n, xn, 'filled', 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.1 1.1])
xlim([-0.5 3.5])
title('Esponenziale monolatero tempo discreto', FontSize=20)
end
function y = u(x)
y=zeros(1, length(x));
y(x >= 0) = 1;
y(x == 0) = 0.5;
end
Rettangolo Unitario
Il rettangolo unitario, come già visto sopra, è:
Il rettangolo unitario è costituito da due gradini unitari, uno dei quali ribaltato (rispetto all’asse orizzontale) per garantire il fronte di discesa:
function rettangolo_unitario()
N = 2; % durata sul semiasse positivo
% --- rettangolo tempo continuo --- %
t = linspace(-N, N, 1001);
t_size = zeros(size(t));
rettangolo_continuo = rect(t); % u(t+1/2) - u(t-1/2);
tiledlayout(1, 2)
nexttile % aggiuge un grafico alla figura
%figure(1);
plot(t, rettangolo_continuo, 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.1 1.1])
title('Rettangolo tempo continuo', FontSize=20)
% --- rettangolo tempo discreto --- %
n = -N:0.1:N; % vettore temporale (discreto)
rettangolo_discreto = rect(n); % u(n+1/2) - u(n-1/2);
nexttile % secondo grafico
stem(n, rettangolo_discreto, 'filled', 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.1 1.1])
title('Rettangolo tempo discreto', FontSize=20)
end
% by using x(abs(x)<=1) inside the indexing operation (on the left), you
% ensure that both sides of the assignment have the same dimensions.
function y = rect(x)
y=zeros(1, length(x));
y(abs(x) < 1/2) = 1;
y(abs(x) == 1/2) = 1/2;
end
Proprietà
La sua trasformata di Fourier è:
Il valore medio del rettangolo tempo-continuo è:
La potenza media del rettangolo tempo-continuo è:
L’energia del rettangolo tempo-continuo è:
Bisettrice limitata
La bisettrice del I e III quadrante è la funzione . La bisettrice del II e IV quadrante è .
Se si vogliono limitare tali funzioni ad un intervallo più ristretto di , si devono moltiplicare per un opportuno rettangolo.
La bisettrice del I quadrante limitatamente a è:
La bisettrice del II quadrante limitatamente a è:
La bisettrice del III quadrante limitatamente a è:
La bisettrice del IV quadrante limitatamente a è:
Posto ad esempio :
Triangolo Unitario
La funzione triangolo unitario è:
function triangolo_unitario()
N = 2; % durata sul semiasse positivo
% --- triangolo tempo continuo --- %
t = linspace(-N, N, 1001);
t_size = zeros(size(t));
triangolo_continuo = triang(t);
tiledlayout(1, 2)
nexttile % aggiuge un grafico alla figura
plot(t, triangolo_continuo, 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.1 1.1])
title('Triangolo tempo continuo', FontSize=20)
% --- triangolo tempo discreto --- %
n = -N:0.1:N; % vettore temporale (discreto)
triangolo_discreto = triang(n);
nexttile % secondo grafico
stem(n, triangolo_discreto, 'filled', 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-0.1 1.1])
title('Triangolo tempo discreto', FontSize=20)
end
% by using x(abs(x)<=1) inside the indexing operation (on the left), you
% ensure that both sides of the assignment have the same dimensions.
function y = triang(x)
y=zeros(1, length(x));
y(abs(x)<=1) = 1 - abs(x(abs(x)<=1));
end
N.B. Un triangolo di altezza A e durata T è dato da:
Proprietà
La sua trasformata di Fourier è:
Il valore medio del triangolo tempo-continuo è:
La potenza media del triangolo tempo-continuo è:
L’energia del triangolo tempo-continuo è:
Derivata del Triangolo Unitario
La derivata del triangolo unitario è una funzione discontinua composta da due rettangoli (uno dei quali nel semipiano negativo delle ascisse). Si capisce meglio togliendo l’operatore di valore assoluto dalla definizione della funzione.
function triangolo_unitario_derivata()
N = 2; % durata sul semiasse positivo
% derivata della funzione triangolo unitario
% x(t) = rect(t+0.5)-rect(t-0.5)
% x[n] = rect(n+0.5)-rect(n-0.5)
% --- tempo continuo --- %
t = linspace(-N, N, 1001);
t_size = zeros(size(t));
xt = rect(t+0.5)-1*rect(t-0.5);
tiledlayout(1, 2)
nexttile % primo grafico
plot(t, xt, 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-1.1 1.1])
title('Derivata triangolo tempo continuo', FontSize=20)
% --- tempo discreto --- %
n = -N:0.1:N; % vettore temporale (discreto)
xn = rect(n+0.5)-1*rect(n-0.5);
nexttile % secondo grafico
stem(n, xn, 'filled', 'LineWidth', 2.5, 'Color', 'b')
hold on
plot(t, t_size, t_size, t, 'Color', '#808080', 'LineStyle','--')
grid on
ylim([-1.1 1.1])
title('Derivata triangolo tempo discreto', FontSize=20)
end
% by using x(abs(x)<=1) inside the indexing operation (on the left), you
% ensure that both sides of the assignment have the same dimensions.
function y = rect(x)
y=zeros(1, length(x));
y(abs(x) < 1/2) = 1;
y(abs(x) == 1/2) = 1/2;
end
Segnale Sinusoidale
Il segnale sinusoidale è costituito dai seguenti parametri:
- ampiezza A (numero puro)
- periodo
[sec]
- frequenza
[Hz]
- fase iniziale
[rad]
, spesso indicata anche con
La pulsazione (frequenza o velocità angolare) [rad/sec]
si definisce come:
E permette di riscrivere il segnale sinusoidale:
La fase iniziale determina lo sfasamento del segnale. Preso come riferimento un segnale con :
- un segnale con fase è in anticipo
- un segnale con fase è in ritardo
Proprietà del segnale sinusoidale
Il valore medio è nullo:
L’integrale del valore medio si risolve per sostituzione:
La potenza media è:
L’energia dissipata è:
Esponenziale Complesso
Si può approfondire il tema leggendo il seguente articolo: Numeri Complessi. I parametri sono gli stessi indicati sopra. In questo caso l’ampiezza è unitaria.
Questa formula ha le seguenti implicazioni:
Da cui si ricavano facilmente:
- modulo ,
- argomento .
L’esponenziale complesso è un segnale sinusoidale perché composto da due componenti sinusoidali.
La potenza istantanea è il quadrato del modulo del segnale:
Un’applicazione molto significativa del segnale esponenziale complesso si può apprezzare nel dominio dei fasori, nell’ambito dell’analisi in regime sinusoidale.
Funzione Delta di Dirac
è un rettangolo alto tra e nullo per i restanti valori di . La sua area è unitaria.
è un gradino reale con pendenza tra :
Queste funzioni sono legate dall’operatore di derivazione (o integrazione):
Si osserva, come conferma di quanto scritto, che è alto quanto la pendenza di nel medesimo intervallo di riferimento. Per sufficientemente piccolo, tende ad un impulso infinitamente alto e stretto. Il comportamento di tali funzioni studiate al limite è:
Si può arrivare alla definizione del segnale Delta di Dirac:
Si tratta di un rettangolo infinitamente alto e stretto che, per convenzione, assume il valore per nell’origine degli assi:
Proprietà
La funzione Delta di Dirac si indica con . La sua notevole importanza nel campo dello studio dei segnali è dovuta ad alcune proprietà. Questa funzione è:
- derivata della funzione gradino ,
- trasformata di Fourier della costante ,
- elemento neutro dell’operazione di convoluzione
è detta funzione campionatrice:
fornisce la trasformata di Fourier anche ai segnali periodici tempo-continui.
Inoltre, nei sistemi LTI, la funzione risposta impulsiva è la risposta all’impulso . Come si studierà in seguito nell’ambito dei filtri ideali, permette di calcolare la funzione in output a partire da un qualunque input.
N = 5; % durata sul semiasse positivo
n =-2*N:2*N; % vettore temporale (discreto)
y = dirac(n); % calcolo della delta di dirac sul vettore n
idx = y == Inf; % trova il punto in cui la funzione dirac vale Inf
y(idx) = 1; % imposta Inf al valore finito 1
stem(n,y, LineWidth=1.5) % grafico discreto
, come il gradino, è un modello matematico che si può approssimare con un onda rettangolare sufficientemente alta e stretta rispetto all’intervallo di osservazione. Come nel caso del gradino reale, la funzione fisicamente realizzabile che approssima la Delta di Dirac si indica con la lettera epsilon nel pedice:
Sequenza Impulsiva
Il corrispettivo tempo-discreto della Delta di Dirac è la sequenza impulsiva così definita:
Si può definire la Delta di Kronecker come segue:
Si tratta di un importante modello matematico utilizzato anche per la definizione della matrice identità:
Gradino tempo discreto
Il gradino tempo discreto è la sequenza somma di :
La sequenza impulsiva si ricava grazie all’incremento del gradino, ovvero la differenza all’indietro del primo ordine.