Introduzione
Classificazione di Segnali
Il segnale è una grandezza fisica rappresentata da una funzione di una o più variabili a cui è associato un contenuto informativo.
Ad esempio, un segnale acustico è rappresentato dalla funzione pressione dell’aria che varia nel tempo. Un segnale elettrico è dato dalla corrente che varia nel tempo
Un esempio di segnale multidimensionale è il monitor di un computer. L’immagine statica (frame) in B/W (black/white) è associata ad un valore di intensità luminosa punto per punto. Dato uno spazio bidimensionale, si devono descrivere tutti i livelli di intensità luminosa: la funzione è in due variabili (asse orizzontale e verticale). Per passare da un’immagine statica ad una dinamica, si deve aggiungere la variabile temporale: dove la terza dimensione è data dal tempo che scorre.
Inoltre, se si vuole passare da B/W ad RGB (red, green, blue) per apprezzare i colori punto per punto del frame, bisogna operare una trasformazione:
Segnali Monodimensionali
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.
I segnali possono essere anche a valori complessi: . Questa casistica è assimilabile, seppur con più complessità, ai segnali a valori reali. Si ricorda che . Un numero complesso con parte immaginaria nulla è un numero reale.
Esempio: un segnale binario è tempo-discreto a valori discreti con .
Dato il codice MATLAB che segue:
function binary_signal
figure;
N = 5;
n =-2*N:2*N;
y = rand_binary_gen(length(n));
stem(n,y, LineWidth=1.5)
grid on
set(title('Esempio di segnale binario'),'FontSize',16);
ylim([-0.1 1.1])
% xlim([-0.5 0.5])
hold off
end
% num parameter defines the number length of the 1D array
% or random integer elements (between 0 and 1) to generate
function y = rand_binary_gen(num)
% randi([0,1]) --> random integer between 0 and 1
y = randi([0 1], 1, num);
end
Si ottiene il grafico:
Operazioni su segnali tempo-discreti
Le operazioni su segnali tempo-discreti si possono comparare alle stesse applicate sui segnali tempo-continui.
L’operazione analoga alla derivata è l’incremento.
L’operazione analoga all’integrazione è la sommatoria.
Il campionamento è la serie di operazioni che permettono di rappresentare segnali tempo-continui in segnali tempo-discreti. L’operazione inversa del campionamento è l’interpolazione.
Campionamento
Dato un segnale tempo-continuo . Campionare significa definire un segnale tempo-discreto estraendo i valori che assume ad istanti di tempo equidistanti.
Le operazioni necessarie per effettuare il campionamento sono:
- definire il periodo di campionamento T
- definire la sequenza discreta di valori
- porre in corrispondenza gli assi temporali tempo-continuo e tempo-discreto
Posto per far coincidere i segnali, allora:
A livello pratico, il campionamento è effettuato da convertitori A/D (analogico/digitale) pilotati da un segnale di clock impostato alla frequenza .
Il convertitore A/D è un campionatore reale e fornisce una rappresentazione finita del segnale campionato:
In aritmetica binaria, il numero di cifre (bit) usate per la rappresentazione degli elementi di varia da 8 a 16.
Un campionatore ideale estrae valori con infinite cifre decimali:
L’errore racchiuso nella rappresentazione della sequenza è detto errore di quantizzazione. In questo articolo si suppone che le operazioni di campionamento siano sempre ideali.
La trasformata di Fourier di una sequenza ottenuta mediante campionamento di un segnale tempo-continuo è la periodicizzazione della trasformata di Fourier del segnale tempo-continuo. Il periodo di ripetizione ha frequenza uguale alla frequenza di campionamento.
Dimostrazione leggera del Campionamento
Dato il seguente segnale tempo-continuo e , si applica un campionamento in frequenza, passando come argomento di Y:
Dato il segnale , allora:
La proprietà di dualità implica:
Condizione di Nyquist
L’errore di aliasing porta ad una distorsione del segnale campionato . Questo errore è dovuto dalle repliche dello spettro-base, ovvero gli alias, che vanno a sommarsi introducendo la distorsione.
Se il segnale di partenza ha banda limitata, si può garantire l’assenza di aliasing grazie alla condizione di Nyquist:
Con frequenza di campionamento.
permette di ricostruire un segnale tempo-continuo a partire dai propri campioni tempo-discreti.
Per un segnale radio digitale kHz
e dunque:
Per poter essere trasmesso e ricostruito correttamente, un segnale radio può avere una banda larga al massimo kHz
.
Filtraggio anti-aliasing
Se , è opportuno applicare un filtraggio anti-aliasing (passa-basso ideale) al segnale tempo-continuo in ingresso prima di effettuare il campionamento.
Questo filtro è in grado di eliminare piccoli disturbi fuori banda del segnale.
Esempio:
Nel dominio delle frequenze si possono apprezzare due in corrispondenza di :
function es_cos_aliasing
% given x[n]=cos(2*pi*f0*n*T)=x(nT)
N = 10; % durata sul semiasse positivo
f0=2;
T=0.8;
f = linspace(-N, N, 1001); % vettore tempo-continuo
t = f;
n =-N:1:N; % vettore tempo-discreto
x_n = cos(2*pi*f0*n*T);
x_t = cos(2*pi*f0*t);
Xf = 0.5 * (dirac_delta(f-f0)+dirac_delta(f+f0));
overXf = (1/(2*T)) * (dirac_delta(f-f0)+dirac_delta(f+f0));
figure(1)
plot(f,overXf,LineWidth=1.5)
hold on
plot(f,Xf,LineWidth=1.5)
grid on
ylim([-0.2 0.6])
xlim([-2.2 2.2])
legend([{'$\overline{X}(f)$'},{'$X(f)$'}],'Interpreter','latex', 'FontSize', 22)
title('Dominio delle frequenze')
hold off
figure(2)
plot(t,x_t,LineWidth=1.5)
hold on
stem(n,x_n,LineWidth=1.5)
grid on
ylim([-1.1 1.1])
xlim([-2 2])
legend([{'$x(t)$'},{'$x[n]$'}],'Interpreter','latex', 'FontSize', 22)
title('Dominio temporale')
hold off
end
% return a Dirac function without discontinuity
function y = dirac_delta(x)
y = dirac(x);
idx = y == Inf; % find Inf
y(idx) = 1; % set Inf to finite value
end
Interpolazione
Il segnale tempo-continuo interpolato si indica con . Esistono diversi tipi di interpolazione in base all’impulso di interpolazione utilizzato.
L’interpolatore ideale è detto interpolatore cardinale. Nel campo delle frequenze è un rettangolo di altezza unitaria e larghezza pari a T e, nel dominio temporale, è dunque un seno cardinale:
Usando questo interpolatore, non c’è bisogno di applicare un equalizzatore (come si vedrà in seguito). Il segnale di partenza si ottiene direttamente con la formula:
A livello pratico, l’interpolatore cardinale può solo essere approssimato.
function es_cos_interpolation
% given x[n]=cos(2*pi*f0*n*T)=x(nT)
N = 10; % durata sul semiasse positivo
f0=2;
T=0.8;
f = linspace(-N, N, 1001); % vettore tempo-continuo
t = f;
n =-N:1:N; % vettore tempo-discreto
x_n = cos(2*pi*f0*n*T);
% 1-D interpolation: https://www.mathworks.com/help/matlab/ref/interp1.html
hat_x = interp1(n,x_n,t);
hat_x_sp= interp1(n,x_n,t,"spline");
hat_x_p= interp1(n,x_n,t,"previous");
%x_t = cos(2*pi*f0*t);
%Xf = 0.5 * (dirac_delta(f-f0)+dirac_delta(f+f0));
%overXf = (1/(2*T)) * (dirac_delta(f-f0)+dirac_delta(f+f0));
%sum_x_n = my_sum(N, f0, t, T);
% hat_x = sum_x_n .* p_t(t-T, T);
plot(n,x_n,'o',LineWidth=1.5)
hold on
plot(t,hat_x,LineWidth=1.5)
hold on
plot(t,hat_x_sp,LineWidth=1.5)
hold on
plot(t,hat_x_p,LineWidth=1.5)
grid on
ylim([-1.1 1.1])
xlim([-2 2])
legend([{'$x[n]$'}, 'linear', 'spline', 'previous'],'Interpreter','latex', 'FontSize', 22)
title('Different interpolation methods')
hold off
end
%function y = my_sum(sum_limit, f0, t, T)
% domain=-sum_limit:1:sum_limit;
% i = 1; % inizializzazione dell'indice del ciclo for
% y = zeros(1,length(domain));
% for m = -sum_limit:1:sum_limit % k va da -n ad n con uno step di 1
% y(i) = cos(2*pi*f0*m*T)* p_t(t(i)-(m*T), T);
% fprintf("»»» %d) y = %.2f\n", m,y);
% i=i+1; % incremento dell'indice
% end
%end
% interpolation_impulse
%function y = p_t(x,T)
% y = rect((x-(T/2))/T);
%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
Ricostruzione di un segnale
L’obiettivo del paragrafo è illustrare la ricostruzione di un segnale tempo-continuo a partire dai suoi campioni .
I passaggi completi, illustrati nel dettaglio in seguito, sono:
- interpolazione
- filtraggio passa-basso ideale
- equalizzazione (opzionale)
Risulta più corretto (e comodo) ragionare nel dominio delle frequenze.
Date le trasformate di Fourier:
Si può affermare che esiste la seguente relazione:
N.B. T è il periodo di campionamento.
Dato l’impulso di interpolazione ed il segnale tempo-continuo interpolato e date le corrispondenti trasformate di Fourier:
La trasformata del segnale interpolato è data dalla formula:
Successivamente si applica un filtro passa-basso ideale con banda .
La riposta in frequenza del filtro è:
Supponendo che la banda sia limitata: . L’aliasing si risolve rispettando la condizione di Nyquist. Il filtro passa-basso serve per eliminare le repliche distorte.
Tale filtro fornisce in output il segnale :
La sommatoria che definisce viene filtrata e passa solo l’elemento posto sull’origine ().
Per togliere la distorsione si applica infine un’equalizzazione: moltiplicazione pari all’inverso di .
La risposta in frequenza del blocco equalizzatore è:
Dal blocco equalizzatore si ottiene , ovvero la trasformata di Fourier del segnale che si voleva ricostruire:
I passaggi completi sono:
Queste formule dimostrano il teorema di Shannon sul campionamento.
Inoltre, si possono porre e in cascata per produrre il filtro equalizzatore :
Si deve fare molta attenzione a garantire i seguenti vincoli:
I sistemi monodimensionali tempo-discreti sono approfonditi nell’articolo Sistemi Fisici.