{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\"FMP\"\n", "\"AudioLabs\"\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "\"C1\"\n", "

STFT: Inverse

\n", "
\n", "\n", "
\n", "\n", "

\n", "In this notebook, we introduce the inverse DFT and then show how a signal can be recovered from its STFT under relatively mild conditions on the windowing process. In most parts, we closely follow Section Section 2.4.2 and Section 8.1.2.1 of [Müller, FMP, Springer 2015].\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Inverse DFT\n", "\n", "\n", "Given a vector $x\\in \\mathbb{C}^N$ of length $N\\in\\mathbb{N}$, the [**discrete Fourier transform**](../C2/C2_DFT-FFT.html) is defined by the matrix–vector product\n", "\n", "$$\n", "X = \\mathrm{DFT}_N \\cdot x\n", "$$\n", "\n", "with the DFT matrix $\\mathrm{DFT}_N \\in \\mathbb{C}^{N\\times N}$ given by \n", "\n", "$$\n", "\\mathrm{DFT}_N(n, k) = \\mathrm{exp}(-2 \\pi i k n / N)\n", "$$\n", "\n", "for $n\\in[0:N-1]$ and $k\\in[0:N-1]$. The DFT is **invertible** in the sense that the vector $x$ can be recovered from its spectral vector $X$. The inverse DFT is again specified by a matrix–vector product\n", "\n", "$$\n", "x = \\mathrm{DFT}_N^{-1} \\cdot X, \n", "$$\n", "\n", "where $\\mathrm{DFT}_N^{-1}$ denotes the **inverse** of the DFT matrix $\\mathrm{DFT}_N$. It is a well-known fact that this inverse is given by \n", "\n", "$$\n", "\\mathrm{DFT}_N^{-1}(n, k) = \\frac{1}{N}\\mathrm{exp}(2 \\pi i k n / N)\n", "$$\n", "\n", "for $n\\in[0:N-1]$ and $k\\in[0:N-1]$. In other words, the inverse essentially coincides with the DFT matrix up to some normalizing factor and complex conjugation. In the following code cell, we generate the DFT matrix and its inverse. Furthermore, we show that the two matrices are indeed inverse to each other (up to some numerical issues\n", "due to rounding in floating point arithmetic). To this end, we measure the entry-wise difference between $\\mathrm{DFT}_N \\cdot \\mathrm{DFT}_N^{-1}$ and the the identity matrix $I_N\\in \\mathbb{R}^{N\\times N}$ as well as between $\\mathrm{DFT}_N^{-1} \\cdot\\mathrm{DFT}_N$ and $I_N$." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:59:40.354986Z", "iopub.status.busy": "2024-02-15T08:59:40.354693Z", "iopub.status.idle": "2024-02-15T08:59:43.529118Z", "shell.execute_reply": "2024-02-15T08:59:43.528399Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAv4AAADjCAYAAAD9shDVAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAA19klEQVR4nO3de7xcdXnv8c9DCBe5mECEhotclIIWalBuNkXxUgt4wetRrIp4QU7FqtUq2ler1tOWHq94xagBRAq1CoIURIrmgEgkgMFwLXlxDURiJEBAIoQ85481G4Y1z29m1syatWet+b5fr3kl+9nPXvObvfd895o16/db5u6IiIiIiEizbTTdAxARERERkdHTjr+IiIiIyATQjr+IiIiIyATQjr+IiIiIyATQjr+IiIiIyATQjr+IiIiIyATQjr+IiIwNM3uqmV1hZg+a2d7TPR6RSaHn3mTQjr+IiIyT3wMvB74/3QMRmTB67k0A7fiLiLSY2SfN7JPTPY5J5u6Puvtv83X9bGS6TMrvXuq5N84m5WdTJu34TwMz29PMfmVma83sb6Z7PCISM7PZZuZmtsuItn+bmT3cyoL7zOwXZnasmW2U6Huw7bZD7uMNuZ6/GvXYpmNcItNtknNhRGPeoLyozsbTPYC6M7PZwL3Aru5+e59f9hFgkbvvO4JxLHb357fVvwH83t0/OOT2vwu8BNgC+A3wf939W2a2KfA14KXANsBy4OPufsEw9ycyJuYBawo8twfxSnf/bzN7KvBC4ETgQODoqC9X23LqP2Z2G/CuoGfUYys8LjP7I+LTCV7v7r8pa/AiIzKPmuaCmf2Rmf08uL8ynnvDjDkcr5RPO/7Dm0fxANgFOHOQOzOzjd19fWIcvwGebWZz3X1lW/1rg9xXzr8C73T3P5jZXsAiM/sVcCNwJ9mT/A7gcOB7ZraPu99Wwv2KTKd5wNIq7sjd7wfONbPfAIvN7HPufm0V991L2WNr7WD8eWkDFKnWPGqaC1U898Y5y0Sn+pRhHgUCwMx+CrwI+Errbaw/btWfZWaLWm+RXWdmr2r7mtvM7KNm9mvgITOLXrDNA64ELgJe1fq6GcA+wK8GemRt3P06d//D1Iet2zPc/SF3/6S73+buG9z9POBW4HnD3qfIGNiXiv7AT3H3K4AVwMFV3m8/qhqbmZ0PvAz4ppm9fZT3JTKAxuZCmc+9cc6ySaYd/+EVCgB3fzFwKXCcu2/p7v9jZjOBHwE/AbYD3gecbmZ7tn3pkWSz7WcljvhPjeOHwKtbtb2AGcAN7Y1mdl7rBUZ0Oy81djP7mpn9nuwo/0rg/KBne+CPget6fCtE6mAerRfOZvafZva9qU+Y2RIzsxHd791kp861+2Hb8/SH/WyknzGb2X9bsclx+bEVHlcv7n64u+/g7s9391PK2KZIieZR41zoptdzr4S8gBFlmfRHO/7Dm8fwAXAQ2Tl5J7j7I+7+U+A8sp39KV9y9zvd/eEu41gK/BdwsJlt1apd6+6Ptje6+yvcfVbi9orUIN39r4GtyF69nwX8of3zrRcwpwOnuvuNfTxukbHVmr/yLJ54Yb87sI2ZzTCzTYBH3d1zX7PIskl/0S06rzZlR7I5O+1e3fY8fXWf2+k5ZuBk4KdDjG2QcYnUUkNyYRjD5gWMLsukD9rxH8IgAZCwA3Cnu29oq91O9oSZcmc/43D3NcAVwGGM4O1Id3/M3X8O7AT877YxbAScBjwCHFfmfYpMk72Bx4Abpp7PwOVkL9SfBdyU/wJ3P8TdLXHr67xaM9uf7LlfZIcg2k6/Yz7d3S+pcmytbY3dETwzW2hmq8yslPORzezH0TupZnaKmd1qZktbt3ll3J9Uota50NrWwM+96ciLfr/Po9K0XNCO/3AKB0DC3cDO9uRlr54O3NX2cbcXEHsDDwO3tD7+IdnpPvsSnN9vZhfYk5fSar/1uxrPxsAzWtsz4NvA9sDr8u8wiNTUvmTvmK3niefzhcChZM+5UiermdnWZvYKson/33X3ZUNusrQxj2BsMJ5H8E4h+16V5TPAWxOf+zt3n9e6LS3xPmW06p4LMOLn3jhn2YBOoUG5oFV9hvN4AJjZc3jyL+aN9P+L+UvgIeAjZvY5YD7wSmD/AuO4pu2Jew7wT8AG4BP5Znc/rM/tAmBm2wEvJjv96GGypTuPBN7cavk62RPzpV1ORRKpm3k88Y7Z1B+axcAnybLz/5V0Pz8ys/Vkz9frgc8DJ5Ww3TLGPJKxBQdKHqTCI3gp7n6Jme3aXjOzZwBfBZ5GdmXTd/d7KqO7X2xmh5Q8TJle86hxLoz4uTfOWTawpuWCdvyHM48SAsDdH7FsFZ+vAR8jO9L/tgLnybePA3e/3bK1cP8UuKbPbXQdItlpPSeRvUt0O/ABdz/HsguYvIfsfP/ftL1b+B53P72E+xaZFu7efsra3sAlrRf595GtzPXVEu5j17L6gp6hxjzgffbbkz+CV+RASdUWAMe6+81mdiBZTr+4hO3+s5n9I3AxcHzbqmkyxhqQCyN57pU15sTnR/J9HlJtc0E7/kMYNADc/ZCgdh3ZWvhR/64FxjFVm9fta4rw7BLeqbHdDmhmvTTdn/DE9TAuIruA3YppHE8/xnnM03oEr19mtiXwZ8B/th3U2LT1udeSvbOad5e7/2WPTX+M7Lorm5DtQHw0sS0Zb+P8HEupxXMvZ6y+z3XPBe34l2esfjFFZCCLoqK7v6rt/98AvlHVgAY15mMe5AjeolEPKrARcF90IMXdzyJb3awwf+ICi38ws5OBDw88QqnCoqg45s+xlHE8et5Vj+/zosoHVPNc0OTekrj7q9z9ztb/v+HuT53uMYlIMe6+yN0XTfc4JsCf8MTpBRcBz+p1oGQ6fjbu/gBwq5m9AbKFDFrzuYZiZnOntke2EMO4nuYkNC4XCj/3xplyYYD7mf5FFEQkYmYLgVcAq9x97+DzBpwIHE42uejt7n51taMUaQ4zOwM4BJgD3EO2OMJPyRYwmAvMBM50977efjezS8kupLgl8Dvgne5+oWVXcH8a2WmSS8nOFX6w1AcjIqVoWi5ox19kTJnZC8hWXPhOYsf/cLKrPB8OHAic6O4HVjtKERERqQud6iMyploXSclf8bDdEWQvCtzdFwOzpt4qFBEREcnTjr9Ife3Ik6/ovIInX+1ZRERE5HGVrupjtonDU6q8S5HC5nJ/WF8Jq939af1s45lm/vsePSvhOmBdW2mBuy/ob5RAvIxq7c7dM9vGYedcNXVa40MFtry+QG8UhTMTvdE16jYkeqMfUao3Wg8g/nGadf4azp4db/Xee6Pvw28TY3gsqG2S6H0gqG2e6N0yqG2W6F0b1NYFNYiPXcXfs+2263xNvGrVbxLbjS4+vn1QW4H7vX0vZ9xnLlzo7mVeJbR2lAlTlAmZOmUCwLK+9xWgdy6UnQkVL+f5FODgau9SpKBjOC+sfyq7cFlfHia74lk3/wjr3H2/AkPLW8GT/zruBNw9xPamyc7Aj3O1yxK9iwtsd02B3jlBbbtEb7TQQmqnJPoDmfqD9fKgFv2xgU03fU9H7S8TK0SfccaqoPrNxBiiP9w7JXovDmrPTvTOL9D7s6CWurBo9P2NdlTgjW/8l47al7/8mcR2o0VO/jaovTLx9bE+cyH6ZZwwyoSMMiFTp0wA2LXvfQXonQtlZ4JO9REZkY163EpwLvC21lJiBwH3t60DLCJjqIJcEJGaqTITdAEvkREwhn9ytS8hZmYryJYQmwng7icB55Ot6LOcbDnPo4e8SxEZoTJyQUSapepcUAaJjMiwr9Td/cgen3fgvUPejYhUSEf1RSSvylzoeV9mtpmZXWFm15jZdWb2qVZ9GzO7yMxubv2bmEYiMnmmXsF3u9WZckGkuCbngjJBZDC9cqFs/WzzD8CL3f1BM5sJ/NzMLgBeC1zs7ieY2fHA8cBHRzBGkZH5RDCR91O8ItEdT/qNGI0/sldaLpjNZNNNn3z5gXXrUlMVop9NaiWI5wW1v0n07h7UVid6o4liByV6o4lxH0j0XhPUload69a9oaN2xhm7JLb7go7KVlv9fdi5du0ngupfJ7YbTaJ7S9g5e/YWHbU1a74R9v7gB52TFF/3umjSIMDCoPbusHNxMAd0q63+Lux9YG3nyitvPvLEjtqFF6ZWN4mVkQtm9kHgXWRLlSwDjnb31OzQKikTnkSZkJmsTAA444zE0BKqzoWe99W6ONDU9PSZrZuTXTzo1Fb9VODVww1bpFlm9LjVmXJBZDDD5IKZ7Ui2p7pf62reM4A3jW60/VMmiAxumH2FornQ14sMM5thZkuBVcBF7v5LYPupFURa/4brXJnZMWZ2pZldCY/0c3citWc0e8cfyssF99T60SLNUlIubAxsbmYbk62RPTZL+CoTRIrrlQt96jsX+trxd/fH3H0e2eKtB5jZ3v2OxN0XuPt+2Xrlxd4WFamrJp/LO6WsXIguPCPSRMPmgrvfBXwWuANYSbaE709GNuCClAkixQ17jn/RXCh0WpG73wcsAg4F7jGzuQCtf6MrQohMrElZr1u5INK/PnJhztSR79btmKmvbU2MPQLYDdgB2MLM4pOop5EyQaSYQTMBiudCzxcTlr30ftTd7zOzzYGXAv9GdvGgo4ATWv+eU+xhilQnmsQL3SbyDq9JO/d5ZeaC+0OsW5efZbWkwGhSV/R8R1A7JNEbXT4+vtojPDeopd6QjS5X/91Eb3Sxx/gqnbBPUEtNJuzc7tq130/0RuP9ct9j2Gqrzgl7AGvWXNrXuABe97roMT8U9h599OkdtZNPvjXsXbKk8zIXxx57cthrJy3tLJ5xfdBZfE5tH7mwussVvV8K3Oqtc2HM7Czgz0j/UlVGmZCnTIBJzITB9MiFbpkABXOhn3cR5gKnmtmM1ti+5+7nmdnlwPfM7J1kby90TikXmVATcKEe5YJIQSXkwh3AQWb2FOBh4CXAlUMPrBzKBJEBVJ0LPe/L3X8N7BvUf9fauIjkWOvWVMoFkeKGzQV3/6WZfR+4GlgP/ApYUMbYhqVMEBlM1bnQ8IOSItPDyNayExGZUkYuuPsngGhxdRGpoapzQTv+IiPS5HP8RWQwygURyasyF7TjLzICE3COv4gUpFwQkbyqc0EZJI0TreAzytV7UnRkr1+/BfKXat860bs8qKVW2ohWjdgz0dt5rZN99okvS79s2bKgGl0mHuKVC8PrFxGvnjG3wHZTK0x0/u4ffPAzw85LL40ex/6J7c7uqKxd+7ZE77ZB7b2J3quC2i1h58knd67KkS1mEdmto3LSSR9O9L41qK0IasUvSqlc6IcyIaNMyNQpEwajI/4iNTd1JT4RkSnKBRHJqzoXtOMvMiL6Ay8iecoFEcnTjr9IzelcXhHJUy6ISJ7O8RdpAEPn8orIkykXRCSv6lzQjr/UVjSJF6ZnIm9Ef+D7tRnw7FztnkRvNBFvVqI3usz7TxK9R3VUli27INF7TVA7ING7NKjtkuh9OKi9INEbPY6dEr2LOyqXXppa7vmQoPbjRG80Ya5zcl8m//MFWBJ27rzzkR21O+88N7Hdv+2o7LHHPmHnzTevDKpLE9uNJlv+R1Bbm/j6NOVCP5QJGWUC1C0TBqMdf5Ga01v6IpKnXBCRPJ3qI9IQw1yCW0SaSbkgInlV5oJ2/EVGoIxLcItIsygXRCSv6lzQjr/IiOhcXhHJUy6ISJ7O8RepOZ3LKyJ5ygURydM5/iKBaAWfcVm9J6Jl+4qYAWyRq81P9EaXSN8y0Rtd0r1zdYjM0qC2PNE7J6jdmOiNVoLoXFEjk/8eAESrTgC8OailVs9YGNSem+idF9RSl6V/KKj9Xdi5eHHn6iIHHXR7Yrud3ve+fwnr23y588zYWw7ysHfOnLkdtcsv3zrsff7zO38WG2/cOYZf/Sq1IkxMudAvZUJGmZAyrpkAcOml/xrWU7Scp0hD6AqdIpKnXBCRPF25V6TmDP2BF5EnUy6ISF7VuaB3HUVGYOqcvW63ntswO9TMbjKz5WZ2fPD5p5rZj8zsGjO7zsyOLvEhiEjJysgFEWmWXrlQtp47/ma2s5n9zMxuaO1cvL9V/6SZ3WVmS1u3w0cwPpHa2qjHrRszmwF8FTiM7BKHR5pZ/lKH7wWud/fnkF1e8XNmtklpD6D7+JQLIgMYJhfGmTJBZHBVZkI/LybWAx9y96vNbCvgKjO7qPW5L7j7Z0cwLplQ0SReGO+JvClDPmEPAJa7+y0AZnYmcARwfVuPA1uZmZHNZruX7PlahRJzYQadk9CiSXgQT9p7INEbTXZLbffRoBZNwoN4YtsOid5bg9ouid7dglo80Swe2zf77t1ss/eFnevWnRtUH0lsN5pkeHbYedBB0eTHeILgnXf+r47al054YdhrXz6ts3jax8Pe2bOjiXjRJEe4/PLOSX+wLqjdG359N3Xeue9BmfAkyoTMpGXCYMZqcq+7r6T103T3tWZ2A7DjqAcmUmclLM+1I3Bn28crgANzPV8BzgXuBrYC3ujuG4a72/4oF0SKa/JynsoEkcFUnQuFXmSY2a7AvsAvW6XjzOzXZrbQzFLrRolMJOtxA+aY2ZVtt2NyX56XX5PsL8nWnNuBbM21r5hZ6nDQyCgXRPrXRy7UnjJBpJgqM6HvHX8z2xL4AfABd38A+DrwDLIdjpXA5xJfd8zUjk367SGRZpm6BHe3G7Da3fdruy1o28QKYOe2j3ciO7Lf7mjgLM8sJ3sPea/yH01aObmwtqrhikyrPnOh1pQJIsX0yoWy9bXjb2YzyZ7Ip7v7WQDufo+7P9Y6teCbZOckd3D3BVM7NlDJvEORaTd1QY4hJuwsAfYws91aE3bfRHZaT7s7gJcAmNn2wJ6kT1gtXXm5sFVVQxaZViXkwlhTJogU1ysXytbztKLWxMFvAze4++fb6nNb5/QBvAa4dgTjE6mlYc/Zc/f1ZnYccCHZTLeF7n6dmR3b+vxJwKeBU8xsWesuP+ruq4ccel+UCyLFNfkcf2WCyGCqzoV+7ms+8FZgmZktbdU+Tra84Dyy845vA94zgvFJg0Ur+NRx9Z6UYV+pu/v5wPm52klt/78beNmQdzOoEnPhfuCCXO05id4bg9rmid5lQS11ufv8SqmQ/gnuHtQ6Lz+ftihRjx7HxYne6HIvqUvAdK6esW7dPyR6tw1q+yR6o1VLUquT/CSo7Z/o7Vz1xLaIvh7i1VteEHa+IoiWpUvjlUyWLYvub4+glvrdS6v7Uf0ulAlPokzITFomDGbcVvX5OfH8gvODmojQ7CN7oFwQGUSTc0GZIDKYcTziLyIDaPCRPREZkHJBRPLG6oi/iBTX5CN7IjIY5YKI5OmIv0gDTM3SFxGZolwQkbyqc0E7/jJy0SReaNZE3oj+wPdra1qrkrZZkujdLKilFjKKJoqlrm92TlBLTYyLHJKoRxP81hQYw/aJ3ujS9vMTvcsT9cieQe2SRO+bg1r8XIfndlRe+cqjws4f/eibQTU1WfOlQe2UsPO006JqNIET4u979LtX/PI6yoV+KBPSY1AmZMY1EwajHX+RujPDNu7x9Hr00WrGIiLjQbkgInm9cqHkTNCOv8io6A+8iOQpF0QkTzv+IjW30UawWY+3AR9+uJqxiMh4UC6ISF6vXCg5E7TjLzIKZr2P7InIZCkhF8xsFvAtYG+yi2K9w90vH35wIjItKs4F7ZmIjIJZ7yN7IjJZysmFE4Efu/vrzWwT4CnDD0xEpk3FuaAdfylVtIJP01fvCemIfwEPAYtztccKfH1qVY4LCmxji6C2rsD9XZ3ojVbPmJnojVYMeSTRe1BQy38Pp6wMatEKIBCv4LFP39vdd99/CzuvXjm3o7b7tfEKHrBDUEs9thuD2osSvauC2lsSvZGFQe3BAl/P0LlgZlsDLwDeDuDuj5D+JakxZUJGmZCpUyYMoOJc0J6JyCj0cy6viEyW4XNhd+C3wMlm9hzgKuD97v5QGcMTkWlQcS5oSWGRUZh6Bd/tJiKTpb9cmGNmV7bdjmnbwsZkC6B/3d33JTs0fvw0PBIRKUuvXOieCVAwF7T3ITIKOsdfRPL6y4XV7r5f4nMrgBXu/svWx99HO/4i9dY7F7plAhTMBe34i4yCzvEXkbwhc8Hdf2Nmd5rZnu5+E9nlba8vbXwiUr2Kc0F7JjKQaBIvTOhE3ojO8S8oP4ktmnQFMCuopS53H0lNEIwm7RWZcJdaZzmaRLdTond+UOucAJe5LKgtSfQeFtT2L7DdaDIiwGs6OxOttva/gupHE9v9+6C2XaI3+tmfkeh9eVD7ZKI3+tlHEw+/nPj6hHJy4X3A6a2VO24Bjh52g+NJmaBMmFKnTBhAxbmgHX+RUdERfxHJGzIX3H0p0O1tfxGpmwpzQXsmIqOgU31EJE+5ICJ5FeeCEkhkFHSqj4jkKRdEJK/iXOi5nKeZ7WxmPzOzG8zsOjN7f6u+jZldZGY3t/6dPfrhitREw5fzVC6IDKDBuaBMEBlQ7+U8S9XPOv7rgQ+5+7PILg33XjN7NtlSQRe7+x7AxWhJMZEnTC3P1e1Wb8oFkaKanQvKBJFB9MqFkvV8KeHuK2lNQ3f3tWZ2A7AjcARwSKvtVGAR6SnZUmPRCj5avaeHhp/LW24uPErnShezEr2bB7X7Er3RNqKVOiC+LH3qYqjRah3Rqh4AWwa1XRK9s4JaalWOLYLaOxK9S4PaSxO9uwe1K/re7tq1Fyd6o7H9daI3Wr0lWgkF4IKgFq/Sctllr++ozZ+fWk3l1KD2k6D2QOLrExqcC8qEPGUCTGImDGCcz/E3s12BfYFfAtu3nui4+0ozS62tJDJ5JuhcXuWCSJ8mJBeUCSIFVJwLfe/4m9mWwA+AD7j7A2bW79cdA7QuLxy9MhdpoAYf2WunXBApYAJyQZkgUtA4HvE3s5lkT+TT3f2sVvkeM5vbegU/l8TVNdx9AbAg284sL2HMIuOv9yW4a6+8XJitXJDJ0PBcUCaIDKDiXOhnVR8Dvg3c4O6fb/vUuTxx2bKjgHPKH55ITTV49Q5QLogMpMG5oEwQGVDFq/r0s8X5wFuBZWa2tFX7OHAC8D0zeydwB/CG0kcnlYom8YIm8g6k+efyjjgXUhPjHglq8cQt2KTAdqNJe1sneqPJX6lJnlFvarvRJLhHE71PD2pXJ3qfE9QuS/R2TjLcf/93h51LlkTjXZbYbvSYf5zojR7b9YneuUFtn7Bz/vzFQTX1PYt+p24KaqmJoQnNzgVlwpMoEzKTlgkDGLdz/N3950DqJL2XlDsckQYZ8pW6mR0KnEj2l+lb7n5C0HMI8EVgJrDa3V841J32SbkgMqAaH9XvRpkgMoRxO8dfRAoacrKOmc0Avgr8BbACWGJm57r79W09s4CvAYe6+x1aLUNkzE3A5F4RKWgcJ/eKSEHDv3V3ALDc3W8BMLMzydbDbn9/883AWe5+B4C7h5PmRGRMNPtUHxEZxLid6iMiA+jvFfwcM7uy7eMFrZUtILvwzZ1tn1sBHJj7+j8GZprZImAr4ER3/87ggxaRkdIRfxHJ0xF/kQbob3mu1e6+X2oLQS2/xN3GwPPIzp/dHLjczBa7+/8UGquIVKPhy3mKyAAqzgXt+E+oaAUfrd5TouFfwa8Adm77eCfg7qBntbs/BDxkZpeQLddQsx3/jYB86KVWuYhWtNgt0Zu6pHtkXlBLXbo9WgkitYpI9DhuTvTuH9RWJHpfENRSq3KcHdS2SPR2PrYlS65I9EYXWUp9H1YHtYMSvdEqLe9J9C4pMIY5Qa1zxZLMYUHt/wS19YmvT9AR/z4pEzLKhEydMmEAOuIv0gDDn7O3BNjDzHYD7gLeRHZOf7tzgK+Y2cZk69QdCHxhmDsVkRHSOf4ikqdz/EUaYMhX8O6+3syOAy4kW85zobtfZ2bHtj5/krvfYGY/Bn4NbCBb8vPaEkYvIqOgI/4ikqcj/iINUMI5e+5+PnB+rnZS7uPPAJ8Z6o5EpBo6x19E8nSOv0gD6MieiOQpF0QkT0f8pUzRJF7QRN6R07m8BWwA1uVqqUuhzwhq0eXnAfYIaqnLx98T1FIT+aJLwqfGG91faqLZvKC2V6I3//0CWJPo7ZyUds45rwo7jzhiUVD998R2o4l4qQmYs4Pa9xO90YTG1HavCWoPJnrnd1Se//xnhp2XX35cUI1+nwo+x5ULfVImZOYFNWVC9+1OdyYMQOf4izSEjuyJSJ5yQUTydMRfpOb0lr6I5CkXRCRPp/qINIDe0heRPOWCiOTpVB+RBtCRPRHJUy6ISJ6O+Is0gJbtE5E85YKI5Gk5TxlUtIKPVu+ZJjqyV4DTuapF6vLxmwS15YneR4NaarsPBLVLEr3RJd2jFSpS93dLoveCoBat1AGwT4Heb3ZUjjhicaI3WiEltTLIkgJjiFYtiR4DxKuhnJbojX4fDkn0Xt1Rufzy1OovbwlqlwU1S3x9gnKhT8qEjDIhU6dMGICO+Is0gM7lFZE85YKI5Okcf5GG0JE9EclTLohIno74i9ScjuyJSJ5yQUTyKs6FjXo1mNlCM1tlZte21T5pZneZ2dLW7fDRDlOkZqbO2et2qzHlgsgAlAvKBZG8XrlQsn62eArwFeA7ufoX3P2zpY9Ieoom8YIm8o4VMzZsHE0yaoxTKC0XZgLb5WpzEr3R5dQvTvQ+EtRWJXp3C2pbJnqjSXCvT/RGkwH3TPTuFdTuSfQ+r6PyD/9wcNj56U//V4HtRhMSo0mOEE/we2Oi9z+C2rsSvfcFtSsSvfnfG4gn90H8M079PmzeUZk9+0MdtQceOCPx9QnKhT4pEzLKhMx9QW08MwFgzZoPJ7aRUHEu9Nzxd/dLzGzXCsYi0hjusH79dI9idJQLIsWVlQtmNgO4ErjL3cfmiI9yQaS4qnOh56k+XRxnZr9uvbWXWrdKZCJt2ADr1nW/NZRyQSShxFx4P3DD6EZaOuWCSEKvXCigr1wYdMf/68AzgHnASuBzqUYzO8bMrjSzK+O32USaZ+oVfLdbAw2YC819FSTSroxcMLOdgJcD3xr1eEvSVy4oE2RS9cqFfhTJhYFmDbj74yeDmdk3IXHSeda7AFiQ9c7yQe5PpI4aunOfNHguPE25IBOjhFz4IvARYKuht1SBfnNBmSCTrMpcGGjH38zmuvvK1oevAa7t1i8yaabeupskygWR7vrMhTnZUe/HLWjtFGNmrwBWuftVZnbISAZZMuWCSHd95EIyE6B4LvTc8TezM8iudzzHzFYAnwAOMbN5ZNfVvg14T6/tyGCiFXy0es/4a/rk3nJz4TE6V4N4NNG7bVB7R6L3J0Ftl/6GBMCKRD1ab/mqAtudkahHl39fGdQAru+ofPrTZyV6oxU4dkj03h7UUiuORN/L74edr3lNfpEXOPvsaGWRlJcm6rcU2MapQe13id6XdFTWrIlWEVld4P77zoXV7r5f4nPzgVe1lsTcDNjazL7r7m8pNJARKS8XlAkZZULauGZCcX3kQrdMgIK50M+qPkcG5W/3+jqRSebe7CP+ygWR4obNBXf/GPAxgNaRvQ+Py04/KBdEBlF1LtT7aiEiY6rpR/xFpDjlgojkVZ0L2vEXGYFJPMdfRLorMxfcfRGwqJytich0qToXtOMvMgI6siciecoFEcnTEf8JFU3iBU3kraumn+NfLqPzcuhbJ3qjb+p3E70zg9oeid7okiapSV6HBLXtE72XBLXUZMIXdVT8sflhp82ItntaYrudGbLZZq8JO9etuzio/ntiuw8FtX8JO88++4KgenBiu9EEzL0TvfcEtVWJ3ujnuVui95lBbWlQS004jSkX+qVMyCgTMnXKhOKqzgXt+IuMgI7siUieckFE8nTEX6QBdI6/iOQpF0Qkr+pciN7LEpESdLsEdz+v7s3sUDO7ycyWm9nxXfr2N7PHzOz1ZY5fRMo3bC6ISPNUmQk64i8yAsO+dWdmM4CvAn9BdtWYJWZ2rrtfH/T9G3Dh4PcmIlXQqT4ikqdTfUQaoIS37g4Alrv7LQBmdiZwBJ2XZ3wf8ANg/6HuTURGTqf6iEhe1bmgHf9pEK3go9V7mqWEV/A7Ane2fbwCOLC9wcx2BF4DvJha7/jPALbI1aJLyqfq+a/t1rs00RutRvHyRO8dfX49xKu+RKtZAMztqNiMLyV6dw9qOyR6V3dU1q37p0RvtPpF6rG9LKitTPTeF9RSf+keC2rXJnqjbaRWSLkiqG1XYAzR96b4qj464t8PZUJGmZCpUyYUpyP+Ig3Q5/Jcc8zsyraPF7j7gtb/Ldps7uMvAh9198fMonYRGSdazlNE8rScp0gD9PkKfrW775f43Apg57aPdwLuzvXsB5zZ2umfAxxuZuvd/YeFBywiI6cj/iKSpyP+Ig1Qwjl7S4A9zGw34C7gTcCb2xvc/fErjZjZKcB52ukXGV86x19E8nSOv0gDDPsK3t3Xm9lxZKv1zAAWuvt1ZnZs6/MnlTJQEamMjviLSJ6O+DdINIkXNJF3EpRxzp67nw+cn6uFO/zu/vbh7m06PUbnpLtoIhVkr4Hy1iR6o0lasxO9NwW1XyR6OyfcpcfbOdntgx+MJwh+4QtnBNXo8QLsGdSWJ3qjSXD5s8ambBnUjk30LgxqsxK9LwhqnRMMM9FEvGjyJMTfh0sSvdsHtdSc+MVB7d1B7WeJr4/pHP9+KRNAmfCEOmUCZCtx90/n+Is0gI7siUieckFE8nTEX6QBdC6viOQpF0QkT+f4izSEjuyJSJ5yQUTyqsyFjXo1mNlCM1tlZte21bYxs4vM7ObWv6mT5EQm0tRbd91udaZcEClOuaBcEMnrlQtl67njD5wCHJqrHQ9c7O57ABe3PhaRlqm37rrdau4UlAsihSgXlAsieb1yoWw9T/Vx90vMbNdc+QjgkNb/TwUWAR8tc2B1E63go9V7JlfTJ/GNPhdSK1dsNtjmHpdaaWO3oHZAoveWoJa6LP01HZUvfOG0RO/uQa1zBZC0LRL1i4PaPgXGkFoRI1o946FEb/Rzi1ZNgfQqK5HvB7VoXPF2586Nv78rV14QVG8MasX+KisXhskFZUJGmdDddGdCcXWZ3Lu9u68EcPeVZhatkSUysSZ02T7lgkgXygXlgkhe45bzNLNjgGOyjzYf9d2JjIWmH9kb1pNz4SnTOhaRqigX0pQJMqnqcsT/HjOb23r1PhdYlWp09wXAAgCzWT7g/YnUyoQu2zdgLmyrXJCJoFxI54IyQSZV1bnQz+TeyLnAUa3/HwWcU85wRJqh6at3JCgXRLpQLigXRPKqXtWn5xF/MzuDbGLOHDNbAXwCOAH4npm9k+y6yW8of2jjKZrEC5rIK0/W9HN5y82FGcDWudqKAqNJnTK8IailtrtTUPvvRG/0g30k0RtNSpuZ6I0mEy5L9EYT7pYneqNTLF+f6P1yUEtdlj7Kwmcner8b1A5J9F4V1G5O9B7b59cDHNRR2XvvuHPlyi2DavTYUpMnY8qFfnNBmZBRJmTqlAnFjd05/u5+ZOJTLyl5LCKN0fRzeZULIsUpF0Qkry7n+ItIFxN6Lq+IdKFcEJG8qnNBO/4iI9LkI3siMhjlgojk6Yi/SM01/S19ESlOuSAieTrVR6QB9Ja+iOQpF0QkT6f6jJFoBR+t3iP90JG9ImbSuYLGmkTvAwW2OyOozUn0riyw3WgM+RVIpjwW1B5N9F4f1O5L9C4OaqnHFq1OEq3UAfFKJPckeiPXJOrRSia/S/RGj21+orfI78MuHZWLLjoj0XtZX18P9xa4f+VC/5QJGWVCpk6ZUJyO+Is0QNOX7ROR4pQLIpI3dst5ikhxOrInInnKBRHJ0xF/kQbQubwikqdcEJE8neMv0hA6siciecPkgpntDHwH+COyy9AucPcTyxmZiEyXKnNBO/7Ek3hBE3llcO7w6KPR5eGl00N0Tt7aLNG7RYHtRhP5UhO/ogl3mxS4r9R4owl+qQlh0SGfOxK9fxbU9kr03hLUdk/0Rt+H1HijSXAHJ3o3D2qpCYLzglrqcNiKoHZYondmUNs70bt/UIsmWqZ+7rEScmE98CF3v9rMtgKuMrOL3D0aXI0pEzLKhMy8oDaumVBc1bmgHX+RkXDiwBSRyTVcLrj7SlrLzbj7WjO7AdiRsvZARGQaVJsL2vEXGQknXgZNRCZXX7kwx8yubPt4gbsvyDeZ2a7AvsAvSxueiEyDnrnQVyZAf7mgHX+RkdGpPiKS1zMXVrv7ft0azGxL4AfAB9y9yMLlIjKWuuZCz0yA/nNBO/4iI7EBHfEXkScbPhfMbCbZH/fT3f2sMkYlItOp2lzYaKh7EpEuHutx687MDjWzm8xsuZkdH3z+r8zs163bL8zsOeWOX0TKN3gumJkB3wZucPfPj3acIlKdofYVCuXCxB3xj1bw0eo9Ur7hJuuY2Qzgq8BfkC1TsMTMzs3N0r8VeKG7rzGzw4AFwIGDj3m6zKDz8u3R6hsQHxVJ9T5YYAxbFvj66P52SPQW+R2Iemclel8b1E5J9EbjjVbUAHg4qH0u0Zv/mQEsSfTuGdRSK4NE34eHEr0rg9rSRO+LgtpNYefcua/vvKeV0X0V/RM69KT/+cBbgWVmtrRV+7i7nz/MRsePMiHdOyvRq0zITHcmDKLaXJi4HX+Rajjw6DAbOABY7u63AJjZmcARtM3Sd/dftPUvBnYa5g5FZNSGywV3/zlgpQ1HRMZAtbmgHX+RkRj6FfyOwJ1tH6+g+9H8dwIXDHOHIjJqWuZXRPKqzQXt+IuMxNDL9kWv3j3aiJm9iGzH/8+LjlJEqqRlfkUkr9pcGGrH38xuA9aSvVRZ389yQyKTY6hl+1YAO7d9vBNwd77JzP4U+BZwmLv/bpBRlk25INLNZC7zq1wQ6aa6XCjjiP+L3H11CdspVTSJFzSRV6oy9Cv4JcAeZrYbcBfwJuDN7Q1m9nTgLOCt7v4/w9zZCBTIheh7lbocezSNocj3OZqoBrAmqKUmmm0b1FYlercOalcneqOJcc9O9J5UYAxzg1pqOkh0uftNEr3RW9PR44X09zKyfVCLfj4Ay4LaMxO9lwW1zgl7ACtXnhFUbw5qaxP3lTLxR/z7zAVlQkaZkKlTJgyiRkf8RSRl6Etwrzez44ALyZZgWOju15nZsa3PnwT8I9lfnK9lq3npKJrIeNM5/iKSV69z/B34iZk58I3UJYRFJs/Qq/rQWorr/FztpLb/vwt411B3MhrKBZHQ8LlQY8oFkVC1uTDsjv98d7/bzLYDLjKzG939kvYGMzsGOCb7KLVOrEjTTPSRvYK58JTqRygyLZQLqVxQJsjkqjYXhrpyr7vf3fp3FXA22drj+Z4F7r5fdgpC6rwwkaaZOmev262ZiufCplUPUWSaKBdSuaBMkMnVKxfKNfCOv5ltYWZbTf0feBlwbVkDE6m/bpfgbuZRP+WCSC/KBZQLIjnVZcIwp/psD5zdmlS4MfDv7v7jUkZVULSCj1bvkenlTOiyfQPkgtH/u4G3B7XU10ZHSqJL1UO8esZmid7lfX49FLvU/G5B7dJE7/5BLbXqSeSaRP2BoJY64rRPULsq0btFUEut6hGNbWaiN3rMHW8wAXDCCZ3f3+OPvymx3cVB7SVBrejpq8oF+soFZUJGmZCpUyYMotpcGHjH391vAZ5T4lhEGmQyl+1TLoh0o1wQkTwt5ynSABM9iU9EQsoFEcmr13KeIhKa6GX7RCSkXBCRvHot5ykiSTqyJyJ5ygURydMR/1A0iRc0kVfG0WSeyzsYBx7O1VJHP6KJeEUWJ0tNzosuK5+61Hw02S26rD3AdkHtPYneaALbtoneOUEtNaHxlkQ9Eo039QfpnqB2UKL3+qD21kTv9kFtYaI3muAXjQuOPz7/Owbwu8R2/z6orQxqRZedVC70R5mQUSZk6pQJg9A5/iINMLGrd4hIknJBRPJqsqqPiHSjI3sikqdcEJE8HfEXaQCt3iEiecoFEcnTqj4iDaDVO0QkT7kgInla1UekIXRkT0TylAsikqcj/uEKPlq9R+pDb+n3bwOdl1mPVuqA+Hua6o2keqPzK1cleqPVOmYneucGtcsSvfcFtYcSvdGqJamVOqJtvD7Re3ZQi1a+gPh7Ga0sAvDGoJY6p/XuoLZbovclQe0bid7O35299vpO2HnjjV8LqtF4o9VculEu9EeZkLkvqCkTMuOaCYPQqT4iDaBJfCKSp1wQkTxN7hVpAB3ZE5E85YKI5OmIv0gDaBKfiOQpF0QkT5N7RRpCR/ZEJE+5ICJ5E3TEP5rEC5rIK3WnI3v9MzovLZ863zGaPBZNagPYosAYovtLXY492u7Wid5o0t/mid5oG6nJo9F290z0Lg5qqQmCsxL1SDS21Pchqu+S6I3GdkSi95+DWur34bMdlRtvXJLofXZQiyZgFr3apnKhP8qE9DaUCZlxzYRB6Ii/SAPoXF4RyVMuiEiezvEXaQCt3iEiecoFEcnTqj4iDaAjeyKSp1wQkbxqcyF14lNfzOxQM7vJzJab2fFlDUqk/qbO2et2ayblgkiKckG5IJLXKxfKNfCOv5nNAL4KHEY26+FIM4tmP4hMqMd63JpHuSDSi3IB5YJITnWZMMypPgcAy939FgAzO5NsmvX1qS+Yy/0ck1vFR6v3SDNtYELP5S2cC/H5jfkVPaZE39PZid4oMKMVQCBeYWLLRO92QS1aUQPisUVfD3BrUJuZ6L0jqO2Q6F0X1FIrbUSrcqSOD70qqK1K9F4T1C5N9B4Z1DZL9Ea/D68NO/fff9uO2pIlFyS2e3tQi1Yc2TTx9SnKBegnF5QJGWVCpk6ZMIhqc2GYU312BO5s+3hFqyYiwLBH9nq9NW6ZL7U+/2sze2654x+IckGkq9HmwphSLoh0NdwR/yK5MMyOvwU1DwZzjJldaWZX/n6IOxOpFyd7Fd/tltbnW+OHAXu0bscAXy9v/AMrnAsTegRUJlIluTCOeuaCMkEmV69c6K5oLgyz478C2Lnt452Au/NN7r7A3fdz9/2eMsSdidTL1FvV3W5dPf7WuLs/Aky9Nd7uCOA7nlkMzDKzueU9hoEUzoX0W/giTVNJLoyjnrmgTJDJ1SsXeiqUC8Ps+C8B9jCz3cxsE+BNwLlDbE+kQaaW5xr47bt+3hofx7fPlQsiSZXkwjhSLogk9cqFngrlwsCTe919vZkdB1xINjtmobtf1+1rVsLqTz0xQ2IOsJrcZN+GaD22RmrqY+vncRWYyXP/hXDOnB5Nm2Vvaz9ugbsvaP2/n1Nm+jqtpkqD5ALcvxrOu53m/m5BJY/tlAK955Rwfwun/lPyY/vIkF9/UlhdsmSgjfV6bAVn91WSC2OneC48ngmgXBjCKQV6S80EKPWxjVUmQPW50C0ToGAuDHUBL3c/Hzi/QP/Tpv5vZldmb+k1jx5b/ZT9uNz90CE30c8pM32dVlO1QXOhqb9boMdWVzXNhbFUJBe0r1B/emz9qzoXhrqAl4iMTD9vjZ8LvK21us9BwP3uvrLqgYpIZXTKjIjkFcqFoY74i8hopN4aN7NjW58/iezo2eHAcuD3wNHTNV4RGb3BTqUTkSYrmgvTueO/oHdLbemx1c/YPa7orfHWDv/U/x14b9XjGqGx+xmUSI+tnsbusRU9la4Bxu5nUCI9tnoau8dWJBcs23cQEREREZEm0zn+IiIiIiIToPId/5pebjxkZgvNbJWZXdtW28bMLjKzm1v/zp7OMQ7KzHY2s5+Z2Q1mdp2Zvb9Vr/3jM7PNzOwKM7um9dg+1arX/rHVlXKhHpQL9XxsdaVcGH/KhPo9tkp3/K2+lxtPOQXIL8N0PHCxu+8BXNz6uI7WAx9y92cBBwHvbf2smvD4/gC82N2fA8wDDm2titOEx1Y7yoVaUS7U87HVjnKhNpQJNXtsVR/xr+vlxkPufglwb658BHBq6/+nAq+uckxlcfeV7n516/9rgRvIrgRX+8fnmQdbH85s3ZwGPLaaUi7UhHKhno+tppQLNaBMqN9jq3rHv66XGy9i+6m11Fv/bjfN4xmame0K7Av8koY8PjObYWZLgVXARe7emMdWQ8qFGlIuyIgpF2pGmVAPVe/41/Jy45PMzLYEfgB8wN0fmO7xlMXdH3P3eWRXuDvAzPae5iFNMuVCzSgXpALKhRpRJtRH1Tv+tb3ceAH3mNlcgNa/q6Z5PAMzs5lkT+TT3f2sVrkxjw/A3e8DFpGde9mox1YjyoUaUS7U+7HViHKhJpQJ9XpsVe/4T8Llxs8Fjmr9/yjgnGkcy8DMzIBvAze4++fbPlX7x2dmTzOzWa3/bw68FLiRBjy2mlIu1IRyoZ6PraaUCzWgTKjfY6v8Al5mdjjwRZ64rPA/VzqAEpnZGcAhwBzgHuATwA+B7wFPB+4A3uDu+Qk9Y8/M/hy4FFgGbGiVP0527l6tH5+Z/SnZhJwZZC9+v+fu/2Rm21Lzx1ZXyoV6UC7U87HVlXJh/CkT6vfYdOVeEREREZEJoCv3ioiIiIhMAO34i4iIiIhMAO34i4iIiIhMAO34i4iIiIhMAO34i4iIiIhMAO34i4iIiIhMAO34i4iIiIhMAO34i4iIiIhMgP8PXzPX8mq6cSsAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import os\n", "import numpy as np\n", "import scipy.signal\n", "import librosa\n", "from numba import jit\n", "from matplotlib import pyplot as plt\n", "\n", "import sys\n", "sys.path.append('..')\n", "import libfmp.c2\n", "\n", "%matplotlib inline\n", "\n", "@jit(nopython=True)\n", "def generate_matrix_dft_inv(N, K):\n", " \"\"\"Generates an IDFT (inverse discrete Fourier transfrom) matrix\n", "\n", " Notebook: C2/C2_STFT-Inverse.ipynb\n", "\n", " Args:\n", " N (int): Number of samples\n", " K (int): Number of frequency bins\n", "\n", " Returns:\n", " dft (np.ndarray): The IDFT matrix\n", " \"\"\"\n", " dft = np.zeros((K, N), dtype=np.complex128)\n", " for n in range(N):\n", " for k in range(K):\n", " dft[k, n] = np.exp(2j * np.pi * k * n / N) / N\n", " return dft\n", "\n", "N = 32\n", "dft_mat = libfmp.c2.generate_matrix_dft(N, N)\n", "dft_mat_inv = generate_matrix_dft_inv(N, N)\n", "\n", "I = np.eye(N)\n", "A = np.dot(dft_mat, dft_mat_inv)\n", "B = np.dot(dft_mat_inv, dft_mat)\n", "\n", "plt.figure(figsize=(11, 3))\n", "\n", "plt.subplot(1, 3, 1)\n", "plt.title(r'$I_N$ for $N = %d$'%N)\n", "plt.imshow(I, origin='lower', cmap='seismic', aspect='equal')\n", "plt.colorbar()\n", "\n", "plt.subplot(1, 3, 2)\n", "plt.title(r'$|I_N - \\mathrm{DFT}_N \\cdot \\mathrm{DFT}_N^{-1}|$')\n", "plt.imshow(np.abs(I-A), origin='lower', cmap='seismic', aspect='equal')\n", "plt.colorbar()\n", "\n", "plt.subplot(1, 3, 3)\n", "plt.title(r'$|I_N - \\mathrm{DFT}_N^{-1} \\cdot \\mathrm{DFT}_N|$')\n", "plt.imshow(np.abs(I-B), origin='lower', cmap='seismic', aspect='equal')\n", "plt.colorbar();\n", "\n", "plt.tight_layout()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Recall that the DFT can be computed efficiently using the [FFT algorithm](../C2/C2_DFT-FFT.html). Basically the same algorithm can be also applied to compute the inverse DFT. In the following, we will use the implementations `numpy.fft.fft` and `numpy.fft.ifft`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Inverse STFT\n", "\n", "Next, we discuss the problem of inverting the discrete [short-time Fourier transform](../C2/C2_STFT-Basic.html) (STFT). As usual, let $x:\\mathbb{Z}\\to\\mathbb{R}$ be a discrete-time signal and $\\mathcal{X}$ its STFT. Furthermore, let $w:[0:N-1]\\to\\mathbb{R}$ denote the underlying real-valued discrete window function of length $N\\in\\mathbb{N}$ and $H\\in\\mathbb{N}$ the hop size parameter. For notational convenience, we extend the window function to $w:\\mathbb{Z}\\to\\mathbb{R}$ using zero padding. Let $x_n:\\mathbb{Z}\\to\\mathbb{R}$ be the windowed signal defined by\n", "\n", "\\begin{equation}\n", " x_n(r):=x(r+nH)w(r)\n", "\\end{equation}\n", "\n", "for $r\\in\\mathbb{Z}$. Then, the STFT coefficients $\\mathcal{X}(n,k)$ for $k\\in[0:N-1]$ are obtained via \n", "\n", "$$\n", " (\\mathcal{X}(n,0),\\ldots, \\mathcal{X}(n,N-1))^\\top = \n", " \\mathrm{DFT}_N \\cdot (x_n(0),\\ldots, x_n(N-1))^\\top.\n", "$$\n", "\n", "Since $\\mathrm{DFT}_N$ is an invertible matrix, we can reconstruct the windowed signal $x_n$ from the STFT by \n", "\n", "$$\n", " (x_n(0),\\ldots x_n(N-1))^\\top\n", " = \\mathrm{DFT}_N^{-1} \\cdot (\\mathcal{X}(n,0),\\ldots, \\mathcal{X}(n,N-1))^\\top\n", "$$\n", "\n", "and $x_n(r)=0$ for $r\\in\\mathbb{Z}\\setminus[0,N-1]$. To obtain the samples $x(r)$ of the original signal, one has to reverse the windowing process. We now show that this is possible under relatively mild conditions on the windowing process. Let us consider the superposition over all suitably shifted versions of windowed sections of the signal: \n", "\n", "$$\n", " \\sum_{n\\in\\mathbb{Z}} x_n(r-nH) \n", " = \\sum_{n\\in\\mathbb{Z}} x(r-nH+nH)w(r-nH)\n", " = x(r)\\sum_{n\\in\\mathbb{Z}} w(r-nH). \n", "$$\n", "\n", "Therefore, one can recover the samples $x(r)$ via\n", "\n", "$$\n", " x(r) = \\frac{\\sum_{n\\in\\mathbb{Z}} x_n(r-nH)}{\\sum_{n\\in\\mathbb{Z}} w(r-nH)}\n", "$$\n", "\n", "as long as the condition \n", "\n", "$$\n", " \\sum_{n\\in\\mathbb{Z}} w(r-nH)\\not= 0\n", "$$\n", "\n", "is satisfied for $r\\in\\mathbb{Z}$. This overall approach is based on the so-called **overlap–add technique**, where the overlapping reconstructed windowed sections are simply overlaid and added up (and then normalized to compensate for the windowing)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Partition of Unity\n", "\n", "It is not hard to find window functions along with hop sizes that satisfy the above condition. For example, when the window function $w:[0:N-1]\\to\\mathbb{R}$ is strictly positive and the hop size is smaller than or equal to the window length, then the sum over the time-shifted windows is always positive. Often, one chooses a window function and a hop size such that the stronger condition \n", "\n", "$$\n", " \\sum_{n\\in\\mathbb{Z}} w(r-nH) = 1\n", "$$\n", "\n", "for all $r\\in\\mathbb{Z}$ is fulfilled. In this case, one also says that the time-shifted window functions define a **partition of unity** of the discrete time axis $\\mathbb{Z}$. For example, one obtains a partition of unity when using the **squared sinusoidal** as window $w:\\mathbb{Z}\\to\\mathbb{R}$ defined by\n", "\n", "\\begin{equation}\n", " w(r):= \\left\\{ \\begin{array}{cl}\n", " \\sin(\\pi r/N)^2 & \\,\\mbox{if}\\,\\,\\, r\\in[0:N-1],\\\\\n", " 0 & \\,\\mbox{otherwise} ,\n", " \\end{array} \\right.\n", "\\end{equation}\n", "\n", "and a hop size of $H=N/2$. Note that the property of being a partition of unity not only depends on the window function itself but also on the hop size parameter. The following figure shows various window functions of length $N$ and their time-shifted versions using a hop size $H$. The sum of the shown time-shifted versions is indicated by the thick red curve.\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:59:43.565245Z", "iopub.status.busy": "2024-02-15T08:59:43.564915Z", "iopub.status.idle": "2024-02-15T08:59:43.908017Z", "shell.execute_reply": "2024-02-15T08:59:43.907430Z" } }, "outputs": [ { "data": { "image/png": "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RaEyZoz/hZk1y7f7l19+4WmnncbWrVszLy/PEhP/85//EABfeOEFv+07d+7k6aefziZNmnD//v2W2PbII48QACdPnuy3/cCBA8zOzma9evW4Y8cOS2ybNm0aAfDWW2/123706FG2adOGp512Gn/55RdLbJs1axYB8LrrrvPr+hcVFbFLly6sVq0a16xZY4lt8+fPp8Ph4MCBA+nSdK1LSkp40UUXMSEhgd9//70lti1evJgJCQns1asXi4uLPRvdbipDhpS2Wh0O8osvLLFPi6Et1nBflgvrU0/5i2oZgSDJ7777jvHx8bz44otZUlISVfP+97//EQDHjRtX7v7Vq1czJSWFXbt2ZVFRUVRt++CDDwiAV199dbnjgps3b2Z6ejrPOussHj16NKq2LViwgA6HgwMGDPATB5Xt27ezbt26zM7O5sGDB6Nq29KlS5mYmMgLLrigVBw07N+/n40bN2ZmZib//PPPqNq2bt06Vq9enR07dmRBQcFJ+/Py8tiqVSvWrFmTv/76a1Rt++2331irVi2eeeaZPHLkiP/OoiK6OnXy3ceuatXI9eujal9Zqq6wzplDRaT0SXf11WQAx8Ebb7xBAPzXv/4VNefCV199xbi4OPbv359OpzNguTlz5lBEOGzYsKg5F3788UcmJSXx/PPP54kTJwKW+/bbbxkfH8++ffsGrYOR5OTkMDU1le3bt+exY8cClvvpp5+YnJzM8847j8ePH4+Kbb///jtr167NFi1a8PDhwwHLbdy4kTVq1ODZZ5/Nv//+Oyq27d69m/Xr12eDBg24Z8+egOX++OMP1qlTh2eccQb/+uuvqNh26NAhNmvWjBkZGdy2bVv5hfbvp7NBA9/97MzMJIPUw2yqprCuWkVXUpLvIri7dyeDCARJ3nvvvQTAKVOmmG7ehg0bmJaWxnPOOUfXjfXUU08RAO+55x7Tbdu2bRszMjLYrFkzHjp0KGT5119/nQB44403mv5Q2rt3Lxs2bMj69etz9+7dIct/9NFHBMARI0aY/lBSIydq167N33//PWT5hQsXMi4ujv369TP9oaRGTqSmpjInJydk+eXLlzMpKYk9evQI+mA1ghMnTvD8889nUlISf/zxx+CFN26kKzW1tOXarh1ZTss7GlQ9Yd25k846dUqfbNnZpA6BcLvdHD58OEXEVI/3vn372KhRI2ZmZnLX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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def plot_sum_window(w, H, L, title='', figsize=(5, 1.5)):\n", " N = len(w)\n", " M = np.floor((L - N) / H).astype(int) + 1\n", " w_sum = np.zeros(L)\n", " plt.figure(figsize=figsize)\n", " for m in range(M):\n", " w_shifted = np.zeros(L)\n", " w_shifted[m * H:m * H + N] = w\n", " plt.plot(w_shifted, 'k')\n", " w_sum = w_sum + w_shifted\n", " plt.plot(w_sum, 'r', linewidth=3)\n", " plt.xlim([0, L-1])\n", " plt.ylim([0, 1.1*np.max(w_sum)])\n", " plt.title(title)\n", " plt.tight_layout()\n", " plt.show()\n", " return w_sum\n", " \n", "L = 256\n", "N = 64\n", "\n", "H = N//2\n", "w_type = 'triang'\n", "w = scipy.signal.get_window(w_type, N)\n", "plot_sum_window(w, H, L, title='Triangular window, H = N/2');\n", "\n", "H = N//2\n", "w_type = 'hann'\n", "w = scipy.signal.get_window(w_type, N)\n", "plot_sum_window(w, H, L, title='Hann window, H = N/2');\n", "\n", "H = 3*N//8\n", "w_type = 'hann'\n", "w = scipy.signal.get_window(w_type, N)\n", "plot_sum_window(w, H, L, title='Hann window, H = 3N/8');\n", "\n", "H = N//4\n", "w = scipy.signal.gaussian(N, std=8)\n", "plot_sum_window(w, H, L, title='Gaussian window, H = N/4');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Basic Implementation of STFT and Inverse STFT\n", "\n", "In the following code cell, we provide a pair of implementations for the STFT and its inverse. Here are some notes one needs to keep in mind that are of practical relevance:\n", "\n", "* To avoid small imaginary values in the inverse DFT (due to floating point arithmetic), it may be beneficial to only keep the real parts of the reconstructed windowed signals.\n", "* After applying the inverse DFT, one needs to compensate for the windowing. Rather than doing this on a frame-based level (i.e., for each windowed section individually), one should do the compensation **globally** by accumulate all windowed signals as well all shifted windows separately. The reason why the global compensation is possible lies in the **linearity** of the DFT. Furthermore, in the compensation, one needs to avoid division by zero. \n", "* In the case that the shifted windows (for a given hopsize) form a partition of unity, no compensation needs to be performed. \n", "* In the case that [padding](../C2/C2_STFT-Padding.html) is applied in the STFT computation, one has to take this into consideration when computing the inverse STFT.\n", "\n", "
\n", "Important note: In practice, one often uses a different reconstruction formula as the one used in the following implementation. This issues will be discuss in the next paragraph and in the FMP notebook on signal reconstruction.\n", "
" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:59:43.910749Z", "iopub.status.busy": "2024-02-15T08:59:43.910562Z", "iopub.status.idle": "2024-02-15T08:59:44.057413Z", "shell.execute_reply": "2024-02-15T08:59:44.056767Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAADQCAYAAAD79kC9AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAACZ9UlEQVR4nOydZ1gUVxeA36EICCgqxoaKvVDELhbsvfcSjZpYYjRqTKKfKWo0Go1JNEaNiSX23nvvXVAUxYZiwYooCAIK7P1+XFhZilIWdsF5n2cfmJk7957ZnXLmnqYIIVBRUVFRUVFRyS6YGFoAFRUVFRUVFRV9oio3KioqKioqKtkKVblRUVFRUVFRyVaoyo2KioqKiopKtkJVblRUVFRUVFSyFapyo6KioqKiopKt0ItyoyjKIkVRniqKcjmZ7Q0URQlRFMU79jNOH+OqqKioqKioqCTETE/9LAZmA0vf0eaYEKKNnsZTUVFRUVFRUUkSvSg3QoijiqI46qOv+Njb2wtHR713q6KioqKiopIN8PLyeiaEyJ9wvb5mblKCu6IoF4GHwDdCiCtJNVIUZRAwCKBYsWJ4enpmoogqKioqKioqWQVFUe4mtT6zHIrPA8WFEJWAv4DNyTUUQvwrhKgmhKiWP38iZUxFRUVFRUVF5Z1kinIjhHgphAiL/X8nYK4oin1mjK2ioqKioqLyYZEpyo2iKAUVRVFi/68RO25QZoytoqKioqKi8mGhF58bRVFWAQ0Ae0VRAoDxgDmAEGIe0AUYoihKNBAB9BBqOXIVFRUVFRWVDEBf0VI937N9NjJUXEVFRUVFRUUlQ8nMaCkVY+DBA7h6FW7ehOfPISwMLCwgVy4oXhzKl4dy5cDMiE+NZ8/A1xeuX5f/h4WBqak8hiJF5DFUqACWloaWNHlevpTHcO0aPHkCoaFyfa5cUKCAPIaKFcHW1rByvouIiLe/w4MH8hhiYqTM9vbyPHJygrx5DS1p8kRFyd/g+nW4d0/+Lm/egI2NlLtMGfk7FCpkaEmTR6MBPz95HP7+EBIifxtra7Czg1Kl5PVQvDhI7wDjQwj5/V+9Ko8lOBhevQIrK3lNlCghr4kyZcDEiBPrP34MV67o3l9z5JDHULSoPIby5cHc3NCSZnuM+Ammoheio+HQIVi7Fg4ckDe/+JiZyTbxsbUFDw9o0wY6dwYDR60JjcB/9Rmez1tDocv7KPJCN4uAMDVFiYnR3cnCAmrXhpYtoVs3eWM3NL6+sGoV7NkDXl7yoRSHiYm8wce31pqaQrVq0KwZdO8uFQVDc++ePIadO+H0aakIxKEo8jgS/hYuLtC0KXTtCjVrGv4B++yZvB62bYNjx+RDND5JXBOBuUtzy7Exxb7qTOGPGxpe+Q8Lg82bYdMmOHxYPkjjk9R1XbgwNGoEHTvK68LKKrOkTZo3b2DXLtiwQd6bHj7U3Z7UMeTNCw0aQLt20KED5M6dWdImTUwMHD0qz6f9+6ViFp+kjsHaGurVk/fXbt0Mfn/NrijG7PpSrVo1oea5SSOBgTB3LsybJ98mcuWChg3ljaFSJShbVr5dW1jIC/TlS6n4+PrC8ePyZuPnJx+wjRtDjx7ypmhnl2mH8Mr7Jpf/t5yCB1dQPOoWEVhy2tyDS/ka4m1ShTMvynI7oiDRJhZ06ij46dswKljHvv2dOiWP4dIl2Zm7u1QQunaVN/nM4tEjWLkSli8Hb2/5fbq7y9+ienX5Fle4MOTMKduHh7+dXTt3Th7D2bNSEXJ2lsfQvbt8g80sXryA9evlMRw9KtdVriwflO7u8hiKFZM3bUWByEh5zl2/LpW4Q4ekEvHmjVQyu3eX55ObW+YpOhERsHUrLFsmlcvoaHkNNGkCderImY0SJaRib2pK6LPXTB8dyKklN3DDm0Ymh6kbfQhbwgi1yo9l7y6Y9+4Bdetm3kxCdDTs2yePYfNmeUwODvIY6tWTym/p0vKBb2YmZ6WeP5ezCD4+cOSIfAAHBcmZqQ4d5O/QtKmcXcgMhICTJ+UxrF0rz618+eQ9pn59qQiXKSPXmZvLYw4JgVu34MoVXh84Ruim/diH3+eNkgP/ci0p82MPTNq3ledfZnHpkrweVq6U16uNjby3Nmggr42yZaXSEnd/DQ2FO3fk/fXECXldX78u7wft2sHXX8uXMUMr/lkQRVG8hBDVEm0QQhjtp2rVqkIllQQFCfHtt0JYWsp5gFathNiwQYiIiNT1o9EI4e0txNixQpQoIfsyNxeibVshVqwQIjQ0Y+T38xPPJ84SdwvVFAJEDIo4m7uxOPjJf+LB1RCdpjExQpw+LQ/X1lYIRRHi88+FePVKtz8xZYoQrq7yGBRFiAYNhJg3T4jAwIw5hocPhfjvPyGaNhXCxESOW6OGELNmCfH4cer7e/RIiL/+EqJOnbi5HSGqVhVi+nQh7t7Vu/hCCCGePxdi3TohOncWIkcOOWb58kL8/LMQt2+nvr/gYCEWLxaiZUshzMxkf2XLCjFunBBXruhffiGECAsTYudOIfr3lycICOHgIMTo0UJcvJjsbpGR8hQxMRFiyJC3p8nDW+FiXrMNYjXdRISJleyvcGEhRo6UJ6JGo/9jeP1aiCNHhBgxQoiPPpJj5s0rT/Tjx1M/ZlSUEHv3CvHZZ0LY2cn+8uSRy/v2ye36JjpaiHPnhPjhh7f3kpw5hfj4Y/n7vHmTom6CguRpb26mESPdT4u1DiNFAIWFAKGxshKiWzchNm5M/b0uJWg08jz99de39xIzM3k/XLNGiPDw1Pd56ZK8eeXJI/urV0+Ikyf1L3s2B/AUSegPBldg3vVRlZtUEB0txJw58oalKEL06SOEr69++tZohDh7VohRo4QoUkSeNpaWUnGaNEneFIOD0ybzjRvy5jBwoIgqVkL78L5AJbHUdbrw2hqQoq6ePZPPGEWRz+Akn12+vkKMHy9EuXJyHFNT+RT7/nshtm0T4unT1B+DRiPEnTtCbN0qBXByequAlCwpH97Xr6e+3+S4d0+I334Tonr1t+PUqCF/m7Vr5fbUPvA0GqmQ7d0rxHffyb7jlLKPPpLH5empv4d3YKAQ//wjRKNG8gcD+b198YUQS5fKcyItYwUFCXH0qFTAGjR4q5TlyiXEp58KcfCg1IjfQUyMfEaCEMuXJ91m8WIhbAgVv7iuFNFt278dx9FRjvPPP/IEjI5O/TG8fCnEmTNC/PGHvL6srWXfFhZCdOkixJYtUuHRB69fy/O+d28hbGze/t49ewrx559SjrSMFREhxIUL8nvo0kUqYyDPqWbN5G+cypejiAgh3Nzk17B9u1yn0Qgxe1aMaGB6RGwrNkRo7O3lOLa2QnToIMS0aVIxDAtL/TG8eSOVmaVLhfjkE6nExl1vtWrJe62+Xo7CwuSLT4ECsv+uXYV48EA/fX8AJKfcqGap7ICvL3z6KZw5I6d3//gDXF0zZiyNRk4rr14tzQ2+vnK9osgp8VKlpOnho4+kfdzSUk69vn4tfRsCA9+aXa5dk+uBiBy52B/dkH00JU+3pvSbUpYSJVIv3oED0KePdEnYtk3OdCdCCDmtvHq1NFFcuvTWT6R4cXkcjo7SsTdfPnkM5ubSrBIeLn02Hj2S8l+9KgcD2a5ePTnN36RJxptdbt2SU/vbt0vzT+x3ScGCcmq/ZEn5v7299K/IkUOaKiIipGniyRM5Ne7rK80DIH+rmjXlMTRtKv/PSP+Sx4+lyWvzZml+i3OszpNHOiSXKiWPIX9+aXawsJCmishIaXIJDJRmlytX5PHE4eb29hjq1k2xf8mUKfD99/Drr/Dtt8m3W7gQBgyAUaPg9x+DYcsW6Tty8qT8bkGaKuKOoXBheQy2tvIYNBr5ewUHy2O4dUv+DvfuvR2kbNm351LDhhnrXxIRIf1f1q2TJsQHD+R6C4u3x+DgIK/rXLnk+jgT5MuX8hjizC63b7/1JytS5O3v0KSJ3D8N/PGHtNxs3gzt2+tu+/NPGDkSViyJplehQ7BmjTTBxfm/mJrK6yHu3pQ/vzy/LCykSfH1a3kNBwZCQIA8l27ceOsrE2c2izuOjPLfCwuTB/rLL/JanTYNBg9WTVXvITmzlKrcZGWEgDlz5F3Y2hpmzoSPP87ciyE4WPqGnD4t7fq3bskbdFCQrnNsHFZW8mFVoQKvS1Vk192KzNzvzMmIyvTsY8b48fKZnB4CAqQP7u3b8rnZ5n216MPDpXJw5gxcuCCP4c4dqcQkdI4FeeMpUEDe9CtWfPupVs1wTppv3kgl7fRpeSx+ftKH6ulTqdAkxNRU3uTjooGcnKTfSY0a8uFlCGJipLJ4+rQ8p27elD/ikyfyIZoQRZEPnlKlEv8OaXiI3rol3ZratJE64/suoy++gL//lm4wTZrErhRCdnTmjPzcuCGXHz9+qwQnJG9e6bPk5PT2GKpUkesMRUCAlP/0aanE37olHX5DQpJunyuXVH7izqWKFd/69qXzfhQSIu8J1avD7t2Jt8fESLcpPz95+mj9c589e3sMV67IYwgISOx8HYe1tYyKi/sNnJzkCeHqmrkRWn5+8Pnn8k2tVStYtEjeb1SSRFVushthYdCvn3xbbNlSXgAFCxpaqrfEOSm/fi3fgCwspNNszpy8iVKYOxd+/lnqQJ07w8SJ8n6iL4KCoEULqW/t3y9f3lONRvP2GKKipFJjZSXfyLPK25QQcjYkMlIqQObmcobJ1ta4Q2rjI4Sc9YuIkL+Fmdnb9AWmpnobolUr6Ut/7ZqccHgf4eFQtao8RXx8UhDxHhEhj+P1a/ndW1jI3yErhQXHzXK8fi2/NEtLeT1YWGTYkN9/L2fUzp+XvrpJceWK3NavH/z773s6jIqS18Tr1/Iaj3dvMhqEgNmzYfRoGcSxcaN03ldJhOpQnJ24fVsIFxdpw54+PWMcGTMAjUb6NpcuLU3LTZtKV46M4tkz6V6TJ0/G+ayqZA/Wr5fn5MyZqdvPy0tehsOHZ4xcHzqBgUJYWQnRq9f72w4eLH1ynjzJeLkyDR8fIUqVkn5dCxcaWhqjhGR8brLIq5uKloMH5fzs/fvSRv7NN1liFuHsWZk6p3Nn+aK0a5d0d6laNePGzJdPTmNbWEDr1snPRqt82Gg0MGGCtMoNHZq6fatUgYEDZdaFmzczRLwPmpUr5YTX//73/rYjRsjJmH/+yXi5Mg1nZ3nzrF8fPvsMhg9P2syskghVuclK/PuvdCb56CPpk9CsmaElei9370KvXtIv9cYNeePx9pYmo8zQyRwdpRPigwfQu7du3jwVFZD+2Jcvw3ffpc13esIEaZ1JyQNYJXUsXiwVSBeX97etUEHeV+bMeetbny3Im1cmzRw1Cv76Sx7ky5eGlsroUZWbrIAQ0oN+8GCp0Jw+LSN6jJiQEHmzL1dOJlH9/nvpJzdoUOYnd61ZE2bNkrNFkyZl7tgqxo0QMHmyzN/Xo0fa+ihYEMaMkW4RJ0/qV74PGR8f6d/ft2/K9/nqK+l/vmZNxsllEMzM4PffpbZ39KiMngsMNLRUxk1Stipj+ag+N0I6qnz9tXQI6NUrxQmvDMWbNzIFRFzKiT59ZOoVQ6PRCNG3r0yrsmOHoaVRMRb275fn6bx56evn1Ssh8ucXok0b/cilIm975uapSyej0cg8V3XqZJxcBmfHDplnrFy5jEvimYVA9bnJgkRHy2Qav/8Ow4bJlOVGGlkhhJzed3WVfgvOzjIieelSWS/O0CiKDNutVElGy9++bWiJVIyBmTNllG1qZgeSImdOeYlu3y4jd1TSR3S0rG7QurVM05RSFEVe3ydOyKjvbEmrVjL/wOPHMgb+2jVDS2SUqMqNsRIdLa/SRYtg/HhpVzHS0N0LF2Sej7ZtpU/Lli3S77lKFUNLpouVlYycVxTo0iWb2eVVUs39+9KVYcAA/RSQHzpUKjm//Zb+vj50jh6V5qU+fVK/b7du8u+6dfqVyaioW1cWTH3zRiYO9fExtERGh3E+LT90oqPlVb12rbxTTphglBFRDx7IvBJVq8LFi9LX7fJlWQfOCMUFZDKwJUukQvb994aWRsWQLFwoZxw/+0w//eXLJ/tasSIbzxpkEjt2yLRSaYmZKFtWJqjOdn43CXFzk4mZLCxkEdvLlw0tkVGhKjfGRkwM9O8vSwP8+qvMOW5khIXBuHEyue2qVTIa3c9PTssbqdVMh7ZtZXbZ33+HvXsNLY2KIYiOlspNs2akqcxHcowaJS/hv//WX58fIjt3yuhnG5u07d+9u0xOfOeOXsUyPsqUkWVwcuSQCo5qE9WiKjfGhEYj58iXL5chHO8qbmMAYmJgwQJ5PU2aJGu8XL8udTA7O0NLlzp++01mRO7bVw06+BDZvVvOrgwapN9+HR1lwvD//ntbmkglddy+Ld1IWrdOex8fhGkqjjgFx8xMKjhx9f4+cFTlxljQaGSo9+LF0gz13XeGlkiHfftkevOBA6Vp5/RpOWvj6GhoydKGlZWU//lzaUow4iokKhlAXLmetm313/egQbKu6o4d+u/7Q2DnTvk3PcpNyZKyxNjGjfqRyegpW1YqOCYmMkxcdTJWlRujQAjpjbhgAfzwg7T5GAn37knn22bNZFmcdeukmbdmTUNLln5cXWXh3W3bYN48Q0ujklkEB0vFo0ePjDGjtmoli4C/t8aRSpLs2CEnI9KbyqtVK5nc94PJTF6unFRwQFYxv3XLsPIYGL0oN4qiLFIU5amiKEl6NCmSWYqi+CmKcklRFCOLozEgQsi84fPmyUxgEycahTfu69cyb2CFCvJNavJkOdvZpYtRiKc3hg+H5s2la5OaPv/DYNMmGWTSs2fG9G9mBp9+Kk1f9+5lzBjZlfBw+XxOz6xNHC1ayAnx/fvT31eWoXx5ecCRkVLBuX/f0BIZDL1UBVcUxQMIA5YKIZyT2N4K+BJoBdQE/hRCvPfdP9tXBRdC+tX8/rv0RPztN6PQHC5dkm+1V69Cp07wxx9QvHjGjvn8+XN8fHwIDAzk6dOnHDlyhKdPn/Lq1Stev36Nubk5VlZWuLq64u7uTo4cOShQoABOTk7YpyYRRhI8eABOTjIHTtzMrkr2pVkz+VLr5/f+y+3ixYtcvXqVmJgYLC0t2bJlC/ny5aN169Y0btwYJZkO7tyRppGffoIff9T/MWRXdu+WPkt79iQdKSWE4PTp02zZsgVPT09y585Nq1ataNeuHfnz59dpGx0N+fPLe9jChZl0AMaCl5f0v/noIxlXX6gQAK9fv2bz5s2EhIRga2uLRqOhZcuW5H1vSXvjJcOrggOOwOVktv0D9Iy3fB0o9L4+s3WGYo1GiO++k+lRhw0zisreGo3M1GphIUShQkLs3JlxYz1//lxs3LhRjBgxQgwePFicPXtWeHp6Ck9PT7F69WoBJPnp2rWrtp2np6dYuXKlqFKlihgzZow4d+6c0KTxe1y4UP4Us2fr+UBVjIpHj2QV7++/f3e7q1evihkzZuica56ensLa2lp7LlatWlVs37492T4aNJBJZI3g0s4y/O9/QpiZCREWlnjb06dPRfPmzZO8L+TMmVMsXrw40T5duwpRuPAH+hucOCGEtbUQFSsK8fSpuHXrlihVqpQAxPjx47Xn9O7du8W+ffsMLW2awcAZiosA8efHAmLXJUJRlEGKongqiuIZmJ3DWH7+GaZMkR66f/5p8BmbqCgYMgQ+/1z6o3l7yzcofRIWFsbKlStp164dBQoUoFOnTvz555/s378fk3jTJe+aiUn4dubl5cX58+eZNm0a1atXp0yZMvz66688e/YsVbL17y/fFMeM+QDCRz9g1q2TpopevZJvs2DBAlxdXVm8eLHO+uDgYF69eqVd9vLyok2bNowePZqYmJhE/fTsKaMJvb31JPwHwJEjUL06WFvrrvf39+fUqVPUqVMnydmy8PBw+vXrx4IFC3TWt2gBDx9+oClgateWDoW3bxPVsCGdGzXiVqwfzqVLl7TN7O3tyZMnD9u3bzeUpBlCZik3ST25k7SHCSH+FUJUE0JUS/ggyzb8+qt0Gu7bV/raGNgOEhIibwL//COLXe7YIWcz9YFGo+H06dMsX76cKlWq8PHHH7Nt2zaioqK0bW7fvk1wcLB22c7ODrNkqmt+lECwhGbLW7duMWbMGBwcHJg2bRr3Uuj0oCjSAVRRpL6pRk9lT9aulRWmK1ZMvE2j0fDNN98wcOBAoqKiuHjxIkePHtVuf/DgQZJ9Tp8+nbZt2+ooPgCdO0uH5ZUr9XoI2ZZXr+DcOZnfJj5Pnjzh+vXrFClShFatWjF06NAk9x88eDCVK1dmTbzsfXGmrd27M0pqI6dhQyJXrQJfX+bdvYtt7GrfBOHiW7Zs4fPPP+fhw4eZL2MGkVn1mQOA+BWGHIDs8y2mhpkz5fRAjx7SEGxgxebpU6nY+PjIKPT01tiJ482bN+zatYvo6GgcHR2pUKECHh4e3EzCa1cIwYULFyhTpgyhoaGYmpry33//UaBAAXLlykWOHDmIiori1atXvHz5kps3bxIdHY2NjQ3nz59PcvwcOXJQq1YtAgICOHbsGG3btiVXrlzvlLl4cal3fvGF/GkGDNDLV6FiJDx+LGsOTZiQeJsQguHDhzNnzhyd9XPnzqVYsWIAODo6smrVKtauXcumTZt02hUtWpTNmzfTvXt3rWKeL5+8tlatklF5qi/Xuzl1SvrJxFduNBoN+/bto0KFCtp1/fr1IyYmhlq1anHr1i2mTp1Kx44dGThwIADFixfn4sWLVKpUCQcHWeduzx6jSxuWafxy4QIXhWA9sB1oAZQuXZpbt25hbW3NpEmTOHPmDABDhgxh8+bNyfqSZSmSslWl5cO7fW5aA7uQMzi1gLMp6TPb+dzMnSsdOzp1Morq3g8eCFG2rBBWVvrzr4mIiBCzZs0ShQsXFgMGDNDxV1izZo2Onbxs2bLiq6++Eps2bRJPnz5N03hPnz4VK1asEB07dhQWFhbavgcNGqQz9q5du8SmTZve219MjPSVyJVLiIcP0ySSipHy99/y8vPxSbxt+vTpifw4rKysxNKlS0VMTEyi9qdOnRKFCxcW5ubm4qefftKeZ8uWLdNpt2qVHPPw4Yw6quzDDz8IYWoqxMuXb9ctX75cdOjQQRw9elTnO3716pW2zaFDh8Thw4d1rvcNGzaIN7H32OHD5T3u9evMPiLD8/TpU2FjYyMA0Q1ENIjz9vbiTeyXPGPGjETn/erVqw0sdeogGZ8bfSk2q4BHQBRyluYz4HPg89jtCjAHuAX4ANVS0m+2Um4WLJBfd9u2RnGVPXkiRPnyQtjYCHH8ePr7i4yMFHPmzBFFihTRXiR58+YVJ0+e1Lnp1KlTR3z77bfi/PnzaXb+TY7AwEDx66+/inLlyiW62Y0ePVoAomfPniIoKOid/dy4IUSOHEL06qVX8VQMTNOmQpQpk9i5dOfOnaJYsWI6N/iCBQuKc+fOvbO/Bw8eiF9//TWR0/HmzZu1bcLChMiZU4ghQzLiiLIXdesKUb362+XHjx8LOzs7AYgiRYqI+fPniw0bNojXSdw/d+zYof3+jx8/Lj7++GPxyy+/CCGEWL9e3npPncqsIzEe/v77b1GnTh0BLgIOiP7KJCFAPKreRojXr0V0dLSoVauWzrnv5OSk93tzRpKhyk1GfbKNcrNsmRCKIkTz5kJERhpaGvHsmRAuLvKme/Ro+vqKjo4Wy5YtS/RwiPvEeeWvXLlSHDx4UERHR+vnIN5BeHi4WL9+vdizZ4/2YWNlZaWVqVixYuL06dPv7GPcOHl1HDiQ4eKqZAJBQTIK53//011/584dcfDgQbF//37h6uoqAJErVy5x6dKlFPXr7++vPc/iP1gDAgK0bTp3ltGHSUwAqcQSHi5fKL755u26ESNGJJpJu3LlSrJ9LF++XMyfP197L8qVK5d48eKFePJEXsvTpmXCgRgRt2/f1r5czp9/WVSq5C+cnPzEhALSguDr3FVo3kQJX19fYWpqqvNdHzx40NDipxhVuTEUa9bI2NNGjeQVbGBevBCialUZ7r1/f/r6OnnypFi3bp347LPPkg3PHDt2rLh69apeZE8twcHBYvny5aJGjRqJZDM3Nxez3xH3HR4uRIkScnbLCCbaVNLJ4sXybnf27Nt10dHRYtWqVVrF5MSJE6Jp06ZifyovDC8vL3H8+HGxcOFCUbx4cQGIli1bat9+ly+XY588qc8jyl4cOiS/o23b5PKDBw90zMyAmD59+jv7ePTokciXL5/OPj///LMQQl7HrVtn8EEYGcuXL09gmt8rwsPDRXi4EMsq/y4ECJ/KfYSIiRGdO3fW+d46depkaPFTjKrcGIJNm6QRuW7dpBM3ZDJhYULUqiWEubkQO3akvZ87d+6IZcuWaS+aY8eOCXt7e+2FYWlpKUaNGiUeP36sP+HTgbe3t6hUqVKSCtjYsWO1tvmEbN8ur5CpUzNZYBW9066dEA4OuiapNWvWJDIppdXfYP78+cLExETn3IrLu/LihZw1+vZbPRxINuWXX+S19uyZXB42bJjOd1m0aFERmYJZ78mTJ+vsly9fPhEWFiYGDRIid24hMmHi2Ch48+aNzoxinB9SHBqNECsqSBPVi+6DxKGDB7UvpN26dRNr1qwRt2/fNuARpBxVuclstm+XWkTNmkKEhBhaGhEVJUSbNnISaePGtPURHR0tZs6cKYoXL57Ip2XcuHHC3NxcfPnll+KhEXrivn79Wnz11VeJbpj79+8XK1asEKGhoUnu1769NN/dvZu58qroj/Bw6VA6dOjbdQ8ePBAODg7ixx9/1J7Dq1atSrPZNCYmRtSrV0/n/CpcuLAIi32padZMiNKlP9BkcimgfXsZ3CCEEPfv3xc5cuTQ+S7//vvvFPXz4sULkStXLp19//jjD+3s2YULGXYIRsX27dtF8+ZjxezZ18XZs+fEkSNHxMv4ntpCiIcPNOJ3i7FCgIgZPlx8PWqUzn19+fLlBpI+dajKTWayZ4+0+1StKl/bDIxGIx0aQUaMpAUvLy9RrVo17Q2jS5cuOsrNsmXLxM2bN/UreAawceNGYWNjI3LlyiU2bNigE8mVlKPxnTvywZiFZmlVEhA3A7d799t1vXr10p7Lzs7O4t9//xV37txJ1zh+fn6JTCkTJ04UQrw7UutDR6MRokABIT75RC4vWLBA9O7dW+TOnVvrI5eUE3FyfPfddzq/gYODg/D3jxYgxJ9/ZtBBGBkdO3YTcFXAVVGgQGHteZiQhQs0YgYjhADh9cMPiSJMk4oUNDZU5SazOH1aPg1dXaUXoxEwbZr8pceMSf2+oaGhYtSoUYmm3E1MTMR///0nNmzYII6m1ys5k7l48aL47bffEpkkfv75Z/EiCWV0yhT5/WXhDOUfNIMHy6jAOKvG4cOHE5kn3+V/lRrGjBmj06+NjY14/PixePhQxhQk84z5oPH3l9fX3LkylcS+ffu0PlATJ04U8+fPT1V/T58+1QYQ5MyZU7Rv317s379fODpK5+7szrNnz4SpaW8BQkB7AYjjyYTEajRCuFXSiDV2g0S0lZU4c/x4ovuisZOccqOXwpkZRZYrnHnrFtSqBblyyYxU+krzmw5Wr5Zp4Hv0gBUrUpdI7MCBA3z77bdcuHAh0bZcuXIxffp0Pv3002SzCRszAQEBeHp6UrSozC25f/9+vv/+e6pXr87evXuxtbXVto2MlNXRc+WC8+fB1NRQUqukFiGgaFGoWRM2bJBJ4apVq6ZzTru5ueHp6YmpHn7YkJAQSpUqRVBQEDY2NvTv35+qVavSt29fataUGbBPn073MNmKVatkOYzz5+Hhwx0ULFhQu+3Vq1e4ubm9NwFnQr766ity5cpF06ZNsbKy4urVq+zZ05v9+2U5huyQoy455syZw7BhJYEKQEnKlCnN9evXk03Mt2wZ9P1Ew/3G/Yhs4Yq/gwPrDh3i4MGDdOvWjcmTJ2eq/KklucKZas5MffHsmSzGJATs2mUUis2JEzLjsIeHzD6cUsUmNDSU5cuXY2dnR8+ePRNt79q1K1evXmXQoEFZUrEBcHBwoG7duty+fZtdu3bx/fffExMTw+nTp2ndujURERHatpaWMHWqrJa+dKkBhVZJNRcuyKrvbdvK5Q0bNiRS1mfPnq0XxQYgd+7cTJgwge7du7N582b69u1LmTJlePjwIa1bw9mzkJ1L5qWF06chZ05ZFiMkJERn271791Kt2AB07tyZdu3aYWVlBUCpUqWoXPkljx/D/fvv2TmLs3r1EaAZsAwQ9OvX750Zh7t3h4KFTPiMRZhs2kSTnj2J+fdf/Pz82LhxY2aJrXdU5UYfRERA+/Zw7x5s3QplyxpaIu7dg06dZEmBTZvAwiJl+505c4YjR45o0503atQIDw8PAIoVK8a2bdtYu3YthQsXzijRMw17e3uaN2/Onj17dAofHjt2jF69eums69ZNvv1//72sgaOSNdi2Tb6lt2oFUVFR/PLLLzrbu3XrRp06dfQ65oABA+jXrx92dnYAWFhYcOjQIVq1ku8+H2ydo2Q4fVoWy7x16zrDhg1j1qxZBAQEAODi4pKmPmvXrs3jx4+1yzly5MDG5qR2vOxKSEgIJ08WB0yRyo18GX0XOXLAl1/CngNmPJqyhT2Kwt+AB3Dt2jWuXr2a0WJnCKpyk140GujTR5qhVqyQlVgNzKtXUteKjJS6Vt68798nKiqKcePG0aBBA8LCwnS2ffPNN3z99ddcuXKFNm3aZJDUhiFXrlzs2LGDmjVr6qzfvHkzw4YNI85sqyjwxx/w6BH8/rshJFVJC9u2SUvxRx/Bjh07+OOPP+jfvz9WVlaYmpoyadIkvY9paWlJaGiozrp8+fJRsmQwBQrIwrQqkshIObtWqxYsXryYFy9esHTpUjp27MiMGTOoVKlSmvo1MTHh5cuXgCy8uXDhQtatm4WlJcSWUcqWHDp0iJo1e2Fufhq4Sbly5ShTpsx79xs8WM5Qr1hrzz8NG+IHbABKIGc7syRJOeIYyydLOBRPmCC94X7/3dCSCCFkFtQuXWTId0rrRfn6+oqqVatqnSBLly6tzWy5bds2ceoDyFv+/Plz4eTkpOMMam1tLZYsWaLTrksXIayt1bpTWYEHD+SlOWWKzPsRP0X/nj17xLhx4zJs7NDQULF//36xf/9+MXDgQJE7d24xZcoU0a+fEHZ2MjWDikxsCEJs3KgRjo6OSeYJSiv+/v7C3d1dJxiiatVwUbu2noQ3QhYu3Cg8PT3FkSMnxa+//iqmTJmS4n27dRMif34h5s79V5QGEQTiEgiPypUzUOL0QzIOxerMTXrYvl2WGO7bF776ytDSAPDzz7B+vaxu3bLlu9tqNBpmzZpFlSpV8PLy0q738/Pj77//xtfXFw8PD2rVqpXBUhuePHnysHv3bhwcHAAoUqQIixYtonz58uzfv1/bbupUePMGfvzRUJKqpJTt2+Xftm1h165dFChQQLvN1taWfv36ZdjYNjY2XL16lbZt2zJ//nxCQkKYO3cuLVrEEBwsJ3pV4Nw5+dfU9Dx37tzRrre0tKRjx47p6tvR0RFLS0s0Go12Xc6clzl/Xl7D2Y2oqChKliwEgLV1Dh2XgpTQq5f0B8uduzN+QDekS/LXFy7wPAs6iqnKTVrx84PevaFyZfj7b6Nwv9+4EcaPh08+gVGj3t327t279O3blxEjRhAZGamzrWDBgvTo0YM+ffqkyZkvq+Lg4MDu3bupW7cuS5YsoVSpUpiampIjRw6uXbsGQKlSMGwYLFoEly8bWGCVd7JtGzg6QoUKGg4dOkR4eLh2261btyhRokSGjt+7d28dR86AgADevNmBmRns3JmhQ2cZvLygQAHYt2+Jzvo2bdro5d7TqVMnneVHjzYRGSmDA7IbZ86cwdbWXLscEhJCjRo1Urx/ixZgZwe7d+fFxcWFQyYm/FyxIjX69uWRkUdMJYWq3KSFV6+gY0cZE7xhA8R65BuSixel60+tWvDPP8nrWhqNhm3btuHv70+nTp200QRxdO7cGR8fH1q1apUJUhsfTk5OTJgwQScU3NramqNHj2ojqH74AWxtpSKpYpyEh8P+/XLWZseO7cycOZM2bdrw999/ExQUlKqbflqxs7Ojd+/eOuv++28mtWvD3r0ZPnyWwMsLqlTRsG7dWp31SUVppoWEsz9+fsuB7OlUvGfPKTZuzEdgoHxZffDgAebm5u/Z6y0WFtC5swxA+eyzIezfv5+2S5fy4MsvsbW0zHIauarcpBYhYMAAuHJFJmjI4Le/lPD0KbRrB3nyyNkbS8uk2wUFBbFy5UoKFy6Mra0txYoVY+TIkYB0rF26dCnr1q3D3t4+84Q3Qho3bqwzRb5v3z5GjRrFV7Gmx7x5pRVy40bpDKlifBw4IJ1V27aFqVOnAvDy5UsWLlzI0qVLKZtJEY1Dhw7VWT506BCVKj3l/Hk1JPzVK7h6FZyd/ejTp482MipXrlx6e7kqUqRIArP6fXLlCsuWTsXLlz9lyhRHWrUaQ58+fXRe0FJKr14QFgZC1NCZOXtWs6Z8e753T58iZyiqcpNa5s6VmfF+/hmaNTO0NLx5A126SAVnyxYoVCjpdnv27MHFxQUfHx+d9Z07d6Z///74+PjQp0+fd+ZD+JDo0qULly9fZtq0aYwdO5ZXr17xzz//sGrVKgBGjpRTuOrsjXGybZucXbOyOsupBA4uo0ePzjQ5XF1dqVu3rs66hw+lCebAgUwTwyi5eFEGm5YocYsePXrw33//sWXLFr755hssk3tDSwPxTVPFixenZctL2W7mJigoiDt3ygHBCHGaq1evJjrvUkL9+tJMePq0E9HR0dr1olgxInPnljkxsojDkqrcpAZvb+nM0rIl/O9/hpYGIWDoUDh2TCbpq1o1cZtXr14xdOhQWrRowaNHj5g1axZ3794F4PXr19y6dYv58+dTrFixzBXeyDExMaFDhw6cP39eZ/2gQYO4fv06dnbwzTfyIXr2rGFkVEkaIeQMerNmMHfuTJ1tzZs3x9XVNVPliZu9KV++PN9++y2ffFKO/Plj2LcvU8UwOry8QFEEpUvn0K4rUqQI7u7ueh2nY8eOfP7556xdu5YNGzYwalQOAgOjSZAvMEtz8OAhoAWwH4jBzc0tTTPwpqZytnPnTkvu3r1HcHAw+/fv55dffuFk+/Yyjj4TXw7Sg6rcpJSwMJnK0d4elixJXR2DDOKvv2DBAplYrnv3xNvPnDlD5cqVmTt3rnZdZGQk48aNw9/fH1tbW7p166a37KzZjdy5c7Nu3Tos4mVADAsLo2vXrkRERDB8OOTLp87eGBuXL8usxLVqPWfdunU6274yQFRjp06dmD9/PsuXL6d79+4UKVKELl1us2+fVMQ+VLy8wN09hLx57bTrwsPD9Z5UsXTp0jRv3pySJUsCYGqqULPmSxK8t2RpNmy4CjgAewCZfDWttGsHoaGwf/8bmjZtyv/+9z82bNjAosBAGDEC/vxThuQaOYZ/QmcVhg6VEVIrVkD+/IaWhl27pN9Hhw4wcaLutjdv3vDnn39Sp04dbt68qbMtbkaibdu2ac7++SFRuXJlZs6cqbPOx8eHH3/8EVtb+RKzezecPGkY+VQSE5cB+M2b9doswSBnTpoZwJScI0eORGaW6tXvcv8+XL+e6eIYDV5eEBLymB9++IH9+/fz6tUr7t27lyjIQR+8SpBW3N39JfGyX2R5Dh6Me5RLT/XGjRunua/GjWWMTFBQQ20SU5D+YmLaNJmq/bPP4Pbt9Iic4ajKTUpYulR+fvwRGjQwtDRcvixnaipVguXLdSeRfH192bZtGzVr1qRUqVI6+5UqVYrjx4/z888/68xGqLybwYMH06NHD+1ywYIFcXR05NSpUwwdKrPfqnlvjIddu6By5Whq1SrNtm3bmDhxIhUqVGDEiBEG8ylL+CLh4GCCldWHa5oKDwdfX3j8+BC7d+/mf//7H02bNs2wWeQ4s3t0dDSenp5cvvwGT8/sMW1279493rwpB9wF7mFmZka9evXS3F/OnNKk6+lZCAuLt0r5w4cPufvokfQ5NTGRDyFj9r9JKrOfsXyMIkPxtWsyJa2Hh1GkFX3yRIjixYUoVEiI+/ffro+JiRGrVq0SJ06c0GZhXbNmjciRI4cAxODBg0VoaKjB5M7qhISEiGLFiokOHTqIw4cPa7M3h4aGihkzZJbVw4cNLaXKy5dCmJsLMXbsRe114OnpKQ4dOiRevnxpUNnWrVsnZsyYIRo1aiTMzc1F3rxBol07g4pkMOIyE0N7bfZgMzMz8fz58wwZLzIyUrRo0UJYW1vHjrdRFCsWkSFjZTabN28WZ896iuXLj4sRI0aIXr16pbvPhQvl71OlSn+drNHLly+XDTZskA2++irdY6UXMjJDsaIoLRRFua4oip+iKIk8bRVFaaAoSoiiKN6xn3H6GDfDiYyU2qmlJaxcCQaugB0ZKc1QT5/KmlGxyXS5e/cuTZs2Zd68eTozMqVKleLLL79kx44dzJs3DxsbG8MIng3IlSsXixcv5ocfftB+j4UKFWLz5s0MHixnb2IjjlUMyMGDEBUFTk66pZ8DAgLSFBqrTx4/fsxXX33FwYMHiYqKIiZmP8eOCeIl0P1geGsSemsbql+/Pnny5MmQ8SwsLLC0tIxnnvLi3j3LbOFU/Pz5G0xMoHx5S/r06aOXMPrWrWWuNGtr3XxDJ06ckP906iSzmc6YIaMqjJB0KzeKopgCc4CWQEWgp6IoFZNoekwI4Rb7mZjEduPjm29kvOKSJVCkiEFFiUuvc+qUtJBVqyZn3RYtWoSLiwsHDx7kyJEjbI/LOY+s6Prtt99+sAn59E3Dhg0TVch9+fIlnp7HGDFC+npcvGgg4VQA+RvkzBnD3r3ruX//rYLj5uZmOKFi6dmzp05StZCQLbx4oWTLbLnvw8sLzM1fAAHade3bt8/QMVvq1KORSlV2yFOVJ08+neW4EjLpoUABWan96dNq2nUWFhY8ePDgbaPp02WG/n794P79xJ0YmqSmc1LzAdyBPfGWxwJjE7RpAGxPbd8GNUtt3Cin3UaNMpwM8Zg0SYozebJcfvDggWjVqpXOlCEgbGxsxLp168SWLVtETEyMYYXOhoSEhIgdO3aIo0ePis6dOwtFUUSpUqXE/fthwsZGCD3MCKukEY1GCEdHIUqV8hGAUBRFVK9eXUyOu2iMgLZt28a7XosIEGLGDENLlfk4OUULRdmlc++6detWho559+7deOPlFyDEpEnhGTpmRvP8+XOxadNxrfn17NmzIjg4WC99jx8vhIlJjPjqq7FiyZIl4vTp0+LMmTO6psMbN4SwsRGiTh2DuW2QgWapIkB8tS0gdl1C3BVFuagoyi5FUZyS60xRlEGKongqiuIZaKgUnnfvwqefyumRX34xjAzxWLNGOqz26QNjxmjYsmULLi4u7EwiHXatWrWoXr067dq1w8QIwtWzG7ly5cLGxoaePXuyYcMGhBDcunWLP/+cwODB0tfO39/QUn6YXL8Od+7A48eLAfnidu7cOaPK4aRbVuABpqZ3OHw4ezi2ppSICBAigkaNArQm3rJly2pDtTOKYsWKUaFChdilQOA++/cHZeiYGc25c+fo2NGKpk2D+eqrr1i9ejW5c+fWS98tW4JGY0K9ek1wcnLCzMwMU1NTvL293zYqU0bW+zlxwuhyYujj6ZdU+EHCq/U8UFwIUQn4C9icXGdCiH+FENWEENXyGyLkOioKevaEmBj5pMqR4/37ZCAHD8pCmHXrws8/P2b16lU4ODjQtGlTnXY5c+Zkzpw57Nmzh+LFixtI2g8DDw+PRDVrZsyYQcuW1zA1hd9/N5BgHzhxIeCvXr3NwZEnTx46d+5sIIkS065dO3LmzKldjonZz8GDUR+U382lS9CxYxDTplVm//79/Pvvv/Tv3z9Txo4fIm1i4sWDB1n7BfDIkfNAJV68OMGxY8d4+fKl3vquVk3m8bp5U9dX89GjR7oNe/WSoeG//IIxhf/p45cNAIrGW3YAHsZvIIR4KYQIi/1/J2CuKIpxFjAaN046tsyfL0tAG5Dz56F9eyhbVjBs2E5u3LhM+fLlAfjyyy+1b6R16tTh4sWLfPHFF+psTSYxdepUnRmBmJgYJkwYSO/egkWL1LpBhmDXLsiZ8y4yJFbyySefZEjelLRibW1N+/btsbGxoW3btsyZk5fPP39Mgqoo2RpPTw21a0tPXjMzM6pUqULNmjUzZewmTZrQvXt3pk+fzv79BZg06QUJUuBkKfbtewmYAtLRV7eOVvowNYXmzeHcubeP9/v37+Pn55e48axZUKEC9O4Njx/rTYb0oIh0pshUFMUMuAE0Bh4A54BeQogr8doUBJ4IIYSiKDWA9ciZnHcOXq1aNeHp6Zku+VLF3r3y1xw4EP79N/PGTQI/P6hTB3LkiKZixUF4em5h3bp1OlOO58+fJyQkhK+++krNMmwANm/enGgGZ8qUjXz/fUd++CFxckWVjCM8HPLk0fDmzZ/AKO36y5cv4+SUrBXcIOzevZvcuXOTI3ZW+MULMy5dcmLUKMNGY2YWgwc/ZtCgt46pERERVKlSRWdGK6N49uwZ/v7+Oi+BgYHFaNHC8IlZU4sQAmvrX4iI+A6wA0Lw8fHB2dlZb2MsXw4jR0bh6voFly5tIigoCBsbG4KDgxM/c65ckV7ItWvDnj1SO8oEFEXxEkJUS7g+3a/5QohoYBgy7/NVYK0Q4oqiKJ8rivJ5bLMuwGVFUS4Cs4Ae71NsMp3Hj6VTi5MTJMhIawhRmjUTvHoVwYsXNdm79z+eP3/OjBkztG3u3r2Lu7s733zzjarYGIj27dvTunVr7XK9evVwdIykU6dwZs+WFTtUMocjR6B+/WAqVfLVrqtTp47RKTYADRo04PXr19rlPHmi8fF59I49shdnz8awfHk4t2Mz3N67dy9TFBsAe3t7nSg6AG/vu8m0Nm78/PyIiKiAnFsIwdbWNp5PkX5o3hyePzfj9OmSBAVJ/6SwsDCuJ5Va28lJ1gQ6cMAo8mLo5VUh1tS0M8G6efH+nw3M1sdYGYJGI6fTQkOlk0smXWhJERgIHh6vuXs3Bo2mAdJdSbJ9+3aaNm2Kvb09Xbp00b75qRgGRVH466+/uHz5MsOHD6d+/foANGu2jw0b2rNwoSzFopLx7NwZxejR98iT53Nu3WrKxo0badOmjaHFShJLS0sCAgJ0HkTW1jFoNEZRsi5DiYyEixcL4O29mJkzf6BgwYJMnjw5U2UIDw/X/h8cbEJAQPg7Whsvp0+fBuoTZ5KqUaOG3l908+eHatUUbt5sHztDJDl79iwVKyaR8eXTT+UzdNw48PCAdGRKTi/Z/FJKIVOnSm1z1iypfRqIu3df8csvN3jzJhyNpg3SwveWWrVq0ahRI3r16qUqNkZCiRIl+OWXX7SKDUDVqg60b/+U2bP5oBxFDcmDB8/IkycGkMkrP//880QmQ2Mif/783Lx5k3///ZcePVYwZ05xfHyMazI7I/D0fIMQZsTlmXn8+DF169bNVBkKFizIjBkz6NWrF02bhrJwoeX7dzJCgoOj+e47Qbt2LyhRooRe/W3i07IlhISUB94mWDx37lzSjRUF5s2DkiVlYM6zZxkiU0pQlZsTJ6SW2aOH9Pg2AEIINm8+xKVL1/n441BGj94NHNJut7Gx4a+//uL48eN6taeq6IcOHTrw8KGODz2lSu3Gz0+anlUyllu3oE4dXa/QgIAArK2tDSTR+6lbty6fffYZ//77L35+GwCFZcvuGVqsDGfDhjux/8kZaQcHB8qUKZOpMri7u7NmzRpu3LiBEBeJjCzL3btGmITuPRQoUJhOnZ4xblxN1q1bh4eHR4aM07IlCGECvC06e/bs2eR3sLWFtWulGaJfP5mB1gB82MrN48fQtSs4OspYfQMU1bt16xaDB4+haNFcFC4sT4KaNctqQxZbtWrFlStXGDZsmOpbY6RYWVmRK1cuQDp59+7dmz/+GEDu3BH89ZeBhfsAWL8+jG3b7Dl61JPo6GhA5k0xZqytreNlzL0H+LNtW6ghRcoUDh9+CQQRF9HWuHHjTC9mam1tHS866yJgy8aNWStVcVhYGMWL59VZl7A4q76oXh3y5tUgixBILl68qOM3lojKlWVOjB07ZIkGA/DhKjdRUVKxCQmBjRsh9uGUWYSHhzN+/HgqVmzO/PmfcOaM7lvmZ599xooVK9i+fbtRJSFTSZr69euzePFiBg0axLVr14AohJjLrl1w86ahpcveLF8eyJEjzxg16nNatmzJv//+S7VqiYInjA5ds9lh/PyKEBOTvU1TN29aE9+PMH7emczkbdVsWS9l9+6s5dB96dIlzMzePr4fP35MoUKFMmQsGRJugqNjU9q1a8fYsWNZtGgRF99Xa2boUOjYEcaMgXfN9GQQH65y8803cPw4LFgArq6ZNmxMTAz//fcfZcuWZeLETbx5cwQoyvTp44iOjiY6OpqrV6/SvHlzevXqlelvNSppZ+TIkTq1g16+nI6paQxz5hhQqGxOZCT4+hYEZAa/Fy9e4OjomCXyPbVu3Tre+XIEjSYPW7feMqhMGcnTp8Hkzu2AcSk3l4EYLlzIWs5xZ8+eZdgwW+bNC+LEiRM8zuDcMi1awOefRzBu3Dg6d+5MhQoVuHfvPWZURYGFC2Vdxu7dM93/xvjvABnB8uXSeXjkSOn0lAloNBoOHDhAtWrV+PTTT3nwoCxwDJnMuS537qxj/fr1WFpa0rt3b/LmzfueHlWMjVKlSjFCJzzqCbCeRYs0alh4BrFixV00GivilBtFUejdu7dhhUohdnZ28R7uhwFYuDD7TvPt2XOFrVtvsHlzNX744Qe6detG4cKFDSJL7dq1Y18cI4EbBAYW4vnz5waRJS0cPHiR06fLsmDBfkaMGBGv2nnG0Lw5XLmia12IiIh4/4558kj/m0ePpKUkKiqDJEzMh6fcXLwIgwbJMLVff82UIb28vFi7di12dnaUKlUK6IW8Gd8H3ClY8BnLli3j119/pVKlSpkik0rG8MMPP2Bv/zb5dkzMDEJDTVi61IBCZWP++ece8Jo4B/xGjRpRtGjRd+5jTHTq1AmAihWtGTr0Co0b2xlWoAzk+XP5MHRwsKNDhw60bdvWYLLY2dlRvXp1atasyeDB95k3rwSZmjA2nZw69Sb2Pxl1llGRUnEUKAAvX+paEezs7FK2c40a0kJy+DAMH6532ZLjw0iJGcfDh9C27VttMp4JISO4fPky69ato127dtqIgEGDvmbXrhqEhx8lR44ejBjRl++//15vxc5UDEvu3LmZNGkSQ4YMAcDS8iJ9+pxj48ZSDBmS1xA+69mWmJgYLlz4CDgKyFwln3zyiUFlSi3t2rWjYMGCsTMYkUAObt70o0yZ0oYWTe8ULqybPyz+S4AhGDZsWLxcLdFcvpw1Zm4ePHjAs2dxCvx5LCwscHNzy/BxK1a05ciRXFy9+hdXr57n2rVr3L59WxtM8U5694bLl2HaNHBxgS++yHB5PxzlJjQUWreG58/h2DGpimYQly5dYtKkSaxfv57cuXPTuHFjbVhqvnw56NNnC2Fh25g8+axa5DIbMmDAAObMmUOxYsUYOnQoBQqY4OkZyP79djRt+uFNlmYUmzefpmXLchw8uJBXr2QUTNxMSFahQIECiab3jx/3zXbKzZMnT3j2zBwHB0GOHAoajcbgTt8JTf+WlpkbVJJWzpw5Azgjo+yCqVy5VqbkPWvTJid16pRBmttl4sALFy7o5Ph6J5MnyxINw4dD+fLQqFGGyQofilkqLjLKxwfWr5dhahnAhQsX6NixI5UqVWL9elmZOCQkhDVr3k53XrkSyKBBjixf/p+q2GRTzMzM+PPPP5k4cSIFYpXoatXCWLMm++cxyUyePg1n/Pi77NnTgUmTJjF48GBsbGzev6ORkTBowMwsayaVexcHDhzmiy8q0rDhSb744gvWrVtn8Jkb1wSBJI6O+QnLAs5xMjOxM9IZOuNNUnHUrAk5coQRPyTcy8sr5R2YmsKKFVKx6dIFrl3Tv5DxyP7KjRByCmzPHpk5sUULvXav0Wg4cuQIU6dOpUqVKmzevDne1tzAv6xYMZxLl0y4dSuS3r2bUaVKFb3KoGJ8NGrUiBs3buisq1EjksePs1ZUhrESEhKCi4sdAJaWFrRs2ZJ27doZVqg0Uq1aNcLDwzlw4ADff/8RQ4bc48mTJ4YWS69s3HgZsOb1a0/Onj1rFFGgRYsWxdvbm02bNjF+fF46dbqafOZdIyIsLJyyZR0xNZW1qTNLuTE1hYoVHwAtAPn7pUq5AZlyZetWyJFDeik/ePD+fdJI9jdLTZoknZl++AEGDNBbt5GRkezZsweNRkOxYsVo3LgxDg4OBAQExLZoB/wNFKBRo1t061YJa+vsr0uqvKVcuXIIIXj9+jVr1uxjyZLvOXzYm5UrVeU2vRw4cITixYtolwMDA2natKkBJUo7JUqUoEePHrFZX12AWuzYsYNPP/3U0KLpjaNH42ZEZBi4oULAE3Ls2DGWLFkCNAAqcOzYLho2bGhgqZInKiqKjz/uxWef3SIioh6+vv9QvXr1TBu/ZUvw9i4IVAK8U6/cgCzNsGsX1K8vJxsOH4Z8+fQsaXafuZk+HcaPh759YeJEvXR569YtxowZQ7FixQgNDdUm2DMxMaFnz56AA7AG2IKjow1nz5qwcWNZVbH5AKlSpQp79+6lU6dOzJo1gZCQ06xbl5vIyHdk9lRJEX//fZaFCwvy6FEIAEFBQVk6g3erVq1i/zsBOLN+/QFDiqNX/P39CQx0ACKAa+TIkSPT60klh24yP2eOHj1pSHHei4+PD5aWFgBYWZlTsmRJHB0dM238zz6Le6GQpqkbN24QGpqGzNqVK8OWLTLDabNm8OKF/oSMJfs+cf/4A0aPljWjFixIV2mFyMhI1q1bR7NmzShdujS//vorgYGBrFixQqddu3adsbW9hrl5ZyZOFNy4kYvq1Q0//apiOLp160ZQUFDs0gKio0sxZsxWg8qU1bl79y7791vz998f0a5dRwYPHpzlTb1vTWrSUfPAgfCU5RHJAhw4cACoAlwCYnB3dydnzpzv2StzeKtkXQSsOHXqmbaEhzHi7++vs/z06dNMTVhZqpQNFhZXMDVtQ5kyZWjbti3e3t5p66xhQ9i0SUZRNW+udwUn+yk3QshCmF9/LZ2Wli4Fs9Rb32JiYjhx4gRLly6lRIkSdOvWjX379um02b9/P0+ePCEmRsPhwzkZOtSJli2tuHHDlB9/VDI60lwlCxBXoVqyDnjJP//E8PLlS0OKlaVZvnw58s3xBEK8xMzMjAoVKhharHTh5uaGg4MDcBaI5s2barFKQdbnwIFDSOXGuExSIGuQffTRR8SVYQgPL532h3Um4OPjw5EjrwgKki/NhsjEPXr0I44csWTVqlWMGzeOR4/SUbqiZUsZ5HPxojRTpaevBGQv5SYqSjoPT5okK3yvWpWqXDYxMTEcO3aMefPmsW/fPiwtLXFycqJq1apJtDbF3Lwfv/9ekU6dXFm5sgKzZ9uwZo0JmThLqJIF+OGHH2JTAYQDK3n9uh2TJ882tFhZEiEECxfuBNyIy0qc1XLbJIWiKLGzN+GAN1CHrVuz/gyfRqOhR4+P+eOPQHr2jKJUqVJGpdwoihI7e3MVeAO4cezYMQNLlTyrV6/m668/onnzO7Rt25aCBQtmugzFikViafm2BtqbN2/e0ToFtG0rC2zevg116ugtiir7KDdBQdI5ad48Wahr/vwUzdgEBwezYcMGBg4cSJEiRfDw8ODcuXPkz59f2+atPRzAghIlJvLRR0FERMznyRNHfvvNgnPnQGu+VVGJR4ECBfj6669jlxYAOVm1KjTbRcRkBmfOnMHfP67i9y7Mzc3p0aOHQWXSF3GmKVvb0zRvXo7ixUsQExNjYKnSx+XLl3FwKICHRwhff12HRYsWGTy/TUKk300UefP60rhxDaOdVX3+/DnXr98BygCXefLkSTIv3hlLuXK6CWdTlMTvfTRpAgcPQlgY1KoFu3enu8vsES114oTMgPjwISxZAu94kwsNDeX8+fM8ePCAf//9l+PHjye6gRw8eJAv4mVQrF69OmXKtMLa+hv8/evh729G5cpSj2rfHrJAjT4VA/PNN98wd+5chLjDp5+ep2PHzuzbty/L1EEyFpYuXYoMRX0IXKJNm47Zpg5bgwYNmDlzJrVq1cTM7CHQDC8vL2rUqGFo0dLM9evXKVmypHY5ICAgUxLOpYZ69eqxYcMGihePAXITHFwXjUZjdMVXZTRdecAUuIyzszO2traZLoezszO3b98mMNCMq1eP4et7kQYNGqRfyalRAzw95UO1dWv4/nv48cc0VxLI2spNeLjMejh1Kjg6yszD8W4E0dHRXLt2jfPnz3P+/HnKlClDtWrVsLGxoVy5ckRERCT5ZnTnzh38/f0pVKgwPj4RHDtWjtu3t2NiotChgyxN1bhxunyUVT4wbG1t+eWXX6hQoULslK5CiRKlCAgIiPW1UHkfERERWFvbUrasBzdu7AKgb9++BpZKf1hYWGBvb4+Z2duH6s2bN7O0cpMwKZ5ZGvwfMxpXV1fCw8O1y3Z2dly7di1eaQbj4G1mYoDL1KxpmIizPHny0L//n/j4LAV+B5bxySefxIs8SwfFisHx4zBsmHQv2bNHVhZ3dn7/vgnQi2qqKEoLRVGuK4ripyjK/5LYriiKMit2+yVFUdIX2qDRyNpQFSogpkwhtG9fLixZwo7AQJYsWULv3r2pXr06tra2uLi40LdvX/7880/u3r2rc3G5u7sn6DgnOXO2wsVlA3/+6UGTJjUZMqQxFy448MsvCgEBctgmTVTFRiX19OjRQ6d6r6VlDg4fPmw4gbIYhw8fpkePbqxc+ZBVqwrRp08fWrZs+f4dsxAJ38TjyrZkRaKjoxk58it69CjAH3884NixY5QrV87QYiXC3Nw8Xn4yyfXr1w0kTfK8zUz8BriZacn7ksLJKRpZ+LkLkIZkfu/C2hr++w/WrQM/P3BzgxEjIDAwVd2kW7lRFMUUmIMMX6gI9FQUJaHK2xJpKCwDDEJmt3svL168YPXq1axcuZJZs2YxZuBAFtWsSUCuXNC9O9cePaK5hQXXhgxBY2VFwYIFKVOmDCtXrsTT05PIyEid/i5cuKCz7O7eBBhInjwr+eij+5iYhBIevoMrVzqhKB8xaZIp16+Dry98+y189FFaviEVFYmNjY2OPf/RI1PWrdvE/fv3DShV1uFFvFDRMmU+olmzZkZn4kgvtWrVIiYmhlu3XvPffzaMHz8+UfhvVsHT05OXL23w83Ng5cq9TJkyBRcXF0OLlSzR0dFcvpyT5cuvxCoSxoNGo4lVIJyBa0C0QZWbatWqIvO5tQDy6Ve5iaNLF7hxQ5pKZs+WszpDh8rIKiHeu7s+5ghrAH5CiNsAiqKsBtoDvvHatAeWCiEEcFpRFDtFUQoJId4Z92VhYaGtpl3s3EWGLFiAOXCenHxNaTZE2RODCV8/D8XePrd2n4IFB/PoUQyQE7AG8gIF8PYuBMC9e+ZcuJCLCxeKA62JilKoUgXc3eWnVi3IJmZ8FSOjdevWbNy4kc2br7NlywSioqBgwZ/5559/DC2aUfPkyRNKlSqls84YZwHSy0cffcSAAQPYts0BmAuEsm3bNoYPH25o0VLN2/w2AOdp1KiR0fmxxFGwYEEaNGhAZORdIIrSpTcybdo0Q4ul5caNG2zevJlr16y5fPkJV6+2oHz58gaTRzoyDwe+AXri5ZVBaQvy5YO5c+HLL+G332Sg0Ny5ULYsUR6NCCmdvHO6PpSbIsj5qTgCgJopaFMESHFQu7V5Xv5gNOvoihdViattAfDkyVXs7d/aTIsVm8ajR2+dm0xMIsmV6xX58sEvv1hQuLAN5crJ4qSzZ0PRoqpTsErmYGVlRWRkJOvXTwYGA31ZtKgzo0ePTvTwVnnLhg0b2Lz5IK1b/0KtWsE8efKINm3aGFqsDKF+/fps27Y0dqk2W7duzcLKjQegAS7SuHF/A0uUPDVq1IhN3ncJcMHPz4/Hjx8bJNQ6Ka5fv46DgwOVKkVTqVJebt7sa1BFsXLlyoAPMndRX65dm0NYWFjGFa6tUIGnvyxkfbGpaDZsouK1DVS9sRJ75iW7iz6+naS8TxLOGaWkjWyoKIMURfFUFMUz/vp1Znb8jyt4MR5ohZwOaw40JSDgNPfvP+fKlYd4ed2na9e9rF59nKtXH/P6NcTEWPLiRT6uXcvH+vU2zJolZ7eaNoXixVXFRiVz+eSTTyhduiSwDGhFdHReJuqpPEh2ZcmSJezbZ8HIkWVo3XoM9+/fN9pZgPQiQ8IvAyFAHY4cOUJwcLBhhUolERERnDx5EqiMNKOEG1V+m4RYW1vHZrn2QZp+TDhx4oSBpXpLwhIHGo1hC/Dmzp071qqyBKiGiYlzhiU/vH9fBkA7OMDQCfmZ/WYQK/rs4e/JL9jwy41k99PHzE0AUDTesgMyTjO1bQAQQvwL/AtQsmRJcfXqVRRFoVgxwR9/NCZPnjzkyZMHOzs7ChQoQJEiRQwSDqeiklbMzc2ZMGECvXv/DPwP+Jjly/9k7NixBp1qNlauXbsWGwb7JRBIUNAR2rZdbGCpMo4yZcpQrlwZrl8/DdQhOjqa3bt3Z6l8PidOnOD169dIs9RRHB0ddULCjZG6dety9uwlpDtDKY4fP07nzp0NLRZAopIQHxmBA2j79u1RFCvKl79KuXILePjwrl7712hg5kxZcECjgSFD5OftLdIEKANjk95fH8rNOaCMoiglgAdAD6BXgjZbgWGx/jg1gZD3+dsA5M2bV80DopIt6dGjB1OmTMHX9wzQD41mBhMmTGD16tWGFs3oWLZsGXLytzmwh4YN62sL1mZX2rVrx/TpJ4HxQC62bduWpZQbf39/hg79lnPncnPx4kWjnrWJo27duvzxx8+xSy4cP37coPLEER4ezoABA8ibdxbOzp1wcfmFsWOTeaJnItWqVaN06dLIrNqmRERE6a3vkBD4+GOZuLhNG/jrL1Kd+T/d87pCiGhgGLAHmcN6rRDiiqIonyuKEldUZydwG/AD5gNfJNmZisoHgqmpKT/99BOwGHDF1bUzHh4eXLx40cCSGRcajSZWuakK5Ad2ZYtyC+9DmqZOAQplyrQnd+7c6U9zn4nkzZuX/v27M3fuTQ4e7ETbtm0NLdJ7qVOnDjIOJgZw5enTp0aRrdjLy4uYmBgCA8ty6NA9duzYYRS+QIUKFdJZtrEprJd+/f1luro9e2DOHNi6NfWKDegpiZ8QYidSgYm/bl68/wUwVB9jqahkFzp16kSLFuto0eI6devKN7ErV65QqVIlA0tmPBw5ciQ2VL4voMHS8hidOyfvRJhdcHd3Z+TIKjRu7EOhQiMAmefEw8PDwJK9n6CgIIoWfeuFYGFhTvXq1Q0oUcr46KOP6N+/J+XK+eDm1gJ7+zZcuHCB+vXrG1Sut2HpzsBOg4aAx8fZ2VknTUHOnLkIDg7Dzi7tTsU3bkCjRjI/74EDkJ7TPXt65KmoZAFMTEwYNWoAdeu+zeJarlw5zp07Z0CpjItLly7RqlUrrKxaAJ507uzxQfjYmZqaUqWKE4UKvZ3qv3fvngElSjmenp6YmppqlwMCAihcWD9v9RlNo0aNaNIkBnt7+d7/4MEDA0sUl5nYHigIXDYa5SZv3rwsXbqUr7/+mlatZtKyZWX+/DPt39fly1KZefMGDh9On2IDqnKjomJQGjdujJ+fbubNo0ePGkga4yI0NJQqVaowceJE9uzJyU8/PcpW5Rbeh729vc5y3rx5DR4lkxL279/P999/z5Yt5jx8GJUo0seYSRjKbAwReXLmxil26TI1aybMtGI4njx5wpEjR3j6dAVwjX/+yUcC3+cUcf48NGgApqZw9Ci4uqZfNsP/cioqHzAmJibY21sCcOFCJIMHD+abb76JDaP9sDl8+DA5c+YEIGdODbVq5aZhw4YGlirzqFOnDq9fRxMZqXD06Hn+/fdffH1937+jgdmxYwd79pxm0iRX2rXbSu7cud+/k5EQP1oxIuI1T548SRSplJkEBATEzh7J2ko5ctw0KrP126rkAvieR4/smTEjdX2cOiVNUTY2UrHRV8Co8VUxU1H5wGjY0IOmTbdw8GBrQIZT/vjjj7FJ0D5cEhZdfPr0gVEWXswocuXKxd9/b2Pduom8fj0X2ELNmjVxTkMRwcwiICCAq1evAtJPxcTkIh4eYwwrVCooW7YsAwaM4cyZCVy/PoqYmH+pW7duvId45uLt7c3o0aPx8anG5ctPcHAobFQlR3S/l03Y2h5g3LjGdOwIpUu/f//Dh2U0VKFC0scmNUGQM2bMeKe5U525UVExMCYmJvTu7QDkIC6LwsGDBz/oopoPHz5k3LhxLF68mCdP5G3K1dV46xJlFLVrO/D69QtAFvndunWrYQV6D/v27Yv9T5ZdqFrVJEvN3JiYmBAc7I+vr4aYGKlEGjIkPDg4mG7dujFpUkk2bQrg888HG0yWpJCJD98SFtaPHDkEn34KCUo7JmLjRmjZUibSPXo0dYrN69evGT169DvTI6jKjYqKEdC/f3Vsba8jo4IkP/74IyIFBeKyI8uWLcPPz4/Zs4/Stq0b3313DFd9GOKzGG3btkGGhEvl5syZMzx+/NigMr2Lt8pNNSCA1q2Tr/1jrNSrVweZqVgq04ZUbhLO0uTLl89AkiSNnZ2dTtkYIQIYOfImx49D27bw6lXifaKj4X//g86doVIlOXuTIKr8vVy+fJn+/fu/M3pQVW5UVIyEgQNzIN945UP8+PHj7N2716AyGQIhBAsXLoxdaolGo1C7dk6DymQoHBwcKFz4HlARyIMQgh07dhharCTRaDTxlJsawFmaNWtmSJHSRN26dZHKzdvr0BAvGW/evMHBwUFnXcWKFTNdjvdRrVo1SpQoQatWrRg1ahRly55j8WI4eFBGPK1dK0O7HzyAJUukT820aTB4MBw5Avnzp37Me/fuMXjwYP74449k26jKjYqKkfDddyVQlCjiZm9MTU3ZuHFjloiQ0SfHjh3j5s2bsUstAG+GDu1kSJEMSrNmcRE8MkrGWE1T3t7e1KxZk3z5SgGlsbC4lCXy2yTEzc0Nc/NrQF6gMI8fP9bJ55JZ+Pj4MGbMGBYuPMSZM7bcv/+M4sWLZ7oc76NDhw6sW7eOiRMn0qtXL4QQfPIJrFsHz55B9+5gbS1rQ/XrB7a2MjHfvHlgYZG2MV8lNSWUgA/HO09FxcjJlw8aNAjjyJFetGhxiIEDP6No0aLs378/S74Bp5UFCxbE/mcL1KF8+R3Y27sZUCLDMnCgG4sXxwC1sbI6wuvXrzO2AnMauXHjRmzWbfDzu8KZM0WypAO4ubk5zs6CCxdAzt485Pjx45leG+vMmTMcP36c48drAmVp1epnOnRonqkypITEmYrledmpE7RvD/v2wdmzUKAAlC0rQ76VpEppp4KlS5cSFhZGuXLlkm2T9c48FZVszFdf5aFatXt07z5Bu+7Vq1fExMToJEbLrgQHB7Nu3brYpaaAOQMGFDGkSAbH3d2Fli0v0aJFU6pXb0KOHDk4efKkUSu8pUtHotGkwd5gJDRvXggTk1Dc3LpTqVIrg4SD62YmfoiHh9O7mhsMJycn7t59WzSzcOHCWuXb1BRatJAffRETE8OJEycIDw/n1KlTybZTzVIqKkZEixZw4EAenXXFihX7YHxv9u7dy9ChQ2ML8rXBxCSEL780TBiusaAoCvXrR1CnjrnWwfTp06cGlkqXsLCwRMVMq1SpYCBp0k+zZjX4558bDBniQu3atRMlVMwMdJUb48lMnBB7e3tu3rzJqVOnWLRoEWPHjsXHxyfDxrt58ybh4eHvbacqNyoqRoS5OdSvb8u+fTJ8Njo6mo0bN/LLL78QExNjYOkyHlNTU3r27Mnq1atZsqQqLVveIUcO9TZlbm6ls1ywYEGjOh9OnjzJ0qVL8fHxISYGHj6MokyZMoYWK81UqVKFmJi3TsRFihThyZMnmTZ+YGBgrN+ZCVARRfE1WK6dlLBp0ya+/PJL5s6dy8GDB/Hy8sqwsS5Ie+F7Ue8aKipGRt++8M8/Rdi27SadO3dmypQpHDt2jDVr1hhatAzl/PnzOMYr/1uhQhStWxcwnEBGRIsWZQkLk7frgIAAdu7ciaenp4GlesuePXv4559/6N9/HE2aVGL58odGUbogreTOnRt/f91ELRcvXsy08d+aW0oAOSlaNMTofKzik1DxMgblRvW5UVExMipVAjs7K/76qwbPn78tRDdhwgS6deuWJZ00U4KPj49O9t1Tp2zp1augASUyHipUsGLkyPz4+R3H378nAFZWVkZTZyh+CHhoqBmVK2edxH3Jcfv2S65edcDbezre3jvo1q1bpvk5Xbt2jVKlSuHv74JGAzVrWmfKuGlFVW70QFRUFAEBAUS+L/2hioqBsbS0xMHBAXNz81Tv268fjBxZEhMTVzSaS4C0NS9fvpx+/frpV1AjICIigm+//ZZKlSrRoUMHatWqhaenBcOHG1oy40BRIChI4O//9iGydetWJk+ebECpJI8ePYrnY1EDeE3fvpUNKZJeyJHDlO++cwSCgbuZmszP0dGRNWvWEBYWxaVLN7G3N24TX8JMxb6+vkRERGBlZZXMHmlDo9GQL18+ypUrx+3bt4mKikq2rWLMGVCrVasmEk69+vv7Y2trS758+VDSG0+mopJBCCEICgoiNDSUEiVKpHr/wEAoXBjKl9/N5csttetLlCjBtWvXjKq+jD5Yvnw5ffr0iV0qSKFCd/jiC4Uffshex5keJkwI56efcgL5gWcA3Lp1K9NDlBOybNkyPvnkk9ilg1hbf0RYmHFG9qSGu3cf4uhoD/wBjMXc3JyQkBC9P7ATEhkZyfnz57GIlwQmb968abqPZCalSpXi9u3b2uVTp07p3Qn6zp07BAUFAXKi4+rVq3z66adeQohEqbCznFE0MjJSVWxUjB5FUciXL1+aZxjz54fWreHJkyaYmVlq1/v7+zN//nx9iWk0zJ49O95SKx49sqBdO1WxiU/jxnFZmt8+MLZt22YYYeLx1iRlAlSjfPlQQ4qjN4oXL0yOHLeIy1QcFRXF2bNnM3zcixcv6ig2T57E6PiiGStxpilFUShevDhXrlzR+xjXr1/X/m9ubv5OP6Qsp9wAqmKjkiVI73naty8EBprRvPnvgKwSPXz4cEqWLElISIg+RDQKzp49y5kzZ+KtaU3BglG4fHh1Mt9JtWpgYiKT+cVh6GzFMTEx3L9/P9Z5uDxgS7NmdgaVSZ84ODwnTrkBOHr0aIaP6ePjw9GjRwkOlte4v39klnjmNWnShH/++YdDhw6xYcMGHQVNXzx79kxn+fXr18m2zXI+NyoqHwqtW8usxSYm/fnkkzP0798fW1tbAHbu3EnPnj0NLKF++Ouvv+It5cDUtCXt25unO4tpdsPKCpycovDxcdeu8/f3JygoyGAFFc+fP89vv/1GcHAwJ08+5sCBYHr0MKyZTJ9UrWrO7dsOQB7gBQcPHuTHH3/M0DF3797Nhg0bUBRnihU7R4cOxzJ0PH1RtmxZ7f0JyJDorvPnz/Pw4UMqVqxIwYIFyZUrV7Jts+TMjaEJCAigffv2lClThlKlSjFixAjevHmTZNuHDx/SpUuX9/bZqlUrgoOD0yTPhAkT+O2331LU1tPTk+EZ4KWZGhlUUkaOHNC7N+zebUXDhm10bhwODg48evTIgNLph0ePHiUIcfcgJsaKNm0MJpJR07ChJRUrujJixFds2LCBdevWvTNLa0YTVwPMzs6OVq3K06rVU5yds485sXVrWcvJ1rYG9evXp0aNGimqa5RWhBCcOHEi9n8n7t61pEaNVJbMNhBOTrp+VoUKFdLrdyWEYNGiRYwePZo2bdrQvHlzypYtm2z7dCk3iqLkVRRln6IoN2P/5kmm3R1FUXwURfFWFEUvyRkURcnQT3IIIejUqRMdOnTg5s2b3Lhxg7CwML7//vtEbaOjoylcuDDr169/7/Hs3LkTOzu79HwlKaJatWrMmjUrw8dR0Q+DB0NUFAQE6Cq/oaGh8WowZV0OHTrEggULaN26Nebm5tjZfYylpaBRI0NLZpzUrg2NG4fTp8/H2iKKaX0p0geWlpY6y35+JmTh9DaJaNq0ANOn3+LAgZ/5/fff6datW4bmF7p58yaPHz+OXXIGomnXLvn6ScZE/vz5tYkO5UzeSby9vfXWv5+fn865HhUVlXHKDfA/4IAQogxwIHY5ORoKIdyS8mrOShw8eBBLS0v69+8PyIyqM2bMYNGiRYSHh7N48WK6du1K27ZtadasGXfu3NHm7ggPD6dbt264urrSvXt3atasqb1QHB0defbsGXfu3KFChQoMHDgQJycnmjVrRkREBADz58+nevXqVKpUic6dO783BfW6detwdnamUqVKeHh4AHD48GHaxL4WBwYG0rRpU6pUqcLgwYMpXry43mVQSR8VKshCcwsXWvPs2XNevnzJX3/9RadOnZg0aZJOdEJWIzIykvz58+Pk5MRPP/3E9u3bcXZuQaNGCjlzvn//DxF3dzh61E5nXdGiRZOdOc5IHjx4wJUrV7T+XxoN2Nll3XpSSVGoEISFCUxM3r7wBgQEZNh4hw8fjrfkjLX1A2xsUp9KwlAcPnyYTp060aRJE0aNGqXXWcVz587pLFevXv2diSLTq9y0B5bE/r8E6JDO/oyeK1euJEpYlCtXLooVK4afnx8gQ+CWLFnCwYMHddrNnTuXPHnycOnSJX788cdkEx3dvHmToUOHcuXKFezs7NiwYQMAnTp14ty5c1y8eJEKFSqwcOHCd8o6ceJE9uzZw8WLF5N0PPzpp59o1KgR58+fp2PHjty7d0/vMqiknyFD4M4dsLRsx/Dhw1myZAmvX78mKioqw+3/Gcn+/fvJmzevdtnKypoLF/LTurUBhTJyihaFoKCcvHghSy+8fv2as2fPcuTIkUyXZdeuXYwbN45mzZrx2We/8/vvRXF3z/rJ++KjKBAQoPuYzMg0DLq/ozMlSmStl8dixYrpPEdOnjypt76TUm7eRXqVmwJCiEcAsX8/SqadAPYqiuKlKMqgd3WoKMogRVE8FUXxDAwMTKd4+kcIkaTZKv76pk2b6ty04zh+/Dg9evQAwNnZGVdX10RtQOYycXNzA2R43Z07dwC4fPky9erVw8XFhRUrVrw31K5OnTr069eP+fPnJ1mHJr48LVq0IE+et1ZFfcmgkn46dIACBWDBAgvGjBmjs23lypWJLvqswuXLl9FoNNplT88oXr0yVf1t3oGiQK1aJixbZs/48eNp1qwZo0ePZvXq1Zkuy/bt2wEZMXXxYj7WrPmI9zxvsiQ5c8p7+Y0bN1i5ciWzZ88mNFT/4e4ajSaeMpATKGn0mYkTUrt2bZ3lkydPoq9cegnD8NOt3CiKsl9RlMtJfNqnQq46QogqQEtgqKIoHsk1FEL8K4SoJoSolj9/8lOcQogM/SSHk5NTIpvry5cvuX//PqVKlQLA2jrpEzKlP3L8EDpTU1Oio6MB6NevH7Nnz8bHx4fx48e/N4fKvHnz+Pnnn7l//z5ubm7a5EcpkUdfMqiknxw5YMAA2LED6tTpRaVKlXS2jxw5Um83kMzC09OTsWPH0qlTJ1auXMnLly/Zu9eNKlUgQXFplQS4u8PSpSXZscNL67C5cePGd4bF6pvw8PB4+W0AamJvH0WRIpkmQqbh6mpHo0aV6NXrR/744w+OHj3KsWP6j2C6efMmq1evZuHChXzxxViqVn1Fs2ZZw5k4DldXV3LGsyk/efIEf3//dPcbFRXF5cuXddalW7kRQjQRQjgn8dkCPFEUpRBA7N+nyfTxMPbvU2ATMkd3lqRx48aEh4ezdOlSQL61fP311/Tr10/nR02KunXrsnbtWkCmp05tWfjQ0FAKFSpEVFQUK1aseG/7W7duUbNmTSZOnIi9vT33799PVp69e/fy4sULvcugoh8GDZJv7QsWmDB9+nSdbSdPnjTIm3t6+P13mbsnICCAP/74gylTFrJnjx0dOhhWrqyAe2wkuK1tc+264OBg9u7dm2ky7N69W8ffztTUAw8Ps2wZvu/mBi9fmgFvXyp0FTv94Ovri5mZGZUqVeLTT1vy6aePcHPLOv42AGZmZonqnenDNHXlyhX27NnDkiVLGDNmDJ06dcLBweGd+6TXLLUV6Bv7f19gS8IGiqJYK4piG/c/0Ay4nLBdVkFRFDZt2sS6desoU6YMZcuWxdLSkilTprx33y+++ILAwEBcXV2ZNm0arq6u5M6dchv1pEmTqFmzJk2bNqV8+fLvbf/tt9/i4uKCs7MzHh4eid74x48fz969e6lSpQq7du2iUKFCOuHG+pBBRT8UKybz3ixYAPXrN6Vdu3babS4uLjx//jxDpsozAj8/P61SHUf58qMRAlW5SQFVqsjZvJIlP9ZZn5kKbpwPnqQQMTHFqFs3G2o2gLMzmJhogLf1snbt2qX3cRKGTXt7WxNrDMhSJGWaSi9+fn6Ym5vj5ORE165d6dy58/sTG6bTdJMPGSV1M/Zv3tj1hYGdsf+XBC7Gfq4A36e0/6pVq4qE+Pr6JlqXVYiOjhYRERFCCCH8/PxE8eLFxevXrw0mT2RkpIiKihJCCHHy5ElRqVIlg8mSXdHn+bpzpxAgxOrVQty8eVMULlxYTJw4UXh6egpPT0+xYsUKvY2VkQwePFgg/fAEIJydnUXLlhpRsqQQGo2hpcsauLsL4eISrPM9Wltbi1evXmX42OHh4aJkyZLxxu4iQIgzZzJ8aINRsWK0UJTtOt/37du39da/RqMRf//9t/Za9vT0FG3aPNFb/5nJjh07RP369cWXX34p5s+fL9asWZPuPpctW6bz3axatUq7DfAUSegP6cpQLIQIAhonsf4h0Cr2/9vEn8/7gAkPD6dhw4ZERUUhhODvv/82aAHEe/fu0a1bNzQaDTly5MiWNYuyE82bQ4kSMHcuHDlSmqlTp1KxYkXtdkdHR27fvm3wQorv4tGjR/z3338660aM+IGhQxWGDiVbmjUygtq1YfbsXBQqVJxHj+4CMopn586dKUoamh5OnDjB2rVr8fHx4dChQ5w40ZCHDwWVK2ffH69KFVP8/GoQP+J+z549fP7553rp/+rVqwwZMoR8+fJRq1Ytatb8lXz5kkwbZ/RUr15da3YG6brx4sULnYCV1CCESORPFpfj6V2o5RcyEVtb2wxNAJVaypQpw4ULFwwthkoKMTGRYeGjR4O3N7Rp0wYvLy/tTcPCwoINGzbw7bffGlbQd7Bq1Sqsra21eVkcHR2xsenCmzeqSSo1uLvD778rNGo0ioCAjbRt25a6detmSt6jx48fkydPHlxcXHBxcaFUKQsOHlQwz1ruIanCzQ2WL8+PrMgeqH2R0Be7d+8GICgoiB07zrBjR0Xi6QdZivz583Pq1CmKxHqXm5qacv78eRo3TjQPkiLu3r3LgAEDyJ07N25ublStWpWff/75vfupyo2KShZi4ED46Sf44w9YujQPYWFh5MmThxs3bvD777/j5eVFlSpV0nwjyUgCAgKoVasWW7duZc2aNSxbtoxvvvmG7dtNsbeXsxEqKSPOqbhChfZ89VUd7fpSpUpx7949imVQyFlkZKT2oRXHrl0O2T6jdOXKYGUVw8iR43F3L0bhwoUJDw8nMjIyUZbmtKDrwyMrxiaTKSRL8PLlS53zJC6VSFqIi0wLCQnhyJEjCCGwsrJ6737ZKFG2ikr2x84OPvsMVq2CBw+gbdu2zJ8/n969e2uTQg4aNMgoM0cfPnwYCwsLrKys6NevH0uWLKF37/5s3w5t24KZ+qqVYgoXhuLF4eLF4ty9e1e73tTUVK+J0xKyb98+rl69qs1PFBISzrlzualbN8OGNArc3CAiwoQGDdwoXLgwADlz5kyUeyUtvHr1KkG1canVZGXlJk+ePGzatInvvvuOZs2aMWfOnDT3lTDsvl69einaT1VuVFSyGCNHylT3s2fLh1nfvn118tzcvn2bCRMmGEy+pLh79642D1QcUVFRnDuXk5AQ1SSVFtzd4dQpdBJ03r59mwMHDmRY3qPFixczdOhQ2rRpw6xZszh4MAqNRtHOJGVX8uaFYsUULl3S9ZGMn403rRw+fFinfIatbW0KFBB8lFxK3CxAzZo1mTx5Mnv37uX58+d4e3snyrOWUlTlRkXlA6FECejUCebNg7AwcHd3Z+jQoTpt4kxUxsIvv/zCn3/+ybNnzwBZ16x169Zs3gxWVtCkiWHly4rUrg0BAVCqVAM2bNjAJ598Qrdu3ViwYEGGVAp/8eKFNivx06dPWbp0Kfv2VcHJSc4oZnfc3ODsWTlr8/r1a44cOcKWLVvSrUjG+dvEYWlZE1fXrO2cbW9vr81wD9Ip+NChQ6nuJzAwkGvXrmmXTUxMcE+hJq0qN2lg8uTJODk54erqipubG2fOnDG0SImYMGECv/32W6r327p1K1OnTk3VPv369UtR5XN9YGNjk+K2AwYMwNfX16AyZBSjRkFwMMQFHk2ZMoWiRYtqt2s0GgYMGEBUVJRhBIzHpUuXmD9/PmvWrKF9+/bMmDGDsLAwLC2t2LJFRoGphTJTT2wtXHx983Pt2jWdc/3vv//W+3hr167VmWEoVao8V67kpkEDvQ9llLi5wY4dBRg3bjJNmzbl66+/Zv369el6idBoNNSsWZNx48bRpEkTcuWyIyTEARcX/cltKBL6/SWstZgSdM114ObmRq5cuVK0r6rcpJJTp06xfft2zp8/z6VLl9i/f7/OQyWr065dO/73v3cVd886LFiwQCdUOjvh7i4/M2dCTIyMxIv/QMuRIwfu7u6ZpnQmhxCCr7/+Wuuj8fr1azw9PWnfvj3nz8uZB9UklTacneWMydGjMHDgQJ1ta9eu5enTJBPGp5lly5bpLDds+C2vXikfjHJTuTKEh5sRFlZWx6dt48aNae7Tx8eHChUq0K5dO6ZOncrOnTsAJUv728SRULk5cOBAqvsIDg5m2rRptGvXjnz58lG/fv0U75ullZuRI6FBA/1+Ro5895iPHj3C3t5eW3vJ3t5e62Dm6OionXb39PSkQexVP2HCBPr27UuzZs1wdHRk48aNjB49GhcXF1q0aKF9u3Z0dOS7777D3d2datWqcf78eZo3b06pUqWYN2+eVobp06dTvXp1XF1dGT9+vHb95MmTKVeuHE2aNOH69euJZI+JiaFkyZIIIQgODsbExESrGderVw8/Pz8WL17MsGHDADkjM3z4cGrXrk3JkiW1D0ohBMOGDaNixYq0bt1a5yZ64MABKleujIuLC59++qm2anGnTp0A2LJlC1ZWVrx584bIyEhtTpZbt27RokULqlatSr169bRTkf7+/ri7u1O9evVkK2C/evWK1q1bU6lSJZydnVmzZg0ADRo00IbeL1y4kLJly9KgQQMGDhz43mMMCwujcePGVKlSBRcXF7ZsSZR8m0ePHuHh4YGbmxvOzs4ZUm/mXXz9Ndy+DXGitW7dmp49e+Lm5sbKlSv57LPPKF68eIbMXqWUHTt2sH//fp11v/32G+bm5qxbJ52I1UKZacPUFOrWlcpN3H0ijjdv3rBgwQK9jXX58mVOnDihs87OrgMAqXjeZGmqVZN/HR0766zfsGFDmk1TCQsP37jxkjdvTLKFclOvXj3M4kUJ3LhxI1EJoHeh0WgoWrQojRs3Zty4cezZs4e2bdumeP8srdwYgmbNmnH//n3Kli3LF198kaBEffLcunWLHTt2sGXLFnr37k3Dhg3x8fHBysqKHTt2aNsVLVqUU6dOUa9ePa255/Tp04wbNw6QNaBu3rzJ2bNn8fb2xsvLi6NHj+Ll5cXq1au5cOECGzduTLJStKmpKWXLlsXX15fjx49TtWpVjh07xuvXrwkICKB06dKJ9nn06BHHjx9n+/bt2hmdTZs2cf36dXx8fJg/f742OiMyMpJ+/fqxZs0afHx8iI6O5u+//6ZKlSrafDrHjh3D2dmZc+fOcebMGW0dkkGDBvHXX3/h5eXFb7/9xhdffAHAiBEjGDJkCOfOnaNgwYJJfre7d++mcOHCXLx4kcuXL9OiRQud7Q8fPmTSpEmcPn2affv26dhwkztGS0tLNm3axPnz5zl06BBff/11ohvYypUrad68Od7e3ly8eFHHxpwZdOgg/W/i58OYMWMGv/32G46OjoDMfXPt2jUiIiIyVTaQSSuHDx+us65x48a0bt0aIWDtWulrky9fpouWbfDwgOvXITDQRHvNxPH3339rC96ml02bNumYYz08PLh4MS8uLmBvr5chjJ4iRaBAAYiOroR5vKQ+N27cSKSkpAQhRKLf5/btApiaQoUK6RbX4NjY2FCrVi1sbW1p3bo1v/32G6dPn07x/hcvXiRfvJtDeHg4tWrVSvH+WTr4cubMzB/TxsYGLy8vjh07xqFDh+jevTtTp06lX79+79yvZcuWmJub4+LiQkxMjPYB7OLiopMDIK5mkIuLC2FhYdja2mJra4ulpaW2ON7evXupXFnWOQkLC+PmzZuEhobSsWNHbfHO+LWH4lOvXj2OHj2Kv78/Y8eOZf78+dSvXz/ZCqsdOnTAxMSEihUr8uTJE0DaQXv27ImpqSmFCxemUWySi+vXr1OiRAnKli0LQN++fZkzZw4jR46kdOnSXL16lbNnzzJq1CiOHj1KTEwM9erVIywsjJMnT9K1a1ftuHEZKU+cOKGtY9OnTx/GjBmTSEYXFxe++eYbxowZQ5s2bRJ50589e5b69euTN29eALp27cqNGzfeeYxCCL777juOHj2KiYkJDx484MmTJzoKVvXq1fn000+JioqiQ4cOma7cmJrCV1/B8OHy7d3DAwoUKMCZM2ewS+DhOXXqVH766adMlW/27Nk657aJiQm///47iqJw7hz4+0Myk3EqKSTO7+bYMejfvz8//PADERERmJiY4OjoyM6dO5O9F6SUoKAgGjZsSMOGDdm1axdr1qzh88+/ZMAAmZbgQ0FRoGpVuHQpB02bNmXnzp3abatXr05RYrn4XLp0iX79+uHi4kKTJk2oX78+V640o2xZ0EPqHKPgs88+o0KFCtoZnJs3b6Z436tXr1KuXDnt8v3791McKQXqzE2aMDU1pUGDBvz000/Mnj1b+/A1MzPT+hZERkbq7BNnxjIxMcHc3Fxb9MvExERHe4/fLu7/+O2EEIwdOxZvb2+8vb3x8/Pjs9g7zHsLiSGVm2PHjnH27FlatWpFcHAwhw8fxiPuLpmA+DLEn7lIaqx3Tc3Wq1ePXbt2YW5uTpMmTTh+/DjHjx/Hw8MDjUaDnZ2d9pi8vb25evXqO8eKT9myZfHy8sLFxYWxY8cyceLEFMuV3DGuWLGCwMBAvLy88Pb2pkCBAol+Uw8PD44ePUqRIkXo06ePtlJ8ZvLZZ/JtctKkt+vatGmjnZ2KmymcOHGizgxhRuPt7U39+vVZuHCh1lzy5Zdfaou3rl0L5uaqv016qVIFrK2lcpsnTx4+/fRT+vTpw8aNG5k5cyYajUYnVDwtHDhwACsrK6ysrOjUqRNz5syhSJH2hIfzwfjbxFGtGvj6Qtu2PbTr7OzsePr0aaqd99euXYsQgkuXLvHHH3/w77//cu6cJZUrv3/frEKtWrV0TFMlSpRIsS/YvHnz6NOnD/PmzePy5cs69+mUoCo3qeT69es62qe3t7e2zoWjo6PWc163aq7+aN68OYsWLSIsLAyABw8e8PTpUzw8PNi0aRMRERGEhoaybdu2JPevWbMmJ0+exMTEBEtLS9zc3Pjnn39SpRF7eHiwevVqYmJiePTokTbEr3z58ty5cwc/Pz9AOiDGOYB5eHgwc+ZM3N3dyZ8/P0FBQVy7dg0nJydy5cpFiRIlWLduHSAVjIsXLwJQp04dbbXjFStWJCnPw4cPyZkzJ7179+abb77h/PnzOttr1KjBkSNHePHiBdHR0Sn6bUJCQvjoo48wNzfn0KFDOonS4rh79y4fffQRAwcO5LPPPks0bmaQMyd8+y3s3w9xudtMTExo3rw506ZNY9KkSVqTVO/evbW/TUYSHh7OnTt3MDMzw9XVlRUrVvDFF18wKVYDizNJNWsGaSw3oxKLubkMCY+zjn/xxRd8+eWXODg4ANLMndDnKTVER0drZ4PjeP78OceOSbPMh+JvE0e1ajLHVKlSnalbty6//PILu3btYvDgwSl2UQB5j4u738XRosUnBATI2aHsQvny5QkICNAum5mZJfLdSooXL15w4sQJrl69yoIFC+jXr1+y1oXkUJWbVBIWFkbfvn2pWLEirq6u+Pr6ahOmjR8/nhEjRlCvXj1MTU0zZPxmzZrRq1cv3N3dcXFxoUuXLoSGhlKlShW6d++Om5sbnTt3TlZZsbCwoGjRolrbZb169QgNDcUlFbGHHTt2pEyZMri4uDBkyBCtAmNpacl///1H165dcXFxwcTERFtYrmbNmjx58kQ7Q+Tq6oqrq6t2VmbFihUsXLiQSpUq4eTkpHXg/fPPP5kzZw7Vq1cnJCQkSXl8fHyoUaMGbm5uTJ48mR9++EFne5EiRfjuu++oWbMmTZo0oWLFiuTOnfudx/jxxx/j6elJtWrVWLFiBeXLl0/U5vDhw7i5uVG5cmU2bNjAiBEjUvwd6pPPP4f8+SH+hJW9vT3Dhw/XOQ+Dg4Pp1KmTVjHOKFavXq0TQWhmZkb79u2xtbUF4PRpuHcPunfPUDE+GDw8wMcHnj+HihUr6phcQabCT6vD66pVq5g3b572AfXmzRvq16/PoUPg4vLh+UvFKR6+vjkZPHgwTZs21frfxJm0U8Lhw4d1XpJz5MhBwYKtADkbl5149eoVt2/fZsGCBXz88ceJCucmxfbt27VWEJCuB6kuKZJUqXBj+VStWjVR6XNfX9+U1UhXUYlHaGioEEKIqKgo0aZNG7Fx48ZMGTezztdp04QAIU6f1l3/+++/C0Dn07JlS/HmzZsMkWPr1q3C2tpaTJ48WXh6egpPT0+xbNkynTYjRwphYSFESEiGiPDBcfy4/O03bJDL3t7ewtPTU5w6dUp89913onDhwmLr1q2p7vfNmzeiZMmSAhBmZmaiU6dO4p9//hFhYULkyCHE11/r+UCyCIULC9G7txCnT5/WnuOenp7i9OnT4v79+ynqo2PHjjrXZOfOncXkyfJ3DA7O4APIZC5cuKBzrBYWFuLly5fv3Kdhw4Y6+/zvf/9Lti3gKZLQHwyuwLzroyo3Kvri66+/FpUqVRLlypUTX375pdBoNJkybmadr6GhQuTLJ0SrVrrrNRqN6NGjh86Nwt7eXsyZM0fExMToVQYfHx9ha2urHad169Zi/fr14vnz59o2MTFCFCkiRPv2eh36g+bNGyFsbIQYMuTtup9++kkUKFBA+1uUKlVKREREpKrff//9V+e8MTMzE7dv3xbbt8snx759ej6QLEK7dkKULy9ETEyM2Lx5s/D09BQbNmwQffr0ET///PN79799+7awsLDQ+W4PHz4sOnUSokyZTDiATEaj0WiV5LjPv//+m2x7Pz+/RC9k77qPqsqNiooByMzzdcoUeUWfPau7PiwsTFSpUkUAwtHRUWzbtk07o6IvBefJkyeiePHiOjckU1NTcfLkSZ12x45JGVeu1MuwKrG0aaP7YLx48aIwMTHR+T0mTZqU4v5evnwpHBwcdPb//PPPhRBCDBsmRM6cQqRSV8o2TJwohKII8fKlEP/995+oXLmy9jvKnTu3jjKfFMuXLxd79uwRgwcPFvb29sLFxUVoNBpRvLgQ3btnzjFkNmPHjtU5l5ycnJJ9wfz+++912rq7u7+z7+SUG9XnRkUlmzBsmCzwFz9yCsDa2podO3bQrFkzFi5cSKFChQCoUKECy5cvT3c0zdOnT2nSpEkip+vffvstUR2YNWtkmKuauE+/NGkCN29C3E/g6urKkCFDdNpMmTKF27dvp6i/0aNH6ziCWlhY8P333wOwZ4+Mksou4cqppVo16RTv5SX9D+OnOwgJCeH3+ImnEhAYGEjhwoXJly8fAwcOZPv27Xz33Xc8f65w9272ciaOz+eff67j/3flypUkMxZHR0dTpUoVxowZo/Vz/PTTT9M0pqrcqKhkE2xtZd6bbdsgYQ7HggULMnPmTDldG489e/bQvn37ZJ2138f9+/cZMGAAPj4+Ous///zzRA7WMTGwfj20bi1lVdEfcZnu4z8vJk2ahH28DHsRERF06dLlvQkdDx48yOLFi3XWxUVg3bollagEeTI/KGLzjnLqFOTOnZtvv/1WZ/uff/5JYGBgkvvu2bNHpzZSeHg4bdq0IS7QMrs5E8dRrFgxOnfWzew8d+7cRO327t1L8eLF6dq1K8uXL2fRokV069YtTWOqyo2KSjZi+HAZOTVmjHy7jE+FChXInz8/L168AGREwsqVK9mxYwc1a9ZMMqv1uzh69CjXr1/n22+/xTVevvhmzZoxa9asRPmJjh2Dx48hjfcqlXfg5CTzHcWP+s6TJw/Tpk3TaZcrVy5WrVqlE4kSn1u3bhEVFcXq1au1iULLlCmjTQC5Z49s9yErN3nzQvnyb1MvfPnll+TPn1+7PSwsjGHDhiV6kTh37hwLFizg0aNH2nWPHz/GxsYm2ys3ACNjaxuVLFmS7777jlGjRuncc0JDQzEx0VVJzM3NU1woMyGqcqOiko3IlUtm/T10CPbuTbzd1dWVwoULc+rUKaZMmaJdf/36dWrVqsWIESN4/PjxO8d49uwZM2bMwNLSkjx58pAzZ05mzZpFxYoVad68OZs3b9ZJTx/H8uUy4Vzr1uk+TJUEKIo0TR04oKvU9u/fn44dO2JiIssz/P7771SqVImVK1fqVPgGmbfp+vXr2Nvb4+DgwPz58xk1ahT//fefNtfN7t2y5EcSlVo+KGrXljM3Qsis9WPHjtXZfuTIEZYvX65dfv78OQMGDODIkSN07dqVRYsWcf/+fdq3bw9IE1eJEtk771OtWrWYNm0aa9eupVOnTlhZWfH06VPty9bvv/+uk7w1Ojpa56UptaRLuVEUpauiKFcURdEoilLtHe1aKIpyXVEUP0VRsnzJ6cmTJ+Pk5ISrqytubm6cOXPG0CIlYsKECfz222+p3m/r1q1MnTo1VfvE1cBSMQ4GD5Y3yjFjZMKxhFSsWJEOHTposwXHodFomDVrFu7u7ixbtowdO3Zw/fp1goKC8Pf3Z8eOHQwYMICSJUsybdo0nczaNjY2fP3112zevBkrK6tEY756JRP3desmFRwV/dOkCTx9Ct7eb9cpisLixYuZMmWKju9ChQoVmDdvHjt27ODatWvMmTOHevXqJZptq1y5MnXq1AHkb7hvn1ROU5AMPVvj7g5BQdJEBzBkyBDtg7hGjRqsWLGCihUrsnjxYlauXEn16tW5dOkSILPXz507l5w5c2qVxrNn3xbmzK4oikKVBFNTBQsWZOXKlQwYMIDJkyczatQovv76ax49esTNmzfTpdykt7bUZaAT8E9yDRRFMQXmAE2BAOCcoihbhRCGK1WcDk6dOsX27ds5f/48FhYWPHv2LNEbUFamXbt26a5Fo2JYcuSAyZOhVy9YuhSSKnvm4ODA0aNHGTp0KIsWLdLZ1qVLFypWrAjIKfaWLVvi7++v0yY0NJRVq1bRr18/NBoNN2/e5JNPPtFJtR6fTZsgNDRpWVT0Q8uWUunYvh2dFP65cuWidevWBAUFaYtfBgcH8+uvv/LgwQOdPubOnatNSnr16lV69HhbZmDPHoiMhE6dMvxQjJ7ateXfkyeJrQVlyYYNG5g8eTJDhgzROs/6+fkxc+ZMXr16pbN/t27daNasGQAPHkhH8K++ytRDMAhNmjRh+fLlVIitDHrq1CnGjx/P8+fPtW2OHDnC/fv3053xPV0zN0KIq0KI6+9pVgPwE0LcFkK8AVYD7dMzrpaRI6Xbvj4/sXbB5Hj06BH29vbaOhf29vYULlwYkOUXnj17BoCnpycNYguvTJgwgb59+9KsWTMcHR3ZuHEjo0ePxsXFhRYtWmhrkjg6OvLdd9/h7u5OtWrVOH/+PM2bN6dUqVLMmzdPK8P06dOpXr06rq6ujB8/Xrt+8uTJlCtXjiZNmnD9euKfJSYmhpIlSyKEIDg4GBMTE44ePQrITMV+fn4sXryYYcOGAXJGZvjw4dSuXZuSJUtqZ2eEEAwbNoyKFSvSunVrnVohBw4coHLlyri4uPDpp5/y+vVrzp49S6fYO+KWLVuwsrLizZs3REZGUrJkSQCtWcPV1VXnhqqSNrp3l46PY8dKpSIpLC0tWbhwIbt379aWEMmdO7d2qjyOly9fJrn/f//9h5+fH6GhofTq1StZxQZg8WIoWRLq1k3T4aikgAIFoEYN6VCeEGdnZ/LkyaOtgfTtt98mUmwAdu7cyfXr17l27Rrdu3fX+U03bpQZiVNRqSXbUr482NlJ01QcpUuXplevXjpRQSVLlkyk2NSvX5/58+drl+OqEcROkGV74iLMZs2axfDhw3UUmzh+++2392aRfx+Z4XNTBLgfbzkgdl2SKIoySFEUT0VRPJPzODckzZo14/79+5QtW5YvvvgixfVEbt26xY4dO7SFDBs2bIiPjw9WVlY6BQ2LFi3KqVOnqFevntbcc/r0acaNGwdIb/KbN29y9uxZvL298fLy4ujRo3h5ebF69WouXLjAxo0bk3QONTU1pWzZsvj6+nL8+HGqVq3KsWPHeP36NQEBAZROwpD+6NEjjh8/zvbt2/nf/6RFcdOmTVy/fh0fHx/mz5/PyVjPusjISPr168eaNWvw8fEhOjqav//+mypVqnDhwgUAjh07hrOzM+fOnePMmTPUjA09mDp1KhcuXODSpUs6ipxK2jAxgT//lA68v/zy7rbNmzfH19eXWbNm0adPn0RmpaSUG3t7e3766Sfat2+vrQqfHHfvwsGD8MknUi6VjKNtWxkpF89nVUucGX3ZsmXa6zEhlpaWPHr0iK5du+r4Tb15I5Wm9u3hHTrsB4OJCdSq9dapOI6mTZvy5MkTrR9JXNHYODp06MDu3bt1nGRPnJA14hJYibMt1tbWODs7c/LkyURO13Z2dixbtoyOHTume5z3nqaKouwHCiax6XshxJYUjJGUdTbZQidCiH+BfwGqVav27oIoM2emYHj9YmNjg5eXF8eOHePQoUN0796dqVOn0u898+0tW7bE3NwcFxcXYmJiaBEbbuDi4qKTJyHOJOTi4kJYWBi2trbY2tpiaWlJcHAwe/fuZe/evdpIhrCwMG7evEloaCgdO3bU2nCTMy3Vq1ePo0eP4u/vz9ixY5k/fz7169dPtihZhw4dMDExoWLFitraKUePHqVnz56YmppSuHBh7cPt+vXrlChRgrJlywLQt29f5syZw8iRIyldujRXr17l7NmzjBo1iqNHjxITE6OtgeXq6srHH39Mhw4d6KCWitYLNWtCnz7w+++yeniC+6wOOXPm5MsvvyQqKooTJ07w4MEDLCwsMDc3x9LSkrx581KyZEmcnZ3p1KkTjRs3TtJpOCmWLJGOl598oqcDU0mWtm3hhx9gxw4YMCDx9kKFCjF79mw+/vhjFi5cyKFDh1AUhfz581OnTh2++eYbbR6k+Bw8CC9fqiap+NSuDePHQ0gIxJ9kaNWqFS9evGDXrl1YWFjg4eFB0aJFadOmDV27dk1Ud/DECTnjlsLLKVtQrlw5Ll68yIYNG1i6dClXrlyhWbNmTJ06lYIFk1I3Us97lRshRJN0jhEAFI237AA8TGefBsXU1JQGDRrQoEEDXFxcWLJkCf369cPMzEwbYhkZGamzT5wZy8TEBHNzc63jnomJiY5jZvx28Uu8x7UTQjB27FgGDx6s0//MmTMTOQMmRb169Zg3bx4PHz5k4sSJTJ8+ncOHD2sLWiYkvgzxteykxkqohSccd9euXZibm9OkSRP69etHTEyM1ul5x44dHD16lK1btzJp0iSuXLnyTjOHSsqYOhU2b4ahQ2HXrvc7gpqbm2vNqXEkZ5ZKCVFR8M8/0Ly5dHJWyVhcXKBYMTnLkpRyA/LarV27NrXjHEdSwMaNMjdRXD4dFancCCFNUwlD4/PkyUOvXr0AEuV3ic+rV9IB/H9ZPswm9eTMmZM+ffrQp0+fDOk/MyaJzwFlFEUpoShKDqAHsDUTxs0Qrl+/rlPN1dvbW+uv4OjoiJeXFwAbNmzIkPGbN2/OokWLtJWdHzx4wNOnT/Hw8GDTpk1EREQQGhrKtqQM78jq3CdPnsTExARLS0vc3Nz4559/kq0inhQeHh6sXr2amJgYHj16xKFDhwBZ3v7OnTv4+fkBsGzZMm3FcA8PD2bOnIm7uzv58+cnKCiIa9eu4eTkhEaj4f79+zRs2JBff/2V4ODgDK9c/aFQuDD8/LN0Bl27NvPH37wZHj6U2ZNVMh5FkbM3+/bBe3L1pZg3b6RDeOvWH25W4qSoVUs67yeRaDfFnD0rk1t+KP42mUl6Q8E7KooSALgDOxRF2RO7vrCiKDsBhBDRwDBgD3AVWCuEuJI+sQ1HWFgYffv21Tq/+vr6aqMLxo8fz4gRI6hXr16iqUd90axZM3r16oW7uzsuLi506dKF0NBQqlSpQvfu3XFzc6Nz587JKisWFhYULVqUWrVqAXJGJTQ0FBcXlxTL0LFjR8qUKYOLiwtDhgzRKjCWlpb8999/dO3aFRcXF0xMTPj8888BqVQ9efJEO0Pk6uqKq6sriqIQExND7969cXFxoXLlynz11VfY2dml41tSic/QoTKt+8iREBycuWPPni1nbFq2zNxxP2Q6dJCKzc6d+ulv+3Z49gz69tVPf9kFa2s5exM/cWJqiXMmjr0dq+gR5V2mBENTrVo14enpqbPu6tWr2jAyFRVjx1jOVy8vadfv2xcSRH5nGJcuSSfJ6dPhm28yZ0wViI6GokVlLpaNG9PfX9u2cP483LsHGfTOlmWZPFn6OD19KjODp5aWLeH+fbh8Wf+yfSgoiuIlhEiUJUiNXVBR+QCoWlUm9fvvP/kmnhnMmCHNGGmse6eSRszMoGdP6VScRJRtqnj8WPpqffKJqtgkRZNYj9SDB1O/7+vXsiRJMu6OKulEVW5UVD4Qxo+XDqcDB6b/ofc+/P1h2TIYNEjW4lHJXHr3lr4y6U0cvmyZ9Anp318/cmU3qlaVkVJpMU0dPy4dilWTbcagKjcqKh8IFhYyLDsoSM6mZKRFeupU+aY/enTGjaGSPJUrQ4UKsp5XWtFopAmzdm2ZhVclMWZm0LChdOBO7fW0c6d0SH5PmiiVNKIqNyoqHxCVK8Ovv8KWLTLJX0Zw/740f332GRRJNl2nSkaiKHL25tgxuH07bX1s3w7XrsEXX+hXtuxGkyYyUWVqv+ddu6B+fbXWWkahKjcqKh8YI0bITLOjR8Pp0/rvf9Ik+fdDzN1hTHzyiZxZmDUr9fsKITNbOzrKUh4qyRNbIirJshfJcecOXL2qmqQyElW5UVH5wFAUObNStKgMG757V399e3rCggUy/LxYMf31q5J6HBykY/GCBan3sTp2TCq+336rllt4H2XKyKjANWtSvs+uXfJvq1YZI5OKqtykCVNTU9zc3HB2dqZt27YEZ3bykHgcPnxYW9tJH2zevBlf39QXbI+rNpwSBgwYkKYx9CnDh06ePNLsEBkpQ32TK66ZGjQamazvo48gNvWTioH55hvptPr336nb75df5O+oOhKnjJ49pTLo75+y9rt2yfxPqi9TxpHllRsvLy+dT3IEBgbqtLubjtdVKysrvL29uXz5Mnnz5mXOnDlp7iu9vEu5iV/WIaWkVblJDQsWLKBixYoZOobK+6lQAdatA19faNcOwsPT199//8GZM9KnJ50FfVX0hKurLA0wa5ZUZFPC9u2we7dUjBLUUFVJhjjTXUpmb4KCYO9e+VKRgoo5Kmkkyys3hsbd3Z0HDx4AsvJ3ixYtqFq1KvXq1ePatWsAPHnyhI4dO1KpUiUqVaqkVUb++OMPnJ2dcXZ2ZmZsEdA7d+5QoUIFBg4ciJOTE82aNSMiNo/6rFmztJmRe/TowZ07d5g3bx4zZszAzc2NY8eO0a9fP0aNGkXDhg0ZM2YMEyZM0NZvAnB2dtYW6ly6dCmurq5UqlSJPn36cPLkSbZu3cq3336Lm5sbt27dSvaY/P39cXd3p3r16vz4449JfjevXr2idevWVKpUCWdnZ9bEXvkNGjQgLjnjwoULKVu2LA0aNGDgwIEMi83T369fP4YPH07t2rUpWbIk62NjWsPCwmjcuDFVqlTBxcWFLVtSUrtVJTmaNoWlS+HoUangpDVlv68vDB8uc3b07q1fGVXSx5gxMsnctGnvbxsWJh2InZykb5ZKynB0lEkTV616f9tly2SOm88+y3CxPmyEEEb7qVq1qkiIr6+vzrKnp6fOJzmePn2q0+7OnTvJtn0f1tbWQgghoqOjRZcuXcSuXbuEEEI0atRI3LhxQwghxOnTp0XDhg2FEEJ069ZNzJgxQ7tPcHCw8PT0FM7OziIsLEyEhoaKihUrivPnzwt/f39hamoqLly4IIQQomvXrmLZsmVCCCEKFSokIiMjhRBCvHjxQgghxPjx48X06dO1svXt21e0bt1aREdHJ7ndyclJ+Pv7i8uXL4uyZcuKwMBAIYQQQUFB2v3XrVunbZ/cMbVt21YsWbJECCHE7Nmztd9JfNavXy8GDBigXQ4ODhZCCFG/fn1x7tw58eDBA1G8eHERFBQk3rx5I+rWrSuGDh2qlaNLly4iJiZGXLlyRZQqVUoIIURUVJQICQkRQggRGBgoSpUqJTQajc7vYkwkPF+NlaVLhVAUIWrXFuLJk9Tt+/KlEOXLC/HRR0I8eJAx8qmkj169hDAzE8Lb+93tRo4UAoQ4cSJz5MpO/Pmn/O6uXEm+jUYjr5VatTJPruwO4CmS0B/UmZs0EBERgZubG/ny5eP58+c0bdqUsLAwTp48SdeuXXFzc2Pw4ME8evQIgIMHDzJkyBBA+uvkzp2b48eP07FjR6ytrbGxsaFTp04cO3YMgBIlSuDm5gZA1apVtTMtrq6ufPzxxyxfvvydFbO7du363tpWBw8epEuXLtjb2wOQN4lMa+86phMnTtCzZ0+AZKu6uri4sH//fsaMGcOxY8fIncBWcfbsWerXr0/evHkxNzena9euOts7dOiAiYkJFStW5MmTJ4BUxr/77jtcXV1p8v/27j02yiqN4/j3WagUuVhFQKFoyQYiRdIWSqtBUVK26yoGKmowoNZLMEaTFUOyy01xjZeguyIRUVeMbtK1gbBVEoiuJF0I/6zSClsri+uFLAXipZVCJaxpOfvHeVtrmSmFmc770vl9kqbTM29nnukzJ3N6rjNncvDgwY775Ozdeac/WPPjj6G42H/viePHfZf8Z59BZaU/qFOiZ80av5niPff4k9pjef11WL0aHnzQ720jZ+b22/2+NUEnfEw7d/rl9QsXpiystHXOz4OfMmVKj64bPnw4w8/m8I8Y2ufcNDc3M2vWLNauXUt5eTlZWVns3r27R4/hutnxacCAAR23+/Xr1zEstWXLFnbs2MHmzZt58sknqa+Pff7ooE4bJ/Tv35+TJ092/HwiGHh3zmGnGfA9efJkt6/pdL8/fvx4ampq2Lp1K0uWLKG0tJTHHnus4/7u/gbw879D+7UVFRUd86cyMjLIycnpeE2SmFtv9d3rs2fD1Kl+qfiKFfHnXTQ1waxZfiLlq6/6zcwkmoYNg1degVtu8ad7V1b+tHO0c/Dmm/4D94Yb/LEZcuYuuQQeeABeftmvMhs37tRrXnsNhg71DSHpXeq5ScAFF1zAmjVreP755xk4cCBjx45l48aNgP8w3rNnDwAlJSWsC5YrtLW1cfToUaZPn84777zD8ePH+eGHH6iqqop7kjf4hsaBAweYMWMGq1at4siRI7S0tDBkyBCOdbPUJScnh9raWgBqa2v5KpjOX1JSwoYNG2hsbASgKVgr2vnxhg4dGvc1TZs2jcrKSsA3OGI5dOgQ559/PgsWLGDx4sUdcbQrKipi+/btfP/997S2trJp06a4r6Ndc3MzI0aMICMjg+rq6oQmhsupCguhrs735DzzDFx+uW/g1Nf7bfjBr6xavRpyc/2BnBs3+iMdJNrKynzvzPbtPs8rVvgenauv9jtWl5T4gzY7/U8hZ2jZMv/36/Q/XIcPP/RzcsrLtXFfKqhxk6CCggLy8vKorKykoqKC9evXk5eXx8SJEzsmu7744otUV1czadIkpkyZQn19PZMnT6a8vJyioiKKi4u5//77KSgoiPs8bW1tLFiwgEmTJlFQUMCiRYvIysri5ptvpqqqqmNCcVdz586lqamJ/Px81q1bx/hg7eHEiRNZtmwZ1113HXl5eTz66KMAzJs3j+eee46CggK++OKLbl/T2rVrmTp1Ks3NzTFjrquro6ioiPz8fJ566imWL1/+s/tHjx7N0qVLKS4uZubMmeTm5p4ydNXV/Pnz2bVrF4WFhVRUVHDFFVd0e72cuYsu8iufduyAq67yJx9feaVfATVsmP/Pc9EiP+l0506YOzfsiKWn7rvPN24GDYKnn/aThr/7Dl56yW9Cp9VRiRk5Eh55xPeMdd4gs6UF5s/3O3Y/8URo4aUVO93QQJgKCwtd+6qadnv37mXChAkhRSTJ1tLSwuDBg2ltbaWsrIx7772XsrKysMNKmr7wft2/3zd0amr8fI0xY+Daa+Gaa8KOTBLx449w+LDf7E8nfifPkSP+gNojR/zZXrm5sHy57+GsrvZHLkjymFmNc66wa/k5P+dGzm0rV65k27ZtnDhxgtLSUubMmRN2SNJFTo7/uuuusCORZDrvPD/sKMmVleX3e5ozx3+1e/xxNWxSSY0bCVXnPXhERPqCUaP88N8LL/hh3Jtu8jsSS+qck42bnqz0EQlblId8RaR3DRwIS5eGHUX6OucmFGdmZtLY2KgPDok05xyNjY1kZmaGHYqISNpJqOfGzG4DVgITgCLn3K441+0HjgFtQGusyT89lZ2dTUNDA99+++3ZPoRISmRmZpKdnR12GCIiaSfRYalPgFuAV3tw7Qzn3HcJPh8ZGRmM1eCliIiIxJFQ48Y5txdOv1OtiIiISKqkas6NA/5uZjVmplM1REREpNectufGzLYBl8S4a5lz7t0ePs8059whMxsBfGBm/3bO7YjzfAuBhQCXXXZZDx9eRERExEvKDsVm9g9gcbwJxV2uXQm0OOdOu8GJmR0D9iUcoCTbxUDC86ck6ZSX6FJuokl5ia6e5uZy59wpp2L3+j43ZjYI+IVz7lhwuxT4Qw9/fV8iK6ukd5jZLuUlepSX6FJuokl5ia5Ec5PQnBszKzOzBuBqYIuZvR+UjzKzrcFlI4GdZrYH+BDY4px7L5HnFREREYkn0dVSVUBVjPJDwI3B7S+BvESeR0RERKSnor5D8WthByAxKS/RpLxEl3ITTcpLdCWUm6RMKBYRERGJiqj33IiIiIicETVuREREpE+JZOPGzG4ws31m9rmZ/T7seNKZme03szoz221mu4Kyi8zsAzP7T/D9wrDjTAdm9oaZfWNmn3Qqi5sLM1sS1KF9ZvbrcKLu++LkZaWZHQzqzW4zu7HTfcpLCpjZGDOrNrO9ZlZvZr8NylVnQtZNbpJWbyI358bM+gGfAb8CGoCPgDucc5+GGliaCk50L+x86KmZrQKanHPPBo3PC51zvwsrxnRhZtOBFuAvzrkrg7KYuTCzXOBtoAgYBWwDxjvn2kIKv8+Kk5eVxNisVHlJHTO7FLjUOVdrZkOAGmAOUI7qTKi6yc3tJKneRLHnpgj43Dn3pXPuR6ASmB1yTPJzs4G3gttv4d+U0suCI0uauhTHy8VsoNI59z/n3FfA5/i6JUkWJy/xKC8p4pw77JyrDW4fA/YCo1GdCV03uYnnjHMTxcbNaOBAp58b6P5FS++KdejpSOfcYfBvUmBEaNFJvFyoHoXvYTP7VzBs1T70obyEwMxygALgn6jOREqX3ECS6k0UGzcWoyxaY2fpZZpzbjLwG+ChoAteok/1KFzrgF8C+cBh4I9BufKSYmY2GNgEPOKcO9rdpTHKlJteFCM3Sas3UWzcNABjOv2cDRwKKZa0F+w2jXPuG/xu1EXA18GYafvY6TfhRZj24uVC9ShEzrmvnXNtzrmTwJ/5qQtdeUkhM8vAf3hWOOf+FhSrzkRArNwks95EsXHzETDOzMaa2XnAPGBzyDGlJTMbFEz2aj8AtRT4BJ+Pu4PL7gbeDSdCIX4uNgPzzGyAmY0FxuHPdpMUaP/wDJTh6w0oLyljZgasB/Y65/7U6S7VmZDFy00y602vnwp+ppxzrWb2MPA+0A94wzlXH3JY6WokUOXfh/QH/uqce8/MPgI2mNl9wH+B20KMMW2Y2dvA9cDF5g+sfRx4lhi5cM7Vm9kG4FOgFXhIqz56R5y8XG9m+fiu8/3AA6C8pNg04E6gzsx2B2VLUZ2Jgni5uSNZ9SZyS8FFREREEhHFYSkRERGRs6bGjYiIiPQpatyIiIhIn6LGjYiIiPQpatyIiIhIn6LGjYiIiPQpatyIiIhIn/J/OvO//zinipwAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def istft_basic(X, w, H, L):\n", " \"\"\"Compute the inverse of the basic discrete short-time Fourier transform (ISTFT)\n", "\n", " Notebook: C2/C2_STFT-Inverse.ipynb\n", "\n", " Args:\n", " X (np.ndarray): The discrete short-time Fourier transform\n", " w (np.ndarray): Window function\n", " H (int): Hopsize\n", " L (int): Length of time signal\n", "\n", " Returns:\n", " x (np.ndarray): Time signal\n", " \"\"\"\n", " N = len(w)\n", " M = X.shape[1]\n", " x_win_sum = np.zeros(L)\n", " w_sum = np.zeros(L)\n", " for m in range(M):\n", " x_win = np.fft.ifft(X[:, m])\n", " # Avoid imaginary values (due to floating point arithmetic)\n", " x_win = np.real(x_win)\n", " x_win_sum[m * H:m * H + N] = x_win_sum[m * H:m * H + N] + x_win\n", " w_shifted = np.zeros(L)\n", " w_shifted[m * H:m * H + N] = w\n", " w_sum = w_sum + w_shifted\n", " # Avoid division by zero\n", " w_sum[w_sum == 0] = np.finfo(np.float32).eps\n", " x_rec = x_win_sum / w_sum\n", " return x_rec, x_win_sum, w_sum\n", "\n", "L = 256\n", "t = np.arange(L) / L\n", "omega = 4\n", "x = np.sin(2 * np.pi * omega * t * t)\n", "\n", "N = 64\n", "H = 3 * N // 8\n", "w_type = 'hann'\n", "w = scipy.signal.get_window(w_type, N)\n", "X = libfmp.c2.stft_basic(x, w=w, H=H)\n", "x_rec, x_win_sum, w_sum = istft_basic(X, w=w, H=H, L=L)\n", "\n", "plt.figure(figsize=(8, 3))\n", "plt.plot(x, color=[0, 0, 0], linewidth=4, label='Original signal')\n", "plt.plot(x_win_sum, 'b', label='Summed windowed signals')\n", "plt.plot(w_sum, 'r', label='Summed windows')\n", "plt.plot(x_rec, color=[0.8, 0.8, 0.8], linestyle=':', linewidth=4, label='Reconstructed signal')\n", "plt.xlim([0,L-1])\n", "plt.legend(loc='lower left')\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Alternative Compensation for Windowing\n", "\n", "We have seen above that the samples $x(r)$ can be recovered from a signal's windowed sections via the formula \n", "\n", "$$\n", " x(r) = \\frac{\\sum_{n\\in\\mathbb{Z}} x_n(r-nH)}{\\sum_{n\\in\\mathbb{Z}} w(r-nH)}\n", "$$\n", "\n", "in the case that the denominator is nonzero for $r\\in\\mathbb{Z}$. In practice, when reconstructing a time-domain signal from an STFT, one often has to deal with unwanted or deliberate modification in the STFT domain. This topic will be covered in the [FMP notebook on signal reconstruction](../C8/C8S1_SignalReconstruction.html). In view of such modifications, it turns out that the following formula yields a better reconstruction of the samples $x(r)$:\n", "\n", "$$\n", " x(r) = \\frac{\\sum_{n\\in\\mathbb{Z}} w(r-nH)x_n(r-nH)}{\\sum_{n\\in\\mathbb{Z}} w(r-nH)^2},\n", "$$\n", "\n", "where one again assumes that the denominator is nonzero for $r\\in\\mathbb{Z}$. In the case that there are no modifications in the STFT domain, both reconstruction formulas yield exactly the original samples. The second strategy is also used in the function `librosa.istft`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## LibROSA Implementation \n", "\n", "The python package LibROSA offers the two functions `librosa.stft` and `librosa.istft` for computing the STFT and its inverse. In the following, we test these two functions. In particular, we want to demonstrate that it is important to compensate for possible padding, e.g., when using the centered variant of the STFT. As an example, we use the following violin sound.\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:59:44.061078Z", "iopub.status.busy": "2024-02-15T08:59:44.060860Z", "iopub.status.idle": "2024-02-15T08:59:44.508422Z", "shell.execute_reply": "2024-02-15T08:59:44.507858Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "=== Centered Case ===\n", "stft: center=True; istft: center=True\n", "Number of samples of x: 46656\n", "Number of samples of x_rec: 46656\n", "Signals x and x_inv agree: True\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAagAAACICAYAAACyaX9CAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAdT0lEQVR4nO2deZQdVbX/P9/uDkmAkBDS8DIAYVYJECTMCGFQhkiAPFkog4B5oA95qAgKP5aIPuUBSwb5IT+GBwIyyaA8gmDEB6gQMSRABhLmIITBhHkKkKT3749zrrdy+97u2911b9W9vT9r1aqqU2fYZ9eps+vsOlUlM8NxHMdx8kZL1gI4juM4TjncQDmO4zi5xA2U4ziOk0vcQDmO4zi5xA2U4ziOk0vcQDmO4zi5xA2U4ziOk0vcQDllkXSZpB8k9v9d0j8kvS9pHUm7Snom7h+coaipI+ksSddnLUezIWmipMVZy+E0Dm1ZC+DUH0kvAOsBK4CVwALgOuAKM+sAMLNvJOIPAC4AdjKzOTHsx8AlZvbz+kqfbySdBWxqZkdmLYvjNDo+guq/HGhmQ4ANgXOA7wNXVYi7HjAIeCIRtmHJftVI8hsjJ3W8XTUfbqD6OWb2jpndCRwGHC1pHICkayT9RNLmwFMx+tuS7pP0HLAxMC26+AZKGirpKkmvSno5pm2NeR0j6SFJF0p6EzgrpvmZpBej6/AySYNj/ImSFkv6rqQlMc9jCzJLGizpfEl/l/SOpAcTaXeSNEPS25LmSJqYSHeMpOclvSdpkaQjulDNIEm/jnEflbRNIp9Rkm6XtDTmc1IM3w/4P8BhUS9zJO0paV4i7R8lzUzsP1hwkVbKNx5rkXSapOckvSHpFknD47GxkkzS0VGfr0s6o1ylJK0m6XFJ/xH3W+O5ObNC/EmSHpP0rqSX4gixcKzLcuN5ukbSW5IWANtXUrakXWL69eP+NvEcfqpSmhjvBUnflzQX+EBSWzdtYLikX0p6Jcp1R1f5OxljZpkswNXAEmB+SvmdR7ijXwhcDCiruuV9AV4A9ikT/iLw73H7GuAncXssYEBbpTyAO4DLgTWAdYGZwNfjsWMI7sT/ILiVBwMXAXcCw4EhwDTgv2L8iTH+j4EBwAHAh8Da8fgvgAeA0UArsAswMO6/EeO3AJ+P++1RrneBLWIeI4EtK+jnLGA58KVY/inAorjdAswGzgRWIxjq54F9E2mvT+Q1CFgGjIh1fw14JdZ5cDy2ThX5fht4GBgT63o5cFPJ+bky5rkN8DHw6Qr1Gwe8BXwaOCPm21oh7kRgqyjf1sA/gIOrKZcwMv9LPMfrA/OBxV20y58C98W85gInVtmWH4/5D+6qDcT4vwN+Dawdz+ceWV+PvnRxfjMrGHYHPksKBorQQT1E6Kxagb8CE7NWbl4XKhuoh4Ez4vY1VGmgCC7Aj4HBieNfAe6P28cALyaOCfgA2CQRtjOwKG5PJHTcyfKWADvFTmcZsE0Z+b8P/KokbDpwNMFAvQ38a1LOCvo5C3g4sd8CvAp8DtgxWZd4/HTgl4m015cc/wswJcr/B+AWYD9gT2BujNNdvguBvRPHRhKMaFvi/IxJHJ8JfLmLOn4XeJJgqDbrQdu5CLiwpF2ULZdgYPdLHDuerg3UAIKRngf8nipuMmM7/FqVbWAk0EG80fEl/0tmPlsz+7OksckwSZsQ7o7bCXfMx5nZk9VkR7hTXY3Q+Q0g3Ok5PWM08GYv0m1I0PmrkgphLcBLiTjJ7XZgdWB2Ir4INxcF3jCzFYn9D4E1CSORQcBzFeQ4VNKBibABBEP5gaTDCKOhqyQ9BHy3i/b1T3nNrENh9tkoQlsbJentRNxWghGqxJ8IRndx3H4L2INg1P+UkL2rfDcEfiupI3F8JeHmoMBrie2CvipxLWHEcruZPVMpkqQdCSOhcYTrayBwa0m0SuWOYtXz/vcu5MHMlku6huABOdmidamCZBkV2wBhlPWmmb1VZb5OxuTtoeIVwDfM7Jl4YVwK7NVdIjP7q6T7CXe5IswuW1hbUZsLSdsTDNSDvUj+EqGzHVFiVJIkO5vXCaOgLc3s5R6W9TrwEbAJMKeMHL8ys+PKCmA2HZgen1f9hOCa+lyFctYvbEhqIbjWXiG4HheZ2WYV0pXrVP8EnE9woZ5DMFBXEnT2i4TsXeX7EmGk8FDpgdIbvSq5FLgL2FfSbmZW6bzfCFwC7G9mH0m6iHCTUA2vEvRYmEyzQVeRJY0Gfgj8Ejhf0vZm9nEV5SR1XrENSBoJDJc0zMzeriJfJ2NyM0lC0poEV92tkh4n+NhHxmNTJM0vs0yPxzcl+NPHEDrZvSTtnklFGgxJa0n6InAzwTU1r7s0pZjZqwTX1fkxvxZJm0jao0L8DkIHfaGkdaMcoyXtW0VZHYTnlxfESQWtknaWNBC4HjhQ0r4xfJDChIsxktaTNFnSGgTD8D5hBFKJ7WK7ayM8//mY4AKdCbwbH8wPjuWMiwYewsh9bDRqBWYAWwA7ADPN7AnCnf6OwJ9jnO7yvQz4qaQNo77aJR3Unb7KIekoYDuC6/Uk4Np4/ZVjCGHU8ZGkHYDDe1DULcDpktaWNIbwDLKSTCK4la8CphKM23/2oKwCFdtAbKf3AJdGmQZ4P5FvcmOgCLK8bWbjE8unAczsN2Y2rsxS6NAOITwzeN/M3ic0wp0yqkejME3Se4Q7zjMI7zkd23WSLvkqwQW0gDBCuI14g1GB7wPPAg9Lehf4I6ETr4ZTCM8pHiG4JM8FWszsJeAgwky6pYS6nUpoWy2E5y6vxDR7ACd0Ucb/EGY2vgUcBUwxs+VmthI4EBhPmDjxOvDfwNCYruD+ekPSowBm9gHwKPCEmX0Sj/8V+LuZLYlxusv354RJJX+I5+1hgoHrEZI2IDxH+mq8Xm4EZgEXVkhyAvDjWOaZBKNTLT8iuPUWEW5gftVF3JMI7sofRNfescCxkiqNcMvSTRuAcC6XE56/LSHcfDg5RdW7eWtQeHBN3GVmhanNMwgPYG+Nd1RbW3wxtJt8DgOOIzx4FuEB60VmNq1mwjuO4zg1JbMRlKSbCHeRWyi88zIVOAKYKmkOwW9drQvjNsJD83mE5xJz3Dg5juM0NpmOoBzHcboiuiQXVDj8GTN7sZ7yOPXFDZTjOI6TSzKZZj5ixAgbO3ZsFkU7juM4OWP27Nmvm1l7aXgmBmrs2LHMmjUri6Idx3GcnCGp7EvceZpm7jiO4zj/xA1Us/Lhh7DOOnD33d3H3W03OPlkGDIEHnoIzEAKS4Ejj4R/+zd47z0YNgzuvReuuQY22ACmToWNNgrp33wTRo0KaefNg8GDi3m99lrnsp98EgYNgkWLwv6dd0J7O3z0Udi/5BIYNw622gouvhgmTYJTT+2cz8qVMGYM3Hhj5XouXlyUZcaM7vXSFUcfHfJ5/vm+5WMWdHjddV3Hu/rqoOMCI0aE8n/0o8ppli4t1nfs2HCOJ08Ox/bcE77znXCsrQ3OPDOEZcmmmwZ5Lrgg7N9+e9hfc0344IPK6Y44Avbfv1jXk06qHLeUiRODHoYOhfvug299K+TxhS/Ayy+H9junwpsuN90U4g4bBsuWhbBFi0J7XugfskmFLD4AuN1225lTY+bMMQOzrbbqPm7oJsMyaZLZJ58U90vjzJgR1jvttGq6wnL33cXtE05Y9dh113Uu+5RTwrHzzgv7m24a9p9+urNsyaWUd98N4WuuWbmel15aTD95cvd66YpCPmef3bd8Crpua6uuvNL9croocNttlXVXrV7rSakco0YV92fPri5dT+uRTLP77qvuX3ZZWB9/fPm0a61VjLtgQQg755yw/73vVS+DY8AsK2MrfATVrDTq7My+yl3veudZz3mWrRqS8tejLqVl9KTMvqR1KpLKJAmFX4i/R/i22Qozm5BGvk4KJN10adDdhdfXTqWQpqdy9zR+Wh2Id0S1Iy83Gz1pW4W43i5SIc1ZfHua2esp5uf0hd5eIIXnT91Ra8PX2/zz0qnlgTzL1gj0ZgSV9nXRz3EXX7NSqwumJyOo0rLLpa0mTjX0l46hL26nRiMvLr7etK1G131OSMtAGeEry7MlHV8ugqTjJc2SNGvp0qUpFet0S29cX2mNoOrp4suKRntm1kjkZTRcqS2WC2+UdtsgpGWgdjWzzwL7A98s948VM7vCzCaY2YT29k4vDDtpk1XH1xfXYnLdKBd6Wnqutr79aQSVJO+TJLrLy+kVqRgoM3slrpcAvyX8mM3Jkt529GleWH0ZifkzqL6TZ9kaiZ54C3ySRKr02UBJWkPSkMI28AVgfl/zdVKi3s+gehu3r1TTMTRDp9EMdaiWvDyD6knaRhn5NwhpzOJbD/ht+L8gbcCNZvb7FPJ1+kKtL+hKF2JaLr605OmuvL7SnwxGvcl6NOyTJDKnzwbKzJ4HtklBFqcWZDmCqgZ38TmVqPcIqhL+HlRm+DTzZqWvI5nuSHsE1df0WblW6l3fvLpY+0oeZE1jkoS7+FLFDVSzUutJErXqUPIwuSMLatGxNbpOkuR9BNVMus4RbqCanXrf0aU1cquF3M1gBPpTR5h1XX2aeea4gWpWspok0RW1/JJET9P3h0kSeZatlHKy5mUWn7+omxluoJqdtF1lte4oGm26ro+gmoeefkmi2V9pyAPl/sFR68X/B9UNhX/KlC6FfyUVluOOC/GvvLJ8/K6WKVPMTj+95+n6y/LWW9XHPffc7OUtXdZdt3Z5n3qq2d579zzd5ptnrxcw23LL7GUAs9ZWsxNPLO5vs01Yf+c75eM/91yWvVJNocL/oBSO1ZcJEybYrFmz6l5uw9CT0YNZ44w2GompU+Gqq7KWwnGKbLghvPBC1lLUBEmzrcxvmtzF5ziO4+QSN1COU44MPAuO46yKG6hGxztSx+kf9ENXvhsox3EcJ5e4gXKccvjI1MkbPoJyGg7vSB3HaVLS+N1G/+L99+HNN2HECFixAp5/HgYMCNvt7bD66uH4tGlwwAHwySeweHEwJM8+C0cfDbNmhXwk2HhjeOKJEPbuu7D99j2TZ9q02tSzvzPff2nm5IxFi2Du3NBfbL89rLEGjByZtVQ1xd+D6imrrw7LlsGYMcHwOI7jZMWcObD11llL0Wf8Pai0WLYsrN04OY6TNU8/nbUENcUNlOM4TqPSUtKF33preHTw4ovZyJMybqAcx3EaldKZfddeG9bz5tVflhrgkyR6wuGHZy2B4zhOkSlTyod/8Yur7jfobF8fQfWEm27KWgLHcZyes+uuYaZxg5GKgZK0n6SnJD0r6bQ08swVM2b0y5fkHMdpEmbMCK/DSKsuF18c1uefn7WEZenzNHNJrcDTwOeBxcAjwFfMbEGlNLmeZm4GDz4Iu++etSSO4zjZsXgxjB5dl6IqTTNP4xnUDsCzZvZ8LOhm4CCgooFi0aJVn+ckRydpbN98M3z0UTH84INhtdWgtbXzMn1608x4cRzHSY0xY8Ko68ADYa21qk+X4vOuNAzUaOClxP5iYMfSSJKOB44HGN/WFr6cAKtWJq3tpHECmDkThgyBlSs7L6+91nXtHMdx+ivLl8Pf/hZu5ntCSo9E0jBQ5STpZELN7ArgCgguPvLo4uvoCJ8RmTIlfJbIcRynv3L44XDDDfUpq4JBS2OSxGJg/cT+GOCVFPKtPy0tsNVW8MwzYURWWCZNyloyx3Gc2jFjxqp9nln9jFMXpDGCegTYTNJGwMvAl4HmemHorruK2z6bz3GcRqWjo6H6sD6PoMxsBXAiMB1YCNxiZk/0Nd/cMnZs1hI4juP0jgYyTpDSe1BmdreZbW5mm5jZT9PIM7dU+nLwm2/C5ZfXVxbHcRyAb34zrA89FJYuDTOT33gDliyBl14KU8Y//jhbGXuBf+qop6xcWT587bVhnXXqK4vjOM7w4TBqVNjeZJPwr7omwT911FMqGajujjmO49QCs2Lf09ZcYw43UD1l880rH2tvr58cjuM4ANtsUxxBbbhhtrKkTHOZ23pw3nlh2vmwYeGT9suWwcSJ4dieewZf8C9+Af/yL/DOO+H4BhuEd6suuijEu/VWOPvs4B9++eWMKuI4TkOyzjrhxdk33oArr4RDDoGhQ0Ofc8ABWUuXKv7L97wwd264E3Ian1NOgZ/9LGspnGbirLPghz/MWoqa4b98zzsN+r8Wpwx+Lp206adtyg1UXuinDdBxnCrop/2DG6i80NGRtQROWvTTzsSpIf20TbmBygv9tAE2JX4unbTpp23KDVRe6KcN0HEcpxJuoPKCG6jmwc+lkzb9tE25gcoLXb0A7DQWU6dmLYFTDzbbrH5lHXpo/crKEW6g8sLQoZ3/x9LbpUBP4xYYM6b48clK+Sxf3rkO1dzlVSNruTTnnhu2Tz21+7p0JXeBv/yluvjV6Ks0zrhx1eVR4Omnq4+/cGHn9AcfnF7b6akOFiwI21tskW677Et73zH+0Hv06LC+5ZbKaa+7LsQ58shVdXrbbd2X2915S3Ppp+9IuoFyOiOV70id7Mnb7xLyJg8U225Ly6r71aRxcoUbKKczebxY05YpTx1rX+uWh7rkqc0UZKlGL5Xi5EGnjhsopwyVXFF5IK2OI08dUE90nSe5oShPntpLTwyUk2vcQDmdyaOLz0dQ+aRZDVSe2kc/xg2UU548dThJvOPIF3k8H26gmgY3UE5n+sPF2R/qWE/ydEPjkySaBjdQTmfy+AzKXXyBcnJnWZdGd/HlqR04neiTgZJ0lqSXJT0el+b6W1Z/JY/PoAr09w4lb/VvdAPl5Jo0RlAXmtn4uNydQn5OHqi2w2nUTiAPcn/qU2Gdp869p+RBj6X0xkCVnoM81qsf4i4+pzN5nPbcjC6+PMiQFnkysj6CahrSMFAnSpor6WpJa1eKJOl4SbMkzVq6dGkKxTo1JU8dTpL+/h5U3siTHgv0ZpKEk0u6NVCS/ihpfpnlIOD/AZsA44FXgfMr5WNmV5jZBDOb0N7enpb8Tq3o7qL2u9S+0xvd+SSJ7vFJEk1DW3cRzGyfajKSdCVwV58lcrKnmkkS9TZQzeji6w15k7vRDVRpmgJ503M/pa+z+EYmdg8B5vdNHKfhqPeF7C6+zuShLo1qoPKgO6ci3Y6guuE8SeMBA14Avt5XgZycUO0IqlHJQ8eUlosvS/ImD7j7uYno0wjKzI4ys63MbGszm2xmr6YlmNMHkv9yqobDDgvrr8f7ixNOgMmTw/a225ZP09a2almHHLLq8aFDi9ujRoX1UUd1zmfvvbuWbY89wnrixLDepwuP89ZbF7cPOqjrfMeMKf4vCOCYY7qOn2T33YvbBx5Yfboku+5aLHPkyC6j/pNddoERIzqHT5nSOxl6y6RJxe3hw8P6a1/rPt3o0bDWWunLs//+q+4fe2xYF9rm+PGV0xba98EHw7BhxfAtt0xJOKcvyDK4E54wYYLNmjWr7uX2G8xg5cqiEemKFSvCbKeWlpDuo49g0KBw97lsGQwcWJwNVS5ta2soq5DHihXQ0QEDBoS8VlutKFMhTpKOjrAkZV25MqQtlF1Is3x5yLcSHR3Fr2CUK6uQ9/LloY4rVxbr39ZW3R33ypUhXqGulcqpJg8p5NFVnSDEMQu6bmmBjz8OeQwcWNR1PSk9Z8uXV6e/lSvDurW1tvKYFfXaXZuBYpxCe5CK7dapC5Jmm9mE0vC+uvicPCJVZ5xg1XgSDB5c3E9ud5U2mUdyu7v0UL6Db22FNdboHLe7jqYaQ9HaWuwgk9vVkoxfrY67yqMa41JazsCB5fOqF6XnrFoDWStZS+WRijJVI1shTm/ag1NT/EVdx3EcJ5dk4uKT9B7wVN0Lbk5GAK9nLUQT4fpMD9dlejS7Ljc0s04vyGbl4nuqnL/R6TmSZrku08P1mR6uy/Tor7p0F5/jOI6TS9xAOY7jOLkkKwN1RUblNiOuy3RxfaaH6zI9+qUuM5kk4TiO4zjd4S4+x3EcJ5e4gXIcx3FySV0NlKT9JD0l6VlJp9Wz7DwTf/a4RNL8RNhwSfdKeiau104cOz3q8ClJ+ybCt5M0Lx67WArfnpE0UNKvY/jfJI2tawXriKT1Jd0vaaGkJyR9K4a7PnuBpEGSZkqaE/X5oxju+uwlklolPSbprrjvuqyEmdVlAVqB54CNgdWAOcBn6lV+nhdgd+CzwPxE2HnAaXH7NODcuP2ZqLuBwEZRp63x2ExgZ0DAPcD+MfwE4LK4/WXg11nXuYa6HAl8Nm4PAZ6OOnN99k6fAtaM2wOAvwE7uT77pNOTgRuBu+K+67KSrup4UnYGpif2TwdOz1oBeVmAsSUG6ilgZNweSXi5uZPegOlRtyOBJxPhXwEuT8aJ222EN9KVdZ3rpNf/AT7v+kxFl6sDjwI7uj57rcMxwP8CeyUMlOuywlJPF99o4KXE/uIY5pRnPYu/L4nrdWN4JT2Ojtul4aukMbMVwDvAOjWTPCdE98a2hLt+12cviS6px4ElwL1m5vrsPRcB3wM6EmGuywrU00CV+xa/z3HvOZX02JV++53uJa0J3A5828ze7SpqmTDXZwIzW2lm4wl3/ztIGtdFdNdnBSR9EVhiZrOrTVImrF/psp4GajGwfmJ/DPBKHctvNP4haSRAXC+J4ZX0uDhul4avkkZSGzAUeLNmkmeMpAEE43SDmf0mBrs++4iZvQ08AOyH67M37ApMlvQCcDOwl6TrcV1WpJ4G6hFgM0kbSVqN8ADvzjqW32jcCRwdt48mPEsphH85ztbZCNgMmBldA+9J2inO6PlqSZpCXl8C7rPopG42Yt2vAhaa2QWJQ67PXiCpXdKwuD0Y2Ad4EtdnjzGz081sjJmNJfR/95nZkbguK1PnB4QHEGZVPQeckfUDuLwswE3Aq8Bywh3QVILf+H+BZ+J6eCL+GVGHTxFn78TwCcD8eOwSil8KGQTcCjxLmP2zcdZ1rqEudyO4NOYCj8flANdnr/W5NfBY1Od84MwY7vrsm14nUpwk4bqssPinjhzHcZxc4l+ScBzHcXKJGyjHcRwnl7iBchzHcXKJGyjHcRwnl7iBchzHcXKJGyin6ZG0jqTH4/KapJfj9vuSLq1Rmd+W9NVa5N1NucdIuqQX6dol/b4WMjlOb2nLWgDHqTVm9gYwHkDSWcD7ZvazWpUX3+D/GuEL9Q2BmS2V9KqkXc3soazlcRzwEZTTj5E0MfFPnrMkXSvpD5JekDRF0nnxnzu/j59PKvyH50+SZkuaXvhETQl7AY9a+Fgnkk6StEDSXEk3x7AdJM2I/wWaIWmLGH6MpDskTZO0SNKJkk6O8R6WNDzGe0DSRTHtfEk7lKlfu6TbJT0Sl11j+B6JEeVjkobEJHcAR6SqZMfpA26gHKfIJsAk4CDgeuB+M9sKWAZMikbq/wJfMrPtgKuBn5bJZ1cg+UHQ04BtzWxr4Bsx7ElgdzPbFjgTODsRfxxwOLBDzP/DGO+vhM/aFFjDzHYh/APo6jJy/By40My2B/4V+O8YfgrwTQsfgP1crB/ArLjvOLnAXXyOU+QeM1suaR7hB5uFZzLzCP/r2oJgPO6NPzBtJXyiqpSRwMLE/lzgBkl3EEYpED7iea2kzQifZhqQiH+/mb1H+N7aO8C0hBxbJ+LdBGBmf5a0VuGbeQn2AT4TZQVYK46WHgIukHQD8BszK/y6YQkwqkx9HCcT3EA5TpGPAcysQ9JyK34HrINwrQh4wsx27iafZYRvohWYRPhr8mTgB5K2BP6TYIgOUfhv1QOlciTK/jixnbxmS79TVrrfQvh53bKS8HMk/Y7wjcKHJe1jZk9GmUvjOk5muIvPcarnKaBd0s4QfusRjU0pC4FNY5wWYH0zu5/wo7phwJqEEdTLMf4xvZTnsFjGbsA7ZvZOyfE/ACcWdiSNj+tNzGyemZ1LcOt9KkbZnPABUsfJBW6gHKdKzOwTwi8MzpU0h/Cl9F3KRL2HMGKC4Aa8ProNHyM8E3obOA/4L0kPxTi94S1JM4DLCF/AL+UkYEKcnLGA4vOvb8eJFXMII6Z7YviewO96KYvjpI5/zdxxaoCk3wLfM7NnapT/A8ApZjYrxTz/DBxkZm+llafj9AUfQTlObTiNMFmiIZDUDlzgxsnJEz6CchzHcXKJj6Acx3GcXOIGynEcx8klbqAcx3GcXOIGynEcx8klbqAcx3GcXPL/AVZt/Di9pY8CAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "=== Non-Centered Case ===\n", "stft: center=False; istft: center=False\n", "Number of samples of x: 46656\n", "Number of samples of x_rec: 46656\n", "Signals x and x_inv agree: False\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAa8AAACICAYAAABQtWQ7AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAVoklEQVR4nO3de7yVVZ3H8c+Xq6SmIOgLgcSMNLwn4q2CHEvUFMfqJXYRzBknyxxf5SSMrxynbNJeeclRx0xNC69lKeYY3sBKIwSUqxAoKiiJ4P0SIvzmj7XO+Hjae5/DOXuffTbn+369ntd5nvWstZ71rL3P/p219nOeRxGBmZlZI+lW7waYmZltKgcvMzNrOA5eZmbWcBy8zMys4Th4mZlZw3HwMjOzhuPgZWZmDcfByzqMpCslfaewfaqk5yW9Lmk7SYdIWpq3j61jU6tO0rmSJte7HZsbSaMlrax3O6zj9ah3A2zzIOkpYAfgHWADsAj4OXBVRGwEiIivFvL3BC4CDoyIuTntu8BlEfHjjm195ybpXOBDEfGlerfFrLPwyMuq6eiI2BrYCTgfOAu4pkzeHYAtgIWFtJ2abbeaJP8hZlXn91Xn5eBlVRcRr0TEFOB4YLykPQAkXSfpPEkfBpbk7C9LekDSE8AHgTvztGFvSdtIukbSKknP5rLdc10TJD0k6WJJLwLn5jI/kvRMno68UlKfnH+0pJWSviVpda7zpKY2S+oj6UJJT0t6RdIfC2UPlPSwpJclzZU0ulBugqQnJb0mabmkL1bomi0k3ZLzzpG0d6GeHSXdJumFXM/pOX0M8O/A8blf5kr6pKT5hbL3SZpZ2P5j07RruXrzvm6SJkp6QtJaSbdK6pf3DZUUksbn/lwj6exSJyWpl6THJH0jb3fPr805ZfIfJelRSa9KWpFHlk37Kh43v07XSXpJ0iJg/3KdLengXH5I3t47v4a7lSuT8z0l6SxJ84A3JPVo4T3QT9LPJD2X23V7pfqtSiLCi5d2L8BTwGEl0p8BTs3r1wHn5fWhQAA9ytUB3A78BNgS2B6YCfxL3jeBNEX5DdL0dx/gEmAK0A/YGrgT+EHOPzrn/y7QEzgSeBPom/dfDkwHBgHdgYOB3nl7bc7fDfhU3h6Q2/UqsGuuYyCwe5n+ORdYD3wuH/9MYHle7wbMBs4BepGC+JPA4YWykwt1bQG8BfTP5/5X4Ll8zn3yvu1aUe8ZwAxgcD7XnwA3NXt9fprr3BtYB3ykzPntAbwEfAQ4O9fbvUze0cCeuX17Ac8Dx7bmuKQR/R/yazwEWACsrPC+/D7wQK5rHnBaK9/Lj+X6+1R6D+T8dwG3AH3z6zmq3r+PXWGpewO8bB4L5YPXDODsvH4drQxepGnFdUCfwv4TgGl5fQLwTGGfgDeAXQppBwHL8/ro/KFePN5q4MD8gfQWsHeJ9p8F/KJZ2lRgPCl4vQx8ttjOMv1zLjCjsN0NWAV8HDigeC55/yTgZ4Wyk5vt/wNwXG7/PcCtwBjgk8C8nKeleh8H/qGwbyApwPYovD6DC/tnAuMqnOO3gMWkIDZsE947lwAXN3tflDwuKfiOKew7hcrBqycpgM8Hfgeole/lr7TyPTAQ2Ej+I8hLxy2ez7VaGwS82IZyO5E+eFZJakrrBqwo5CmuDwDeB8wu5BdpFNVkbUS8U9h+E9iKNILZAniiTDs+L+noQlpPUhB9Q9LxpFHUNZIeAr4VEYvLnNP/tzciNipdJbcj6cN6R0kvF/J2JwWoch4kBeSVef0lYBQp4D9YaHulencCfiNpY2H/BtIfDk3+Wlhv6q9yrieNdG6LiKXlMkk6gDSC2oM0IuwN/LJZtnLH3ZH3vu5PV2gPEbFe0nXApcA3I0eeVigeo+x7gDQ6ezEiXmplvVYlDl5WM5L2JwWvP7ah+ArSB3H/ZgGnqPhBtIY0eto9Ip7dxGOtAf4G7ALMLdGOX0TEP5dsQMRUYGr+fuw80nTXx8scZ0jTiqRupOm650jTmcsjYliZcqU+cB8ELiRNy55PCl4/JfXZ5YW2V6p3BWmE8VDzHZKGlilTyRXAb4HDJX0sIsq97jcClwFHRMTfJF1C+gOiNVaR+rHpwp4PVMosaRDwH8DPgAsl7R8R61pxnGKfl30PSBoI9JO0bUS83Ip6rUp8wYZVnaT3S/oMcDNpumt+S2Wai4hVpOmwC3N93STtImlUmfwbSR/eF0vaPrdjkKTDW3GsjcC1wEX5Aofukg6S1BuYDBwt6fCcvoXSxR+DJe0g6RhJW5KCxuukkUs5+0k6TukKtjNymRmkabFX80UCffJx9sjBH9J3QkNzwGvyMLArMBKYGRELSSOEA4Df5zwt1Xsl8H1JO+X+GiBpbEv9VYqkLwP7kaZzTweul1RulLY1abTyN0kjgS9swqFuBSZJ6itpMOk7z3JtEmmq+hrgZFLg+94mHKtJ2fdAfp/eDVyR29RT0ifacAzbRA5eVk13SnqN9Jfq2aT/4zqpcpGKTiRNKy0ijSx+RfqOoZyzgGXADEmvAveRPuBb40zS9yKPkKY5LwC6RcQKYCzpir8XSOf2b6TfnW6k73mey2VGAV+rcIw7SFdgvgR8GTguItZHxAbgaGAf0kUca4CrgW1yuaYptbWS5gBExBvAHGBhRLyd9/8JeDoiVuc8LdX7Y9IFLvfk120GKfhtEkkfIH1vdWJEvB4RNwKzgIvLFPka8N18zHNIAam1/pM0Vbic9MfNLyrkPZ00BfqdPF14EnCSpHIj45JaeA9Aei3Xk77vW036w8RqTK2fAjYzM+scPPIyM7OG4ws2zKxLydOci8rsHh4Rz3Rke6xtPG1oZmYNp8uPvPr37x9Dhw6tdzPMzKyZ2bNnr4mIAaX2dfngNXToUGbNmlXvZpiZWTOSyv4Tui/YMDOzhuPgZWZmHWfPPUFKy5ZbwurVbarGwcvMzDrOggXvrr/5Jkyf3qZqHLzMzKzhOHiZmVnHeHZT75ldnoOXmZl1jMGD/z7t3UcYbRIHLzMzazgOXmZm1nAcvMzMrLbWrSs/PbhxY+n0Fjh4mZlZbf3lL+X3rV3bpiodvMzMrOE4eJmZWW1VuqKwjU82cfAyM7PaauPl8JU4eJmZWf145GVmZp2Spw3NzGyz4uBlZmYNx//nZWZmnZIv2DAzs4bj77zMzGyzMnlym4o5eJmZWW1VGnnNmdOmKh28zMystto4NViJg5eZmdVWZw1eksZIWiJpmaSJJfZL0qV5/zxJH22prKR+ku6VtDT/7FvYNynnXyLp8EL6fpLm532XSjW4xMXMzOqu3cFLUnfgcuAIYDhwgqThzbIdAQzLyynA/7Si7ETg/ogYBtyft8n7xwG7A2OAK3I95HpPKRxrTHvPz8zMOp8eVahjJLAsIp4EkHQzMBZYVMgzFvh5RAQwQ9K2kgYCQyuUHQuMzuWvB6YDZ+X0myNiHbBc0jJgpKSngPdHxJ9yXT8HjgXurtj6NWtg5sy2n701rpYG5q0ZuG+OeTpTWzoyT2dqS0fm6YjjrFhRuWwbPoOrEbwGAcWWrQQOaEWeQS2U3SEiVgFExCpJ2xfqmlGirvV5vXl6ZU8/DQc0b66ZmXWYNnwGVyN4lQq3zb+dK5enNWVbe7xW1yXpFNL0Irttuy3ccEMLh7SGEdG6vxJb+gK5NV8wb455OlNbOjJPZ2pLR+bpqOPceCM88ED5/XfdVTr9qKPKFqlG8FoJDClsDwaea2WeXhXKPi9pYB51DQRWt1DXyrxeqR0ARMRVwFUAI0aMCI48stL5mZlZe2y9deXg1YbP4GpcbfgIMEzSzpJ6kS6mmNIszxTgxHzV4YHAK3lKsFLZKcD4vD4euKOQPk5Sb0k7ky7MmJnre03SgfkqwxMLZczMrF66d285zyZq98grIt6RdBowFegOXBsRCyV9Ne+/Evhf4EhgGfAmcFKlsrnq84FbJZ0MPAN8PpdZKOlW0kUd7wBfj4gNucypwHVAH9KFGpUv1jAzs9rr27flPJtIUYN/HmskI0aMiFmzZtW7GWZmm68HH4TRo8vvLxOHJM2OiBGl9vkOG2ZmVlt+JIqZmTWcznp7KDMzs47k4GVmZg3HwcvMzBqOg5eZmdXPqae2qZiDl5mZ1c+wYW0q5uBlZma15asNzcxss9LG/wFz8DIzs4bj4GVmZrXlO2yYmdlmxdOGZmbWcPr3b1MxBy8zM6utSlcb9urVpiodvMzMrOE4eJmZWf3069emYg5eZmZWH5/+NBx6aJuKOniZmVnHGDXqvdtTp/pqQzMz6+SqeJsoBy8zM+s43aoTdtpVi6R+ku6VtDT/7Fsm3xhJSyQtkzSxNeUlTcr5l0g6PKe9T9JdkhZLWijp/EL+CZJekPRYXv6pPedmZmZVJsGGDWkE1s5RWHtD4ETg/ogYBtyft99DUnfgcuAIYDhwgqThlcrn/eOA3YExwBW5HoAfRcRuwL7AIZKOKBzulojYJy9Xt/PczMysk2pv8BoLXJ/XrweOLZFnJLAsIp6MiLeBm3O5SuXHAjdHxLqIWA4sA0ZGxJsRMQ0g1zUHGNzOczAzswbT3uC1Q0SsAsg/ty+RZxCworC9MqdVKl+pDACStgWOJo3YmnxW0jxJv5I0pFyjJZ0iaZakWS+88EILp2hmZp1Ni8FL0n2SFpRYxrZUtqmKEmktTXZWLCOpB3ATcGlEPJmT7wSGRsRewH28O6L7+4oiroqIERExYsCAAS00xczMOpseLWWIiMPK7ZP0vKSBEbFK0kBgdYlsK4HiKGgw8FxeL1e+UhmAq4ClEXFJoZ1rC/t/ClxQ+czMzKxRtXfacAowPq+PB+4okecRYJiknSX1Il2IMaWF8lOAcZJ6S9oZGAbMBJB0HrANcEbxIDn4NTkGeLztp2VmZlVTxf/vatLiyKsF5wO3SjoZeAb4PICkHYGrI+LIiHhH0mnAVKA7cG1ELKxUPiIWSroVWAS8A3w9IjZIGgycDSwG5ij9Z/Zl+crC0yUdk/O/CExo57mZmVk1VfGhlIoaRMRGMmLEiJg1a1a9m2FmtvmaNi3dw3DUKJg+vdXFJM2OiBGl9vkOG2ZmVltVHHE1cfAyM7OG4+BlZmYNx8HLzMxqqwbXVjh4mZlZx6jid18OXmZm1nAcvMzMrOE4eJmZWcNx8DIzs4bj4GVmZrU1bFj6OW5c1aps770NzczMKhs8GN5+G3pUL+Q4eJmZWe317FnV6jxtaGZmDafL31Ve0mvAknq3o8H0B9bUuxENxn226dxnbbM59dtOEVHycfeeNoQl5W65b6VJmuU+2zTus03nPmubrtJvnjY0M7OG4+BlZmYNx8ELrqp3AxqQ+2zTuc82nfusbbpEv3X5CzbMzKzxeORlZmYNx8HLzMwaTpcOXpLGSFoiaZmkifVuT0eSdK2k1ZIWFNL6SbpX0tL8s29h36TcT0skHV5I30/S/LzvUik9bU5Sb0m35PQ/SxraoSdYA5KGSJom6XFJCyX9a053v5UhaQtJMyXNzX32nzndfdYCSd0lPSrpt3nbfVYUEV1yAboDTwAfBHoBc4Hh9W5XB57/J4CPAgsKaT8EJub1icAFeX147p/ewM6537rnfTOBgwABdwNH5PSvAVfm9XHALfU+5yr02UDgo3l9a+AvuW/cb+X7TMBWeb0n8GfgQPdZq/rum8CNwG/ztvus2D/1bkAd3xgHAVML25OASfVuVwf3wdBmwWsJMDCvDyT9A/ff9Q0wNfffQGBxIf0E4CfFPHm9B+k//lXvc65y/90BfMr91ur+eh8wBzjAfdZiXw0G7gcOLQQv91lh6crThoOAFYXtlTmtK9shIlYB5J/b5/RyfTUorzdPf0+ZiHgHeAXYrmYt72B5mmVf0kjC/VZBnv56DFgN3BsR7rOWXQJ8G9hYSHOfFXTl4KUSaf6/gdLK9VWlPtxs+1fSVsBtwBkR8WqlrCXSuly/RcSGiNiHNJoYKWmPCtm7fJ9J+gywOiJmt7ZIibTNvs+6cvBaCQwpbA8GnqtTWzqL5yUNBMg/V+f0cn21Mq83T39PGUk9gG2AF2vW8g4iqScpcN0QEb/Oye63VoiIl4HpwBjcZ5UcAhwj6SngZuBQSZNxn71HVw5ejwDDJO0sqRfpS8spdW5TvU0Bxuf18aTvdJrSx+UrlHYGhgEz89TFa5IOzFcxndisTFNdnwMeiDzB3qjyOV4DPB4RFxV2ud/KkDRA0rZ5vQ9wGLAY91lZETEpIgZHxFDS59IDEfEl3GfvVe8v3eq5AEeSrhh7Aji73u3p4HO/CVgFrCf9FXYyac77fmBp/tmvkP/s3E9LyFcs5fQRwIK87zLevWvLFsAvgWWkK54+WO9zrkKffYw0tTIPeCwvR7rfKvbZXsCjuc8WAOfkdPdZ6/pvNO9esOE+Kyy+PZSZmTWcrjxtaGZmDcrBy8zMGo6Dl5mZNRwHLzMzazgOXmZm1nAcvMzaQNJ2kh7Ly18lPZvXX5d0RY2OeYakE2tRdwvHnSDpsjaUGyDpd7Vok1mPejfArBFFxFpgHwBJ5wKvR8SPanW8fBeEr5CeBNAQIuIFSaskHRIRD9W7PbZ58cjLrIokjS48f+lcSddLukfSU5KOk/TD/Hyl3+VbTTU9c+lBSbMlTW26BVAzhwJzIt1EFUmnS1okaZ6km3PaSEkP52dAPSxp15w+QdLtku6UtFzSaZK+mfPNkNQv55su6ZJcdoGkkSXOb4Ck2yQ9kpdDcvqowkj0UUlb5yK3A1+saieb4eBlVmu7AEcBY4HJwLSI2BN4CzgqB7D/Bj4XEfsB1wLfL1HPIUDxRq0TgX0jYi/gqzltMfCJiNgXOAf4r0L+PYAvACNz/W/mfH8i3TaoyZYRcTDpeU/XlmjHj4GLI2J/4LPA1Tn9TODrkW7A+/F8fgCz8rZZVXna0Ky27o6I9ZLmkx6A2vQd0HzS89R2JQWWe/NDbruTbtvV3EDg8cL2POAGSbeTRjeQbq56vaRhpNtY9SzknxYRr5HudfcKcGehHXsV8t0EEBG/l/T+pvsSFhwGDM9tBXh/HmU9BFwk6Qbg1xHR9CiO1cCOJc7HrF0cvMxqax1ARGyUtD7evR/bRtLvn4CFEXFQC/W8RbofXZOjSE/DPgb4jqTdge+RgtQ/Kj1vbHrzdhSOva6wXvwcaH6/uObb3UgPMXyrWfr5ku4i3etxhqTDImJxbnPzvGbt5mlDs/paAgyQdBCkR67kQNTc48CHcp5uwJCImEZ6YOG2wFakkdezOf+ENrbn+HyMjwGvRMQrzfbfA5zWtCFpn/xzl4iYHxEXkKYKd8tZPky6MaxZVTl4mdVRRLxNeiTFBZLmku5Uf3CJrHeTRlqQphYn56nIR0nfQb0M/BD4gaSHcp62eEnSw8CVpCcNNHc6MCJfKLKId79vOyNf5DGXNNK6O6d/ErirjW0xK8t3lTdrEJJ+A3w7IpbWqP7pwJkRMauKdf4eGBsRL1WrTjPwyMuskUwkXbjRECQNAC5y4LJa8MjLzMwajkdeZmbWcBy8zMys4Th4mZlZw3HwMjOzhuPgZWZmDef/AADyUYVKwsZuAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "=== Centered vs. Non-Centered Case ===\n", "stft: center=True; istft: center=False\n", "Number of samples of x: 46656\n", "Number of samples of x_rec: 46656\n", "Signals x and x_inv agree: False\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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RSm+9O/fv9it0K2RJC4j1q1bB0BKSkqerKG0tDTi4+MByxX4l7/8JYTSKYpSkBQ35ZQTqqBKMNHR0ezatYtrr702z3UcPHiQn376idatW4dQMuVy5pNPPuHQoUPUrl2buLg4mjZtWtQilRiefvrpohYhpKiCKuE0btwYhxv38OHDxMbGkpGREVQd8+bNY968eQBUrVo1LAdZleLDr7/+6vz766+/uimob7/91u8KrCkpKURHRxeKjOHGddddR2Jiot/jffv2pWbNmiFdLDAcCL/RMqXAqFWrFh999FG+6jh9+jSZmZkhkkgJBs84j+HMnDlzfKbPnDmTChUquKVlZWUBlmvZ4Z72ZNasWbz99tt8/vnnAF4vWe+++24+JQ5PBg0axIsvvsif/vQnWrVq5TPPyy+/TP369UuccgJVUJcdffr0YdmyZSxfvpwtW7Zw3333BV3H22+/zb/+9S9mz56tH/8WENu2bSMhIcG5/+WXXzJjxgy/+YcPH058fDwjR44sDPFyxdfbfqdOndi6dSvnz593prVr147hw4fzyCOPMGbMGDIyMkhJSXErl5SUxNatW3nllVdo06YN8fHxbt8DTpw4kVOnTnH27Nlc5Xr99de90t5///2AzmncuHEB5fMkIiKCfv36OffXrFkTULlu3bpRqVIl54q1PXr08Aph9oc//IHSpUuuI0wV1GWGiHDbbbdx66230qxZM7744oug6zh//jzHjx9ny5YtpKWl8eGHHxaApCWPqKioXPuqbdu2xMfHM3PmTIwxxMfH07JlS7Zv386FCxfc8iYlJbFy5UomTZrkDEKcmZnJm2++6VXvuXPn8iRzXr6zi4iIYO3atc79evXq8cwzz3DLLbc405KTk9m0aROrV68GoFGjRs5j7733HhMnTuSTTz7hscceY/LkySQnJzNixAg3D0DFihV54YUXnBaYPyvqtdde46WXXiIuLo709HT27dvnPPbOO+9w7NixHM/n73//O126dPHqQ4c1lxtDhgyhVq1aVKtWDYBFixYFVM5XiLK77rrLbb9JkyYB1VVcyZfqFZFqwHQgFkgC/miMOe0jXxJwDsgCMn1NJ1SKhnLlyrF582ZatGiR5zqCDcNUEvj888+DCur72muvYYyhW7duHDlyhB9//NFnvi5dupCcnEyNGjUA642/Z8+ezuNjx44lIiKC1NRU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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def print_plot(x, x_rec):\n", " print('Number of samples of x: ', x.shape[0])\n", " print('Number of samples of x_rec:', x_rec.shape[0])\n", " if x.shape[0] == x_rec.shape[0]:\n", " print('Signals x and x_inv agree:', np.allclose(x, x_rec))\n", " plt.figure(figsize=(6, 2))\n", " plt.plot(x-x_rec, color='red')\n", " plt.xlim([0, x.shape[0]])\n", " plt.title('Differences between x and x_rec')\n", " plt.xlabel('Time (samples)');\n", " plt.tight_layout()\n", " plt.show()\n", " else:\n", " print('Number of samples of x and x_rec does not agree.')\n", "\n", "fn_wav = os.path.join('..', 'data', 'C2', 'FMP_C2_F05c_C4_violin.wav')\n", "Fs = 11025\n", "x, Fs = librosa.load(fn_wav, sr=Fs) \n", " \n", "N = 4096\n", "H = 2048\n", "L = x.shape[0]\n", "\n", "print('=== Centered Case ===')\n", "X = librosa.stft(x, n_fft=N, hop_length=H, win_length=N, window='hann', pad_mode='constant', center=True)\n", "x_rec = librosa.istft(X, hop_length=H, win_length=N, window='hann', center=True, length=L)\n", "print('stft: center=True; istft: center=True')\n", "print_plot(x, x_rec)\n", "\n", "print('=== Non-Centered Case ===')\n", "X = librosa.stft(x, n_fft=N, hop_length=H, win_length=N, window='hann', pad_mode='constant', center=False)\n", "x_rec = librosa.istft(X, hop_length=H, win_length=N, window='hann', center=False, length=L)\n", "print('stft: center=False; istft: center=False')\n", "print_plot(x, x_rec)\n", "\n", "print('=== Centered vs. Non-Centered Case ===')\n", "X = librosa.stft(x, n_fft=N, hop_length=H, win_length=N, window='hann', pad_mode='constant', center=True)\n", "x_rec = librosa.istft(X, hop_length=H, win_length=N, window='hann', center=False, length=L)\n", "print('stft: center=True; istft: center=False')\n", "print_plot(x, x_rec)\n", "\n", "plt.figure(figsize=(6, 2))\n", "plt.plot(x, color='black')\n", "plt.xlim([0, x.shape[0]])\n", "plt.plot(x_rec, color='gray')\n", "plt.title('Signal x (black) and x_rec (gray)')\n", "plt.xlabel('Time (samples)');\n", "plt.tight_layout()\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## libfmp Implementation \n", "\n", "We also provide an implementation of the inverse FFT, the STFT, and the inverse STFT in our library `libfmp`. These implementations also include padding options and realize the centric view as used in the FMP notebooks (similar to `librosa`). In the following code cell, we call these `libfmp` function." ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:59:44.510836Z", "iopub.status.busy": "2024-02-15T08:59:44.510643Z", "iopub.status.idle": "2024-02-15T08:59:50.057982Z", "shell.execute_reply": "2024-02-15T08:59:50.057300Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "import sys\n", "sys.path.append('..')\n", "from libfmp.c2 import fft, stft, ifft, istft\n", "\n", "L = 256\n", "t = np.arange(L)/L\n", "omega = 4\n", "x = np.sin(2 * np.pi * omega * t*t)\n", "\n", "X = fft(x)\n", "x_rec = np.real(ifft(X))\n", "plt.figure(figsize=(8, 2))\n", "plt.plot(x, color='k', linewidth=4, label='Original waveform')\n", "plt.plot(x_rec, color=[0.8, 0.8, 0.8], linestyle=':', linewidth=4, label='Reconstructed with inverse FFT')\n", "plt.xlim([0,L-1])\n", "plt.xlabel('Time index')\n", "plt.ylabel('Amplitude')\n", "plt.legend()\n", "plt.tight_layout()\n", "\n", "N = 64\n", "H = 3 * N // 8\n", "w = scipy.signal.get_window('hann', N)\n", "X_stft = stft(x, w=w, H=H)\n", "x_stft_rec = istft(X_stft, w=w, H=H, L=L)\n", "plt.figure(figsize=(8, 2))\n", "plt.plot(x, color='k', linewidth=4, label='Original waveform')\n", "plt.plot(x_stft_rec, color=[0.8, 0.8, 0.8], linestyle=':', linewidth=4, label='Reconstructed with inverse STFT')\n", "plt.xlim([0,L-1])\n", "plt.xlabel('Time index')\n", "plt.ylabel('Amplitude')\n", "plt.legend()\n", "plt.tight_layout()\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Further Notes\n", "\n", "In this notebook, we have seen that a time-domain signal can be perfectly reconstructed from an STFT under mild conditions on the window function and the hopsize parameter (one only requires $\\sum_{n\\in\\mathbb{Z}} w(r-nH)\\not= 0$ for $r\\in\\mathbb{Z}$). In practice, one often modifies an STFT and then tries to reconstruct a time-domain signal from the modified STFT. Such a reconstruction, however, is generally not possible and involves some unanticipated pitfalls. For a further discussion of this topic, we refer to the [FMP notebook on signal reconstruction](../C8/C8S1_SignalReconstruction.html)." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", "Acknowledgment: This notebook was created by Meinard Müller and Frank Zalkow.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "
\"C0\"\"C1\"\"C2\"\"C3\"\"C4\"\"C5\"\"C6\"\"C7\"\"C8\"
" ] } ], "metadata": { "anaconda-cloud": {}, "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.8.16" } }, "nbformat": 4, "nbformat_minor": 1 }