Differences

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

Link to this comparison view

ps:labs_python:08-10 [2026/09/25 21:36]
marian_gabriel.dinu
ps:labs_python:08-10 [2026/09/25 21:46] (current)
marian_gabriel.dinu
Line 1: Line 1:
-===== Laboratorul 08. =====+===== Secțiunea 3 - RTL-SDR, Convoluție și Tipuri de filtre ​===== 
 +==== Partea I - RTL-SDR ​====
 /​*<​hidden>​*/​ /​*<​hidden>​*/​
  
Line 553: Line 554:
 După proiectarea filtrelor precum ați dorit, le puteți salva (File->​Generate MATLAB Code) și să le folosiți direct în alte scripturi MATLAB pentru a filtra diverse semnale. După proiectarea filtrelor precum ați dorit, le puteți salva (File->​Generate MATLAB Code) și să le folosiți direct în alte scripturi MATLAB pentru a filtra diverse semnale.
  
 +===== Laboratorul 10. =====
 +
 +==== Filtre FIR trece bandă și trece-sus, filtre IIR ====
 +/​*<​hidden>​*/​
 +=== Exercițiul 1 -- Filtre FIR trece bandă și trece-sus ===
 +[<color red>​8p</​color>​]
 +
 +Pentru acest exercițiu vom utiliza metoda proiectării cu fereastră pentru a crea filtre FIR trece-bandă și trece-sus. Precum am văzut la curs, putem folosi același principiu pentru a crea filtre trece-jos, trece-bandă sau trece-sus. Tot ce trebuie să facem este să înmulțim coeficienții filtrelor (adică secvența $h_{ideal}$) cu valorile unei sinusoide de o anumită frecvență (centrul frecvențelor pentru filtrul trece-bandă).
 +
 +Pentru a crea un filtru trece-bandă cu frecvența centrală $f_B$ ar trebui să procedați în felul următor:
 +  * Generați filtrul în timp $h_{ideal}$ precum în laboratorul 9, ex.2 (creați filtrul în frecvență,​ treceți în domeniul timp, înmulțiți cu o fereastră precum Blackman sau alta)
 +  * Înmulțiți $h_{ideal}$ element cu element cu secvența $\cos(\frac{2\pi f_B n}{f_s})$, unde  $f_B$ este frecvența din centrul benzii dorite, iar $f_s$ este frecvența de eșantionare.
 +
 +
 +Câteva cazuri particulare:​
 +  * $f_B = \frac{f_s}{4}$,​ în acest caz secvența cosinus devine [1, 0, -1, 0, 1, 0, -1, 0, ...]. Acesta este un tip de filtru eficient trece-bandă centrat în frecvența $f_s / 4$.
 +  * $f_B = \frac{f_s}{2}$,​ în acest caz secvența cosinus devine [1, -1, 1, -1, ...] și obținem un filtru trece-sus.
 +
 +<note tip>​Spectrul poate fi văzut ca ieșirea din DFT(FFT), adică primul element corespunde frecvenței //0//, pe când următoarele //N/2-1// corespund frecvențelor pozitive, iar ultimele //N/2// componente reprezintă frecvențele negative.</​note>​
 +
 +Acum că știți toate acestea (sperăm că ați reținut și de la curs), aveți de făcut următoarele:​
 +  - Generați o secvență de filtru ideal trece-jos $H_{ideal}$ având N = 256 elemente, reprezentând spectrul de frecvență al unui filtru trece-jos. Folosiți o frecvență de cut-off de fs/16. Adică totul înainte de fs/16 trebuie să treacă, pe când totul mai sus trebuie sa fie oprit (folosiți un dreptunghi care se oprește la fs/16). Observați că trebuie să generați un spectru simetric pentru a obține o secvență reală la următorul pas. Plotați această secvență (folosind //plot//). Notați axa frecvențelor (axa x) ca o funcție de $F_s$, adică de la //0// la //1//. Ar trebui să obțineți ceva precum: {{:​ps:​labs:​9.png?​300|}}
 +  - Acum aplicați inversa DFT (în practică inversa FFT) pentru a obține secvența corespunzătoare în domeniul timp $h_{ideal}$.
 +  - Trunchiați secvența $h_{ideal}$ prin selectarea a doar $L = 65$ de eșantioane din centru (32 din stânga maximului funcției sinc, maximul funcției, și 32 de eșantioane din dreapta). Aceasta corespunde multiplicării secvenței ​ $h_{ideal}$ cu o fereastră dreptunghiulară centrată în punctul maxim al funcției sinc. Plotați secvența.
 +  - Aplicați DFT($fft$) pe secvența trunchiată înmulțită cu fereastra dreptunghiulară (care conține doar 1) și plotați spectrul. Rețineți: este important aici, precum și la primul plot pentru filtru trece-jos ideal, să notăm axa frecvențelor (axa x) ca o funcție de Fs, adică de la 0 la 1.
 +  - Folosiți aceeași secvență trunchiată ca mai sus, dar înmulțiți-o cu o fereastră precum $Blackman$. Aplicați din nou $fft$ și plotați spectrul.
 +  - Din această secvență puteți obține o secvență corespunzătoare unui filtru trece-bandă cu $f_B = \frac{f_s}{4}$. Afișați spectrul.
 +  - Obțineți o secvență corespunzătoare unui filtru trece-sus cu $f_B = \frac{f_s}{2}$. Afișați spectrul.
 +  - Generați trei sinusoide cu frecvențe diferite (ex: $ f = 3 kHz$, $15 kHz$, $30 kHz$, cu $f_s = 64000$ și $N = 64$) și filtrați-le (folosind funcția //​np.convolve//​ din NumPy sau //​signal.convolve//​ din //​scipy.signal//​) cu  filtrele trece-sus și trece-bandă obținute mai sus. Plotați atât input-ul cât și output-ul în același plot folosind //stem// pentru a observa efectele filtrelor.
 +
 +=== Exercițiul 2 -- Proiectarea rapidă de filtre IIR folosind Python ===
 +[<color red>​2p</​color>​]
 +
 +Putem descrie un filtru (sistem liniar) cu feedback (IIR având termenii $a_i$ mai jos) sau fără feedback (FIR) folosind o ecuație cu diferențe precum:
 +
 +$y(n) = b_0 \cdot x(n) + b_1 \cdot x(n-1) + \ldots + b_q \cdot x(n-q) + a_1 \cdot y(n-1) + \ldots + a_p \cdot y(n-p)$
 +
 +Putem reprezenta întârzierile $x(n-1)$ ca $z^{-1} \cdot x(n)$, unde $z=e^{j2\pi}$.
 +Apoi, obținem o ecuație care depinde doar de $x(n)$ și $y(n)$ și obținem funcția de transfer a filtrului $H(z) = \frac{Y(z)}{X(z)}$ precum:
 +
 +$H(z) = \frac{\sum_{k=0}^q b_k \cdot z^{-k}}{1 - \sum_{k=1}^p a_k \cdot z^{-k}}$
 +
 +În Python, puteți folosi funcția //​signal.butter//​ din SciPy, pentru a obține coeficienții ($b_i$ și $a_i$) ai unui filtru IIR trece-jos, trece-bandă sau trece-sus. Apoi puteți folosi funcția //​signal.lfilter//​ din SciPy, pentru a filtra orice secvență folosind coeficienții $b_i$ și $a_i$ dați de //​signal.butter//​.
 +
 +Pentru acest exercițiu, trebuie să proiectați filtre IIR trece-jos (folosiți cutoff = 0.1), trece-bandă (folosiți cutoff = [0.2, 0.5]) și trece-sus (folosiți cutoff = 0.75). Puteți alege //numtaps = 5//. Apoi folosiți funcția //​signal.lfilter//​ pentru a testa filtrele cu niște sinusoide ca în Exercițiul 1, cu $f=3$ kHz, $15$ kHz, $30$ kHz. Afișați cu stem, în subplot-uri sinusoidele inițiale și pe cele filtrate.
 +Pentru răspunsul în frecvență,​ vă puteți folosi de următorul cod:
 +
 +<code python>
 +freq, H = signal.freqz(b_low,​ a_low, fs=fs)
 +plt.figure()
 +plt.plot(freq,​ 20 * np.log10(abs(H)))
 +plt.xlabel('​Frequency [Hz], from 0 to fs/2')
 +plt.ylabel('​Amplitude [dB]')
 +plt.title('​Digital Filter Frequency Response'​)
 +plt.grid()
 +plt.show()
 +</​code>​
 +, unde b_low sunt coeficienții $b_i$ și a_low coeficienții $a_i$ ai unui filtru IIR trece-jos. Observați diferențe față de cele FIR?
 +
 +/​*</​hidden>​*/​
ps/labs_python/08-10.1790361376.txt.gz · Last modified: 2026/09/25 21:36 by marian_gabriel.dinu
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