11. Analiza sygnałów II

Transformata Fouriera

Transformacja Fouriera służy do rozłożenia funkcji okresowej na szereg funkcji okresowych tak, że uzyskany rezultat odzwierciedla sposób w jaki poszczególne częstotliwości składają się na pierwotną funkcję.

Przykłady:

5.png
6.png

Aby wykonać transformatę pobierz plik i umieść go w tym samym katalogu, w którym będzie plik pythona, na którym będziemy operować.

import numpy as np
import matplotlib.pyplot as plt
import aseegg as ag
 
czestotliwosc = 5
t = np.linspace (0, 1, 256*1)
f = np.linspace (0, 250, 256*1)
sygnal = np.sin (2* np.pi*czestotliwosc*t)
transformata = ag.FFT(sygnal)
 
plt.subplot(2, 1, 1)
plt.plot(t, sygnal)
plt.subplot(2, 1, 2)
plt.plot(f, transformata)
plt.show()

Przeanalizujmy wynik działania innego kodu:

import numpy as np
import matplotlib.pyplot as plt
import aseegg as ag
 
czestotliwosc1 = 5
czestotliwosc2 = 7
czestotliwosc3 = 3
t = np.linspace(0, 3, 3*250)
f = np.linspace(0, 256, 3*250)
sygnal = np.sin(2* np.pi* czestotliwosc1 *t)+np.sin(2* np.pi* czestotliwosc2 *t)+np.sin(2* np.pi* czestotliwosc3 *t)
transformata = ag.FFT(sygnal)
 
plt.subplot(2, 1, 1)
plt.plot(t, sygnal)
plt.subplot(2, 1, 2)
plt.stem(f, transformata)
plt.xlim([0, 10])
plt.show()

Filtracja

Typy filtrów:

dolnoprzepustowy

7.png

górnoprzepustowy

8.png

pasmowo-zaporowy

10.png

pasmowo-przepustowy

9.png

Aby przefiltrować sygnał wykonujemy następujący kod:

import numpy as np
import matplotlib.pyplot as plt
import aseegg as ag
 
czestotliwosc1 = 5
czestotliwosc2 = 17
czestotliwosc3 = 31
czestProbkowania = 250
czas = 3
t = np.linspace(0, czas, czas * czestProbkowania)
sygnal = np.sin(2* np.pi* czestotliwosc1 *t)+np.sin(2* np.pi* czestotliwosc2 *t)+np.sin(2* np.pi* czestotliwosc3 *t)
przefiltrowany = ag.gornoprzepustowy(sygnal, czestProbkowania, 10)
 
plt.subplot(2, 1, 1)
plt.plot(t, sygnal)
plt.xlim([0, 1])
plt.subplot(2, 1, 2)
plt.plot(t, przefiltrowany)
plt.xlim([0, 1])
plt.show()

Inne możliwe nazwy filtrów to:
- ag.gornoprzepustowy
- ag.dolnoprzepustowy
- ag.pasmowoprzepustowy
- ag.pasmowozaporowy


Zadanie 11

Dla danych:

  • Czestotliwosc1[Hz] − 10Hz
  • Czestotliwosc2[Hz] − 25Hz
  • Czestotliwosc3[Hz] − 40Hz
  • Częstotliwość próbkowania: 500 Hz
  • Czas: 1s (dla każdego sygnału, w sumie 3s, patrz poniżej).
  • Amplitudy: wybrać samemu, powinny być rożne dla każdego sygnału.

Sygnał tworzymy następująco (tej linijki nie modyfikujemy! [poza zmianą amplitud])
sygnal=np.concatenate([np.concatenate([np.sin(2*np.pi*czestotliwosc1*t), np.sin(2*np.pi*czestotliwosc2*t)]), np.sin(2*np.pi*czestotliwosc3*t)])

Innymi słowy, różne częstotliwości mają być ustawione jedna za drugą jak na poniższym wykresie.

one_after_another.png

UWAGA sygnał na powyższym wykresie jest poglądowy. W treści zadania wyraźnie powiedziane jest, że amplitudy powinny być różne dla tych trzech sygnałów.

Dlaczego częstotliwości mają być ustawione "jedna za drugą"? Ten, kto przefiltruje sygnał i go wyświetli ten zobaczy.

  1. Przefiltruj sygnał filtrem dolno lub górnoprzepustowym tak, aby w wynikowym sygnale znajdował się tylko pierwszy sygnał. Jakiej filtracji użyjesz? Dlaczego? Załącz wykres w dziedzinie czasu i częstotliwości.
  2. Przefiltruj sygnał filtrem pasmowo-przepustowym lub pasmowo-zaporowym, aby w wynikowym sygnale znajdował się tylko drugi sygnał. Jakiej filtracji użyjesz? Dlaczego? Załącz wykres w dziedzinie czasu i częstotliwości (sygnał po transformacji) przed i po filtracji (4 wykresy dla każdego punktu, można użyć subplot, ale trzeba pamiętać o tytułach wykresów).
  3. Przefiltruj sygnał, aby w wynikowym sygnale znajdował się tylko pierwszy i trzeci sygnał. Jakiej filtracji użyjesz? Dlaczego? Załącz wykres w dziedzinie czasu i czestotliwosci.

Podpowiedź Otrzymuję error:
ValueError: x and y must have same first dimension (w terminalu wygląda on tak [kliknij w link aby wyświetlić]: pierwszy zrzut ekranu, albo tak: drugi zrzut ekranu).

Dlaczego?

Otóż inna "oś OX" (zmienna t) jest potrzebna aby wygenerować sinusoidy, a inna aby wygenerować wykres, na którym sinusoidy są złączone jedna za drugą.
Taka oto linijka jest potrzebna aby stworzyć "oś" do generowania sinusoid: t = np.linspace(0, czas, czas * czestProbkowania) (1 skunda oraz 1*500=500 wartości/punktów/próbek)
Co należy w niej zmodyfikować aby stworzyć "oś" dla wykresu? (3 sekundy oraz 1*3*500=1500 wartości/punktów/próbek)

UWAGA wymagana jest praca w formacie PDF.

Terminy: dostępne na podstronie z informacjami organizacyjnymi — http://kck.wikidot.com/info#terminy_zadan
Punkty: 3

Strona na licencji Creative Commons Attribution-ShareAlike 3.0. Autorzy: A. Czoska, M. Komosiński, B. Kowalczyk, A. Kupś, M. Lubawy