This is an old revision of the document!


Laboratorul 06.

fftifft

\begin{equation} DFT: S(k) = \sum^{N-1}_{n = 0}{s(n)e^{\frac{-j 2 \pi n k}{K}}}, k \in \{0, ..., K-1\} \\ IDFT\ (inversa\ DFT): s(n) = \frac{1}{K}\sum^{K-1}_{k = 0}{S(k)e^{\frac{j 2 \pi n k}{K}}}, n \in \{0, ..., N-1\} \end{equation} 6p

click aici$k \in \{ -9, ..., 9\}$$k = 0$$k = 1, ..., 9$$k = −1, ... , −9$

$k = \{0, 1, ..., N/2 - 1\}$

npz = np.load('noisy_signal.npz')
noisy_signal = npz['noisy_signal']

$N = 128$$f_s = N = 128$

fftfftshiftfftfft$0$$N/2 - 1$$-N/2$$-1$1p

$k \in \{-9, ..., 9\}$$power = \frac{1}{N}\sum^{N-1}_{k = 0}{|S(k)|^2}$1p

SNRdB1p

fft1p

IDFTifft2p

Pentru a putea reface perfect semnalul discret original avem nevoie să calculam un spectru de lungime egală cu semnalul, adică K trebuie să fie egal cu N.

4p

click aici

$f_s = 8000$$k = 0, 1, ..., N-1$$\frac{k \cdot f_s}{N}$

npz = np.load('noisy_sound.npz')
noisy_sound = npz['noisy_sound']
fs = npz['fs']

s

import sounddevice as sd
import time

sd.play(s, fs)
time.sleep(T) #Ne asigură că putem auzi tot semnalul
sd.stop()

s

from scipy.io.wavfile import write

sound = np.int16(s/np.max(np.abs(s)) * 32767)
write('s.wav', fs, sound)

Atenție

În acest exercițiu folosiți pentru calculul spectrului funcția fft, respectiv ifft pentru reconstruirea semnalului.

1p

from scipy.fft import fft2
from scipy.fft import ifft2
  1. încărcați și afișați o imagine folosind funcția imread din matplotlib.image: ex:
    import matplotlib.image as image
    import matplotlib.pyplot as plt
    
    
    img = image.imread("peppers.png")
    plt.figure()
    plt.imshow(img, cmap=plt.get_cmap('gray'), vmin=0, vmax=1)
    plt.title("Original Image")
    plt.show()
  2. Convertiți imaginea RGB în imagine gri și normalizați (daca este nevoie). Pentru a converti imaginea în gri puteți folosi următoarea funcție:
    def rgb2gray(rgb):
        return np.dot(rgb[..., :3], [0.2989, 0.5870, 0.1140])
  3. Aplicați fft2 pe imagine și obțineți un spectru 2D (o matrice) S(k)
  4. Tăiați frecvențele joase din spectru obținând un nou spectru S1(k). Frecvențele joase 2D sunt cele de frecvență mică pe ambele axe, adică, pe rezultatul dat de fft sunt în colturile matricii.
  5. Tăiați frecvențele înalte din spectru obținând un nou spectru S2(k). Frecvențele înalte sunt formate din tot spectrul (toată matricea) mai puțin colțurile. Hint: Vă puteți folosi și de spectrul calculat anterior pentru a determina mai ușor S2(k)
  6. Obțineți din fiecare spectru o imagine: reconstructed_img = ifft2(S1)
  7. Afișați cele 2 imagini cu funcția
    plt.imshow(img1, cmap=plt.get_cmap('gray'), vmin=0, vmax=1)

peppers.png

ps/labs_python/06.1698921292.txt.gz · Last modified: 2023/11/02 12:34 by constantin.savu1510
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