Laboratorul 06.

Semnale digitale - procesarea simplă şi eşantionarea

În acest laborator vom începe să experimentăm efectele semnalelor eşantionate şi procesarea semnalelor digitale.

Materiale ajutătoare:

    1. Secţiunile 5.1-5.3

Exerciuţiul 1 -- Procesarea simplă [4p]

Vom încerca să implementăm un sistem de procesare digitală simplă, care funcţionează după cum urmează:

  • luaţi 5 eşantioane (samples) din semnalul de intrare, $d_1, d_2, \ldots, d_5$.
  • faceţi o medie a celor 5 eşantioane (samples), $a = 0.2 \cdot (d_1 + d_2 + d_3 + d_4 + d_5)$
  • puneţi la ieşire valoarea curentă $y(n) = a$

Urmăriţi aceşti paşi:

  1. Creaţi câteva secvenţe digitale care reprezintă sinusoide de diferite frecvenţe (1, 2, 10, 20, 100 Hz), la aceeaşi frecvenţă de eşantionare (folosiţi acelaşi număr de eşantioane, e.g. $N=128$).
  2. Implementaţi sistemul de procesare menţionat mai sus
  3. Creaţi secvenţele corespunzătoare de ieşire.
  4. Plotaţi toate secvenţele de intrare/ieşire
  5. Ce fel de sistem de procesare este acesta ?
  6. Cum ați putea implementa sistemul de procesare menționat mai sus, folosind funcția 'filter'? [Bonus 1p]

Pentru fiecare eşantion de intrare ($x(n)$) trebuie să produceţi o valoare de ieşire ($y(n)$). Pentru primele patru eşantioane nu aveţi suficiente valori de intrare diferite de zero, şi pentru simplitate ori setaţi ieşirea pe zero, ori faceţi media dintre 1, 2, 3, 4 eşantioane, în timp ce consideraţi ca celelalte să fie zero. Dar de la al 5-lea eşantion veţi avea câte 5 eşantioane la îndemână (actualul $x(n)$ şi anterioarele patru eşantioane).

Pentru crearea timpilor de eșantionare puteți folosi 0:periada_esantionare:timp_maxim sau funcția linspace(0,timp_maxim,numar_esantioane)

Sistemul este un simplu filtru trece-jos în domeniul digital. O posibilă soluţie poate fi următoarea:

lab06_ex1.m
close all;
 
f= [1, 2, 10, 20, 50, 100];
wvec = [0.2, 0.2, 0.2, 0.2, 0.2];
np = length(wvec);
 
 
fm = 10;
tm = 1/fm;
t = linspace(0, 1, 128);
for i=1:length(f)
    s=sin(2*pi*f(i)*t);
    s1 = zeros(1,128);
    for j=np:128
        idx1 = j-np+1;
        idx2 = j;
        s1(j) = s(idx1:idx2) * wvec';        
    end
    h = figure;
    plot(t,s, 'b-');
    hold on;
    plot(t, s1, 'r--');
    ylim([-1, 1]);
    legend('Original signal', 'Signal after processing');
    title(['Moving average for frequency ', num2str(f(i))]);
    print(h, '-dpng', ['mavg_freq_', num2str(f(i)), '.png']);
end

Cum ar trebui să arate:

Exercițiul 2 -- Subeşantionare (Bandpass sampling) [3p]

În acest exercițiu vom experimenta subeșantionarea, metodă care reduce frecvența de eșantionare, necesară pentru a obține întreg spectru al semnalului.

Un semnal real cu o frecvență purtătoare (centrată) la 3kHz este eşantionată la 8 kHz. Lăţimea de bandă a semnalului este 1 kHz, cum puteţi vedea mai jos:

Task-uri/întrebări:

  1. De ce avem energie în ambele frecvenţe $f_c$ şi $-f_c$ ?
  2. Folosiţi MATLAB pentru a calcula transformata Fourier Discretă (folosiţi comanda “fft”, aşa cum aţi folosit în laboratorul precedent) a unei sinusoide de $3kHz$ eşantionată la $8kHz$.
  3. Plotaţi rezultatele şi observaţi frecvenţele. Acum folosiţi “fftshift” pe rezultatul obţinut de la “fft” şi plotaţi din nou rezultatele.
  4. De ce într-un caz avem semnal la $3 kHz$ şi $5 kHz$ în timp ce, în celălalt caz pare să avem la $-3 kHz$ şi $3 kHz$ ?
  5. Care este semnificaţia semnalului de $5 kHz$ ? Când plotaţi rezultatele de la “fft” luaţi în considerare că, în mod implicit output-ul transformatei Discrete Fourier, deci şi “fft”, arată frecvenţele de la $0$ la $f_s$ (frecvenţa de eşantionare).
  6. Putem să reducem frecvenţa de eşantionare în timp ce încă detectăm spectrul dorit de frecvenţe ? (vedeţi bandpass sampling). Cât de mult putem reduce frecvenţa de eşantionare? Ce se întâmplă dacă reducem frecvenţa de eşantionare sub 2B?

