Segnali tempo-discreti


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 P(t)P(t) che varia nel tempo. Un segnale elettrico è dato dalla corrente i(t)i(t) 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 z(x,y)z(x,y) è in due variabili (asse orizzontale e verticale). Per passare da un’immagine statica ad una dinamica, si deve aggiungere la variabile temporale: z(x,y,t)z(x,y,t) 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:

z=[rgb]=z(x,y)  2D to 3D  z(x,y,t)\overline{z}=\begin{bmatrix}r\\g\\b\end{bmatrix}= \overline{z}(x,y)\xrightarrow{\;\textrm{2D to 3D}\;}\overline{z}(x,y,t)

Segnali Monodimensionali

x:ABtx(t)\Large \begin{equation} \begin{split} x : & \quad A \longrightarrow B \\ & \quad t \longmapsto x(t) \end{split} \end{equation}

Il segnale xx è:

  1. tempo-continuo se tRt \in \R, ovvero se ARA \equiv \R,
  2. tempo-discreto se tZt \in \Z, ovvero se AZA \equiv \Z.

Inoltre, in base al codominio B, il segnale xx​ è:

  1. a valori reali (continui) se BRB \sube \R
  2. a valori discreti se B={b1,,bM}ZB = \{b_1,\dots,b_M\}\sub \Z

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 x[n]x[n] con nZn \in \Z​ che sostituisce la lettera t per convenzione.

I segnali possono essere anche a valori complessi: BCB \sube \C. Questa casistica è assimilabile, seppur con più complessità, ai segnali a valori reali. Si ricorda che RC\R \sube \C. Un numero complesso con parte immaginaria nulla è un numero reale.

Esempio: un segnale binario è tempo-discreto a valori discreti con B={0,  1}B = \{0,\;1\}.

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:

binary_signal

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.

Δ[x[n]]=x[n]x[n1]n(n1)=x[n]x[n1]\Delta \biggl[ x[n] \biggr] = \frac{x[n]-x[n-1]}{n-(n-1)} = x[n]-x[n-1]

L’operazione analoga all’integrazione è la sommatoria.

S[x[n]]=k=nx[k]S \biggl[ x[n] \biggr] = \sum_{k = -\infty}^n x[k]

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 x(t)x(t). Campionare x(t)x(t) significa definire un segnale tempo-discreto x[n]x[n] estraendo i valori che x(t)x(t)​ assume ad istanti di tempo equidistanti.

Le operazioni necessarie per effettuare il campionamento sono:

  1. definire il periodo di campionamento T
  2. definire la sequenza discreta di valori tn=t0+nTt_n=t_0+nT
  3. porre in corrispondenza gli assi temporali tempo-continuo e tempo-discreto

Posto t0=0t_0=0 per far coincidere i segnali, allora:

x(t)    tn=nT    x[n]    x(tn)=x(nT)=x[n]\large x(t)\;\xrightarrow{\; t_n=nT \;}\;x[n] \implies x(t_n) = x(nT) = x[n]

A livello pratico, il campionamento è effettuato da convertitori A/D (analogico/digitale) pilotati da un segnale di clock impostato alla frequenza fc=1/Tf_c = 1/T.

Il convertitore A/D è un campionatore reale e fornisce una rappresentazione finita del segnale campionato:

xreale:ZZnx[n]\begin{equation} \begin{split} x_{\text{reale}} : & \quad \Z \longrightarrow \Z \\ & \quad n \longmapsto x[n] \end{split} \end{equation}

In aritmetica binaria, il numero di cifre (bit) usate per la rappresentazione degli elementi di x[n]x[n] varia da 8 a 16.

Un campionatore ideale estrae valori con infinite cifre decimali:

xideale:ZRnx[n]\begin{equation} \begin{split} x_{\text{ideale}} : & \quad \Z \longrightarrow \R \\ & \quad n \longmapsto x[n] \end{split} \end{equation}

L’errore racchiuso nella rappresentazione della sequenza x[n]Rx[n] \in \R è 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.

X(f)=1Tm=X(fmT)\overline{X}(f)=\frac{1}{T}\sum_{m=-\infty}^\infty X\bigg(f-\frac{m}{T}\bigg)

Dimostrazione leggera del Campionamento

Dato il seguente segnale tempo-continuo e F[y(t)]=Y(f)\mathcal{F}[y(t)]=Y(f), si applica un campionamento in frequenza, passando k/T0k/T_0 come argomento di Y:

z(t)=m=y(tmT0)  F  Zk=1T0Y(kT0)z(t)=\sum_{m=-\infty}^\infty y(t-mT_0)\;\xrightarrow{\quad \mathcal{F} \quad}\; Z_k=\frac{1}{T_0}Y\biggl(\frac{k}{T_0}\biggr)

Dato il segnale z~(t)=z(t)T0\widetilde{z}(t)=z(t)T_0, allora:

