Differences

This shows you the differences between two versions of the page.

Link to this comparison view

ps:laboratoare:06 [2017/09/11 11:56]
darius.necula [Semnale digitale - procesarea simplă şi eşantionarea]
ps:laboratoare:06 [2020/11/10 12:12] (current)
ionut.gorgos
Line 10: Line 10:
  
  
-=== Exerciuţiul 1 -- Procesarea simplă [5p] ===+=== Exerciuţiul 1 -- Procesarea simplă [4p] ===
  
 Vom încerca să implementăm un sistem de procesare digitală simplă, care funcţionează după cum urmează: Vom încerca să implementăm un sistem de procesare digitală simplă, care funcţionează după cum urmează:
Line 23: Line 23:
   - Plotaţi toate secvenţele de intrare/​ieşire   - Plotaţi toate secvenţele de intrare/​ieşire
   - Ce fel de sistem de procesare este acesta ?   - Ce fel de sistem de procesare este acesta ?
 +<​hidden>​ 
 +  - Cum ați putea implementa sistemul de procesare menționat mai sus, folosind funcția '​filter'?​ [Bonus 1p] 
 +</​hidden>​
 <note tip> <note tip>
 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 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).
 </​note>​ </​note>​
-<​hidden>​ 
-<​note>​ 
-Sistemul este un simplu filtru trece-jos în domeniul digital. 
-O posibilă soluţie poate fi următoarea:​ 
-<code matlab> 
-close all; 
  
-f= [1, 2, 10, 20, 50, 100]; +<​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>​
-wvec = [0.2, 0.2, 0.2, 0.2, 0.2]; +
-np = length(wvec);​ +
- +
- +
-fm = 10; +
-tm = 1/fm; +
-t = linspace(0, ​1128)+
-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) [5p] ===+=== 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. Î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.
Line 76: 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$ ? 
Line 82: Line 48:
   - 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>​ +=== Exercițiul 3 -- Reconstruire de semnal [3p] ===
-<​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 (bonus) ​-- Reconstruire de semnal [3p] ===+
  
 Pentru reconstruirea unui semnal ideea este: 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).  ​ - 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: +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: 
-  * să construiţi semnalul digital, adică varianta eşantionată a semnalului +  * simulați un semnal sinus '​analog'​. Pentru aceasta generați un semnal sinus de frecventa 1Hz cu un număr mare de puncte (i.e. 5000 de puncte).  
-  * 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+  * construiți semnalul digital, adică varianta eșantionată a semnalului ​analog, folosind un număr mai mic de puncte (i.e. de 100 de ore mai puține) din semnalul analog. ​ 
-  * să faceţi convoluţie între un sinc (de frecvenţă fs, dar centrat pe zero, adică un semnal simetric) şi semnalul continuu.+  * 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.
  
 +Pentru a face convolutie cu un semnal sinc, folositi codul urmator:
 <​note>​ <​note>​
-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$.+<​code>​ 
 +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); 
 +</​code>​
 </​note>​ </​note>​
 +
 <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>​ +  * Responsabil:​ [[neculadarius23@gmail.com|Darius Necula]]
-<code matlab>​ +
-%% Demonstration of signal recovery after sampling +
-% Using very large Fs for simulation of analog signal+
  
-%% Initialise things +  ​Data publicării03.11.2019
-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'​);​ +
-</​code>​ +
- +
-</​hidden>​+
  
-  * Responsabil:​ [[ionutgorgos@gmail.com|Ionuţ Gorgos]] 
  
-  * Data publicării:​ 08.11.2016 
ps/laboratoare/06.1505120207.txt.gz · Last modified: 2017/09/11 11:56 by darius.necula
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