a) pentru că este un semnal real (are ambele $e^{f_{c}}$ şi $e^{-f_{c}}$)

b) $f_c \pm f_s$

c) putem să folosim $fs = 4KHz$ ⇒ replici la -1Khz şi 1Khz de exemplu. Sub 2B obţinem superpoziţia spectrului ⇒ erori în recuperarea semnalului.

d)

fs = 8000;
f1 = 3000;
ts = 1/fs;
xi = 0:ts:100*ts;
x1 = cos(2*pi*f1*xi);
 
% Plot x1
figure
stem(xi, x1, 'ro');
 
% Show FFT of x1
N = 64;
k = fs/N; % Fundamental frequency
X1 = fft(x1, N);
xf = 0:k:fs/2;
figure
stem(xf, abs(X1(1:N/2+1)));
xlabel('Frequency [Hz]');
ylabel('Amplitude');
title('Spectrum of x1');

Exercițiul 3 -- Reconstruire de semnal [3p]

Pentru reconstruirea unui semnal ideea este: - dacă se face sampling pe un semnal cu $f_s > 2 \cdot W$ (unde $W$ este frecvenţa maximă a semnalului, i.e. respectiv Nyquist), atunci puteţi să reconstruiţi din semnalul digital semnalul analog (exceptând o eroare de cuantizare) pe baza unui low pass filter (cu un sinc).

Vom simula un semnal sinus analog, pe care îl vom eșantiona, apoi îl vom reconstrui. Pentru asta ar trebui să faceţi următorii paşi:

  • simulați un semnal sinus 'analog', adică folosiți un semnal sinus cu un număr mare de puncte.
  • construiți semnalul digital, adică varianta eșantionată a semnalului
  • faceți din semnalul digital un semnal continuu (analog), prin crearea unui semnal de aceeași lungime ca cel analog inițial, folosind valorile din semnalul digital pentru valorile de la momentele eșantionate și zero în rest.
  • faceţi convoluţie între un sinc (de frecvenţă fs, dar centrat pe zero, adică un semnal simetric) şi semnalul continuu creat anterior.

Semnalul va avea un număr mare de eșantioane ($N_{analog} = 5000$) pentru a-l simula pe cel analog, și un număr de eșantioane mai mic pentru semnalul digital (ex. de 100 de ori mai puține).

Trebuie să folosiţi funcţia stem, nu plot pentru reprezentare !

%% Demonstration of signal recovery after sampling
% Using very large Fs for simulation of analog signal
 
%% Initialise things
close all;
clear;
samples_analog = 1000;
N_periods = 5;
N_analog = N_periods * samples_analog;
samples_digital = 10;
N_digital = N_periods*samples_digital;
f_sin = 1;
t = linspace(0, N_periods, N_analog); % N_periods periods
 
%% Create original sinewave
s_analog = cos(2*pi*f_sin*t);
% s_analog = cos(2*pi*f_sin*t) + cos(4*pi*f_sin*t);
% s_analog = cos(2*pi*f_sin*t) + cos(4*pi*f_sin*t) + cos(6*pi*f_sin*t);
figure
stem(t, s_analog);
title('Original sinewave (approximation of continuous signal)');
 
%% Create 'sampled' version of sinewave
interval = N_analog / N_digital;
t_digital = t(1:interval:end);
s_digital = s_analog(1:interval:end);
figure;
stem(t_digital, s_digital);
title('Sampled sinewave');
 
%% Create 'continuous' version of 'sampled' sinewave
s_cont = zeros(1, N_analog);
for i=1:N_digital
    s_cont((i-1)*interval+1:i*interval) = [s_digital(i), zeros(1,interval-1)];
end
figure;
stem(t, s_cont);
title('Continuous version of sampled sinewave');
 
%% Low-pass filter the 'continuous' version of 'sampled' sinewave
% Use the moving average from previous exercise for low pass filtering
N_sinc = N_analog;
t_sinc = linspace(-0.2, 0.2, N_sinc/10);
sincvec = sinc(samples_digital*t_sinc);
s_cont_filtered = conv(s_cont, sincvec);
N_cont_filtered = length(s_cont_filtered);
t_cont_filtered = linspace(0, N_periods, N_cont_filtered);
figure;
stem(t_cont_filtered, s_cont_filtered);
title('Low-pass filtered signal from continous sampled sinewave');
  • Data publicării: 05.11.2018
ps/laboratoare/06.txt · Last modified: 2018/11/17 13:49 by ionut.gorgos
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0