z~(t)=T0m=y(tmT0)  F  Z~k=Y(kT0)\widetilde{z}(t)=T_0\sum_{m=-\infty}^\infty y(t-mT_0)\;\xrightarrow{\quad \mathcal{F} \quad}\; \widetilde{Z}_k=Y\biggl(\frac{k}{T_0}\biggr)

La proprietà di dualità implica:

ftT01Ty()X()Y()x()1Tm=X(fmT)x(kT)\eq{ & f\longleftrightarrow t \\ & T_0\longleftrightarrow\frac{1}{T} \\ & y(\cdot)\longleftrightarrow X(\cdot) \\ & Y(\cdot)\longleftrightarrow x(\cdot) \\ & \frac{1}{T}\sum_{m=-\infty}^\infty X\biggl(f-\frac{m}{T}\biggr)\longleftrightarrow x(kT) }

Condizione di Nyquist

L’errore di aliasing porta ad una distorsione del segnale campionato x[n]x[n]. Questo errore è dovuto dalle repliche dello spettro-base, ovvero gli alias, che vanno a sommarsi introducendo la distorsione.

Se il segnale di partenza x(t)x(t) ha banda limitata, si può garantire l’assenza di aliasing grazie alla condizione di Nyquist:

fc=1T2Bf_c = \frac{1}{T} \geq 2B

Con fc=1/Tf_c=1/T frequenza di campionamento.

fc2Bf_c \geq 2B permette di ricostruire un segnale tempo-continuo a partire dai propri campioni tempo-discreti.


Per un segnale radio digitale fC=30f_C = 30 kHz e dunque:

30103>2B    B<15  [kHz]30\cdot 10^3 > 2B \implies B<15 \;\rm [kHz]

Per poter essere trasmesso e ricostruito correttamente, un segnale radio può avere una banda larga al massimo B=15B=15 kHz.

Filtraggio anti-aliasing

Se fc<2Bf_c < 2B, è opportuno applicare un filtraggio anti-aliasing (passa-basso ideale) al segnale tempo-continuo in ingresso prima di effettuare il campionamento.

x(t) Low Pass t=nTxF(t)  xF[n]\large x(t) \xrightarrow{\quad} \boxed{\textrm{ Low Pass }} \xrightarrow[t=nT]{\quad x_F(t) \quad}\;x_F[n]

Questo filtro è in grado di eliminare piccoli disturbi fuori banda del segnale.

Esempio: x[n]=cos(2πf0nT)=x(nT)x[n]=\cos(2\pi f_0 nT)=x(nT)

x(t)  F  X(f)=12[δ(ff0)+δ(f+f0)]x[n]  F  X(f)=1Tm=[12δ(ff0)+12δ(f+f0)]\eq{ x(t)\;\xrightarrow{\quad \mathcal{F} \quad}\; &X(f)=\frac{1}{2}\bigg[\delta(f-f_0)+\delta(f+f_0)\bigg] \\ \\ x[n]\;\xrightarrow{\quad \mathcal{F} \quad}\; &\overline{X}(f)=\frac{1}{T}\sum_{m=-\infty}^\infty\bigg[\frac{1}{2}\delta(f-f_0)+\frac{1}{2}\delta(f+f_0)\bigg] \\ }

Es cos time

Nel dominio delle frequenze si possono apprezzare due δ(t)\delta(t) in corrispondenza di ±f0\pm f_0:

Es cos f

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 x^(t)\widehat{x}(t). Esistono diversi tipi di interpolazione in base all’impulso di interpolazione p(t)p(t) utilizzato.

cos interpolazione

x^(t)  F  X^(f)=P(f)X(f)\widehat{x}(t)\;\xrightarrow{\quad \mathcal{F} \quad}\;\widehat{X}(f)=P(f)\overline{X}(f)

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:

P(f)=Trect(fT)F1p(t)=sinc(tT)P(f)=T\,\textrm{rect}(fT)\xrightarrow{\quad \mathcal{F}^{-1}\quad}p(t)=\textrm{sinc}\bigg(\frac{t}{T}\bigg)

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:

x(t)=[n=x[n]sinc(tnTT)]x(t)=\Bigg[\sum_{n=-\infty}^\infty x[n]\cdot \textrm{sinc}\bigg(\frac{t-nT}{T}\bigg)\Bigg]

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 x(t)x(t) a partire dai suoi campioni x[n]x[n].

I passaggi completi, illustrati nel dettaglio in seguito, sono:

  1. interpolazione
  2. filtraggio passa-basso ideale
  3. equalizzazione (opzionale)
  x[n]   interpolazione   x^(t)   Low Pass   x~(t)   equalizzatore   x(t)  \Large \xrightarrow[]{\;x[n]\;} \normalsize \boxed{\text{ interpolazione }} \Large \xrightarrow{\; \widehat{x}(t) \;} \normalsize \boxed{\text{ Low Pass }} \Large \xrightarrow{\; \widetilde{x}(t) \;} \normalsize \boxed{\text{ equalizzatore }} \Large \xrightarrow{\;x(t)\;}

