{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# ZADANIE 1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Wykonaj w Pythonie poniższy skrypt i przeanalizuj go" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "%matplotlib inline" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "from pylab import *\n", "from numpy import *\n", "from scipy import *\n", "import math\n", "\n", "from ipywidgets import *\n", "\n", "#--- Definiujemy sygnal wejsciowy\n", "A = 1 # Amplituda sygnalu\n", "F = 2.0 # Czestotliwosc sygnalu [Hz]\n", "T = 1/F # Okres sygnalu [s]\n", "f = lambda t : A * sin(2*pi*t*F) # Def. analizowanej funkcji (sygnalu)\n", "\n", "#--- Probkujemy sygnal\n", "LP = 1 # Liczba analizowanych pełnych okresów sygnalu (okresow)\n", "w = 40 # Częstotliwość probkowania [Hz]\n", "TW = 1/w # Okres probkowania [s] (co ile sekund pobieramy próbkę)\n", "\n", "t = np.arange(0, LP*T, TW) # Momenty, w których pobieramy próbki (oś OX)\n", "n = len(t) # Liczba próbek\n", "\n", "signal = f(t) \n", "\n", "#--- Rysujemy sygnał (niebieskie kółka)\n", "fig = plt.figure(figsize=(15, 6), dpi=80) \n", "ax = fig.add_subplot(121)\n", "ax.plot(t, signal, 'o')\n", "\n", "#--- Rysujemy sygnał przed spróbkowaniem (dla wizualizacji)\n", "base_t = np.arange(0, LP * T, 1/200)\n", "base_signal = f(base_t)\n", "ax.plot(base_t, base_signal, linestyle='-', color='red')\n", "ax.set_ylim([min(base_signal), max(base_signal)])\n", "\n", "#--- Wykonujemy FFT\n", "signal1 = fft(signal)\n", "signal1 = abs(signal1) # moduł\n", "\n", "#--- Rysujemy FFT\n", "ax = fig.add_subplot(122)\n", "ymax = max(signal1)\n", "ax.set_ylim([0.0, max(1.1*ymax, 3.0)])\n", "\n", "freqs = range(n)\n", "stem(freqs, signal1, '-*');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**UWAGA**: do dalszych ćwiczeń warto powyższy skrypt przekształcić na funkcję o wielu argumentach, typu: amplituda, częstotliwość próbkowania, liczba przebiegów. Oczywiście dla wygody, należy nadać wartości domyślne argumentom funkcji." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "#Tutaj dla wygody możesz powyższy kod zawrzeć w postaci funkcji wielu parametrów" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "UWAGA DLA CHĘTNYCH: można wykorzystać 'interact', dzięki któremu można zmieniac parametry danej funkcji i na bieżąco obserwować zmiany. Poniższy kod przedstawia sposób wykorzystania interact:" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def prosta(a=2, b=0):\n", " x = linspace(-5, 5, 100, endpoint=False) # punkty na osi OX [s]\n", " f = lambda x : a*x + b\n", " y = f(x) \n", " \n", " fig = plt.figure(figsize=(6, 3), dpi=80)\n", " ax = fig.add_subplot(111)\n", " ax.set_xlim(-5, 5)\n", " ax.set_ylim(-5, 5)\n", " ax.plot(x, y)\n", "\n", "interact(prosta, a=(-5,5,0.5), b=(-5,5,0.5))\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### b) Zmień częstotliwość próbkowania na 50Hz." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# w=50" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### c) Punkty na osi OX spektrum są teraz kolejnymi liczbami naturalnymi, a nie częstotliwościami w Hz. Popraw skrypt (funkcje), tak aby oś OX spektrum była w Hz (podpowiedź: oś OX rozpoczyna się od 0Hz, a kończy się na (prawie!) Hz, gdzie jest częstotliwością próbkowania). Następnie: Upewnij się, że spektrum dla 1Hz-owego sinusa i pięciu (LP=5) analizowanych przebiegów wygląda teraz prawidłowo." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# popraw oś OX" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### d) Podpisz osie obu wykresów, używając funkcji xlabel() i ylabel(). Pamiętaj o jednostkach." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Podpisz osie wykresów" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### e) Wygeneruj spektrum dla funkcji sinus o częstotliwościach 5Hz i 21Hz, dla czestotliwości próbkowania 20Hz i 20 (LP=20) analizowanych przebiegów. Czy rozpoznajesz te funkcje patrząc na ich spróbkowane wykresy? Odczytaj w drugim przypadku uzyskaną częstotliwość z FFT. Dlaczego uzyskano taki wynik?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# F=5, w=20, LP=20" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# F=21, w=20, LP=20" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### f) Porównaj spektrum funkcji $sin(F*2\\pi t)$, $2sin(F*2\\pi t)$ i $3sin(F*2\\pi t)$. Jak zmienia się wartość na osi OY na wykresie spektrum?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# F=1, A=1, LP=1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# F=1, A=2, LP=1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [], "source": [ "# F=1, A=3, LP=1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### g) Ile punktów jest na wykresach przy częstotliwości próbkowania 50Hz, $T=1s$? Zwiększ dwukrotnie liczbę próbek poprzez zwiększenie częstotliwości próbkowania. Następnie: dla $sin(F*2\\pi t)$ porównaj wartość na osi OY spektrum uzyskane w tym oraz poprzednim punkcie." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# F=1, w=50, LP=1" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# F=1, w=100, LP=1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### h) Na podstawie wyników uzyskanych w dwóch poprzednich punktach przeskaluj oś OY spektrum tak, aby wskazywała wartości amplitud badanych sygnałów. Sprawdź wyniki dla kilku wybranych funkcji (tu fajnie użyć interact), częstotliwości próbkowania oraz rozważanych liczb punktów. Pamiętaj o wysokim LP." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# popraw oś OY" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Zadanie 2" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Zwróć uwagę, że spektrum jest symetryczne (poza pierwszym elementem)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "a) Przy w=100Hz, przeanalizuj widma sygnałów:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "i) $sin(F*2\\pi t)$, $F=10Hz$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# f=10, w=100, A=1, LP=10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "ii) $sin(F*2\\pi t)$, $F=20Hz$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# f=20, w=100, A=1, LP=10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "iii) $sin(2*pi*t*f)$, $f=30Hz$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# f=30, w=100, A=1, LP=10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "iv) $sin(2*pi*t*f)$, $f=40Hz$" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# f=40, w=100, A=1, LP=10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### b) Jak się nazywa twierdzenie, którego konsekwencją jest takie zachowanie się spektrum?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### c) Przy F=50Hz, w=100Hz, wygeneruj spektrum dla $sin(2*pi*f*t)$. Zwróć uwagę na skalę wykresów." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# f=50, w=100, A=1, LP=10" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Zadanie 3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Poniższe przypadki skłądają się z złożonych sygnałów. Jeżeli stworzyłeś/aś na początku funkcję odpowiedzialną za rysowanie sygnału i FFT, możesz ją zmodyfikować tak, by jako jej argument podawać funkcję lambda, realizującą sygnał." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "a) $sin(2*pi*t*f) + 2*sin(4*pi*t*f)$, T=1s, w=20Hz." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Wyrysuj sygnał" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### c) Wygenerujemy trochę szumu. Wychodząc z funkcji sin(2*2*pi*t*f), dodamy do niej 100 losowych sinusów. Wygenerujemy dla nich losowo amplitudy (z [0.1, 0.3], częstotliwosci: [2.0, 4.0] oraz modyfikacje fazy[0 + math.pi]. Jeżli utworzyłeś/aś funkcje lambda wcześniej, śmiało możesz ją podmienić na 'zwyczajną funkcję', która będzie realizować sumowanie losowych sinusów. Inne parametry: w=20Hz, T=1s. Czy dla powyższych paramerów losowania, jesteś w stanie odnaleźć bazowy przebieg (sin(2*2*pi*t))? (Jeżeli wykorzystujesz podany na początku kod, to nie przejmuj się, że pełen sygnał i sprókowany sobie nie odpowiadają. Każdy jest inny - bo losowy). " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Dodaj szum do sygnału" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### d) $0.5 + 2*sin(2*pi*t*f)$, T=1s, w=20Hz, LP=10. Czy amplituda zerowego prążka jest prawidłowa? Dlaczego? (Podpowiedź: zwróć jeszcze raz uwagę na “symetrię” spektrum)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Wyrysuj sygnał" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### e) $sin(2*pi*t*f)$ oraz $sin(2*pi*t*f + pi/4)$ dla T=1s, w=20Hz. Czy informacja o fazie zniknęła? Poszukaj śladów tej informacji w tablicy, będącej wynikiem operacji fft(signal)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# faza = 0" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# faza = pi/4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Zadanie 4" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Oblicz wynik ifft(fft(x)), gdzie x=random.random(10). Czy jakaś informacja została stracona? (Uwaga: natkniesz się na problemy numeryczne – rozwiąż je)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# wygeneruj wektor x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# oblicz fft z x" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# oblicz ifft z x" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.0" } }, "nbformat": 4, "nbformat_minor": 0 }