{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Pachete necesare pentru folosirea acestui Notebook\n", "\n", "Vom folosi [numpy](https://numpy.org/), [matplotlib](https://matplotlib.org/), și [sounddevice](https://python-sounddevice.readthedocs.io/)." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import sounddevice as sd" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Generarea unui semnal sinusoidal\n", "\n", "Întâi trebuie să definim parametrii sinusoidei continuue:\n", "\n", "* orizontul de timp ($t$)\n", "* frecvența semnalului original ($f_0$)\n", "* amplitudinea ($A$)\n", "* faza ($\\varphi$)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "time_of_view = 1 # s\n", "frequency = 2 # Hz\n", "amplitude = 1\n", "phase = 0" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Iar apoi parametrii de măsurare, sinusoida discretizată:\n", "* frecvența de eșantionare ($f_s$)\n", "* perioada de eșantionare ($t_s$)\n", "* numărul de eșantionare ($n$)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "sampling_rate = 12 # Hz\n", "sampling_period = 1./sampling_rate # s\n", "n_samples = time_of_view/sampling_period" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cu datele de mai sus putem genera orizontul de timp cu momentele de interes pentru semnalul continuu și cel discretizat ($t$, respectiv $nt_s$):" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "atime = np.linspace (0, time_of_view, int(10e5 + 1)) # s.\n", "time = np.linspace (0, time_of_view, int(n_samples + 1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Observație*: orizontul de timp continuu (analog) este de fapt un orizont de timp discret ($nt_s$) foarte dens ($n=10^5$ eșantione).\n", "\n", "Cu aceste date putem crea o funcție sinus ce generează sinusoidele parametrizate conform variabilelor de mai sus:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "def sine (amplitude, frequency, time, phase):\n", " return amplitude * np.sin (2 * np.pi * frequency * time + phase)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sinusoidă continuă\n", "Pentru a obține o sinusoidă \"continuă\" putem apela funcția ```sine```:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYIAAAD4CAYAAADhNOGaAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAA9jElEQVR4nO3dd3hV15no/++rjnovgEASiGbAYGRJgI0Fxja2M8ZJnIw9KU6uEzIpM3Mn5Rdn5k6Sm0nyS+6U3EnGScbjOLFTjO0Um2BcaDI2GFFMb0KFIgES6qhL56z7xzmyj2UJlVP2Ke/nefRwyt5nvwvto3evstcSYwxKKaVCV5jVASillLKWJgKllApxmgiUUirEaSJQSqkQp4lAKaVCXITVAUxGenq6ycvLm9S+XV1dxMXFeTYgP6dlDg1a5uDnbnkPHjzYZIzJGP56QCaCvLw8Dhw4MKl9y8vLKSsr82xAfk7LHBq0zMHP3fKKyPmRXtemIaWUCnGaCJRSKsRpIlBKqRCniUAppUKcJgKllApxHkkEIvKkiDSKyPFR3hcR+bGIVInIURG5yeW9h0XkrPPnYU/Eo5RSavw8VSP4FbDuOu/fDRQ6fzYAPwMQkVTgW0AJUAx8S0RSPBSTUkqpcfDIfQTGmF0iknedTdYDTxvHnNd7RSRZRHKAMmCrMaYFQES24kgoz3giLn/XO2Bjd1UTlQ2d2I0hLy2O5bPSSI2Lsjo0FQQGbXb2nWvh5KUO+gbtZCXGUFqQyvSUWKtDU37GVzeUTQMuujyvc7422uvvIyIbcNQmyMrKory8fFKBdHZ2TnpfT+kbNGyuHWDb+QF6Bt/7XoTAimkRfLgwiqRo8cjx/KHMvhbKZbYbQ/nFQTZVD9DW9971RgRYnBHOX86NYmp84HcRhtrv2VvlDZg7i40xjwOPAxQVFZnJ3l1n9Z2IlQ3X2PD0Ac41D3DvohweKp7B4twkIsPCOH2lgz8dqueZfRc40jzATx5ayqo577sbfMKsLrMVQrXMC4uW84Xfvs2+2haK81L59Mo8SgrSiIsO53xzNy8dvcwvd9fyrbd6+eZf3MAnSmdaHbZbQu337K3y+ioR1AO5Ls+nO1+rx9E85Pp6uY9i8rkD51p4+Ml9xEZH8MxnS1k+K+097y+dkcLSGSl8cnkeX/rd23zql/v4lwdu5MPLplsUsQokTT121v/nbpo6+/jXj9zIh2+ahsi7tco5WQnMuSOBTyyfydeeP8I/vXCcupZuHr173nu2U6HHV3XDTcAnnaOHSoF2Y8xl4FXgThFJcXYS3+l8LegcrWvjU7/cT1ZiDH/+0i3vSwKuZmfG84fPr2DFrHS+9vsjbD56yYeRqkDU0NHLD/f1cq13gOc+t5wHlk0f9Y97enw0Tzx8Mx8vncF/7arhR9vO+jha5W88UiMQkWdwXNmni0gdjpFAkQDGmJ8DW4B7gCqgG/i0870WEflnYL/zo74z1HEcTBqv9fLZpw+QHBvJbz9bQnZSzJj7xEVH8N+fLOKTT1bwleeOkJcWx8JpST6IVgWavkEbf/2bg3T0G5796xJuzE0ec5/wMOE79y2kf9DOj7efZVZGHOuXjNg9p0KAp0YNPTTG+wb44ijvPQk86Yk4/NGgzc7f/O4Q7T0D/OkLK8lJmjLufadEhfPzjy/jL37yJp/79UG2/O2tJMVGejFaFYi+u/kUhy608cUl0SwZRxIYEhYmfO+Di6ht6uLrfzjKvOxE5mYneC9Q5bcCf9iAn3vizVoqalv43v2LmJ+TOOH90+Kj+dnHl3Glo5f/vfmEFyJUgaz8TCO/3nuez96az83ZE7+uiwwP47GP3URcVARfef4wAza7F6JU/k4TgRfVXO3kR1srueuGLD500+Sr3TfmJvPFsln88e16tp5s8GCEKpBd6x3gH/54jNmZ8Xz1rrmT/pzMhBi+e/9Cjtd38PPyag9GqAKFJgIvMcbwD386RnREGP+8fqHbozK+tKaQedkJfHvTCXoHbB6KUgWyf3utkssdvfzww4uJjgh367PuXpTDvYtz+MmOKi62dHsoQhUoNBF4yWsnG9hb08L/t24emYljdw6PJSoijG/fdwP1bT08vqvGAxGqQFZ9tZPf7D3PQ8UzWDbTM7Oy/NO9CwgPE76/5ZRHPk8FDk0EXjBgs/ODl08zOzOeB2/OHXuHcSotSOOeRdn8rLyay+09HvtcFXj+/y2niYkM58t3zPHYZ2YnxfD5slm8fPwKe2uaPfa5yv9pIvCC31VcoLapi3+4Zx4R4Z79L/7G3fMZtNv5zx1VHv1cFTgqaprZdqqBz5fNIj0+2qOfvWFVATlJMfzLq2dwDPZToUATgYf1Ddr4aXkVxfmprJ6b6fHPz02N5aNFuTx34CL1bVorCEX/sf0sGQnRPHJLvsc/OyYynC+uns3B8628WdXk8c9X/kkTgYf9/mAdDR19/N3thV67bf8Lq2cD8NOdWisINQfPt7CnupnPrSogJtK9DuLRfKRoOjlJMfzfbWe1VhAiNBF40IDNzs/Kq1mSm8yK60wh4a5pyVPeqRVoX0Fo+c8dVaTERvJXJTO8dozoiHC+4KwV7K7SvoJQoInAg148fIm61h7+Zs1sr0/i9de3zcJmNzy157xXj6P8x4lL7ew8c5VHbsknNsq780V+tGi6Y06iN3WEWijQROAhxhiefLOWuVkJrJnn+b6B4XJTY7nrhmye2XeB7v7BsXdQAe/JN88RGxXOJ5bnef1Y0RHhfKJ0JuVnrlLVeM3rx1PW0kTgIQfPt3LycgcPr8jz2ZS+j9yST3vPAH84WOeT4ynrNHf28eejl/jQTdNImuKb+aY+VjqDqIgwntx9zifHU9bRROAhv9pzjoSYCO5fOtVnx1w2M4Ubpyfx5O5z2O3aqRfMNu6/SP+gnYd9UBsYkh4fzQeXTOOPb9fR2tXvs+Mq39NE4AENHb28cvwKHy3K9XrbrSsR4dMr86lt6mJPtXbqBatBm53f7j3PytlpFGb5dnbQT9+SR++AnT+8rbXOYKaJwAN+V3EBmzGWLPu3bmE2SVMi2bj/gs+PrXxj26kGLrX38kkf1gaGzMtOZOmMZJ7Zd0GHkgYxTQRustkNzx+4yC2z08lLj/P58WMiw/ng0mm8dqKBFq2+B6Vn918kOzGGtfOzLDn+QzfPoPpqFwfOt1pyfOV9HkkEIrJORM6ISJWIPDrC+z8SkcPOn0oRaXN5z+by3iZPxONLb1U3c6m9l48WeW5OoYl6qHgG/TY7f9Tqe9Bp6Ojl9cqrfOimaYSHWbOu8L2Lc4iPjmDjvouWHF95n9uJQETCgceAu4EFwEMissB1G2PM3xtjlhhjlgA/Af7o8nbP0HvGmPvcjcfXnj94kcSYCO5YYM3VGsDc7AStvgepPx2qx27ggWXTLYshLjqCv7hxKi8du0R7z4BlcSjv8USNoBioMsbUGGP6gY3A+uts/xDwjAeOa7mO3gFeOX6F9Uumee12//F68OZcqq92cehim6VxKM8xxtHsWDQzhYKMeEtjeag4l94BO5uPXrI0DuUdnhjiMg1wrTPWASUjbSgiM4F8YIfLyzEicgAYBH5gjHlhlH03ABsAsrKyKC8vn1SwnZ2dk953uPKLA/QN2smXBsrLrZ2gK2HAEBEGj23exycWvHdGSk+WOVAEQ5mr2mxUX+3l0wsHxlUWb5bZGENOnPBU+Umm9dR65RiTEQy/54nwVnl9N9bR4UHg98YY1yW2Zhpj6kWkANghIseMMe9bL88Y8zjwOEBRUZEpKyubVADl5eVMdt/hfvzT3czJiuLT963y2U1k17O58SAVNS38/NZVRLpMf+3JMgeKYCjza386xpTIer7ykdXER4/9VfV2mf/KfpZ/21rJ7BuLmZ4S67XjTEQw/J4nwlvl9UTTUD3g2lM63fnaSB5kWLOQMabe+W8NUA4s9UBMXnehuZu3L7TxoZum+0USAFi/ZBrNXf06fXAQGLDZ2XLsMnfekDWuJOAL65c41t3+85HLFkeiPM0TiWA/UCgi+SISheOP/ftG/4jIPCAFeMvltRQRiXY+TgdWAic9EJPXbT7maCv9wOIciyN5V9ncDBJjInjx0Gh5WAWKN6uaaOse4C8W++5O9bHMSIvlphnJvHhYz69g43YiMMYMAl8CXgVOAc8ZY06IyHdExHUU0IPARvPeYS3zgQMicgTYiaOPIDASwZHLLJ2R7DdVZHBMFHbv4hxeO9mgE9EFuM1HLpMQE8Gtc9KtDuU97l86jdNXrnH6SofVoSgP8sh9BMaYLcaYOcaYWcaY7zlf+6YxZpPLNt82xjw6bL89xphFxpgbnf/+whPxeFvN1U5OXu7g3kX+UxsYsn7JNLr7bWw92WB1KGqS+gZtvHbiCnfdkE10hLWj0Ya7d1EO4WHCC4d09FAw0TuLJ2HzUUcb6b1+1Cw0pDgvlazEaF4+dsXqUNQkvX7mKtf6Bv2q2XFIWnw0K2en8/Lxy3rPShDRRDAJm49e4ua8FHKSplgdyvuEhQl33ZBNeWWjNg8FqM1HL5MSG8nK2f7VLDTk7oXZnG/u5tRlXacgWGgimKDKhmtUNnTyAT/qxBtu3Q3Z9A7Yef3MVatDURPU029j26kG1i3Mfs8QYH9yx4IswgReOaG1zmDhn2eaH9ty7DIicPeibKtDGVVxfiopsZG8fFy/qIHm9cqrdPfbuHeR/15opMdHc3NeKq8c12GkwUITwQRtPdnAshkpZCbEWB3KqCLCw7hzQTY7TjfSN2gbewflN7aebCAxJoKSglSrQ7muuxdmU9nQSfXVTqtDUR6giWAC6tt6OHGpw9IJ5sZr3aJsOvsG2a03lwWMQZudHacbWDMv02+bhYbctdBRI35Fa51Bwb/PNj+z1dkmGgiJYOWsdBJiInT0UAA5eL6V1u4B7ljgv82OQ3KSprAkN1kTQZDQRDABW081MCsjzvKZIMcjKiKMtfOz2HaqAbsO8wsIr51sICo8jNvmZlgdyrjcvTCbY/Xt1LV2Wx2KcpMmgnFq7xmgoqYlIK7Whqydn0Vr9wDVbXarQ1FjMMaw9WQDK2an+c3cQmMZqhnvPN1ocSTKXZoIxqn8TCODdsOdN/h/s9CQW+ekExEmHG7UDmN/V9nQyYWW7oBodhxSkBFPfnoc2zURBDxNBOP02skGMhKiWTI92epQxi0xJpLi/FSOXNUby/zd1pOOtnar1iWerDXzMtlT3aw3LwY4TQTj0Ddo4/UzV1k7P5Mwi9aNnaw18zKp6zRcbNF2XH+29WQDS3KTyUr032HJI7l9Xib9g3bePKuj0wKZJoJxqKhpobNvMOCu1gBud8a8Q6vvfqvxWi9H6toDqlloSFFeKgnREXp+BThNBONQfuYqURFhrJjln3O/XE9+ehzZcaLtuH5saCqQsgAZLeQqKiKMVXMy2HG6EbtdR6cFKk0E41Be2UhpQRpTovxrSuDxWpIRzt7qZrr6tB3XH5VXXiUzIZoFOYlWhzIpa+Zl0nitjxOXdI2CQKWJYAwXW7qpudpF2ZzAu1obcmNGBP02O29oO67fGbTZeaPyKrfNyfCbJU8nqmxuBiKw/bSugRGoPJIIRGSdiJwRkSoReXSE9z8lIldF5LDz5zMu7z0sImedPw97Ih5PKq8M3Gr7kMKUMBJiItihX1S/c/hiGx29g5TNzbQ6lElLi4/mphkpbD+lzY+Byu1EICLhwGPA3cAC4CERWTDCps8aY5Y4f55w7psKfAsoAYqBb4lIirsxedLrZxqZkRpLfnqc1aFMWkSYcGthOrsqm3QxET9TfuYq4WHCLYWB1//kqmxOBsfq22nu7LM6FDUJnqgRFANVxpgaY0w/sBFYP8597wK2GmNajDGtwFZgnQdi8oi+QRt7qpsDuto+ZFVhBlc6ejnbqLNF+pPyykZumpFM0pRIq0Nxyypn0+mbOslhQPLEvezTgIsuz+twXOEP92ERWQVUAn9vjLk4yr7TRjqIiGwANgBkZWVRXl4+qWA7OzvHve+JJhvd/TbS+q9QXh64J3hnZyeRPVUAPLllL+vyA/uPznhM5PdslbY+O8fre/hwYaRHYrWyzHZjiI+E53YdJ6ntrM+OGwi/Z0/yVnl9NanJn4FnjDF9IvI54ClgzUQ+wBjzOPA4QFFRkSkrK5tUIOXl5Yx33zc3nyQq/Dwb7i8jNiow5n8ZSXl5OR8oK+Nnp16n3h5DWdlIeTq4TOT3bJXfH6wDjvDpdSUsnJbk9udZXebVVw6xt6aZ2267zWc1aKvL7GveKq8nmobqgVyX59Odr73DGNNsjBlqPHwCWDbefa1UXnmVkoLUgE4CrlYVZrCvtoXeAZ17yB+Un2kkIyGaG6YG5rDR4W4tTOfqtT5OX9G1jAONJxLBfqBQRPJFJAp4ENjkuoGI5Lg8vQ845Xz8KnCniKQ4O4nvdL5mubrWbqoaO7ktgIeNDnfrnHT6Bu1U1LZYHUrIG3QO5w2G/qchqwod35VdlbpWdqBxOxEYYwaBL+H4A34KeM4Yc0JEviMi9zk3+1sROSEiR4C/BT7l3LcF+GccyWQ/8B3na5Z7/Z1ho4E7rG+40vw0oiLC9IvqB47Wt9PeMxBUFxrZSTHMzUpg11k9vwKNR9o8jDFbgC3DXvumy+NvAN8YZd8ngSc9EYcn7a5qYmpSDLMyAnfY6HBTosIpzkvVROAHdp9tQgRWzg7sYaPD3VqYztNvnaen3xawd+KHIr2zeAQ2u2FPdTMrZ6cHTbV9yKo56Zxt7ORye4/VoYS0N6uauGFqIqlxUVaH4lGr5mTQb7Ozt7bZ6lDUBGgiGMHJSx20dQ8E3dUavDve+43KwB0OG+i6+wd5+0IrKwNwEsOxFOenEq3NjwFHE8EIdlc7/kiumJ1mcSSeNzcrgcyEaF7XdlzL7D/XyoDNBOWFRkxkOCUFaZoIAowmghHsrmpy/sEMrEVCxkNEuLUwgz1VTTptsEV2VzURFR7GzXmpVofiFasK06m+2sWlNm1+DBSaCIbpHbCxr7YlKK/WhqycnUZr9wCnrui0wVZ482wTy2amBG1n6tC6HW9Vaz9BoNBEMMzb51vpG7RzS2HwNQsNGfqi7qnSL6qvNXf2cfJyR8BPMnc987ITSI2LeqeJVfk/TQTDvFnVRESYUJwfvIkgOymGgow49ugX1ef2OK+Sg7nGGRYmLC9I463qZp3tNkBoIhhmd3UzS3KTiY8OjmklRrNiVhr7alsYsNmtDiWk7K5qIiEmgkUemFvIn62Yncbl9l5qm7qsDkWNgyYCF+3dAxyrawvqq7UhK2el09Vv42hdm9WhhJQ3q5pYXpBGeFhw3Z8y3DvNj9pPEBA0Ebh4q6YZuyGo22+HlBakIQK7tZ/AZy40d1PX2hMS51deWixTk2K0+TFAaCJwsbuqidiocG6cnmx1KF6XEhfFgpxE/aL60NCiLaFQ4xQRls9K563qZh2mHAA0EbjYXdVESX4qURGh8d+ycnY6b59vo6dfp6X2hd1VTeQkxVAQwMueTsSKWTpMOVCExl+8cbjU1kNNU1dIXK0NWT4rjX6bnYPnW60OJejZ7YY91U1BOX/VaIbuzNdhyv5PE4FTKAzrG644L5WIMNHx3j5w+so1WrsHWDEreIclD5eTNIWCdB2mHAg0ETjtrWkmJTaSuVkJVofiM3HRESzJTdaRHT6wt8bxf1xaEDqJABy1Ah2m7P88kghEZJ2InBGRKhF5dIT3vywiJ0XkqIhsF5GZLu/ZROSw82fT8H19paK2meL8VMKCfFjfcCtmp3Osro32ngGrQwlqe2uamZEay9TkKVaH4lMrdJhyQHA7EYhIOPAYcDewAHhIRBYM2+wQUGSMWQz8Hvg/Lu/1GGOWOH/uwwJ1rd1cbOkJuas1cHTo2Q3s0+UrvcZuN+w710JJfnBOMnc9y53fKR2m7N88USMoBqqMMTXGmH5gI7DedQNjzE5jTLfz6V4ci9T7jYoaxx/BUEwES2ckExMZxu4qbcf1ljMN12jrHgjJ82tomLKeX/7NE/MoTAMuujyvA0qus/0jwMsuz2NE5AAwCPzAGPPCSDuJyAZgA0BWVhbl5eWTCrazs/N9+75wrI+4SLh8+iANZ4KvaWikMrualQjbj12gLDF45pAfq8y+tPWco9nNNFZSXl7lteP4U5ld5Ub3sf38IK9t30lUuGe/X/5aZm/xVnl9OqGOiHwcKAJuc3l5pjGmXkQKgB0icswYUz18X2PM48DjAEVFRaasrGxSMZSXlzN832/u28nKwjTWrC6a1Gf6u5HK7OqY7Sz/vq2SJcUrSI4NjqUTxyqzL2389UGmp7TzwN1rvHocfyqzq4HMBl59+gCJ+Ys9Xivy1zJ7i7fK64mmoXog1+X5dOdr7yEia4F/BO4zxvQNvW6MqXf+WwOUA0s9ENO41bf1cKGlOySr7UNKZ6VhDFRoP4HH2e2GitrmkD6/ivNSEXl35JTyP55IBPuBQhHJF5Eo4EHgPaN/RGQp8F84kkCjy+spIhLtfJwOrAROeiCmcasI0WF9rhZPTyI6IuydvhLlOZWNjvsHQvn8SoqNZH52op5ffsztRGCMGQS+BLwKnAKeM8acEJHviMjQKKB/AeKB54cNE50PHBCRI8BOHH0EPk0Ee2uaSZoSybzs0Ll/YLjoiHCWzUzRKzYvGPrjF4ojhlyVFqTx9oVW+gZ1OhN/5JE+AmPMFmDLsNe+6fJ47Sj77QEWeSKGyaqobQnJ+weGKy1I40fbKmnvHiApNtLqcILG3ppmpiVPITc11upQLFVSkMqTu2s5crGd4hBPiv4opO8svtTWw/nm0O4fGFKSn4oxsO+cVt89xRhDRW2Lnl84zi/tJ/BfIZ0IKmodJ2WoV9sBbsxNJjoiTL+oHnS2sZOWrn5KCvT8So6NYl524jvfOeVfQjsR1LSQGBPB/JxEq0OxXExkOEtnJOsX1YOGkupyrREAjguug+db6R/UeYf8TUgngr01zRTnB/+ygeNVWpDGiUsdOu+Qhwz1D0xPCa35hUZTWpBG74Bd5x3yQyGbCC6393CuuZtSrba/oyTfcT/BAe0ncJsxhoqaFmfbuF5oAO90Emvzo/8J2UQQyvMLjWbpjGSitJ/AI6oaO2nu6tfzy0VqXBTzshP0xkU/FLqJoLaZBO0feI+YyHCW5CbrF9UDQnX9gbGU5Kdy4Fyrrk/gZ0I2Eex1Vtu1f+C9SgvSOF7fTkev9hO4Y29tCzlJMeSmav+Aq9KCNHoGbByta7c6FOUiJBNBQ0cvtU1dlOTr1dpwpQWp2LWfwC2O/gHH/ELaP/Be2k/gn0IyEWi1fXQ3zUghKlznHXJH9dVOmjr79f6UEaTFRzMnK16bH/1MiCaCFhKiI1gwVfsHhhvqJ9ArtsnbqwMRrqskP40D53QdY38SkomgosaxPrH2D4yspCCV45c6uKb9BJOyt6aZ7MQYZqaF9vxCoyktSKO738bxeu0n8Bchlwjaeu3UNHXpbf/XUVqQhs1uOHC+1epQAo4xxjEQoUDvHxjNu/0E2jzkL0IuEZxudVRHtdo+uptmpBAZLtpPMAk1TV00dfbp+XUdGQnRzM6M1+lM/EjoJYIWm6N/QO8fGNWUqHBunK79BJOhAxHGpyQ/lf21LQxqP4FfCMlEUJSXQkR4yBV9QkoKUjlW305n36DVoQSUvTUtZCZEk6f9A9dVWpBGV7+N45c6rA5F4aFEICLrROSMiFSJyKMjvB8tIs86368QkTyX977hfP2MiNzliXhG09jRy5Uuo1dr4zDUT3BQ+wnGTe8fGL+hProKrXX6BbcTgYiEA48BdwMLgIdEZMGwzR4BWo0xs4EfAT907rsAxxrHNwDrgJ86P88rhsYuayIY27KZKUSEiTYPTUBtUxeN17R/YDwyE2IoyIjT88tPeKJGUAxUGWNqjDH9wEZg/bBt1gNPOR//HrhdHJdM64GNxpg+Y0wtUOX8PK/YW9NMTDjcoPcPjCk2KoLF05P0izoBQ6NgdETa+JQWpHHgXKv2E4zT0bo2/vNQLxeauz3+2Z5Ys3gacNHleR1QMto2xphBEWkH0pyv7x2277SRDiIiG4ANAFlZWZSXl0840EuX+liQYnjzjV0T3jeQdXZ2Tur/a2pEPy/XDvDKtp3ERARWU8dky+yOTUd6SYoWLhzfz0ULmoasKLM7EnsGudY3yK837yQ/aXINAYFWZndsru7nQIONwwcrqIny7PnlkcXrfcEY8zjwOEBRUZEpKyub8GeUlUF5eTmT2TeQTbbMYVOvsrlmH7EzFrJqTobnA/MiX/+ejTF8fc92Vs1LY/XqpT47rqtAO7fnd/Ty86PbGUjJo2zVrEl9RqCV2R1P1uxjanwT99252uOf7YmmoXog1+X5dOdrI24jIhFAEtA8zn2VRZbNTCE8THS89zicb+6moaNP5xeagKzEGArS4/R+lXEYtNk5eK6FeSne6UL1RCLYDxSKSL6IROHo/N00bJtNwMPOxw8AO4wxxvn6g85RRflAIbDPAzEpD4iLHuon0C/qWN69f0ATwUSUFKSyr7YFm91YHYpfO3Gpg65+G3NT/TQRGGMGgS8BrwKngOeMMSdE5Dsicp9zs18AaSJSBXwZeNS57wngOeAk8ArwRWOMzd2YlOeUFqRx5GIb3f16P8H17K1pJj0+mlkZ8VaHElBKC9K41jfIqct6P8H1DF1ozE31zv1PHvlUY8wWY8wcY8wsY8z3nK990xizyfm41xjzEWPMbGNMsTGmxmXf7zn3m2uMedkT8SjPKclPZdBuePt8m9Wh+C1jDBW1Or/QZAytCaKj066voraFgow4kqP9OBGo4FWU55ilVb+oo7vQ0s3l9l5KtX9gwrKTYshLi9Xz6zpsdsP+2hav3p+iiUBdV3x0BAun6f0E11Oh6w+4pbQgTfsJruPkpQ6u9Q16dSCCJgI1ptKCVI7UtdHTr903I9lb20xaXBSzM7V/YDJKC9Lo6NV+gtH4YiJDTQRqTKUFaQzYDG9f0HmHRlKh6w+4ZehObK11jqyitpn89DiyEmO8dgxNBGpMRTNTCBP9oo7kYks39W0973R6qonLSZrCzLRYXcd4BDa7YyCCt4clayJQY0qIiWTRtCS98WcEuv6AZ5TmO/oJ7NpP8B6nLndwrXfQ6xcamgjUuJQWpHH4Yhu9A9pP4KqitoWU2EgKtX/ALSUFqbT3DHDqivYTuBq60PD2RIaaCNS4lBSk0m+zaz/BMHtrminJTyMsTPsH3FHirFFprfO99ta0MDMtlpykKV49jiYCNS5FeanOfgL9og6pa+2mrrVHp532gGnJU5iRqvcTuLLbDfvPtVDqg/4nTQRqXBJjIvV+gmH0/gHPKslPZd857ScYcupKB+09Az650NBEoMatJD9V+wlcVNQ2kxwbydysBKtDCQqlBWm0dQ9wpuGa1aH4hYp3FjrSGoHyI6UFafQP2jl0oc3qUPzC3poWivNStX/AQ/R+gvfaW9PMjNRYpiV7t38ANBGoCXi3n0C/qJfaerjQ0u2Tq7VQMT0llukpU7TDGEf/wL5zLT5b30ITgRq3pCmRLJiaqAvVwDv/B7r+gGeVFqRRUdsc8v0EZxqu0dY94LP+J00EakJK89N4+4L2E1TUtJAYE8G87ESrQwkqJfmptHYPUNkY2v0EFT66f2CIJgI1ISXOfoLDF9usDsVSe2uaKc5PI1z7BzyqVO8nABz9T9NTpjA9JdYnx3MrEYhIqohsFZGzzn9TRthmiYi8JSInROSoiPyly3u/EpFaETns/FniTjzK+4rzUhEJ7S/qlfZezjV3a7OQF+Q6O0dDuR/q3f4B3/U/uVsjeBTYbowpBLY7nw/XDXzSGHMDsA74vyKS7PL+14wxS5w/h92MR3lZUmwkC3ISQ/qL+m7/gHYUe0NJQSoVtS04ljUPPWcbO2np6vfphYa7iWA98JTz8VPA/cM3MMZUGmPOOh9fAhqBDDePqyxUkp/G2xda6RsMzX6CvTUtJMREMD9H+we8obQgjZaufs42dlodiiWsuNAQd7KuiLQZY5KdjwVoHXo+yvbFOBLGDcYYu4j8ClgO9OGsURhj+kbZdwOwASArK2vZxo0bJxVzZ2cn8fGhNUGYp8v8dsMgPz7UxzeKY5ibGu6xz/Ukb/6ev76rm+y4MP5+mffmh5+MYDm3r3bb+dquHj4+P4q1MyOvu22wlNnVTw71cq7dzr/eNuV9a1y4W97Vq1cfNMYUve8NY8x1f4BtwPERftYDbcO2bb3O5+QAZ4DSYa8JEI0jQXxzrHiMMSxbtsxM1s6dOye9b6DydJlbu/pM3qObzX9sq/To53qSt37Pda3dZubXN5sn3qjxyue7I1jObbvdbpZ/f5v5/G8OjLltsJR5iM1mN4u//ar56nOHR3zf3fICB8wIf1Mjxsogxpi1o70nIg0ikmOMuSwiOTiafUbaLhF4CfhHY8xel8++7HzYJyK/BL46VjzKesmxUczLHrqfoNDqcHxqT1UTACtna/+At4gIpQVpvF55FWNMSK38dvKyY36hFT4+v9ztI9gEPOx8/DDw4vANRCQK+BPwtDHm98Pey3H+Kzj6F467GY/ykdKCVA6eD71+greqHesTz8nU+YW8qbQgjeaufqpCrJ9gT7XjQmPFrHSfHtfdRPAD4A4ROQusdT5HRIpE5AnnNh8FVgGfGmGY6G9F5BhwDEgHvutmPMpHSgvS6B2wc7Su3epQfMYYw+7qJpbP0vUHvC1U5x3aXdXMrAzvrk88kjGbhq7HGNMM3D7C6weAzzgf/wb4zSj7r3Hn+Mo6JfmO+wn2VDVzc15ojKevaeqioaPP51droWhGaixTk2LYU93MJ5bnWR2OT/QP2tl/roUHlk33+bH1zmI1KcmxUSycmsRuZ1U2FGj/gO+ICCtnp/NWTTO2EJl36EhdG939NlbM8v35pYlATdqK2WkcutBKV9+g1aH4xJ7q5ndW0lLed0thOm3dA5y8FBrrGO+pakbEmhsVNRGoSbtldjoDNsft8MHObje8VdPMillpITWKxUrLnVfGb1aFRq1zT3UTN0xNJDk2yufH1kSgJu3mvFSiIsLYfTb4v6gnL3fQ1u37YX2hLDMhhrlZCewOgUTQ02/j0IU2VlrU/6SJQE1aTGQ4RTNTQuKKzaphfaFu5ex09p1rCfppzw+cb6HfZn+nFuRrmgiUW1bOTuf0lWs0dY44M0jQ2FNtzbC+UHdLoWPa84PnW60Oxat2VzUTESYU+2hFsuE0ESi33DLbcYW8pzp4x3v3D9rZV9vCytlaG/C14vw0IsIk6Gudb1U3sXRGMrFRbo3onzRNBMotC6clkRgTEdT9BEctHNYX6uKjI1g6Izmo+wnaewY4Vt9uabOjJgLllvAwYfmsNN6sagra+eN3WzisTzmaH4/Vt9PW3W91KF6xt6YZu8HSCw1NBMptt8xOp76th/PN3VaH4hW7zl5l8bQkS4b1KUciMCZ4p5t44+xV4qLCWTrjfQs8+owmAuW2obbzYGzHbe8Z4PDFNm4t1LWUrLIkN5m4qPCgPL8A3jjrmL8qKsK6P8eaCJTb8tPjmJoUE5TtuG9VN2GzG1bN0URglcjwMEoK0thdFXw1gvPNXZxv7rb8QkMTgXLb0Lwwe6qDb16Y1yub3umwVNZZOTud2qYu6lqDq/lxV+VVAMsvNDQRKI+4pTCd9p4BjtcHz7TUxhh2VV5l+aw0IsP1q2KloWHKwVbr3HW2idzUKeSlWTt/lZ7dyiOG+gled17hBIPapi7q23osv1pTMCcrnqzE6KA6vwZsdt6qbubWwgzL569yKxGISKqIbBWRs85/R+z2FhGby6I0m1xezxeRChGpEpFnnauZqQCUHh/N4ulJlJ8ZcbXSgDRUbb9NO4otJyLcNieDN842MWizWx2OR7x9vpXOvkFW+cH55W6N4FFguzGmENjufD6SHmPMEufPfS6v/xD4kTFmNtAKPOJmPMpCZXMyOHyxLWjGe79xtomZabHMsLjarhzK5mZyrXeQty+0WR2KR7xxtonwMPGLiQzdTQTrgaecj5/Cse7wuDjXKV4DDK1jPKH9lf+5bW4mduNo9wx0/YN23qpp9ourNeWwcnY64WESNLXOXWevsjQ3mcSYSKtDcW+pSiDLGHPZ+fgKkDXKdjEicgAYBH5gjHkBSAPajDFDq5rUAdNGO5CIbAA2AGRlZVFeXj6pgDs7Oye9b6DyVZntxhAXCc++fozE1kqvH+963C3zqWYb3f02UvuvUF4eGIktFM7tWUnC5oO1FMdcAQK3zNf6Dcfqurl/duSE4vdWecdMBCKyDcge4a1/dH1ijDEiMtrYwZnGmHoRKQB2OBesn9DwEmPM48DjAEVFRaasrGwiu7+jvLycye4bqHxZ5jVXDvFWdTOrVt1m6QLv7pa54pXTRITV8Jn7biPBD67YxiMUzu0Tpop/efUMC24qJTMxJmDLvOnIJQyHePiuYpbkJo97P2+Vd8ymIWPMWmPMwhF+XgQaRCQHwPnviHU2Y0y9898aoBxYCjQDySIylIymA/Vul0hZqmxOBk2dfZy8HNjLC+483ciymSkBkwRCRdlcR1NdeYCPHio/3UhybCSLpiVZHQrgfh/BJuBh5+OHgReHbyAiKSIS7XycDqwEThrHDGU7gQeut78KLENDLQO5Hbe+rYfTV65x+/xMq0NRwyzISSQzIZrXzwRuIrDZDTvPNLJ6bibhFtaaXbmbCH4A3CEiZ4G1zueISJGIPOHcZj5wQESO4PjD/wNjzEnne18HviwiVTj6DH7hZjzKYhkJ0SyalkR5AH9Rd5x2JLE180br8lJWeXcY6dWAHUZ6+GIrrd0DfnWh4VZnsTGmGbh9hNcPAJ9xPt4DLBpl/xqg2J0YlP8pm5vBYzuraO8eICk28JpWdpxqYGZaLLMy4qwORY2gbG4mzx+s49DFNqtDmZTtpxqJCBPL5xdypXcWK48rm5vhHEYaeLWC7v5Bdlc3s2ZepuV3e6qR3VLoGEa683RgNj/uON3IzXmpJE3xn4skTQTK45bkppASG8n2Uw1WhzJhe6qa6R+0c7s2C/mtpCmRFM1MYfupwEsEda3dftn/pIlAeVx4mHD7/Cx2nG5kIMDacbefbiQuKtyyRcTV+NyxIIszDddo7A6s82vnO/1PmghUCLhjQRYdvYPsq22xOpRxM8aw43QDq+ZkWLpIiBrbnQsctzYdarRZHMnEbD/dSH56HAUZ8VaH8h56tiuvuLUwneiIMLaeDJzmoROXOmjo6OP2+dos5O9mpMUyLzuBtxsGx97YT3T3D7LH2f/kbzQRKK+IjYrg1sIMtp5sCJhF7bedakDk3ZuWlH+7Y0EWla12WroCY5LDN842OfufNBGoEHLngizq23o4cSkw7jJ+5fgVbp6ZSnp8tNWhqHG4Y0EWhnfv+/B3rxy/QnJsJDf7Yf+TJgLlNWvmZyJCQDQP1TZ1cfrKNe5aONK0WsofLZqWREq0sPXkFatDGVP/oJ1tpxq4Y36WX652538RqaCRHh9N0cyUgEgErxx3/DFZp4kgYIgIS7PC2VXZRO+Af3ca76lu4lrvoN+eX5oIlFfdsSCLk5c7uNji34uOv3L8MjdOT2Ja8hSrQ1ETcFNmOD0DNt7w8zUwXjl+hfjoCG4pTLc6lBFpIlBete6GHABePn55jC2tU9/Ww5G6dm0WCkDzUsNJmhLJlmP+e34N2uy8drKBNfMyiY4ItzqcEWkiUF41Iy2WxdOT+PMR//2ivupsFrp7YY7FkaiJiggT1t2QzdaTDX7bPLTvXAstXf1+2ywEmgiUD3xgcQ7H6ts519RldSgjeuX4FeZlJ5CfrpPMBaIP3JhDZ9+g3854++rxK8REhvn1sGRNBMrr7l08FYCX/LD6fqW9l/3nW/z6ak1d3/KCNNLioth89JLVobyPzW546dgVyuZkEhvl7srA3qOJQHndtOQpLJuZwp+P+N8XddOReoyB9UtGXS5b+bmI8DDWLcxm+6lGuvv9607jPdVNNHX2sX7JVKtDuS5NBMonPrA4h9NXrlHVeM3qUN7jhUOXuHF6kjYLBbgPLJ5Kz4DN724ue+HQJRKiI1jth3cTu3IrEYhIqohsFZGzzn9TRthmtYgcdvnpFZH7ne/9SkRqXd5b4k48yn/dsygHEfyq0/hswzVOXu7Q2kAQKM5PJTMhms1+dH71Dth49cQV1i3MJibSP0cLDXG3RvAosN0YUwhsdz5/D2PMTmPMEmPMEmAN0A285rLJ14beN8YcdjMe5aeyEmMoyU/lxcP1fjP30IuHLxEmjs5GFdjCw4R7F+ew43Qjbd3+MffQtlMNdPYNcv9S/7/QcDcRrAeecj5+Crh/jO0fAF42xvj33UXKKz5803TONXez/1yr1aFgjOHFI/WsnJ1OZkKM1eEoD3hg2XT6bXY2+Ulf1AuHLpGZEE1pQZrVoYxJ3Lk6E5E2Y0yy87EArUPPR9l+B/DvxpjNzue/ApYDfThrFMaYvlH23QBsAMjKylq2cePGScXc2dlJfLx/zQXubf5S5t5Bw9/t7KY4O4JHFnl3YrexylzZauP7Fb18ZlEUt0zznyUD3eEvv2dfGl7mf9rdQ7jAt1dYe4f4tX7D/9zZzdqZETw0z3Pnuru/49WrVx80xhS97w1jzHV/gG3A8RF+1gNtw7Ztvc7n5ABXgchhrwkQjaNG8c2x4jHGsGzZMjNZO3funPS+gcqfyvzV5w6bBf/0sunqG/DqccYq85efdcTR2evdOHzJn37PvjK8zL94o8bM/Ppmc+pyuzUBOf33rmqvxOHu7xg4YEb4mzpm05AxZq0xZuEIPy8CDSKSA+D893pd9h8F/mSMGXD57MvO+PqAXwLFY8WjAttHinLp6rex5Zh1M0Z29A7w0rFL3LdkGnHR/ju2W03c/UunERkuPH+gzrIYjDFs3H+RJbnJzMtOtCyOiXC3j2AT8LDz8cPAi9fZ9iHgGdcXXJKI4OhfOO5mPMrP3ZyXQl5aLM8fuGhZDC8evkTvgJ2HinMti0F5R2pcFLfPy+KFQ/WWrZf99oVWqho7A+r8cjcR/AC4Q0TOAmudzxGRIhF5YmgjEckDcoHXh+3/WxE5BhwD0oHvuhmP8nMiwkeKcqmobaGqsdOSGJ7df4H5OYksmpZkyfGVd3305uk0d/Xz2glrpj9/Zt9F4qLC+cBi/76JzJVbicAY02yMud0YU+hsQmpxvn7AGPMZl+3OGWOmGWPsw/ZfY4xZ5Gxq+rgxxpq/DMqn/vLmXKLCw/j1W+d8fuxjde0cr+/goeJcHBVRFWxum5NJbuoUntpzzufH7ugd4KWjl7lvydSAanbUO4uVz6XHR/OBxTn8/mAd13oHxt7Bg365p5bYqHC9iSyIhYcJnyidyb5zLZz08TKpz+67SM+AjY+VzPTpcd2liUBZ4uEVeXT12/jDQd916jV29PLnI5f4aFEuSVOCY8ioGtlHi3KJiQzzaa1g0GbnV3vOUZyfysIAa3bURKAscWNuMktyk3n6rfPY7b650/g3e88zaDd8akWeT46nrJMcG8UHl07jhcP1tHb55k7j1042UN/WwyO35PvkeJ6kiUBZ5tMr86hp6mLbKe936vUO2PhNxQVun5dFnk4wFxI+tSKfvkE7T7913ifH+8WbtcxIjWXt/CyfHM+TNBEoy9y7KIeZabH8584qr88/9NyBi7R09fOZWwPvak1NztzsBNbOz+LJ3bV09nl3euqKmmYOnm/l0yvzCA8LvEEImgiUZSLCw/j8bbM4Wtfu1cXHewds/HRnNcV5qZTkp3rtOMr/fGnNbNp7BvjtXu/WCv5j+1nS46N5qHiGV4/jLZoIlKU+dNN0cpJi+MmOs16rFTx34CJXOnr5n2sLdchoiFmSm8ythen89xs19PR7Z03jfbUt7Klu5q9vK/D76aZHo4lAWSoqIowvlM1i/7lWr6w5O1QbuDkvheWz/H8WSOV5f7OmkKbOfp7cXevxzzbG8KOtlaTHRwfckFFXmgiU5f7y5hnkp8fxvS2nGPTwtACP76rhSkcvX7lzrtYGQlRxfipr52fxs/JqmjpHnNx40radauStmma+tHoWU6ICszYAmgiUH4iKCOPRu+dR1djJM/s9NwfRlfZeflZezd0LswNiTnjlPd+4Zx69AzZ+tLXSY5/ZP2jney+dZHZmPB8rDdzaAGgiUH7izgVZlOSn8m+vneHqNc9ctX1/yylsdsM/3DPfI5+nAtesjHg+XjqTZ/Zd4MjFNo985i/erOVcczf/6975RIYH9p/SwI5eBQ0R4XsfXEh3n41vbXJ/EtqDDYNsOnKJL6yeRW5qrAciVIHuy3fOITMhhq/9/gh9g+51HFc1XuNH2yq564Ysyub698L046GJQPmN2ZkJ/N3aQrYcu+LWcoMtXf08daKfBTmJfHH1bA9GqAJZYkwk3//QQiobOvmPbWcn/TkDNjtfff4ocVHhfPf+RR6M0DqaCJRf+dyqApbOSOYbfzhKVeO1Ce8/aLPzN8+8Tfeg4V8/cmPAV9mVZ62Zl8VfFuXy0/Jqtk/yjvbvbznF4YttfPf+RWQkeHfJVV/Rb4nyKxHhYfz0YzcxJSqcDU8fpGUC88QYY/juS6fYXdXMwwuiWDA1MFaHUr71v9ffwMJpifzPZw9z5srELjae23+RX+4+x/9Ymc+9i3O8FKHvaSJQficnaQo//dgy6tt6+PgTFbR1j50MjDH862tn+NUex5f01uk6u6gaWUxkOD/72DKmRIbzsScqxr1A0ouH63n0j0e5tTCdb9wzz8tR+pZbiUBEPiIiJ0TELiJF19lunYicEZEqEXnU5fV8Ealwvv6siES5E48KHsX5qTz+ySKqGju5/7Hd171y6+m38ZXnj/DYzmoeKs7lf92ro4TU9eWmxvK7z5YChg/9dDflZ0Zfbt1mN/x4+1n+buNhivJSefwTRUHX5OhuaY4DHwJ2jbaBiIQDjwF3AwuAh0RkgfPtHwI/MsbMBlqBR9yMRwWR2+Zk8MyGErr6bXzgJ2/w3c0nOd/c9c77XX2DPHfgImv//XX++HY9X75jDt//4CLCAnDSL+V7szPj+ePnVzI1eQqf+uV+/vaZQxyra39nqpP+QTtbTzZw/2O7+fetlXxw6TSe/h/FAX3j2GjcWkvNGHMKGOuOzWKgyhhT49x2I7BeRE4Ba4C/cm73FPBt4GfuxKSCy7KZqWz521v5P6+c5he7a3nizVrS46OJjgjjSkcvNrthXnYCz31uOcU6oZyaoBlpsfzpCyv5WXkV/7Wrhk1HLpEYE0FSbCQNHX30D9rJSYrhPx5cwn03Tg3au9PFExN9iUg58FVjzIER3nsAWDe0hrGIfAIowfFHf6+zNoCI5AIvG2MWjnKMDcAGgKysrGUbN26cVKydnZ3Ex8dPat9AFSxlbum1c+CKjbpOO4N2SJsiLEwLZ05K2Pu+oMFS5onQMruna8BwsGGQc+12emyGpChhbmo4i9LDifCTWqa75V29evVBY8z7mvHHrBGIyDYge4S3/tEY8+KkI5ogY8zjwOMARUVFpqysbFKfU15ezmT3DVTBVOYPjXO7YCrzeGmZ3Xevxz7JO7z1Ox4zERhj1rp5jHog1+X5dOdrzUCyiEQYYwZdXldKKeVDvuj63g8UOkcIRQEPApuMo01qJ/CAc7uHAZ/VMJRSSjm4O3z0gyJSBywHXhKRV52vTxWRLQDOq/0vAa8Cp4DnjDEnnB/xdeDLIlIFpAG/cCcepZRSE+fuqKE/AX8a4fVLwD0uz7cAW0bYrgbHqCKllFIWCa67IpRSSk2YJgKllApxmgiUUirEaSJQSqkQ55E7i31NRK4C5ye5ezrQ5MFwAoGWOTRomYOfu+WdaYzJGP5iQCYCd4jIgZFusQ5mWubQoGUOft4qrzYNKaVUiNNEoJRSIS4UE8HjVgdgAS1zaNAyBz+vlDfk+giUUkq9VyjWCJRSSrnQRKCUUiEuaBOBiKwTkTMiUiUij47wfrSIPOt8v0JE8iwI06PGUeYvi8hJETkqIttFZKYVcXrSWGV22e7DImJEJKCHGo6nvCLyUefv+YSI/M7XMXraOM7rGSKyU0QOOc/te0b6nEAiIk+KSKOIHB/lfRGRHzv/T46KyE1uHdAYE3Q/QDhQDRQAUcARYMGwbb4A/Nz5+EHgWavj9kGZVwOxzsefD4UyO7dLAHYBe4Eiq+P28u+4EDgEpDifZ1odtw/K/DjweefjBcA5q+P2QLlXATcBx0d5/x7gZUCAUqDCneMFa42gGKgyxtQYY/qBjcD6YdusB55yPv49cLsE9srUY5bZGLPTGNPtfLoXx6pwgWw8v2eAfwZ+CPT6MjgvGE95Pws8ZoxpBTDGNPo4Rk8bT5kNkOh8nARc8mF8XmGM2QW0XGeT9cDTxmEvjtUecyZ7vGBNBNOAiy7P65yvjbiNcSye045jcZxANZ4yu3oExxVFIBuzzM4qc64x5iVfBuYl4/kdzwHmiMhuEdkrIut8Fp13jKfM3wY+7lwkawvwN74JzVIT/b5fl1sL06jAJCIfB4qA26yOxZtEJAz4d+BTFofiSxE4mofKcNT4donIImNMm5VBedlDwK+MMf8mIsuBX4vIQmOM3erAAkWw1gjqgVyX59Odr424jYhE4KhSNvskOu8YT5kRkbXAPwL3GWP6fBSbt4xV5gRgIVAuIudwtKVuCuAO4/H8jutwrAk+YIypBSpxJIZANZ4yPwI8B2CMeQuIwTE5WzAb1/d9vII1EewHCkUkX0SicHQGbxq2zSbgYefjB4AdxtkLE6DGLLOILAX+C0cSCPS2YxijzMaYdmNMujEmzxiTh6Nf5D5jzAFrwnXbeM7rF3DUBhCRdBxNRTU+jNHTxlPmC8DtACIyH0ciuOrTKH1vE/BJ5+ihUqDdGHN5sh8WlE1DxphBEfkS8CqOUQdPGmNOiMh3gAPGmE3AL3BUIatwdMo8aF3E7htnmf8FiAeed/aLXzDG3GdZ0G4aZ5mDxjjL+ypwp4icBGzA14wxAVvTHWeZvwL8t4j8PY6O408F+EUdIvIMjoSe7uz7+BYQCWCM+TmOvpB7gCqgG/i0W8cL8P8vpZRSbgrWpiGllFLjpIlAKaVCnCYCpZQKcZoIlFIqxGkiUEqpEKeJQCmlQpwmAqWUCnH/D0rnUFaqoueUAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "asignal = sine(amplitude, frequency, atime, phase)\n", "\n", "plt.grid(True)\n", "plt.plot (atime, asignal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Sinusoidă discretizată\n", "Discretizarea se obține apelând aceiași funcție ```sine``` dar cu parametrii discreți și folosind ```stem``` pentru a obține cele $n$ eșantioane:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "signal = sine(amplitude, frequency, time, phase)\n", "\n", "plt.grid(True)\n", "plt.stem (time, signal)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Producerea și audiția unui ton\n", "\n", "Pentru a produce o sinusoidă ce poate fi percepută de urechea umană trebuie să creștem frecvența și amplitudinea acesteia.\n", "\n", "În exemplul de mai jos generăm o sinusoidă de frecvență $f_0=440\\text{Hz}$ și amplitudine $10.000$ pe care o discretizăm cu frecvența de eșantionare $f_s=44.100\\text{Hz}$ pe un orizont de timp de $2\\text{s}$." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "time_of_view = 2 # s\n", "frequency = 440 # Hz\n", "amplitude = 10000\n", "phase = 0\n", "\n", "sampling_rate = 44100\n", "sampling_period = 1./sampling_rate # s\n", "n_samples = time_of_view/sampling_period\n", "time = np.linspace (0, time_of_view, int(n_samples + 1))\n", "\n", "tone = sine(amplitude, frequency, time, phase)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aceast ton îl vom discretiza cu o frecvență de eșantionare $f_s$ conform ```sampling_rate``` și îl vom transforma în formatul WAV prin conversia eșantioanelor la întregi pe 16-biți:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "sd.default.samplerate = sampling_rate\n", "wav_wave = np.array(tone, dtype=np.int16)\n", "sd.play(wav_wave, blocking=True)\n", "sd.stop()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Sarcini\n", "\n", "1. [8p] Scrieți tonurile pentru notele muzicale Do, Re, Mi, Fa, Sol, La, Si, Do.\n", "\n", "2. [8p] Compuneți un cântec simplu clasic (ex. Frère Jacques) într-un singur semnal.\n", "\n", "3. [4p] Citiți o partitură la intrare (folosind [LilyPond](https://lilypond.org/) sau formatul propriu) și produceți semnalul ce conține melodia la ieșire prin compunerea tonurilor asociate notelor automat." ] } ], "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.8.6" } }, "nbformat": 4, "nbformat_minor": 4 }