Risulta più corretto (e comodo) ragionare nel dominio delle frequenze.

Date le trasformate di Fourier:

X(f)=F[x(t)]X(f)=F[x[n]]X(f) = \mathcal{F} \Big[x(t) \Big]\\ \overline{X}(f) = \mathcal{F} \Big[ x[n] \Big]

Si può affermare che esiste la seguente relazione:

X(f)=1Tm=X(fmT)\overline{X}(f)=\frac{1}{T}\sum_{m=-\infty}^\infty X\bigg(f-\frac{m}{T}\bigg)

N.B. T è il periodo di campionamento.

Dato l’impulso di interpolazione p(t)p(t) ed il segnale tempo-continuo interpolato x^(t)\widehat{x}(t) e date le corrispondenti trasformate di Fourier:

P(f)=F[p(t)]X^(f)=F[x^(t)]P(f) = \mathcal{F} \Big[p(t) \Big]\\ \widehat{X}(f) = \mathcal{F} \Big[ \widehat{x}(t) \Big]

La trasformata del segnale interpolato è data dalla formula:

X^(f)=X(f)P(f)\widehat{X}(f)=\overline{X}(f)P(f)

Successivamente si applica un filtro passa-basso ideale con banda B=1/TB=1/T​.

La riposta in frequenza del filtro è:

HLP(f)=rect(12Bf)=rect(T2f)H_{LP}(f)= \text{rect}\bigg(\frac{1}{2B}f\bigg)= \text{rect}\bigg(\frac{T}{2}f\bigg)

Supponendo che la banda sia limitata: f>B|f| >B. 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 X~(f)\widetilde{X}(f):

X~(f)=X^(f)HLP(f)==X(f)P(f)HLP(f)==1TX(f)P(f)\eq{ \widetilde{X}(f) &= \widehat{X}(f)\cdot H_{LP}(f)=\\ &=\overline{X}(f)P(f)\cdot H_{LP}(f)=\\ &= \frac{1}{T} X(f) P(f) }

La sommatoria che definisce X(f)\overline{X}(f) viene filtrata e passa solo l’elemento posto sull’origine (m=0m=0).

Per togliere la distorsione si applica infine un’equalizzazione: moltiplicazione pari all’inverso di P(f)P(f).

La risposta in frequenza del blocco equalizzatore è:

HE(f)=T1P(f)H_E (f) =T \cdot \frac{1}{P(f)}

Dal blocco equalizzatore si ottiene X(f)X(f), ovvero la trasformata di Fourier del segnale che si voleva ricostruire:

X(f)=X~(f)HE(f)==X~(f)T1P(f)==1TX(f)P(f)T1P(f)==X(f)\eq{ X(f) &= \widetilde{X}(f)\cdot H_E(f)=\\ &= \widetilde{X}(f)\cdot T \cdot \frac{1}{P(f)}=\\ &= \frac{1}{T} X(f) P(f)\cdot T \cdot \frac{1}{P(f)}=\\ &= X(f) }

I passaggi completi sono:

X(f)  x[n]  P(f)X^(f)  x^(t)  HLP(f)X~(f)  x~(t)  HE(f)X(f)  x(t)  \Large \xrightarrow[\overline{X}(f)]{\;x[n]\;} \normalsize \boxed{ P(f)} \Large \xrightarrow[\widehat{X}(f)]{\; \widehat{x}(t) \;} \normalsize \boxed{H_{LP}(f)} \Large \xrightarrow[\widetilde{X}(f) ]{\; \widetilde{x}(t) \;} \normalsize \boxed{H_E(f)} \Large \xrightarrow[X(f)]{\;x(t)\;}

Queste formule dimostrano il teorema di Shannon sul campionamento.

Inoltre, si possono porre HLP(f)H_{LP}(f) e HE(f)H_E(f) in cascata per produrre il filtro equalizzatore H(f)H(f):

X(f)  x[n]  P(f)X^(f)  x^(t)  H(f)X(f)  x(t)  \Large \xrightarrow[\overline{X}(f)]{\;x[n]\;} \normalsize \boxed{ P(f)} \Large \xrightarrow[\widehat{X}(f)]{\; \widehat{x}(t) \;}\normalsize \boxed{H(f)} \Large \xrightarrow[X(f)]{\;x(t)\;}

Si deve fare molta attenzione a garantire i seguenti vincoli:

H(f)=0f<1TB    f>1TBH(f)=TP(f)B<f<B\eq{ H(f)&=0\quad \forall f < -\frac{1}{T}-B \;\land\;f > \frac{1}{T}-B\\ H(f)&= \frac{T}{P(f)}\quad \forall -B <f < B }

I sistemi monodimensionali tempo-discreti sono approfonditi nell’articolo Sistemi Fisici.