{ "cells": [ { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden" }, "source": [ "# Quantization of Signals\n", "\n", "*This jupyter notebook is part of a [collection of notebooks](../index.ipynb) on various topics of Digital Signal Processing. Please direct questions and suggestions to [Sascha.Spors@uni-rostock.de](mailto:Sascha.Spors@uni-rostock.de).*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Non-Linear Requantization of a Speech Signal\n", "\n", "Speech signals have a [non-uniform amplitude distribution](../random_signals/important_distributions.ipynb#Example) which is often modeled by the Laplace distribution. Linear uniform quantization is not optimal for speech signals, since small signal amplitudes are more likely than higher ones. This motivates a non-linear quantization scheme, where the signal is companded before linear quantization and expanded afterwards. \n", "\n", "The following example illustrates the [A-law quantization scheme](https://en.wikipedia.org/wiki/A-law_algorithm) used in European telephone networks. In this scheme the signal is first companded by the non-linear A-law characteristic before a linear uniform quantizer is used. This results overall in a non-linear quantization characteristic. First some functions for A-law companding/expanding, quantization and evaluation are defined." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import soundfile as sf\n", "\n", "\n", "def A_law_compander(x):\n", " A = 87.6\n", " y = np.zeros_like(x)\n", " idx = np.where(np.abs(x) < 1/A)\n", " y[idx] = A*np.abs(x[idx]) / (1 + np.log(A))\n", " idx = np.where(np.abs(x) >= 1/A)\n", " y[idx] = (1 + np.log(A*np.abs(x[idx]))) / (1 + np.log(A))\n", " \n", " return np.sign(x)*y\n", "\n", "def A_law_expander(y):\n", " A = 87.6\n", " x = np.zeros_like(y)\n", " idx = np.where(np.abs(y) < 1/(1+np.log(A)))\n", " x[idx] = np.abs(y[idx])*(1+np.log(A)) / A\n", " idx = np.where(np.abs(y) >= 1/(1+np.log(A)))\n", " x[idx] = np.exp(np.abs(y[idx])*(1+np.log(A))-1)/A\n", " \n", " return np.sign(y)*x\n", "\n", "def uniform_midtread_quantizer(x, w):\n", " # quantization step\n", " Q = 1/(2**(w-1))\n", " # limiter\n", " x = np.copy(x)\n", " idx = np.where(x <= -1)\n", " x[idx] = -1\n", " idx = np.where(x > 1 - Q)\n", " x[idx] = 1 - Q\n", " # linear uniform quantization\n", " xQ = Q * np.floor(x/Q + 1/2)\n", " \n", " return xQ\n", "\n", "def evaluate_requantization(x, xQ):\n", " e = xQ - x\n", " # SNR\n", " SNR = 10*np.log10(np.var(x)/np.var(e))\n", " print('SNR: {:2.1f} dB'.format(SNR))\n", " # normalize error\n", " e = .2 * e / np.max(np.abs(e))\n", " return e" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Quantization Characteristic\n", "\n", "Lets first take a look at the non-linear characteristic of the A-law requantizer. The left plot shows the characteristic of the A-law companding and linear-quantization. The right plot shows the overall characteristic for companding, linear quantization and expansion. " ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "x = np.linspace(-1, 1, 2**16)\n", "y = A_law_compander(x)\n", "yQ4 = uniform_midtread_quantizer(y, 4)\n", "yQ8 = uniform_midtread_quantizer(y, 8)\n", "xQ4 = A_law_expander(yQ4)\n", "xQ8 = A_law_expander(yQ8)\n", "\n", "plt.figure(figsize=(10, 4))\n", "\n", "plt.subplot(121)\n", "plt.plot(x, yQ4, label=r'$w=4$ bit')\n", "plt.plot(x, yQ8, label=r'$w=8$ bit')\n", "plt.title('Compansion and linear quantization')\n", "plt.xlabel(r'$x$')\n", "plt.ylabel(r'$x_Q$')\n", "plt.legend(loc=2)\n", "plt.axis([-1.1, 1.1, -1.1, 1.1])\n", "plt.grid()\n", "\n", "plt.subplot(122)\n", "plt.plot(x, xQ4, label=r'$w=4$ bit')\n", "plt.plot(x, xQ8, label=r'$w=8$ bit')\n", "plt.title('Overall')\n", "plt.xlabel(r'$x$')\n", "plt.ylabel(r'$x_Q$')\n", "plt.legend(loc=2)\n", "plt.axis([-1.1, 1.1, -1.1, 1.1])\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Signal-to-Noise Ratio\n", "\n", "Now the signal-to-noise ratio (SNR) is computed for a Laplace distributed signal for various RMS levels $\\sigma_x / x_\\mathrm{min}$. The results show that the non-linear quantization scheme provides a constant SNR over a wide range of levels. The SNR is additional higher as for [linear quantization](../quantization/linear_uniform_quantization_error.ipynb#Example) of a Laplace distributed signal." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAfsAAAEOCAYAAACO1L54AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvOIA7rQAAIABJREFUeJzt3XmcXGWV//HP6b2T7k5n7SxkJSEkJGSFBBBJCIuAgCgqCIg6mB8OLoA4iKgoi4M44IyACgoCDhAcBcGwSxIgELKSjez7vnaSTqfXqjq/P+p2LEJvSaq6uirf9+tVr667n5Ob7lPPvbeex9wdERERSV8ZyQ5AREREEkvFXkREJM2p2IuIiKQ5FXsREZE0p2IvIiKS5lTsRURE0pyKvYiISJpTsRcREUlzKvYiIiJpTsVeREQkzWUlO4B46tSpk/fp0ydu+ztw4ABt27aN2/6SKV1ySZc8QLm0VumSS7rkAcqlMXPnzt3l7p2bWi+tin2fPn2YM2dO3PY3bdo0xo0bF7f9JVO65JIueYByaa3SJZd0yQOUS2PMbH1z1tNlfBERkTSnYi8iIpLmVOxFRETSnIq9iIhImlOxFxERSXMq9iIiImkurb56JyJyONwdM2v2+qFwhM17K+lRnE91KEJFTZiObXOojUQoPVBD29ws8rMzMeBAdZiacITMDCMvO4Oq2ggHqkO0a5NNRXWY4jbZAKzfXUFtOEK7/Oh0UV42m/ZW0KFtDgW5WeRkZZCTmcHuAzXsrwpRVRvGHQaUFFBeFaJ92xxC4Qjb91dTUR2iX+cCVmzfz+b9Edyd1TsPkJVhFLfJprhNTiL+GSUFqNiLSMLUhCJkZxpmhrtTVhliT0UNmRlGl6JcwhFn055KNu+pBAMDsoPCVhOKsHpnOVkZRk04QlVNmIqaMJ0LcymvDlFeHQKPHqcgL4tVO8rpUpgLwLrdFfTq0IaCvCxqQxFCEScUcWpCYZZsLaNNdha7yqspq6qlZ4c2RCJOVW2EytowoVAt7Wa8xc7yanKzMsnJyqBD2xw6FeSwYOM+KmvD5GRmEHYnHHEyM4xMi8YIkJVhhCLerH8fM/AmVs3MMLIyjOpQ5GPze3bIZ2NpJaf27cCm0gq27KsCoDA3i/3VIQAeXTaN9bsrAOjXqS3/vPksMjKMqtowAHe/vIRFm8voXJDDacd3YsKJXejTKT06r5GPU7EXkQZt3lvJ0i1lRNzJMCM7K4OZa3ZTkJfFgeoQ5VUhyqvDrNtcxR9WfUB5dZjaUIS2uZlsK6tiy94qMjOMorws9lbUNrsI1snMMCLu5GRmkJ+TSV5WJjvLq8nLyqC4TQ51jfLd5TX06dT2YCu5f5cCZq8rpTbsZGcaWZlGhhnVtRGG9ywm7M6oPu1pm5PJxtJKcrIyyMvOIC87kw2bNlPYoQPdi/OoDTk14TAbSyvZW1HDl0/pyYCSAjbsriAnK4POhbnsKKumNhyhe3E+1aEw+ypryc7MoDAvm5xMIxxxqkIR8rMzyc/JZOveKgrysqioDhGKOEX52ZQU5VJVG22J76moobhNDpU1YWpCEfZV1lIdCtO9OJ/iNtnkZWWydvcB7nttOQB7DtRwXPs23HB2f8IRZ+aaUs4a2JnZC5fy99WVXDS0G5W1YaYs28HwO99gdJ8OvLNi58FzcWLXQpZv388/l+7gwSkruWZsbz4/8jjyszPZW1nDiV2L4vp/SpJDxV7kGLJ5byUfbd5Hu/xsNu2pJOzRlnVVbZhIxCk9UMOKHfvZtb+GipoQZVWhBveVmWG0zcmkMC8bC0UoyYteis4wKK8KMapXey4+OZ9w0KJv3yabDm1zaN8mh5pw9LJ3ZobRtSiPnh3ycYdQxIm407FtLhF3BpYUkpHx8cvs5dUhcrMyyM5MzCNH06btYty4EQnZdzyN6tWeQd2LKMrL/tj8r57WB4Au5au565oJ5GVnUlETYvBPX6esKsSstaVcMrw7H6zeTe+ObXnmm2MAeHXxNv796Xk8OGUVL87fQm5WBit3lNO3U1tG9Crmjs+eRLs22YeGISlCxV4kDbg7ZVUhlm0tY+WOcqpqw6zaUc6SrWW4Q204en95Q2nFJ7bNsOil8wyL3tft36WAwd2KyMvOpE/HtgzvVUxOZgY14QgbSys4+8QuZGVEW8J197ujXYCe3iK5FuTqzxbAmH4dm1wnLzsTgDY5WUyaOJaC3CyG9GgHRJ8/cDh4Di8Y0pVrT+tNTdh5dtaGg/tYu+sAa3cdYMKJJVx0crf4JyItImG/NWaWB7wD5AbH+au732Fm7wKFwWpdgFnu/rl6tg8Di4LJDe5+SaJiFUkFZVW1bN9XRVVthPmb9jJ7bSlrdx1gd3k1u4J73LHat8nmpO7tMIPcrEzysjO48tRenHZ8R3btr6ZXxzbkZ2fSrk32J1qHDRnZq30iUpMWMPaQDwdZh1wZMTN+fukQQuHIwWL/9TP6cNWY3pzzwNvs2F/VYrFK/CXyI3I1cLa7l5tZNjDdzF519zPrVjCzvwEvNrB9pbsPT2B8Iq1SbTjC8m37+XDDHhZs2sf2sio27alk675Kqmr/VdC7FOYyqFsRA7sW0rEgh84FufTu2JYhPYrIzcqkfZvsw3rSXAQ+/iHg3MElHN+5LdmZxo791R9b73C/ySDJlbBi7+4OlAeT2cHr4NM5ZlYInA18PVExiLR2ew7UsHjLPpZv28+M1btZu+sAm/dWHnzyulNBLt3a5TG4WxFnDujE6D4dyM4wBncvoleHNvpjKwnxlTG9eGbmhuDKkNGlMI/tZVWUVdXysxc/onNRLn+avo7OhbncesGJXDKse7JDliaYN/W9j6PZuVkmMBfoDzzs7rfGLPsqcIm7X97AtiFgPhAC7nX3vzew3kRgIkBJScmoSZMmxS3+8vJyCgoK4ra/ZEqXXFI5j5qwU1rlzN0eYt72MKVVYfZU/6tYd21j9CzKoGOe0addJv2Lo+9ToaCn8nk5VLrkcjR5hCLOvmqnY360lX/njErysyAn0/hwR/jger2LMthQFuGmUbmsL4twbu9s8rLi//81Xc4JxD+X8ePHz3X30U2tl9AnXdw9DAw3s2LgBTMb4u6Lg8VXAn9sZPNe7r7FzPoBU8xskbuvrucYjwKPAowePdrjOU6wxlBufVIpj30VtazYsZ+Za3azYNM+3l6x8+B99WHHtaOk7QFOH9KPkb3bc3znAkqK8pIc8ZFLpfPSlHTJJZ55PLtxDjPXllJWWUvfTm1Zu+sA3xp3PDeM788597/Nr+dV4Q7ZxV259wsnx+WYsdLlnEDycmmRx1rdfa+ZTQM+Ayw2s47AqcBljWyzJfi5Jth2BPCJYi/SWtSEIvxz6XZmryvl7eU7WbPrwMFl/Tq35QsjezC0RzFnDuhEzw5tgl/6AUmMWKR5uhTmsbeiFoBHrxnFrHWlfPbk7hTkZvHpEzrxlzmbAHjhw83ccfFJ5OdkJjNcqUcin8bvDNQGhT4fOAf4ZbD4i8Bkd6/38U4zaw9UuHu1mXUCzgDuS1SsIkeqrKqWVxdt5c8frGfdrgrKq0PkZ2dyUvcivnRKT04oKeCk7u1SutUukpMVvZw/olcxA0oKGVBSeHDZKX06HCz21aEIq3aUM/S4dkmJUxqWyJZ9N+DJ4L59BvAXd58cLLsCuDd2ZTMbDVzv7tcBg4BHzCwSbHuvuy9JYKwizRKOOG+v2MHc9XuYvW4Ps9aWAjCoWxGXjejBhEFdOHNAZzIzWv99dpHmOv34jjw2fS13f27IJ5aN6Rv9St/nR/Tg+Q83s3z7/oPFfuGmvSzavI+rxvRu0XjlkxL5NP5Copfe61s2rp55c4DrgvfvA0MTFZvI4XB3Fm7axz8WbOHlRVvZuq+KrAzj+M4FfG/CAE47viNj+nZIiQfpRI7EhEElrLzngnp7LezVsQ1PfP0URvRsz+SFW1m5ff/BZZc89B4AXzm1l34/kkxdUYnUw91Zv7uCv87dxEsLtrChtILsTOOsE7rwk88OZsKgLuRm6b6kHDsa65543MAuABzfpYCPtpRxzWMzuTbothdgX2WtRtxLMhV7kRj7Kmt59J3VPPX+evZXh8gwOKN/J759dn/OH9xVfYOLNGJwtyL+Ni96/37p1rKD83fsr1axTzIVeznmuTsz1uzmyffXMXXZTmrCES4c2pVT+nTggiHd6NpOD9eJNMe3xh1/sNjvKq85OH9HWTUnxDzUJy1PxV6OWQeqQ7w4fwtPvr+O5dv3075NNtec1pvPj+zBSd31NLHI4erfpYAnvn4Kf56xnreW7Tg4f2e5+tVPNhV7OeYs2rSPR95ZzesfbaM27JzUvYj7Lj+ZS4Z1PzhKmIgcmXEDuxCOOG8t28FJ3Yv4aEsZO8qqmbpsB19/YjZTvn8W/TqnR294qUTFXo4J7s5LC7bw9MwNzFpbSmFuFleP7c1FQ7sxqnd7PSksEkefGtCJ700YwLWn9+FTv5zCjv3VLN4SvYe/cNM+FfskULGXtLavopaHp63iraXbWb3zAP06teWHF5zIV8b0avawriJyeHKzMrnp3BMA6FiQwzMzNzC0R/TWWFamPlgng4q9pKWq2jD/N3cTv5+2mu1lVZx2fEeuO7MfXxrdUx3eiLSgvp0K2Fi6k1nroh1QhSOJG3xNGqZiL2mlrKqWP01fx1Mz1rH7QA3DjmvHb64cwaje7ZMdmsgx6b+/PJyRd715cLq8OpTEaI5dKvaSFmpCEf73g/U8OGUleypqmXBiFyZ+uh+nqmc7kaTq0DaHT/XvxPRVuwAor1KxTwYVe0lpkYgzedFW/uv15WworeBT/TvxwwtOZEgPfXVOpLWIHQhKLfvkULGXlPX+6l3c++oyFm7ax6BuRTz1jVP59Amdkx2WiByipCj34Pv9atknhYq9pJxpy3fw22mrmbW2lO7t8rj/i8P43IgeevBOpJWK7YVSxT45VOwlZewoq+LZpdW8/tpsenVow48uPJGvntZHHeGItHKdC2Jb9rWEwhFu/ssC/u1TfRnWsziJkR07VOyl1ausCfP0zPXc9/pyakIRrhnbm9svGqQiL5Ii8nL+9btaXh1i455KXlqwhfdW7WLuT85NYmTHDhV7adXe+GgbP3vpI7bsq2LcwM6c27mcqz47JNlhichhGBIz1sT+qhBb91YC0a/KSstoeIDio2RmeWY2y8wWmNlHZvbzYP4TZrbWzOYHr+ENbH+tma0MXtcmKk5pncqrQ/z474uY+Oe5FOVn8+w3x/Knr51Cj4KE/ZcVkQTpXJjLunsv4uJh3Vm0eR/PzdkIQG1YHey0lES27KuBs9293Myygelm9mqw7Afu/teGNjSzDsAdwGjAgblm9pK770lgvNIKVIfC/HnGen47bTWlB2qY+Ol+/OD8gWRnqsiLpLo2wa23F+dvOThvX2Ut7fLVdXWiJazYu7sD5cFkdvBq7se484E33b0UwMzeBD4DPBvvOKX12Lm/mm/971zmrN/Dp/p34gfnD9TDOyJpZNn2/Z+Yt2rHfkb17pCEaI4tCW0umVmmmc0HdhAt3jODRfeY2UIz+7WZ5dazaQ9gY8z0pmCepKED1SH++58rOOtXU1mwaS//c8Vw/ve6MSr0Imnmu2f3/0QrfstejXXfEizaAE/wQcyKgReA7wC7gW1ADvAosNrd7zxk/R8Aue5+dzD9E6DC3e+vZ98TgYkAJSUloyZNmhS3uMvLyykoSI+hGFtrLpv2R/ifeVXsrHRGl2Ry+Qk5dG3b8GfQ1prHkVAurVO65NJa84i4843XKw5OX3liDuf3afwyfmvN5UjEO5fx48fPdffRTa7o7i3yInoP/pZD5o0DJtez7pXAIzHTjwBXNnWMUaNGeTxNnTo1rvtLptaWSygc8YemrPT+P3rZR931hn+weleztmtteRwN5dI6pUsurTmPWWt3+9qd5T7g9lf8Fy8vaXL91pzL4Yp3LsAcb0YNTtg9ezPrDNS6+14zywfOAX5pZt3cfatFRyf5HLC4ns1fB35hZnVDlZ0H3JaoWKVlbdtXxU3PzWfGmt1cNLQbd156Eh0L6rubIyLp6JQ+0Xv0JUW5bC/TZfyWkMin8bsBT5pZJtFnA/7i7pPNbErwQcCA+cD1AGY2Grje3a9z91IzuwuYHezrTg8e1pPUVRuO8NCUVfzh3TW4w31fOJkvjj5Oo9KJHKNKCvPYXlad7DCOCYl8Gn8hMKKe+Wc3sP4c4LqY6ceBxxMVn7Ss/VW13PDMh7yzYicXndyNW84bSN9ObZMdlogkUUlRHku3lR2cXrfrAL07tlEDIAH05WVJqEjEefSd1Zz7wDu8t2oX935+KA9/ZaQKvYjQuTCXHUHLfvHmfYz7r2kHx72X+FJ3uZIwoXCEHz6/iL/O3cTYfh347dUjGdmrfdMbisgxoVu7PMqrQ8zbsIcZq3cDsHWf7uEngoq9JMTqneX8x18XMnf9Hr43YQA3njNAl+ZE5GMuG9GDp2du4MZJ8+lRnA9oCNxE0WV8ibtXFm3lkgens2ZnOQ98aRg3nXuCCr2IfEKXojyuGdubDaUVzF4XfQZ7vwbHSQi17CVuKmpC3Pfacp54fx0jehXz8FdG0j34tC4iUp8hPaIj4oUi0Q7e1LJPDBV7iYuFm/ZywzPz2FhaydfP6MNtFwwiJ0sXjkSkcSf1KAIgO9Nom5tFWaVa9omgYi9H7e0VO/n2M/MoysvmuYljGdOvY7JDEpEUUZSXTb/ObelckEvpgRq17BNExV6OWDji/M9bK3lwykoGlhTy2NdOOfiQjYhIc/3+6lHkZWVy43Mfsr9aLftEULGXI7K3ooYbn5vPtOU7uXzUcdx16RDyczKTHZaIpKATSgoBKMrPpvRADQBLtpRRUpSrrrTjRDdV5bAt2VLGxQ9N571Vu/jFZUP51eUnq9CLyFErzMtmf1WISMT58iMz+PU/VyQ7pLShlr0clhfnb+bWvy2kOD+H5/7faeokR0TipjAviz0VNSzZWsb+6hBLtpQ1vZE0i4q9NIu789j0tdz98lJO7duBh78yks6FurwmIvFTmJfF3opaPvvgdABWbi+vG+ZcjpKKvTSpOhTmxy8s5v/mbuL8k0r4zZUjyM3SZXsRia+ivOyPTe+vDqn73DhRsZdG7S6v5rqn5vDhhr189+z+3HjOCWRkqDc8EYm/LXsrPzFv+fb96C/O0dMDetKgzXsr+eIjM1i6tYzfXTWSm88bqEIvIglz0cndAPja6X2Y+Ol+QHTYWzl6atlLvf4yeyN3v7wEB/78b2M4pU+HZIckImnu9OM7se7ei4Do8NhPvLeObWVV9FX3HUdNxV4+JhJxfvXGcn43bTWn9evIXZ87if5dCpMdlogcYzIyjJJ2uWzbVwUq9kctYcXezPKAd4Dc4Dh/dfc7zOxpYDRQC8wC/p+7f6LLJDMLA4uCyQ3ufkmiYpWoA9UhbnpuPm8s2c6Vp/birktPIitTd3pEJDm6FeVHH9DrmuxIUl8iW/bVwNnuXm5m2cB0M3sVeBq4OljnGeA64Hf1bF/p7sMTGJ/E2LK3kuuenMOybWXccfFgvnZ6Hw1LKyJJ1bVdHgs27QU9onfUElbsPfrlyPJgMjt4ubu/UreOmc0CjktUDNI8izbt4xtPzqaqJszjXzuFcQO7JDskERG6tcvjtY+qcM9LdigpL6HXaM0s08zmAzuAN919ZsyybOAa4LUGNs8zszlm9oGZfS6RcR7LFm/ex1V//ICczAye//fTVehFpNUoKcqjJhShXGPjHDVrid6JzKwYeAH4jrsvDub9ATjg7jc2sE13d99iZv2AKcAEd19dz3oTgYkAJSUloyZNmhS3uMvLyykoKIjb/pKpvlxmbQ3x5JJq8jKNH56aR+c2rf/+fLqfk1SlXFqfdMhjzrYQD82v5qahzrAeqZ1LnXifl/Hjx89199FNrujuLfIC7gBuiXn/dyCjmds+AVze1HqjRo3yeJo6dWpc95dMsblEIhH/wzurvfetk/2SB9/19bsOJC+ww5Su5yTVKZfWJx3y2FdZ4yfc/or3vnWy/2X2hmSHExfxPi/AHG9GHU1YU87MOgcteswsHzgHWGZm1wHnA1e6e6SBbdubWW7wvhNwBrAkUbEeS0LhCN//vwXc/fJSzj+phP+7/nR6dWyT7LBERD6hKC+bi4d1B+AHf12Y5GhSWyKfxu8GPGlmmUSfDfiLu082sxCwHpgRPO39vLvfaWajgevd/TpgEPCImUWCbe91dxX7o1QdCnPjpPm8ungbN54zgO+ePUA94olIq/bTiwcze+UWtlZEr0TrW0JHJpFP4y8ERtQzv95juvscol/Dw93fB4YmKrZjUXXIue7JOby7chc/vmgQ153ZL9khiYg0qSgvm9O6ZTFpeQ19b3tFf7+OUOt/IkuO2t6KGn41p4r3Vu3ivi+crF8UEUkpxbn/as0/OWNd0uJIZeouN81t21fFtY/PYt2+CA9/ZSQXDO2W7JBERA5Lu5hiX5Cb3cia0hAV+zQ2d/0eJj41h6raMDePzlOhF5GUVPyxYp+ZxEhSly7jp6m3V+zk6j/OpDAvixe//SkGd9QviIikpuK8fxX7qtp6v8QlTVCxT0OTF27huidn07dTW/7v+tPp3yU9OqMQkWNTXkxbZXd5dfICSWEq9mnmmZkb+M6zHzK8ZzHPThxL58LcZIckInJUYr9ut6u8pq6zNTkMKvZpwt357bRV/OiFRYw7oTNPfWMM7fL1IIuIpIfld3+GH15wIjXhSHTYWzksKvZpwN35z1eXcd9ry7l0eHce/epo8nN0j15E0kduViZdi6Kj351+7xR27FfBPxwq9ikuFI5w698W8ug7a/jqab359ZeGk52p0yoi6adjQc7B968u2pbESFKPqkIKc3du/dsi/jJnE9+dMICfX3KSur8VkbR1at8O3H7hIHoU5zN54ZZkh5NSVOxTVCTi3P3yUv42bxPfmzCAm889QX1Gi0hay83K5Juf7scVp/Rk9ro9bNlbmeyQUoaKfQqqqg3z7Wfn8dj0tXzt9D7ceM6AZIckItJiPhuMhPfKoq1JjiR1NFrszewsMzs5eP8lM3vIzG6qG35WWt6B6hBffXwWry7exo8vGsQdFw9Wi15Ejil9O7VlYEkh767clexQUkaD3eWa2cPAyUCuma0ACoDXgNOBx4GrWiRCOaiqNsx1T85hzrpS/ueKEVwSfLoVETnW9OrYho2lFckOI2U01jf+eHcfbGZ5wGagi7uHzewRYGHLhCd1KmpCXP+/8/hg7W5+/aXhKvQickwrKcplzrrSZIeRMhor9lUA7l5lZuvdPRxMu5nVtkh0AsD63Qf46uOzWL+7gvu+cDKfG9Ej2SGJiCRVSWEeeypqqQ6Fyc1SvyJNaazYdzGzmwGLeU8w3TnhkQkA63Yd4Mo/fEBVbZhJE8cytl/HZIckIpJ0JUEHOzvKqunZoU2So2n9GntA7w9AIdF79XXv66b/2NSOzSzPzGaZ2QIz+8jMfh7M72tmM81spZk9Z2Y5DWx/m5mtMrPlZnb+4SaWDmIL/dPXqdCLiNTpUhR9Tlw96TVPgy17d//5Ue67Gjjb3cvNLBuYbmavAjcDv3b3SWb2e+DfgN/Fbmhmg4ErgJOA7sA/zeyEulsJx4J1uw5wxaMfUB0K88w3xzKoW1GyQxIRaTW6tou27L/wuxk8/++nM7JX+yRH1Lo19jT+bxrb0N2/28RyB8qDyezg5cDZwFeC+U8CP+OQYg9cCkxy92pgrZmtAk4FZjR2zHSxaNM+vvnUHGrCERV6EZF6lBTmHXz/9AcbGNmrPbPXldKjOJ/uxflJjKx1soaGCjSza4O3ZwCDgeeC6S8Cc939piZ3bpYJzAX6Aw8DvwI+cPf+wfKewKvuPuSQ7R4K1vvfYPqxYL2/1nOMicBEgJKSklGTJk1qKqxmKy8vp6CgZceCX7MvzL0zqyjIMW4alUfPwvj0e5SMXBIhXfIA5dJapUsu6ZIH1J+Lu/P116NfvetRYNx9Rj5ff72Cohz4zdltkxFms8T7vIwfP36uu49uckV3b/QFTAWyY6azgalNbXfIPoqD/ZwJrIqZ3xNYVM/6DwNXx0w/BnyhqeOMGjXK42nq1Klx3V9TZq7Z7UPveM3PuPct315WGdd9t3QuiZIuebgrl9YqXXJJlzzcG86lojrkv5+2ynvfOtkXbNzjvW+d7L1vndyywR2meJ8XYI43ow43p9nYneiDeXUKgnnN5u57gWnAWKDYzOpuHxwH1DeawabggwBNrJc2Xl20lasfm0mnwlye/eZYusRcohIRkU/Kz8lkwqASAP7w7tokR9O6NafY3wt8aGZPmNkTwDzgF01tZGadzaw4eJ8PnAMsJdrCvzxY7VrgxXo2fwm4wsxyzawvMACY1YxYU9KT76/j35+Zx9Ae7fjb9afrayQiIs3Uv0sB/bsU8I8Fad0ePGpNFnt3/xMwBngheJ3m7k82Y9/dgKlmthCYDbzp7pOBW4Gbg4fuOhK9RI+ZXWJmdwbH/Aj4C7CEaBe9N3iaPon/7KwN3PHSR5w7qISnrxtD+7b1fhNRREQacOHQbgff52RqfLf6NNapzkHuvo36W+CNbbMQGFHP/DVEn6w/dP5LRFv0ddP3APcczjFTibvz0oIt/PjviznrhM48fNVIsvWfVETksH3l1F785q2VANSEI1TWhMnPUa96sVRdksDdueOlj/jepPkM6dGO36rQi4gcsa7t8vj2+P50Lox2tLP7QHWSI2p9VGGS4MEpq3hqxnr+7VN9+dv1p9E2t1kXWEREpAG3nD+Q/7xsKAC7y2uSHE3r06wqE3xfviR2fXffkKig0tmT76/jgTdX8PmRPfjxRYM0Fr2ISJx0LIg+86SW/Sc1WezN7DvAHcB2IBLMdqJj3ctheG528DDe4BJ++YWTVehFROKoU0H0Mv66XRrn/lDNadl/Dxjo7rsTHUy6cnd+9/Zq7nttOZ8+oTMPfWWE7tGLiMTZce3zGdqjHY+/t5arx/YmJ0t/Z+s0519iI7Av0YGkq3DEuf3vi7nvteVcOrw7f/zqaI29LCKSAGbGD84fyKY9lfz474uSHU6r0pxiYJGrAAAbNUlEQVSW/Rpgmpm9THQkOwDc/YGERZVG/vufK3hm5ga+Ne54fnDeQDIydOleRCRRPn1CZ677VF/+OH0t3z9v4MFx7491zWnZbwDeBHL415j2hY1uIQD8dtoqHpyyii+NPo7/OF+FXkSkJXx2WLRH97nr9yQ5ktajyZa9H/249sccd+f+N1bw0NRVXDq8O/dcNlQP44mItJDB3YrIzcpgzro9H+td71jW2Hj2/+3uN5rZP4g+ff8x7n5JQiNLUe7OnZOX8Kf31nHFKT2557KhZKpFLyLSYnKyMhjWs5h5G9Syr9NYy/7Pwc//aolA0sWDU1bxp/fW8fUz+vDTzw5Wi15EJAkGlhTy4vzNyQ6j1Wiw2Lv73ODn2y0XTupyd+59dRmPvLOGz4/ooUIvIpJEPTvkU1YVYl9FLe3aZCc7nKTTlxDjIBJxfv6PJTzyzhquHtuLe9VhjohIUvVsHx0qfOMedbADKvZHLRJx/uNvC3ni/eil+7suHaKOHEREkqxnh6DYl6rYwxEWezPrHe9AUpG7c/fLS/nr3E18b8IA7rj4JLXoRURagYPFXi17oIlib2anmdnlZtYlmD7ZzJ4BprdIdK3cg1NW8fh7a/na6X248ZwByQ5HREQC7fKzKczN4hevLONDPZXfcLE3s18BjwNfAF42szuIdq4zE2iysplZTzObamZLzewjM/teMP85M5sfvNaZ2fwGtl9nZouC9eYcSXKJEo44//nq0ujodXoYT0SkVbpqbPQi9ANvrkhyJMnX2FfvLgJGuHuVmbUHtgAnu/vKZu47BHzf3eeZWSEw18zedPcv161gZvfTeL/74919VzOP12J+8uJinpm5gavG9OLOS4eoZzwRkVbohxecSJucTB54cwW/nbaKb511/DHbMGvsMn6lu1cBuPseYPlhFHrcfau7zwve7weWAj3qllv0X/xLwLNHEngy1IYj/PK1ZTwzcwPfPLOvOswREWnlrhnbm0HdirjvteV8uHFvssNJmsaK/fFm9lLdC+hzyHSzmVkfYATRWwB1zgS2N/IBwoE3zGyumU08nOMlgrtz+wuL+N201XxueHduOX9gskMSEZEmtG+bw6SJY8nKMF7/aFuyw0kac/9ET7jRBWZnNbZhczvbMbMC4G3gHnd/Pmb+74BV7n5/A9t1d/ctwcOBbwLfcfd36llvIjARoKSkZNSkSZOaE1azlJeXU1BQAMCLq2p4YVUtlxyfzecH5MTtGC0lNpdUli55gHJprdIll3TJA+KTy3/NrmJbRYR7z8wnK4lXZON9XsaPHz/X3Uc3uaK7J+wFZAOvAzcfMj8L2A4c18z9/Ay4pan1Ro0a5fE0depUj0Qifv8by733rZP9puc+9EgkEtdjtJSpU6cmO4S4SJc83JVLa5UuuaRLHu7xyWXKsu3e+9bJ/rtpq44+oKMQ7/MCzPFm1NHGBsKZSj0D4PzrM4JPaOxDRHBP/jFgqbs/cMjic4Bl7r6pgW3bAhnuvj94fx5wZ2PHSwQPvkf/2PS1fGn0cfzn59UznohIKho/sAsjehXzzyXbuf6s45MdTotr7Gn8W+qZNxb4D2BHM/Z9BnANsCjm63U/cvdXgCs45ME8M+sO/NHdLwRKgBeCwpoFPOPurzXjmHHj7jzxUQ1vb1rL18/ow08uGqyn7kVEUljfTm2ZuaY02WEkRZMD4cDB+/c/AXKB69391aZ27O7TgXqro7t/rZ55W4ALg/drgGFNHSORfv/2Gt7eFOKG8cdzy3kD1aIXEUlx3dvls62silA4QlbmsdWteWMte8zsfKJFvoroA3ZTWySqJKusCfP0zPWc2jVThV5EJE10L84nHHF27K+me3F+ssNpUY3ds58NdAZ+BcwI5o2sW+7Bd+jTUX5OJi/ecAazP3hfhV5EJE10K84DYOu+ShX7GAeAcuByol3mxlY9B85OYFxJ17Egl7wsFXoRkXTRIyjwm/dWMeoYG86tsXv241owDhERkYTq1i7ast+ytzLJkbS8xgbCOcXMusZMf9XMXjSz35hZh5YJT0REJD4K87IpbpPN+t3H3rC3jT2O+AhQA2BmnwbuBZ4iOnDNo4kPTUREJL6O71zA6h3lVNaEkx1Ki2qs2Ge6e90XEr8MPOruf3P3nwD9Ex+aiIhIfPXvXMCsdaUM+ulrrNt1INnhtJhGi72Z1d3TnwBMiVnW6Ff2REREWqP+Xf7VL/27K3cmMZKW1VixfxZ428xeBCqBdwHMrD+Nj0EvIiLSKvXq2Obg+w+Ood70Gnsa/x4zewvoBrwRdLgP0Q8I32mJ4EREROJpdO/2dGybQ05WBjPW7CYS8WOiK/RG+wt09w/c/QV3PxAzb0U6d6gjIiLpq2NBLnN/ci7fP28gpQdqWL59f7JDahHHVufAIiIiwGnHdwTg/dW7kxxJy1CxFxGRY06P4nz6dGzDe6t2JTuUFqFiLyIix6RxA7swfdUu9lfVJjuUhFOxFxGRY9JnT+5GTSjCP5duT3YoCadiLyIix6SRvdrTpTCXKcvS//v2KvYiInJMysgwTunTgXnr9yQ7lIRLWLE3s55mNtXMlprZR2b2vWD+z8xss5nND14XNrD9Z8xsuZmtMrMfJipOERE5do3oVczmvZVsL6tKdigJlciWfQj4vrsPAsYCN5jZ4GDZr919ePB65dANzSwTeBi4ABgMXBmzrYiISFyM7N0egH8s2JLkSBIrYcXe3bfWdb7j7vuBpUCPZm5+KrDK3de4ew0wCbg0MZGKiMixamiPdpzatwN3v7yUpVvLkh1OwrTIPXsz6wOMAGYGs75tZgvN7HEza1/PJj2AjTHTm2j+BwUREZFmyc7M4P4vDgNg/sa9SY4mcexfXd4n6ABmBcDbwD3u/ryZlQC7AAfuArq5+zcO2eaLwPnufl0wfQ1wqrt/ok9+M5sITAQoKSkZNWnSpLjFXl5eTkFBQdMrpoB0ySVd8gDl0lqlSy7pkgckPpeIO9/6ZwWfPi6LqwblJuw4EP9cxo8fP9fdRze5orsn7AVkA68DNzewvA+wuJ75pwGvx0zfBtzW1PFGjRrl8TR16tS47i+Z0iWXdMnDXbm0VumSS7rk4d4yuVzy0HQf8tPX/K2l2xJ6nHjnAszxZtTjRD6Nb8BjwFJ3fyBmfreY1S4DFtez+WxggJn1NbMc4ArgpUTFKiIix7aSwlz2V4eY+NRclm1Lv3v3ibxnfwZwDXD2IV+zu8/MFpnZQmA8cBOAmXU3s1cA3D0EfJvoVYGlwF/c/aMExioiIsewi4d1p3NhLm1yMvn9tNXJDifuGhzP/mi5+3SgvkGCP/FVu2D9LcCFMdOvNLSuiIhIPF08rDsXD+vO1X+cydrdFckOJ+7Ug56IiEigR3E+m/dUJjuMuFOxFxERCfRon8+u8mqqasPJDiWuVOxFREQCPYrzAdiyN71a9yr2IiIigR7to8V+s4q9iIhIeqpr2afbfXsVexERkUC3dnkU5mUxY83uZIcSVyr2IiIigazMDL4w8jheWbSVnfurkx1O3KjYi4iIxLjmtN7Uhp0H3lzOvA17kh1OXKjYi4iIxDi+cwFj+nbg2Vkb+fxv36eiJpTskI6air2IiMghfnD+wIPvp6/clcRI4kPFXkRE5BCj+3Rg5T0XUJiXxZtLtic7nKOmYi8iIlKP7MwMzhzQifdX764bbj1lqdiLiIg0YEzfjmzeW8mmFP/evYq9iIhIA8b26wjAByn+vXsVexERkQYM6FJAu/zslP8Knoq9iIhIAzIyjMHdiliydX+yQzkqKvYiIiKNGNStiOXbyghHUvchvYQVezPraWZTzWypmX1kZt8L5v/KzJaZ2UIze8HMihvYfp2ZLTKz+WY2J1FxioiINGZw9yKqaiOs3XUg2aEcsUS27EPA9919EDAWuMHMBgNvAkPc/WRgBXBbI/sY7+7D3X10AuMUERFp0NAe7QD40fOL2FFWleRojkzCir27b3X3ecH7/cBSoIe7v+HudX0PfgAcl6gYREREjtbAroX84rKhLN6yjy8/+gFlVbXJDumwtcg9ezPrA4wAZh6y6BvAqw1s5sAbZjbXzCYmLjoREZHGfWVML/70tVPYUFrBj19YnHKd7FiiAzazAuBt4B53fz5m/u3AaODzXk8QZtbd3beYWReil/6/4+7v1LPeRGAiQElJyahJkybFLfby8nIKCgritr9kSpdc0iUPUC6tVbrkki55QOvK5aXVNTy/spaJJ+dyevesw94+3rmMHz9+brNudbt7wl5ANvA6cPMh868FZgBtmrmfnwG3NLXeqFGjPJ6mTp0a1/0lU7rkki55uCuX1ipdckmXPNxbVy6hcMTPum+Kf+NPs45o+3jnAszxZtTRRD6Nb8BjwFJ3fyBm/meAW4FL3L2igW3bmllh3XvgPGBxomIVERFpjswMY1jPYpZuLUt2KIclkffszwCuAc4Ovj4338wuBB4CCoE3g3m/h+hlezN7Jdi2BJhuZguAWcDL7v5aAmMVERFplhO7FrFlXxX7KlLnQb3Dv+HQTO4+HbB6Fr1SzzzcfQtwYfB+DTAsUbGJiIgcqUHdCgFYtq2MMUHf+a2detATERE5DIO7FQGwcNO+JEfSfCr2IiIih6FLUR4DSwqZsmxHskNpNhV7ERGRwzRhUBdmrStNmfv2KvYiIiKH6byTuhKOOG8s2ZbsUJpFxV5EROQwDTuuHb06tOHF+VuSHUqzqNiLiIgcJjPjc8O78/7qXaza0frHulexFxEROQLXnt6HNjlZ/PwfS6gJRZIdTqNU7EVERI5Ax4JcbrvwRN5duYtfvLI02eE0SsVeRETkCF01pjfnDS7hrWXbkx1Ko1TsRUREjsKpfTuwsbSSHWVVyQ6lQSr2IiIiR2FU7/YAPDR1FeFI6xznXsVeRETkKJzUvR3t22Tz1Iz1vLp4a7LDqZeKvYiIyFHIycrg/R9OID87kylLW2cXuir2IiIiRyk/J5PzTyph2oqdRFrhpXwVexERkTg4a2BnSg/UsGRrWbJD+QQVexERkTgY0zc6tv3sdaVJjuSTElbszaynmU01s6Vm9pGZfS+Y38HM3jSzlcHP9g1sf22wzkozuzZRcYqIiMRD9+J8ehTnH1vFHggB33f3QcBY4AYzGwz8EHjL3QcAbwXTH2NmHYA7gDHAqcAdDX0oEBERaS3G9OvAtOU7uXvyklbVZ37Cir27b3X3ecH7/cBSoAdwKfBksNqTwOfq2fx84E13L3X3PcCbwGcSFauIiEg83DjhBDoX5vLH6Wu5/40VyQ7noBa5Z29mfYARwEygxN23QvQDAdClnk16ABtjpjcF80RERFqtXh3bMOX747h0eHfeXbmr1QyQY+6J/YqAmRUAbwP3uPvzZrbX3Ytjlu9x9/aHbPMDINfd7w6mfwJUuPv99ex/IjARoKSkZNSkSZPiFnt5eTkFBQVx218ypUsu6ZIHKJfWKl1ySZc8IDVzmbc9xG8+rOaW0bkM6ZR1cH68cxk/fvxcdx/d5IrunrAXkA28DtwcM2850C143w1YXs92VwKPxEw/AlzZ1PFGjRrl8TR16tS47i+Z0iWXdMnDXbm0VumSS7rk4Z6auVRUh3z03W/6JQ++6+Fw5OD8eOcCzPFm1ONEPo1vwGPAUnd/IGbRS0Dd0/XXAi/Ws/nrwHlm1j54MO+8YJ6IiEirl5+Tya2fOZEFm/bx7qpdyQ4noffszwCuAc42s/nB60LgXuBcM1sJnBtMY2ajzeyPAO5eCtwFzA5edwbzREREUsLFw7pRlJfFix9uTnYoZDW9ypFx9+mANbB4Qj3rzwGui5l+HHg8MdGJiIgkVm5WJhcO7cY/FmyhoiZEm5yEldwmqQc9ERGRBLl0eA8O1IR5c8n2pMahYi8iIpIgY/p2oFu7PF5I8qV8FXsREZEEycgwvjjqON5esZM1O8uTF0fSjiwiInIMuPq03mRnZPDUjPVJi0HFXkREJIG6FOZx7uASJi/cQjhJY92r2IuIiCTYxcO6sau8hmWlyek+V8VeREQkwcYN7ELXojx2V6nYi4iIpKW87Eze++HZfPq47KQcX8VeRESkBWRmNNTPXOKp2IuIiKQ5FXsREZE0p2IvIiKS5lTsRURE0pyKvYiISJpTsRcREUlzKvYiIiJpztyT009vIpjZTiCeIw10AnbFcX/JlC65pEseoFxaq3TJJV3yAOXSmN7u3rmpldKq2Mebmc1x99HJjiMe0iWXdMkDlEtrlS65pEseoFziQZfxRURE0pyKvYiISJpTsW/co8kOII7SJZd0yQOUS2uVLrmkSx6gXI6a7tmLiIikObXsRURE0pyK/SHM7GdmttnM5gevC2OW3WZmq8xsuZmdn8w4D4eZ3WJmbmadgulxZrYvJsefJjvG5qonFzOz3wTnZaGZjUx2jE0xs7uCWOeb2Rtm1j2Yn1LnpZE8UvGc/MrMlgXxvmBmxcH8PmZWGXNOfp/sWJvSUC7BspT6G2ZmXzSzj8wsYmajY+an1HlpKI9gWcucE3fXK+YF/Ay4pZ75g4EFQC7QF1gNZCY73mbk0xN4nWj/A52CeeOAycmOLU65XAi8ChgwFpiZ7DibkUdRzPvvAr9PxfPSSB6peE7OA7KC978Efhm87wMsTnZ8ccol5f6GAYOAgcA0YHTM/JQ6L43k0WLnRC375rsUmOTu1e6+FlgFnJrkmJrj18B/AOnwcEZ9uVwKPOVRHwDFZtYtKdE1k7uXxUy2JUXPTSN5pOI5ecPdQ8HkB8BxyYznaDSSS8r9DXP3pe6+PNlxHK1G8mixc6JiX79vB5fAHjez9sG8HsDGmHU2BfNaLTO7BNjs7gvqWXyamS0ws1fN7KSWju1wNZJLyp0XADO7x8w2AlcBsZfrU+281JdHSp6TGN8gemWiTl8z+9DM3jazM5MV1BGKzSXVz8uhUvm81Gmxc5KViJ22dmb2T6BrPYtuB34H3EW0lXIXcD/RXxirZ/2kt8iayOVHRC/pHWoe0S4Wy4NnEv4ODEhclM1zhLmk3Hlx9xfd/XbgdjO7Dfg2cAet8LwcYR4peU6CdW4HQsDTwbKtQC93321mo4C/m9lJh1zVaHFHmEvKnpd6tLrzcoR5tNg5OSaLvbuf05z1zOwPwORgchPRe8Z1jgO2xDm0w9ZQLmY2lOg9oAVmBtF455nZqe6+LWb7V8zst2bWyd2T2vf0keRCip2XejwDvAzcEfuHqrWclyPJgxQ9J2Z2LfBZYIIHN1TdvRqoDt7PNbPVwAnAnASH26gjyYUUPS8NbNPqzsuR5EELnhNdxj/EIfcWLwMWB+9fAq4ws1wz60u0xTWrpeNrLndf5O5d3L2Pu/ch+p9qpLtvM7OuFlTNoGBmALuTGG6jGsuF6Hn5avAE+Fhgn7tvTWa8TTGz2Nb6JcCyYH5KnZeG8iA1z8lngFuBS9y9ImZ+ZzPLDN73I/p7vyY5UTZPQ7mQYn/DGpOK56UBLXZOjsmWfRPuM7PhRC+lrAP+H4C7f2RmfwGWEL00doO7h5MW5dG5HPiWmYWASuCKmE//qeYVok9/rwIqgK8nN5xmudfMBgIRot8suD6Yn2rnpaE8UvGcPET0ieg3g89bH7j79cCngTuDcxIGrnf30uSF2Sz15pKKf8PM7DLgQaAz8LKZzXf380mx89JQHi15TtSDnoiISJrTZXwREZE0p2IvIiKS5lTsRURE0pyKvYiISJpTsRcREUlzKvYiIiJpTsVeREQkzanYi7QAMwsH424vNrN/2L/GS3cz+3PMellmttPMJsfMu92iY2HXjR0/poFjlCcg7qPep5k9YmZnxCOeRo7x/lFu/zMzuyV4X3euFpjZPDM7PT5RiiSPir1Iy6h09+HuPgQoBW4I5h8AhphZfjB9LrC5biMzO41oH+cj3f1k4Bw+PkpWKhhDdKjVhHH3eBbkunM1DLgN+M847lskKVTsRVreDD4+jOWrwEXB+yuBZ2OWdQN2BQN/4O673L3RgTLM7GozmxW0Th+J6UP8l2b27zHr/czMvt/Q+k0cY5iZvWNmS8wsElyh+Hk96w0CVtR1AWpmU83s3OD93Wb2m6aO1Rx1VyDMrI+ZLTWzPwRXQ96I+SB16Da3m9lyi45WNrCBXRcBe+IRo0gyqdiLtKCgkE4gOgBGnUlEB8PIA04GZsYsewPoaWYrglHwzmpi/4OALwNnuPtwov2GXxVznC/HrP4loqOENbR+Q8fIA54DbnH3wcA9wH8BP6tn9QuA12Km7yA6JO5VwAjgpsaOdYQGAA+7+0nAXuALh65g0WFRrwhi+DxwSszi/OCDzzLgj0SHuhZJaRoIR6Rl5JvZfKAPMBd4s26Buy80sz5EW/WvxG4UjG0/CjgTGA88Z2Y/dPcnGjjOBGAUMDsYBCUf2BHs60Mz62Jm3YkOyLEHGNrQ+o04B5jn7nWjcy0EPtPAoD3nEzMQjru/E4zsdzMwrrFBP8zsEmCPu7/bRDyHWuvu84P3c4n+mx/qTOCFulHhzCz2w1dl8MGn7jbKU2Y2pJUPSiTSKBV7kZZR6e7DzawdMJnoPfvYS9gvEW0djwM6xm4YFMRpwDQzWwRcCzzRwHEMeNLdb2tg+V+Jjq7XlWhLv6n16zMEWBQzPRKYZ2adgfuAnwB3Em21F8fedjCzofzr1sT+YN7XiH6QqQS2AtnBMV4BIsHys4gOYRpx93uaiK865n2Y6AeY+jRZvN19hpl1IvrhqKkPQSKtli7ji7Qgd98HfBe4xcyyYxY9Dtzp7rFFFDMbaB8fN3440eFkG/IWcLmZdQm272BmvWOWTyJ6+fpyooW/qfXrs5vo7QbM7ASil8EnuftOYANwf5Djp4CpMbl0A54GLgUOmNn5Mft8vW5IWXf/MdExvdvGLH/N3e8i+iEgHt4BLjOzfDMrBC6ubyUzOxHIJJqzSMpSy16khQWX0xcQLbp18zYB/1PP6gXAg8FX9UJEx4if2Mi+l5jZj4E3zCwDqCV6FWF9sPyjoLhtdvetwNbG1m/As8AlZrYY2AVc6e67zawA6AeEgtsPFxD9QIGZtQGeB77v7kvN7C7gl8DrwT7Lgp87g581RMdkr3Mg+GmNxNVs7j7PzJ4D5hPNNfZWQd0tl7rjXdvax30XaYrGsxeRo2ZmWcCjwM+JPvg3G3gAGOPutU1s+zWil/Unm9kkd78i+M57FrAY6HTo8kTmIpKOVOxFRETSnO7Zi4iIpDkVexERkTSnYi8iIpLmVOxFRETSnIq9iIhImlOxFxERSXMq9iIiImlOxV5ERCTNqdiLiIikuf8Pr+BJq2zcUhsAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "w = 8 # wordlength of the quantizer\n", "A = np.logspace(-50/20, -10/20, num=500) # relative RMS levels\n", "N = int(1e6) # number of samples\n", "np.random.seed(1)\n", "\n", "def compute_SNR(a):\n", " # compute input signal\n", " x = np.random.laplace(size=N, scale=a/np.sqrt(2))\n", " # quantize signal\n", " y = A_law_compander(x)\n", " yQ = uniform_midtread_quantizer(y, 8)\n", " xQ = A_law_expander(yQ)\n", " e = xQ - x\n", " # compute SNR\n", " SNR = 10*np.log10((np.var(x)/np.var(e)))\n", " \n", " return SNR\n", "\n", "\n", "# quantization step\n", "Q = 1/(2**(w-1))\n", "# compute SNR for given RMS levels\n", "SNR = [compute_SNR(a) for a in A]\n", "\n", "# plot results\n", "plt.figure(figsize=(8,4))\n", "plt.plot(20*np.log10(A), SNR)\n", "plt.xlabel(r'RMS level $\\sigma_x / x_\\mathrm{min}$ in dB')\n", "plt.ylabel('SNR in dB')\n", "plt.grid()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Requantization of a Speech Sample\n", "\n", "Finally we requantize a speech sample with a linear and the A-law quantization scheme. The speech signal was originally recorded with a wordlength of $w=16$ bits using linear uniform quantization. First the A-law compansion is applied, then quantization by a linear uniform quantizer with a wordlength of $w=8$ bits. This scheme is used in the backbone of many telephone networks resulting in a total bit-rate of 64 kbits/s. Listen to the samples! Note, the quantization error has been normalized." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "SNR: 35.7 dB\n", "SNR: 38.2 dB\n" ] } ], "source": [ "# load speech sample\n", "x, fs = sf.read('../data/speech_8k.wav')\n", "x = x/np.max(np.abs(x))\n", "\n", "# linear quantization\n", "xQ = uniform_midtread_quantizer(x, 8)\n", "e = evaluate_requantization(x, xQ)\n", "sf.write('speech_8k_8bit.wav', xQ, fs)\n", "sf.write('speech_8k_8bit_error.wav', e, fs)\n", "\n", "# A-law quantization\n", "y = A_law_compander(x)\n", "yQ = uniform_midtread_quantizer(y, 8)\n", "xQ = A_law_expander(yQ)\n", "e = evaluate_requantization(x, xQ)\n", "sf.write('speech_Alaw_8k_8bit.wav', xQ, fs)\n", "sf.write('speech_Alaw_8k_8bit_error.wav', e, fs)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Original Signal**\n", "\n", "\n", "[../data/speech_8k.wav](../data/speech.wav)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Linear Requantization to $w=8$ bit** \n", "\n", "Signal\n", "\n", "\n", "[speech_8k_8bit.wav](speech_8k_8bit.wav)\n", "\n", "Error\n", "\n", "\n", "[speech_8k_8bit_error.wav](speech_8k_8bit_error.wav)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**A-law Requantization to $w=8$ bit**\n", "\n", "Signal\n", "\n", "\n", "[speech_Alaw_8k_8bit.wav](speech_Alaw_8k_8bit.wav)\n", "\n", "Error\n", "\n", "\n", "[speech_Alaw_8k_8bit_error.wav](speech_Alaw_8k_8bit_error.wav)" ] }, { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden" }, "source": [ "**Copyright**\n", "\n", "This notebook is provided as [Open Educational Resource](https://en.wikipedia.org/wiki/Open_educational_resources). Feel free to use the notebook for your own purposes. The text is licensed under [Creative Commons Attribution 4.0](https://creativecommons.org/licenses/by/4.0/), the code of the IPython examples under the [MIT license](https://opensource.org/licenses/MIT). Please attribute the work as follows: *Sascha Spors, Digital Signal Processing - Lecture notes featuring computational examples, 2016-2018*." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.1" } }, "nbformat": 4, "nbformat_minor": 1 }