Esame di Elaborazione dei Segnali in MATLAB: Convoluzione, Filtraggio, FFT e Processi Stocastici (14 Febbraio 2024)

Classificato in Elettronica

Scritto il in italiano con una dimensione di 4,57 KB

Esame del 14 Febbraio 2024

Di seguito è riportato il codice MATLAB dell'esame, con i relativi punti di svolgimento. Il codice è mantenuto nella sua forma originale.

Inizializzazione dei parametri

b = [4, 0, 2];
a = [1, 1/2, -3/7];
h = 3*rand(1, 6) + 1;

Punto 1: Generazione e filtraggio dei segnali

Si genera la sequenza x[n] campionata a Fs = 5400 Hz per una durata T = 12 s, la si convolve con la risposta impulsiva h, si applica il blocco non lineare e infine il filtro IIR definito da b e a.

Fs = 5400;
T = 12;
n = 0:1/Fs:T;
x = cos(780*pi*n);
y1 = conv(x, h);
y2 = blocco_1(y1);
y3 = filter(b, a, y2);

figure;
plot(n(1:100), x(1:100));
title('Sequenza x[n]');
xlabel('n');
ylabel('Ampiezza');

figure;
plot(n(1:100), y1(1:100));
title('Sequenza y_1[n]');
xlabel('n');
ylabel('Ampiezza');

figure;
plot(n(1:100), y2(1:100));
title('Sequenza y_2[n]');
xlabel('n');
ylabel('Ampiezza');

figure;
plot(n(1:100), y3(1:100));
title('Sequenza y_3[n]');
xlabel('n');
ylabel('Ampiezza');

Punto 2: Selezione dei campioni nell'intervallo [35, 40]

Si individuano gli indici e i valori di y3 compresi tra 35 e 40, stampandoli in forma tabellare.

id = find((y3>=35) & (y3<=40));
val = y3(id);
tabella = [id' , val'];
fprintf('%5.0f %7.0f\n', tabella');

Punto 3: Analisi spettrale tramite FFT

Si calcolano gli spettri di ampiezza monolateri di x[n] e y3[n] mediante la trasformata di Fourier veloce (FFT).

X = fft(x);
Y3 = fft(y3);

Lx = length(x);
fx = (0: Lx-1) * (Fs/Lx);
Mx = abs(X(1:floor(Lx/2)+1));
fx = fx(1 : floor(Lx/2)+1);

Ly3 = length(y3);
fy3 = (0: Ly3-1) * (Fs/Ly3);
My3 = abs(Y3(1:floor(Ly3/2)+1));
fy3 = fy3(1 : floor(Ly3/2)+1);

figure;
plot(fx, Mx);
title('Spettro x[n]');
xlabel('f');
ylabel('Ampiezza');

figure;
plot(fy3, My3);
title('Spettro y_3[n]');
xlabel('f');
ylabel('Ampiezza');

Punto 4: Processi stocastici e istogrammi

Si genera un processo gaussiano con media m = 5 e varianza = 36, di lunghezza L = 3500, e si analizzano le uscite dei vari blocchi tramite grafici e istogrammi.

L = 3500;
m = 5;
varianza = 36;
x = m + sqrt(varianza) * randn(1, L);
y1 = conv(x, h);
y2 = blocco_1(y1);
y3 = filter(b, a, y2);

figure;
plot(y1(1:1000));
title('Processo y_1[n]');
xlabel('Indice');
ylabel('Ampiezza');

figure;
plot(y2(1:1000));
title('Processo y_2[n]');
xlabel('Indice');
ylabel('Ampiezza');

figure;
plot(y3(1:1000));
title('Processo y_3[n]');
xlabel('Indice');
ylabel('Ampiezza');

M = 50;
figure;
histogram(y2, M);

figure;
histfit(y3, M);

Punto 5: Statistiche su realizzazioni multiple

Si generano 32 realizzazioni indipendenti del processo, memorizzate nella matrice Y, e si calcolano minimo, massimo, media, mediana e varianza sull'insieme dei valori.

Y = zeros(3505, 32);
for k = 1:32
    x_k = m + sqrt(varianza)*randn(1, L);
    y1_k = conv(x_k, h);
    y2_k = blocco_1(y1_k);
    y3_k = filter(b, a, y2_k);
    Y(:, k) = y3_k.';
end

val_min = min(Y(:));
val_max = max(Y(:));
val_mean = mean(Y(:));
val_med = median(Y(:));
val_var = var(Y(:));

fprintf('Il valore minimo di Y è: %2.0f\n', val_min);
fprintf('Il valore massimo di Y è: %2.0f\n', val_max);
fprintf('Il valore medio di Y è: %2.0f\n', val_mean);
fprintf('Il valore mediano di Y è: %2.0f\n', val_med);
fprintf('La varianza di Y è: %2.0f\n', val_var);

Punto 6: Integrale e derivata prima

Si valuta la funzione y(x) nell'intervallo [-1, 3], se ne calcola la derivata prima numerica e l'area sotto la curva mediante la regola dei trapezi.

x = -1: 0.001: 3;
y = log((3/2) + cos(x.^2 -2*x)) + tanh(sin(x./(2+ x.^2)));
d = diff(y)./diff(x);
A = trapz(x,y);
fprintf('Area sotto la curva = %.4f\n', A);

figure;
hold on
grid on
plot(x,y)
plot(x(1:end-1),d,'--r','LineWidth',1.5)
title('derivata prima')
xlabel('x')
ylabel('y')

Funzione di supporto: blocco_1

Blocco non lineare utilizzato nei punti precedenti.

function out = blocco_1(in)
out = log(abs(3*cos(in.^2 - 2*in) - 4/3)) + tanh(sin(2*in./(3 + in.^2)));
end

Voci correlate: