{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Zdroje a tutoriály"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pro práci se signály budeme používat především knihoven Numpy, Scipy (hlavně Scipy.signal) a Matplotlib:\n",
    "* Numpy http://www.numpy.org/\n",
    "* Scipy.signal https://docs.scipy.org/doc/scipy/reference/signal.html\n",
    "* Matplotlib https://matplotlib.org/\n",
    "\n",
    "Nemyslím, že je potřeba k těmto knihovnám studovat zdlouhavé tutoriály, spíše používat jejich dokumentací a za chodu hledat, co je potřeba. Pokud by ale někdo přece jen chtěl, například tyto zdroje vypadají dobře:\n",
    "* http://www.scipy-lectures.org/\n",
    "* https://www.machinelearningplus.com/python/numpy-tutorial-part1-array-python-examples/\n",
    "* https://www.datacamp.com/community/tutorials/matplotlib-tutorial-python"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Dále tady jen zběžně upozorním na pár věci, na které si dát v Pythonu pozor při dělání projektu."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Načítání wavky"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pro Python existuje spousta knihoven, které dokáží načíst zvukový soubor, je možné využít kteroukoli z nich. Je dobré si ale dát pozor na to, jaký interval hodnot různé tooly načítají. Narozdíl od Matlabu, kde se hodnoty přečtené z `wav` souboru implicitně normalizují do intervalu $-1\\dots1$, některé knihovny v Pythonu načítají hodnoty jako integer, tzn $-32768\\dots32767$. Pro potřeby projektu chceme hodnoty v intervalu $-1\\dots1$, je tedy třeba normalizovat podělením $2^{15}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-29259, 29770)"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# scipy - potreba normalizace\n",
    "from scipy.io import wavfile\n",
    "fs, data = wavfile.read('music.wav')\n",
    "data.min(), data.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.892913818359375, 0.90850830078125)"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = data / 2**15\n",
    "data.min(), data.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-29259, 29770)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# wavio - potreba normalizace\n",
    "import wavio\n",
    "d = wavio.read('music.wav')\n",
    "data = d.data\n",
    "data.min(), data.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.892913818359375, 0.90850830078125)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = data / 2**15\n",
    "data.min(), data.max()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(-0.892913818359375, 0.90850830078125)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# soundfile - neni potreba normalizace\n",
    "import soundfile\n",
    "data, fs = soundfile.read('music.wav')\n",
    "data.min(), data.max()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Počítání nul a pólů z $b$,$a$ koeficientu"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Pro výpočet nul a pólů z koeficientů $b$,$a$ lze využít funkce `tf2zpk` z knihovny `scipy.signal`, která je ekvivalentem stejnojmenné funkce v Matlabu. Funkce ze `scipy` se ale od funkce z Matlabu (a toho, jak koeficienty $b$,$a$ používáme v ISSku) lehce liší. Pro ekvivalentní výsledky je třeba pro `scipy` zadat stejný počet koeficientů $a$ a $b$ - ty, kterých je méně doplnit nulami."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from scipy.signal import tf2zpk"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Nuly: []\n",
      "Póly: [-2.5  0.2]\n"
     ]
    }
   ],
   "source": [
    "# takto nedostaneme stejný výsledek jako v Matlabu\n",
    "a1 = [1, 2.3, -0.5]\n",
    "b1 = [2.3]\n",
    "z1, p1, _ = tf2zpk(b1, a1)\n",
    "print(f'Nuly: {z1}')\n",
    "print(f'Póly: {p1}')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Nuly: [ 0.  0.]\n",
      "Póly: [-2.5  0.2]\n"
     ]
    }
   ],
   "source": [
    "# takto dostaneme stejný výsledek jako v Matlabu a ekvivalentní tomu, jak máme b,a definované v ISS\n",
    "a2 = [1, 2.3, -0.5]\n",
    "b2 = [2.3, 0, 0]\n",
    "z2, p2, _ = tf2zpk(b2, a2)\n",
    "print(f'Nuly: {z2}')\n",
    "print(f'Póly: {p2}')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Je to kvůli tomu, že `tf2zpk` ze `scipy` považuje $b$,$a$ za koeficienty násobící kladné mocniny $z$ v přenosové funkci, zatímco v Matlabu jsou to koeficienty násobící záporné mocniny $z$. Tyto dva přístupy jsou ekvivalentní, dokud je koeficientů stejný počet.\n",
    "Viz https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.signal.tf2zpk.html a https://www.mathworks.com/help/signal/ref/tf2zpk.html"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ukládání obrázků"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "collapsed": true
   },
   "source": [
    "Grafy vytvořené v Matplotlibu je dobré do dokumentace vkládat ve vektorovém formátu - např. pdf nebo eps. Uložit je možné jednoduše pomocí `plt.savefig`. Občas se stane, že se kolem grafu uloží do pdf i velký bílý okraj, v takovém případě zkuste pro `savefig` přidat parametry `bbox_inches = 'tight', pad_inches = 0`"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "\n",
    "plt.figure()\n",
    "plt.plot(np.arange(100), np.arange(100))\n",
    "plt.savefig('test.pdf')"
   ]
  }
 ],
 "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.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}