PRZETWARZANIE SYGNAŁÓW
Laboratorium #5

Przekształcenia Fouriera sygnałów w Pythonie

M. Kociński, P. Strumiłło, A. Borowska-Terka

Zakład Elektroniki Medycznej
Instytut Elektroniki


In [1]:
import funkcje_do_lab5_pl as f5
f5.hide()
Out[1]:
Dla przejrzystości instrukcji, kod Ipython notebook jest domyślnie ukryty. Aby zobaczyć/ukryć kod, kliknij tutaj.

CEL:

Obliczanie oraz wykreślanie przekszałcenia Fouriera sygnałów w środowisku Python.

ZADANIA:

1. Zdefiniuj sygnał harmoniczny x(t)=A * sin(2 * pi * f * t) o częstotliwości f=50Hz i amplitudzie A=10 składający się z N=2000 próbek i próbkowany z częstotliwością fs=1000Hz.

a.Wykreśl zdefiniowany sygnał w odpowiedniej skali czasowej, oblicz widmo amplitudowe Fouriera (za pomocą polecenia fft z pakietu scipy.fftpack) i wykreśl go w skali częstotliwości w hercach. Skomentuj otrzymane rezultaty.
Wskazówka: skalę częstotliwości DFT można wyliczyć z zależności: k * f0=k * fs/N, gdzie f0 jest rozdzielczością częstotliwości.
b. Oblicz odwrotne przekształcenie Fouriera widma sygnału harmonicznego x(t) i wykreśl otrzymane rezultaty.
Wskazówka: ze względu na ograniczoną dokładność obliczeniową należy wybrać i wykreślić rzeczywistą część otrzymanego sygnału zespolonego.
c. Powtórz punkt a) zmieniając tylko częstotliwość funkcji harmonicznej f=50.25Hz. Jaką widzisz różnicę na wykresie widma dla nowej częstotliwości sinusoidy? Aby lepiej dostrzec różnice użyj polecenia stem z pakietu pylab służącego do wykreślania widma. Wybierz ikonę powiększenia (lupy) w oknie rysunku i powiększ odpowiedni fragment wykresu.
d. Utwórz sygnał będący sumą trzech sinusoid: x1(t)=5sin(50 * pi * t), x2(t)=10sin(100 * pi * t), x3(t)=20sin(150 * pi * t). Oblicz widmo amplitudowe Fouriera zdefiniowanego sygnału. Czy można określić częstotliwości i amplitudy tych funkcji harmonicznych z widma Fouriera?

OCZEKIWANE WYNIKI:

In [2]:
%pylab inline
pylab.rcParams['figure.figsize'] = (14.0, 7.0)
f5.task1()


Zadanie 1a:

In [3]:
f5.task1_a()

Zadanie 1b:

In [4]:
f5.task1_b()

Zadanie 1c:

In [5]:
f5.task1_c()

Zadanie 1d:

In [6]:
f5.task1_d()

2.
a. Do sygnału zdefiniowanego w punkcie 1d) dodaj szum Gaussa o średniej mi=0 i odchyleniu standardowym sigma=20.
Wskazówka: Użyj funkcji random.normal z pakietu numpy.
b. Wykreśl otrzymany sygnał zakłócony. Czy można z dziedziny czasu tego sygnału określić jakie są ukryte w nim częstotliwości?
c. Oblicz i wykreśl widma amplitudy sygnału określonego w punkcie 2a. Czy teraz można określić składniki harmoniczne w sygnale zakłóconym?

OCZEKIWANE WYNIKI:

In [7]:
f5.task2_a()

3. Wczytaj ecg_mit.mat sygnał EKG dostępny w paczce Pliki sygnałów ze strony przedmiotu Przetwarzanie sygnałów.

a. Wykreśl wczytany sygnał EKG w odpowiedniej skali czasu (w sekundach), wiedząc , że częstotliwość próbkowania wynosi fs=360Hz.
b. Oblicz i wykreśl widmo amplitudowe Fouriera pierwszych N = 1800 próbek sygnału EKG. Jaka jest rozdzielczość częstotliwości używana do wykreślenia tego widma? Jak można skomentować uzyskany mało czytelny wynik pokazujący, że amplitudy widma wynoszą prawie zero, z wyjątkiem wartości dla 0Hz?
c. Tym razem przed obliczeniem i wykreśleniem widma amplitudowego Fouriera, usuń wartość średnią (tj. składową DC) sygnału EKG. Wyjaśnij w jakim celu usunęliśmy wartość średnią sygnału?
d. Czy można z wykresu widma odczytać częstotliwość sieci energetycznej, która zakłóciła nagrany sygnał EKG? Jaka jest częstotliwość sieci energetycznej w USA?
e. Dla chętnych: Zaproponuj metodę usunięcia częstotliwości sieci energetycznej i zweryfikuj swoją metodę wykreślając poprawiony sygnał EKG w dziedzinie czasu.
f. Wykreśl wczytany sygnał EKG w odpowiedniej skali czasu (w sekundach) i amplitudy (w mV), wiedząc , że częstotliwość próbkowania wynosi fs=360Hz, próbki są kodowane słowem 11-bitowym a zakres przetwarzania przetwornika A/C wynosi [-5mV, +5mv].
Teraz oblicz i wykreśl widmo amplitudowe Fouriera pierwszych N = 1800 próbek tak wyskalowanego sygnału EKG. Jaka jest rozdzielczość częstotliwości używana do wykreślenia tego widma? Skomentuj uzyskany wynik?

OCZEKIWANE WYNIKI:

In [8]:
f5.task3()

Zadanie 3f:

In [9]:
f5.task3f()