This shows you the differences between two versions of the page.
ps:laboratoare:06 [2019/11/04 07:12] andrei.nicolicioiu |
ps:laboratoare:06 [2020/11/10 12:12] (current) ionut.gorgos |
||
---|---|---|---|
Line 31: | Line 31: | ||
<note> Pentru crearea timpilor de eșantionare puteți folosi 0:periada_esantionare:timp_maxim sau funcția linspace(0,timp_maxim,numar_esantioane)</note> | <note> Pentru crearea timpilor de eșantionare puteți folosi 0:periada_esantionare:timp_maxim sau funcția linspace(0,timp_maxim,numar_esantioane)</note> | ||
- | |||
- | |||
- | <hidden> | ||
- | <note> | ||
- | Sistemul este un simplu filtru trece-jos în domeniul digital. | ||
- | O posibilă soluţie poate fi următoarea: | ||
- | <code matlab 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 | ||
- | </code> | ||
- | Cum ar trebui să arate: | ||
- | |||
- | {{:ps:laboratoare:mavg_freq_10.png?300|}} | ||
- | </note> | ||
- | </hidden> | ||
=== Exercițiul 2 -- Subeşantionare (Bandpass sampling) [3p] === | === Exercițiul 2 -- Subeşantionare (Bandpass sampling) [3p] === | ||
Line 82: | Line 42: | ||
Task-uri/întrebări: | Task-uri/întrebări: | ||
- De ce avem energie în ambele frecvenţe $f_c$ şi $-f_c$ ? | - De ce avem energie în ambele frecvenţe $f_c$ şi $-f_c$ ? | ||
- | - 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$. | + | - Folosiţi Octave 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$. Folosiți $N=128$ pentru fft. |
- 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. | - 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. | ||
- 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$ ? | - 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$ ? | ||
- 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). | - 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). | ||
- 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? | - 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? | ||
- | |||
- | <hidden> | ||
- | <note> | ||
- | 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) | ||
- | <code matlab> | ||
- | 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'); | ||
- | </code> | ||
- | </note> | ||
- | </hidden> | ||
=== Exercițiul 3 -- Reconstruire de semnal [3p] === | === Exercițiul 3 -- Reconstruire de semnal [3p] === | ||
Line 143: | Line 68: | ||
</code> | </code> | ||
</note> | </note> | ||
- | |||
- | <hidden> | ||
- | <note> | ||
- | 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). | ||
- | </note> | ||
- | |||
- | |||
- | |||
- | |||
- | </hidden> | ||
<note warning> | <note warning> | ||
Trebuie să folosiţi funcţia stem, nu plot pentru reprezentare ! | Trebuie să folosiţi funcţia stem, nu plot pentru reprezentare ! | ||
</note> | </note> | ||
- | |||
- | <hidden> | ||
- | <code matlab> | ||
- | %% 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'); | ||
- | </code> | ||
- | </hidden> | ||
* Responsabil: [[neculadarius23@gmail.com|Darius Necula]] | * Responsabil: [[neculadarius23@gmail.com|Darius Necula]] |