{ "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 }