This is an old revision of the document!


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ă [5p]

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 ?

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).

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

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) [5p]

Î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 (bonus) -- Reconstruire de semnal [3p]

Pentru reconstruirea unui semnal idee 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).

Pentru asta ar trebui să faceţi următorii paşi:

  • să construiţi semnalul digital, adică varianta eşantionată a semnalului
  • să faceţi din semnalul digital un semnal continuu (analog), în care pentru eşantioanele din semnalul digital se pune valorile (analog) din semnal, iar între eşantioane se pune 0 la ieşire.
  • să faceţi convoluţie între un sinc (de frecvenţă fs, dar centrat pe zero, adică un semnal simetric) şi semnalul continuu.

Semnalul va avea un număr mare de eșantioane ($N_{analog} = 5000$) pentru a simula pe cel analog, și un număr de eșantioane (respectiv $f_s$) mic în comparație cu ($N_{analog} = 5000$), e.g. $f_s = 10$.

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;
fs_analog = 1000;
N_periods = 5;
N_analog = N_periods * fs_analog;
fs = 10;
N_digital = N_periods*fs;
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(fs*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: 08.11.2016
ps/laboratoare/06.1479132452.txt.gz · Last modified: 2016/11/14 16:07 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