Ćwiczenia 3: Różnice pomiędzy wersjami
(Nie pokazano 24 wersji utworzonych przez 3 użytkowników) | |||
Linia 1: | Linia 1: | ||
+ | [[Analiza_sygnałów_-_ćwiczenia]]/Fourier_3 | ||
+ | |||
== Twierdzenie o splocie == | == Twierdzenie o splocie == | ||
− | Na pierwszych ćwiczeniach poznaliśmy poznaliśmy operację [[Systemy_liniowe_niezmiennicze_w_czasie#Splot|splotu]] jako efekt działania systemu liniowego niezmienniczego w czasie. Poznaliśmy wówczas jego [[Systemy_liniowe_niezmiennicze_w_czasie#W.C5.82asno.C5.9Bci_splotu|własności]]. | + | <!--Na pierwszych ćwiczeniach poznaliśmy poznaliśmy operację [[Systemy_liniowe_niezmiennicze_w_czasie#Splot|splotu]] jako efekt działania systemu liniowego niezmienniczego w czasie. Poznaliśmy wówczas jego [[Systemy_liniowe_niezmiennicze_w_czasie#W.C5.82asno.C5.9Bci_splotu|własności]]. |
− | Okazuje się, że gdy rozważamy sprzężone ze sobą za pomocą transformaty Fouriera dziedziny czasu i częstości splot ma wiele wspólnego z mnożeniem. Związek ten można zapisać jako | + | Okazuje się, że gdy rozważamy sprzężone ze sobą za pomocą transformaty Fouriera dziedziny czasu i częstości splot ma wiele wspólnego z mnożeniem. Związek ten można zapisać jako --> |
+ | Przypomnijmy sobie poznane na wykładzie | ||
[[Twierdzenia_o_splocie_i_o_próbkowaniu_(aliasing)#Twierdzenie_o_splocie|Twierdzenie o splocie:]] | [[Twierdzenia_o_splocie_i_o_próbkowaniu_(aliasing)#Twierdzenie_o_splocie|Twierdzenie o splocie:]] | ||
<equation id="uid2"> | <equation id="uid2"> | ||
Linia 22: | Linia 25: | ||
<ul> | <ul> | ||
<li> | <li> | ||
− | + | pozwala na zamianę splotu na mnożenie | |
<li> | <li> | ||
daje wgląd w okienkowanie | daje wgląd w okienkowanie | ||
<li> | <li> | ||
− | + | łatwiej można zrozumieć działanie filtrów | |
</ul> | </ul> | ||
==Okienka== | ==Okienka== | ||
===Wstęp=== | ===Wstęp=== | ||
− | * Jakie są dostępne okna w | + | * Jakie są dostępne okna w <tt>scipy.signal</tt>? Proszę odwiedzić stronę z [http://docs.scipy.org/doc/scipy-0.14.0/reference/signal.html dokumentacją]. |
* Jak wyglądają te okienka? | * Jak wyglądają te okienka? | ||
<source lang = python> | <source lang = python> | ||
− | import | + | from scipy import signal |
− | w = | + | w = signal.bartlett(10) |
− | + | plt.plot(w,'.') | |
+ | plt.show() | ||
</source> | </source> | ||
===Badanie własności okien=== | ===Badanie własności okien=== | ||
+ | ====Zadanie 1: Własności różnych okien i szerokość prążka w widmie ==== | ||
+ | Widmo amplitudowe w skali dB sygnału <math>s</math>, jego transformata Fouriera <math>S</math>: | ||
+ | : <math> P_[dB] = 20*np.log10( abs(S) ) </math> | ||
+ | |||
+ | Proszę zwrócić uwagę na charakterystyczne elementy: szerokość piku głównego, szybkość zanikania listków bocznych, zera. | ||
+ | |||
+ | Posługując się poniższym kodem (należy uzupełnić brakujące fragmenty kodu): | ||
+ | |||
+ | * Wygeneruj sinusoidę o częstości <math>f=10.2</math> Hz fazie 0, czasie trwania <math>T=1</math> s, i częstości próbkowania <math>Fs=100</math> Hz | ||
+ | * Wygeneruj okno prostokątne o długości równej długości sinusoidy. | ||
+ | * Zokienkuj sygnał mnożąc sinusoidę przez okienko | ||
+ | * Wykreśl zokienkowany sygnał, widmo zokienkowanego sygnału, widmo okienka | ||
+ | * Powtórz powyższe kroki dla okienek Bartletta, Hanna, Hamminga i Blackmana. | ||
− | |||
− | |||
− | |||
<source lang = python> | <source lang = python> | ||
+ | #!/usr/bin/env python3 | ||
+ | # -*- coding: utf-8 -*- | ||
+ | |||
+ | from numpy.fft import rfft, rfftfreq | ||
import numpy as np | import numpy as np | ||
− | import | + | import pylab as py |
+ | import scipy.signal as ss | ||
+ | |||
+ | def widmo_dB(s, N_fft, F_samp): | ||
+ | ''' | ||
+ | funkcja pomocnicza do obliczania widma amplitudowego w skali decybelowej | ||
+ | ''' | ||
+ | S = rfft(s,N_fft) | ||
+ | S_dB = ... | ||
+ | F = rfftfreq(N_fft, ...) | ||
+ | return (S_dB,F) | ||
+ | |||
+ | def rysuj_wlasnosci(s, okno, N_fft, F_samp,tytul): | ||
+ | ''' | ||
+ | funkcja implementująca polecenia z zadania | ||
+ | ''' | ||
+ | okno = ...# znormalizuj okienko | ||
+ | s_okienkowany = ...# okienkujemy sygnał | ||
+ | |||
+ | py.figure() | ||
+ | py.subplot(2,2,1) | ||
+ | py.plot(t,okno) | ||
+ | py.title(tytul) | ||
+ | |||
+ | py.subplot(2,2,2) | ||
+ | S_okienka_zera, skalaF_zera = ...# oblicz widmo okienka z dopełnieniem zerami do 1024 | ||
+ | py.plot(skalaF_zera,S_okienka_zera) | ||
+ | |||
+ | S_okienka, skalaF = ...# oblicz widmo okienka dla oryginalnej jego długości | ||
+ | py.plot(skalaF,S_okienka,'r.-') | ||
+ | py.title('widmo okienka') | ||
+ | py.ylim((-90,25)) | ||
+ | |||
+ | py.subplot(2,2,3) | ||
+ | py.plot(t,s_okienkowany) | ||
+ | py.title('sygnał okienkowany') | ||
+ | |||
+ | py.subplot(2,2,4) | ||
+ | S_okienkowany_zera, skalaF_zera = ... # oblicz widmo sygnału okienkowanego z dopełnieniem zerami do 1024 | ||
+ | S_okienkowany, skalaF = ...# oblicz widmo sygnału okienkowanego dla oryginalnej jego długości | ||
+ | py.plot(skalaF_zera,S_okienkowany_zera) | ||
+ | py.plot(skalaF,S_okienkowany,'r.-') | ||
+ | py.plot([f,f],[-90,25],'r') | ||
+ | py.ylim((-90,25)) | ||
+ | py.title('widmo sygnału okienkowanego') | ||
− | + | ||
− | + | ||
− | + | # ustawienia parametrów | |
− | + | ||
− | + | Fs = 100 | |
− | + | dt = 1/Fs | |
− | + | N_fft =1024 | |
− | + | ||
− | + | f = 10.2 | |
+ | T = 1 | ||
− | + | t = np.arange(0,T,dt) | |
− | + | s = np.sin(2*np.pi*f*t) # tu mamy sygnał do testowania okienek | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | # ilustrujemy własności poszczególnych okienek | |
− | + | M = len(s) | |
− | + | okno = np.ones(M) | |
− | + | rysuj_wlasnosci(s, okno, N_fft, Fs,'prostokąt') | |
− | |||
− | + | okno = ss.hanning(M)# | |
+ | rysuj_wlasnosci(s, okno, N_fft, Fs,'hanning') | ||
− | + | okno = ss.hamming(M)# | |
− | # | + | rysuj_wlasnosci(s, okno, N_fft, Fs,'hamming') |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | okno = ss.blackman(M)# | |
− | + | rysuj_wlasnosci(s, okno, N_fft, Fs,'blackman') | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</source> | </source> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<!-- | <!-- | ||
− | |||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
Linia 206: | Linia 229: | ||
py.show() | py.show() | ||
+ | --> | ||
− | + | ==== Zadanie 3: Wpływ okienkowania na wykrywalność składowych o różnej amplitudzie ==== | |
− | + | * Wygeneruj sygnał będący sumą dwóch sinusoid o fazie 0, czasie trwania <math>T=1</math> s, i częstości próbkowania <math>Fs=100</math> Hz. Jedna niech ma częstość <math>f=10.2</math> Hz. Częstość drugiej, niech zmienia się od 11,4 do 15,5 Hz w 9 krokach | |
− | ====Wpływ okienkowania na wykrywalność składowych o różnej amplitudzie ==== | ||
− | * Wygeneruj sygnał będący sumą dwóch sinusoid o fazie 0, czasie trwania <math>T=1</math> s, i częstości próbkowania <math>Fs=100</math> Hz. Jedna niech ma częstość <math>f=10.2</math> Hz. Częstość drugiej, | ||
* Jaki jest wpływ okienek na możliwości rozróżnienia dwóch częstości? | * Jaki jest wpływ okienek na możliwości rozróżnienia dwóch częstości? | ||
* Proszę powtórzyć iteracje dla przypadku gdy druga z sinusoid ma 10-krotnie niższą amplitudę. | * Proszę powtórzyć iteracje dla przypadku gdy druga z sinusoid ma 10-krotnie niższą amplitudę. | ||
− | + | <source lang = python> | |
− | + | #!/usr/bin/env python3 | |
− | <source | ||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
− | + | ||
+ | from numpy.fft import rfft, rfftfreq | ||
+ | import numpy as np | ||
import pylab as py | import pylab as py | ||
− | import | + | import scipy.signal as ss |
− | + | ||
− | + | def widmo_dB(s, N_fft, F_samp): | |
− | + | ''' | |
− | + | funkcja pomocnicza | |
− | + | ''' | |
− | + | S = rfft(s,N_fft) | |
− | + | S_dB = 20 * np.log10(np.abs(S)) | |
+ | F = rfftfreq(N_fft, 1.0/F_samp) | ||
+ | return (S_dB,F) | ||
+ | |||
+ | def rysuj_wlasnosci(t, F_samp, okno, tytul ): | ||
+ | ''' | ||
+ | prezentacja własności | ||
''' | ''' | ||
− | + | py.figure() | |
− | + | f = 10.2 | |
− | + | okno = okno/np.linalg.norm(okno) | |
− | + | k = 1 | |
− | + | for f2 in np.linspace(11.4,15.5,9): | |
− | + | s = ... # suma sinusoid o częstościach f i f2 | |
− | + | s_okienkowany = s* okno | |
− | + | py.subplot(3,3,k) | |
− | + | py.title(str(f2)) | |
− | + | S_okienkowany, skalaF = widmo_dB(s_okienkowany,len(s), Fs) | |
− | + | py.plot(skalaF,S_okienkowany) | |
− | + | py.plot([f,f],[-50,25],'r') | |
− | + | py.plot([f2,f2],[-50,25],'r') | |
+ | py.ylim((-50,25)) | ||
+ | k+=1 | ||
+ | |||
+ | Fs = 100 | ||
+ | dt = 1/Fs | ||
+ | T = 1 | ||
+ | t = np.arange(0,T,dt) | ||
− | ( | + | M = len(t) |
− | + | okno = np.ones(M) | |
− | + | rysuj_wlasnosci(t,Fs, okno,'prostokąt') | |
− | |||
− | okno = np.ones( | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | okno = ss.hanning(M)# | |
− | + | rysuj_wlasnosci(t,Fs, okno,'hanning') | |
− | |||
− | okno = | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | okno = ss.hamming(M)# | |
− | + | rysuj_wlasnosci(t,Fs, okno,'hamming') | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | okno = | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
+ | okno = ss.blackman(M)# | ||
+ | rysuj_wlasnosci(t,Fs, okno,'blackman') | ||
</source> | </source> | ||
− | |||
− | |||
− | |||
+ | ===Okienkować możemy też w częstości=== | ||
+ | ====Zadanie 4: Konstrukcja prostego filtru==== | ||
* Proszę wykreślić widmo, a następie obliczyć i wykreślić [[%C4%86wiczenia_2#Transformaty_rzeczywiste_i_Hermitowskie|odwrotną transformatę Fouriera dla sygnału rzeczywistego]] zadanego w dziedzinie częstości przez (poniższy kod definiuje sygnał w dodatniej części widma): | * Proszę wykreślić widmo, a następie obliczyć i wykreślić [[%C4%86wiczenia_2#Transformaty_rzeczywiste_i_Hermitowskie|odwrotną transformatę Fouriera dla sygnału rzeczywistego]] zadanego w dziedzinie częstości przez (poniższy kod definiuje sygnał w dodatniej części widma): | ||
<source lang = python> | <source lang = python> | ||
Linia 321: | Linia 304: | ||
* Koncepcyjnie najprostszym filtrem jest operacja przemnożenia widma sygnału przez okienko w dziedzinie częstości a następnie zastosowanie odwrotnej transformaty Fouriera. Co stanie się z sygnałem w dziedzinie czasu, a co w dziedzinie częstości, jeśli chcielibyśmy przefiltrować go pasmowo przy użyciu filtra pasmowo przepustowego z poprzedniego punktu? | * Koncepcyjnie najprostszym filtrem jest operacja przemnożenia widma sygnału przez okienko w dziedzinie częstości a następnie zastosowanie odwrotnej transformaty Fouriera. Co stanie się z sygnałem w dziedzinie czasu, a co w dziedzinie częstości, jeśli chcielibyśmy przefiltrować go pasmowo przy użyciu filtra pasmowo przepustowego z poprzedniego punktu? | ||
− | + | ||
− | + | <!-- | |
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
Linia 340: | Linia 323: | ||
py.plot(t,s) | py.plot(t,s) | ||
py.show() | py.show() | ||
− | |||
--> | --> | ||
− | + | ||
− | + | ====Zadanie 5: Porównanie działania najprostszych filtrów fft na biały szum==== | |
− | + | ||
− | + | * Proszę wytworzyć sygnał będący białym szumem o długości 256 próbek. | |
− | + | * Policz transformatę rzeczywistą tego sygnału. | |
− | + | * Przygotuj dwa okna w dziedzinie częstości (w części dodatniej) o długości 129: | |
− | + | ** okno prostokątne z jedynkami w punktach 20:30 | |
− | + | ** okno Gaussowskie <tt>np.exp(-((F-25.0)/5)**2)</tt> | |
+ | * Przemnóż widmo sygnału przez każde z okien i oblicz odwrotną transformatę Fouriera. | ||
+ | * Zilustruj wyniki rysunkiem opisanym przez poniższą tabelkę: | ||
+ | |||
{|border = 1 | {|border = 1 | ||
Linia 364: | Linia 349: | ||
|Przebieg czasowy odwrotnej tr. Fouriera iloczynu widma szumu i okna Gaussowskiego | |Przebieg czasowy odwrotnej tr. Fouriera iloczynu widma szumu i okna Gaussowskiego | ||
|} | |} | ||
− | + | ||
<!-- | <!-- | ||
− | |||
# -*- coding: utf-8 -*- | # -*- coding: utf-8 -*- | ||
Linia 417: | Linia 401: | ||
py.show() | py.show() | ||
+ | --> | ||
+ | |||
+ | =Co musimy z tego zapamiętać?= | ||
+ | * Jeśli nic nie zrobimy z sygnałem, to okienkujemy go okienkiem prostokątnym. | ||
+ | * Okienkowanie w czasie odpowiada splotowi transformaty sygnału z transformatą okienka. | ||
+ | * Okienka różnią się szerokością piku głównego i szybkością zanikania listków bocznych. | ||
+ | * Obecność listków prowadzi do "wycieku" mocy z piku głównego. | ||
+ | * Wolno zanikające listki boczne mogą utrudniać interpretację składu częstotliwościowego sygnału. | ||
− | + | [[Analiza_sygnałów_-_ćwiczenia]]/Fourier_3 | |
− |
Aktualna wersja na dzień 20:59, 5 lis 2016
Analiza_sygnałów_-_ćwiczenia/Fourier_3
Spis treści
Twierdzenie o splocie
Przypomnijmy sobie poznane na wykładzie Twierdzenie o splocie:
To twierdzenie działa też w drugą stronę:
W praktyce oznacza to tyle, że jeśli w jednej dziedzinie jakieś dwa sygnały przez siebie przemnożymy, to w drugiej dziedzinie transformaty tych sygnałów splatają się. Własność ta ma bardzo ważne konsekwencje, np. przy estymacji widma skończonego fragmentu sygnału. Dlaczego?
Wyobraźmy sobie, że mamy nieskończenie długi sygnał. Oprócz niego mamy też funkcję, która jest niezerowa tylko na skończonym odcinku. Funkcję taką będziemy nazywać oknem. Pobranie fragmentu sygnału można wyobrazić sobie jako efekt pomnożenia badanego sygnału przez okno. Ta operacja mnożenia w dziedzinie czasu, w dziedzinie częstości odpowiada splotowi widma sygnału z widmem okna. Aby uzyskać sygnał o skończonej długości odrzucamy wyzerowane odcinki. FFT widzi taki skończony odcinek jako periodyczne przedłużenie. Widać, że w praktyce estymowania widma zawsze mamy do czynienia z widmami będącymi splotem widma sygnału i widma okna, ponieważ zawsze pracujemy z sygnałami o skończonej długości.
Zastosowania
- pozwala na zamianę splotu na mnożenie
- daje wgląd w okienkowanie
- łatwiej można zrozumieć działanie filtrów
Okienka
Wstęp
- Jakie są dostępne okna w scipy.signal? Proszę odwiedzić stronę z dokumentacją.
- Jak wyglądają te okienka?
from scipy import signal
w = signal.bartlett(10)
plt.plot(w,'.')
plt.show()
Badanie własności okien
Zadanie 1: Własności różnych okien i szerokość prążka w widmie
Widmo amplitudowe w skali dB sygnału [math]s[/math], jego transformata Fouriera [math]S[/math]:
- [math] P_[dB] = 20*np.log10( abs(S) ) [/math]
Proszę zwrócić uwagę na charakterystyczne elementy: szerokość piku głównego, szybkość zanikania listków bocznych, zera.
Posługując się poniższym kodem (należy uzupełnić brakujące fragmenty kodu):
- Wygeneruj sinusoidę o częstości [math]f=10.2[/math] Hz fazie 0, czasie trwania [math]T=1[/math] s, i częstości próbkowania [math]Fs=100[/math] Hz
- Wygeneruj okno prostokątne o długości równej długości sinusoidy.
- Zokienkuj sygnał mnożąc sinusoidę przez okienko
- Wykreśl zokienkowany sygnał, widmo zokienkowanego sygnału, widmo okienka
- Powtórz powyższe kroki dla okienek Bartletta, Hanna, Hamminga i Blackmana.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from numpy.fft import rfft, rfftfreq
import numpy as np
import pylab as py
import scipy.signal as ss
def widmo_dB(s, N_fft, F_samp):
'''
funkcja pomocnicza do obliczania widma amplitudowego w skali decybelowej
'''
S = rfft(s,N_fft)
S_dB = ...
F = rfftfreq(N_fft, ...)
return (S_dB,F)
def rysuj_wlasnosci(s, okno, N_fft, F_samp,tytul):
'''
funkcja implementująca polecenia z zadania
'''
okno = ...# znormalizuj okienko
s_okienkowany = ...# okienkujemy sygnał
py.figure()
py.subplot(2,2,1)
py.plot(t,okno)
py.title(tytul)
py.subplot(2,2,2)
S_okienka_zera, skalaF_zera = ...# oblicz widmo okienka z dopełnieniem zerami do 1024
py.plot(skalaF_zera,S_okienka_zera)
S_okienka, skalaF = ...# oblicz widmo okienka dla oryginalnej jego długości
py.plot(skalaF,S_okienka,'r.-')
py.title('widmo okienka')
py.ylim((-90,25))
py.subplot(2,2,3)
py.plot(t,s_okienkowany)
py.title('sygnał okienkowany')
py.subplot(2,2,4)
S_okienkowany_zera, skalaF_zera = ... # oblicz widmo sygnału okienkowanego z dopełnieniem zerami do 1024
S_okienkowany, skalaF = ...# oblicz widmo sygnału okienkowanego dla oryginalnej jego długości
py.plot(skalaF_zera,S_okienkowany_zera)
py.plot(skalaF,S_okienkowany,'r.-')
py.plot([f,f],[-90,25],'r')
py.ylim((-90,25))
py.title('widmo sygnału okienkowanego')
# ustawienia parametrów
Fs = 100
dt = 1/Fs
N_fft =1024
f = 10.2
T = 1
t = np.arange(0,T,dt)
s = np.sin(2*np.pi*f*t) # tu mamy sygnał do testowania okienek
# ilustrujemy własności poszczególnych okienek
M = len(s)
okno = np.ones(M)
rysuj_wlasnosci(s, okno, N_fft, Fs,'prostokąt')
okno = ss.hanning(M)#
rysuj_wlasnosci(s, okno, N_fft, Fs,'hanning')
okno = ss.hamming(M)#
rysuj_wlasnosci(s, okno, N_fft, Fs,'hamming')
okno = ss.blackman(M)#
rysuj_wlasnosci(s, okno, N_fft, Fs,'blackman')
Zadanie 3: Wpływ okienkowania na wykrywalność składowych o różnej amplitudzie
- Wygeneruj sygnał będący sumą dwóch sinusoid o fazie 0, czasie trwania [math]T=1[/math] s, i częstości próbkowania [math]Fs=100[/math] Hz. Jedna niech ma częstość [math]f=10.2[/math] Hz. Częstość drugiej, niech zmienia się od 11,4 do 15,5 Hz w 9 krokach
- Jaki jest wpływ okienek na możliwości rozróżnienia dwóch częstości?
- Proszę powtórzyć iteracje dla przypadku gdy druga z sinusoid ma 10-krotnie niższą amplitudę.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from numpy.fft import rfft, rfftfreq
import numpy as np
import pylab as py
import scipy.signal as ss
def widmo_dB(s, N_fft, F_samp):
'''
funkcja pomocnicza
'''
S = rfft(s,N_fft)
S_dB = 20 * np.log10(np.abs(S))
F = rfftfreq(N_fft, 1.0/F_samp)
return (S_dB,F)
def rysuj_wlasnosci(t, F_samp, okno, tytul ):
'''
prezentacja własności
'''
py.figure()
f = 10.2
okno = okno/np.linalg.norm(okno)
k = 1
for f2 in np.linspace(11.4,15.5,9):
s = ... # suma sinusoid o częstościach f i f2
s_okienkowany = s* okno
py.subplot(3,3,k)
py.title(str(f2))
S_okienkowany, skalaF = widmo_dB(s_okienkowany,len(s), Fs)
py.plot(skalaF,S_okienkowany)
py.plot([f,f],[-50,25],'r')
py.plot([f2,f2],[-50,25],'r')
py.ylim((-50,25))
k+=1
Fs = 100
dt = 1/Fs
T = 1
t = np.arange(0,T,dt)
M = len(t)
okno = np.ones(M)
rysuj_wlasnosci(t,Fs, okno,'prostokąt')
okno = ss.hanning(M)#
rysuj_wlasnosci(t,Fs, okno,'hanning')
okno = ss.hamming(M)#
rysuj_wlasnosci(t,Fs, okno,'hamming')
okno = ss.blackman(M)#
rysuj_wlasnosci(t,Fs, okno,'blackman')
Okienkować możemy też w częstości
Zadanie 4: Konstrukcja prostego filtru
- Proszę wykreślić widmo, a następie obliczyć i wykreślić odwrotną transformatę Fouriera dla sygnału rzeczywistego zadanego w dziedzinie częstości przez (poniższy kod definiuje sygnał w dodatniej części widma):
S = np.zeros(128)
S[21] = 1
- Proszę wykreślić okienko prostokątne w częstości, pozycja 1 w binach częstości od 21 do 30, a następnie wykreślić odpowiadający mu sygnał w dziedzinie czasu.
- Koncepcyjnie najprostszym filtrem jest operacja przemnożenia widma sygnału przez okienko w dziedzinie częstości a następnie zastosowanie odwrotnej transformaty Fouriera. Co stanie się z sygnałem w dziedzinie czasu, a co w dziedzinie częstości, jeśli chcielibyśmy przefiltrować go pasmowo przy użyciu filtra pasmowo przepustowego z poprzedniego punktu?
Zadanie 5: Porównanie działania najprostszych filtrów fft na biały szum
- Proszę wytworzyć sygnał będący białym szumem o długości 256 próbek.
- Policz transformatę rzeczywistą tego sygnału.
- Przygotuj dwa okna w dziedzinie częstości (w części dodatniej) o długości 129:
- okno prostokątne z jedynkami w punktach 20:30
- okno Gaussowskie np.exp(-((F-25.0)/5)**2)
- Przemnóż widmo sygnału przez każde z okien i oblicz odwrotną transformatę Fouriera.
- Zilustruj wyniki rysunkiem opisanym przez poniższą tabelkę:
okno prostokątne w częstości | okno Gaussowskie w częstości |
przebieg czasowy odwrotnej tr. Fouriera okna Prostokątnego | przebieg czasowy odwrotnej tr. Fouriera okna Gaussowskiego |
przebieg czasowy szumu | przebieg czasowy szumu |
Przebieg czasowy odwrotnej tr. Fouriera iloczynu widma szumu i okna prostokątnego | Przebieg czasowy odwrotnej tr. Fouriera iloczynu widma szumu i okna Gaussowskiego |
Co musimy z tego zapamiętać?
- Jeśli nic nie zrobimy z sygnałem, to okienkujemy go okienkiem prostokątnym.
- Okienkowanie w czasie odpowiada splotowi transformaty sygnału z transformatą okienka.
- Okienka różnią się szerokością piku głównego i szybkością zanikania listków bocznych.
- Obecność listków prowadzi do "wycieku" mocy z piku głównego.
- Wolno zanikające listki boczne mogą utrudniać interpretację składu częstotliwościowego sygnału.
Analiza_sygnałów_-_ćwiczenia/Fourier_3