music/waves.ipynb
Eryn Wells c879913b7e Fix up DFT plotting code in waves notebook
Got the X axis scale set properly. Yay!
Graph the signal and DFT together. Wow!
2018-03-08 09:37:06 -08:00

271 lines
92 KiB
Text

{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import matplotlib\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"\n",
"# Show plots inline.\n",
"%matplotlib inline\n",
"\n",
"# Number of harmonics to include in subsequent plots.\n",
"Harmonics = 10\n",
"# Time in seconds.\n",
"Time = 2.0\n",
"# Plot resolution.\n",
"Steps = 200"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
"# Array of step values.\n",
"def time_space(sec=Time, samples=Steps):\n",
" '''An array of equally spaced samples over a period of time.'''\n",
" # One extra sample to also include the endpoint.\n",
" return np.linspace(0, sec, num=samples + 1)\n",
"\n",
"def sample_rate(sec=Time, samples=Steps):\n",
" '''Sampling rate in samples per second.'''\n",
" return float(samples + 1) / float(sec)\n",
"\n",
"def sample_spacing(sec=Time, samples=Steps):\n",
" '''Time between samples.'''\n",
" return float(sec) / float(samples + 1)\n",
"\n",
"def frequency_spectrum(data):\n",
" '''Perform an FFT on `data`.'''\n",
" # Get the signal frequencies.\n",
" fft = np.abs(np.fft.fft(data))\n",
" \n",
" # Get the frequencies for a DFT plot (this doesn't depend on the actual signal) based on the \n",
" # spacing of our samples.\n",
" freqs = np.fft.fftfreq(len(fft), d=sample_spacing())\n",
" \n",
" return freqs, fft\n",
"\n",
"def plot_signal_and_spectrum(domain, data):\n",
" '''Plot the signal and spectrum in a stacked plot.'''\n",
" plt.subplot(121)\n",
" plt.plot(domain, data)\n",
" \n",
" freqs, mags = frequency_spectrum(data)\n",
" plt.subplot(122)\n",
" plt.plot(freqs[:Harmonics], mags[:Harmonics], 'x')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Basic Waves"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Sine Wave\n",
"\n",
"Sine waves are easy. 😁 The have a single frequency, and no harmonics."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Sine wave.\n",
"\n",
"def sine(domain, freq=1.0):\n",
" return np.sin(2.0 * np.pi * freq * domain)\n",
"\n",
"wave = sine(time_space())\n",
"plot_signal_and_spectrum(time_space(), wave)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Saw Wave\n",
"\n",
"Saw waves consist of every integer harmonic _n_ above the fundamental frequency, where that harmonic's amplitude is n<sup>-1</sup>."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAD8CAYAAAB+UHOxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvFvnyVgAAIABJREFUeJzt3Xt8XOV56Pvfo/vVulu+SLZs+QrGxqBgMAFSSNiE5kCakh5CSEhOUnbSeNOW9LSkPU27Oad7p/v0kJSShs2BnNINDmGTEGhCGggQCHEwGIyxwRhLxhf5Ksm2bMmWNJfn/DFrxrI0kkaeNWvNmnm+n48+nhkt6X39auZ91nsXVcUYY0z+KfA7A8YYY/xhAcAYY/KUBQBjjMlTFgCMMSZPWQAwxpg8ZQHAGGPylAUAY4zJUxYAjDEmT1kAMMaYPFXkdwYm09jYqG1tbX5nw+SoN954o1dVm7xO197XJpOm877O6gDQ1tbGpk2b/M6GyVEissePdO19bTJpOu9r6wIyxpg8ZQHAGGPylAUAY4zJUxYAjDEmT1kAMMaYPGUBwJg8dv9LXWzo6j3rtQ1dvdz/UpdPOTJesgBgzCgi8n0ROSIi20a9Vi8iz4nITuffOud1EZF7RaRTRN4WkYv8y/m5WdlSw7r1mxNBYENXL+vWb2ZlS43POTNeCHwAeH33Ubbt7/c7G1ml88hJfr2zx+9sBNW/ANeNee0u4HlVXQw87zwH+Diw2Pm6HfieR3l0zdr2Ru67ZTXr1m/mnmd3sG79Zu67ZTVr2xv9zprxQOADwKfv/y2f+KdX/M5GVvnoPS/zuYdeIxq1856nS1VfBo6OeflG4GHn8cPAJ0e9/q8a8ypQKyKzvcmpe9a2N3Lrmnnc+0Int66ZZ5V/Hgl0ADg1Ek48HglHfcxJdurqGfA7C7miWVUPOo8PAc3O47nAvlHXdTuvBcqGrl4e2biXO65exCMb944bEzC5K9ABYOfhMxXcjkMnfcxJ9hgdFN/ad9zHnOQmVVVg2k0rEbldRDaJyKaenuzpnov3+d93y2ruvHZpojvIgkB+CHQAGF3pv3PAxgHg7KD47sETPuYkpxyOd+04/x5xXt8PtI66rsV5bRxVfUBVO1S1o6nJ8/3nJvR2d/9Zff7xMYG3u+3zlA8CHQC6j51KPD5yctjHnGSPfVYmmfA0cJvz+DbgqVGvf96ZDXQp0D+qqygQvnJV+7g+/7XtjXzlqnafcmS8lNW7gU7l5HCY6rIiBOgbsMoOYGAo1gXUUlduZXIOROQHwEeARhHpBv4G+BbwuIh8CdgD/IFz+TPA9UAncAr4oucZNiYNgQ4AA0NhqkuLKCsupHdgxO/sZIWB4VgAaGuo5NCJIZ9zEzyq+pkJvnVNkmsV+Fpmc2RM5gS6C2hgOExVWRGNVaX02N0uACedFsD8hgp6rUyMMZNwJQAkWz055vsfEZF+EXnL+fqmG+kODIepKi2isbrEKjvHwHCYypJCZlaXcfxUiFDEpscaY5JzqwXwL4xfPTnWr1X1QufrbjcSPTkUpqqsmMaqUvqsCwiIdYtVlcWCIsDRQSsXY0xyrgSACVZPZtzAcGwMoKGylP7TIVsMxplWUUNlKQA9NhPIGDMBL8cALhORLSLycxE5f6KLprNgZmDoTBcQ2N0uxGZGVZUV0+SUSZ+ViTFmAl4FgDeB+aq6Cvgn4CcTXTidBTPxQeD6CgsAcQNDIapLi6hzyuSYlYkxZgKeBABVPaGqA87jZ4BiEUlrx6loVBPdHXWVTmV3yiq7eJnUV1pQNMZMzpMAICKzREScx5c46fal8zsHnT1vqsusshstPgg8o6yYArGgaIyZmCsLwSZYPVkMoKr3AzcBXxWRMHAauNlZRHPO4gueqkZ3d1hlFxsDKC2ioECoqyixoGiMmZArAWCS1ZPx798H3OdGWnHxLQ8qS4uorSgGrAWgqgw6AQCgrrLEgqIxZkKBXQl8aiQCQEVJIcWFBdSUF+f9gOdwOEpUobykEIB6awEYYyYR2AAw7Mz5Ly1yKrvKEo6eCvmZJd+dKZPYn7Wusphjg/ldJsaYiQU4AMRaAGXFTmVXYS2AM2UyOijmd5kYYyYW2AAwFErSAsj3ABAa0wKoKOHY4AhpjrcbY3JUYANA/G63tPhMZZf3ASBRJmeCYjiqnBgKT/Zjxpg8FdwAMOZuN97dkc93u0NJygRsNbAxJrngBgBnwDPe311XWcJIOJqYHZSPkpUJYOMAxpikAhsAhkJOd0f8btf2A2J4gjKxFoAxJpnABoBk00Ahv1cDj50GaltkGGMmE+AAcPbdbp1VduOmgdomecaYyQQ2AAyFopQUFlBQIIC1AGD8IHBlSSElhQUctcVgxpgkAhsAhsORREUHZ/q7Rx8N+fL7PXT1DHieN7+MnQYqItRVFnN08MypYNv29/P6bs8PbzPGZCFXNoPzw3A4mlgDADCjvIiy4gIO9Q8BsHnvMT7//dcQge13X5foFsllY8cAAJpnlHHQKZMjJ4b4xD+9AsBvv3E1s2vKvc+kMSZrBLcFEIomBoAhdrfbUlfBvmOnAHjw1x8AoArPvXvYlzx6Lb42YnSwa62roPvYaQAee31f4vVHX93rbeaMMVknsAFgKBw5qwUA0FpXzr6jp4lElVc6e/nkhXMoLSpgy77jPuXSW2OnxgK01Jez/9hpolHl5fd7WNlSw3mzZ7ClOz/KxBgzscAGgLEtACDRAtjSfZz+0yGuXt7MeXPyp7IbDkcpEChyBsYh1gIYiUTp7Blg877jXLm4iVWtNbzd3Z/Xq6aNMUEOAGMGgQFa68s5ORTmp1sOIgJXLGpkVUst2/afIBLN/couViaFOKdvAtBaXwHAD1/fRySqXLmkiZUttfSfDrH36Cm/smqMyQIBDgDRxFbQcYtnVgPw/d98wMq5NdRVlrCkuZrToQgH+0/7kU1PJSuTRTOrAHjolQ+oKi1i9bxaljTHyimfZkgZY8YLbgAIRcZ1Aa1d1JB4fO35swBoa4zdAe/uzf273aEkZTK3tpy5tbHZPr+zbCbFhQUsaKwE4IM8KBNjzMSCGwDC0XFdQKVFhfzRR9r5UFsdX75iAcCZyq5v0PM8em3s1Ni4r1+7hAWNlfz17y4HYofnzCgr4oNeawEYk89cWQcgIt8HPgEcUdUVSb4vwD8C1wOngC+o6pvppBnr7hg/t//Pr1t21vPm6jLKiwv5oCcPAkAoSlnR+DL51EUtfOqilsRzEWFBY2VetIrcJCJ/CnwZUGAr8EVgNvAY0AC8AXxOVfN3OboJFLdaAP8CXDfJ9z8OLHa+bge+l26Cw6EIJUVTZ7+gQJjfUMHuvGgBpFYmAG2NlXzQm/tl4hYRmQvcAXQ4NzmFwM3A3wPfVtVFwDHgS/7l0pjpcSUAqOrLwGT7C9wI/KvGvArUisjsdNIciSjFhallP3a3m/uVXSiiFBfK1BcSK5MD/acTawdMSoqAchEpAiqAg8DVwBPO9x8GPulT3oyZNq/GAOYC+0Y973ZeO2fhaJSSFCu7tsZK9h49RTgSTSfJrDcSiU4rKKpiU0FTpKr7gX8A9hKr+PuJdfkcV9X4mZtpv6+N8VLWDQKLyO0isklENvX09Ex4XSg8vcouHFX2H8/tqaDhSDT1LqCG+Eyg3G8ZuUFE6oi1ZBcAc4BKJu/2HPvzKb2vjfGSVwFgP9A66nmL89o4qvqAqnaoakdTU9OEvzAUUYpTrOziM4F25XhlF5pGt1ibUyb50DXmko8CH6hqj6qGgB8DlxPrzoxPpkj7fW2Ml7wKAE8Dn5eYS4F+VT14rr9MVafV3RG/2831yi4UiaY8BlBTXkxDZYm1AFK3F7hURCqcWW3XAO8CLwI3OdfcBjzlU/6MmTa3poH+APgI0Cgi3cDfAMUAqno/8AyxKaCdxKaBfjGd9MLOtg7FBalVdo1VJVSXFuV8ABiJRClKMSiCzQSaDlXdKCJPAG8CYWAz8ADwM+AxEfm/nNce8i+XxkyPKwFAVT8zxfcV+JobaUHsThdIuQtIRGKVXV9uD3iGIrFT0lLV1lDJK53WH50qVf0bYjc3o+0CLvEhO8akLesGgVMRijgtgGne7eZ6CyA8jWmgAAsaKzh8YpjB4fDUFxtjck5AA0CsBZDqNFCIDQR3HzuVODYxF4WmMS4CsKAxtlFcPiySM8aMF+gAMJ3KbvmsaqIK2/afyFS2fDcyjamxAMtnx3YFfbu7P1NZMsZksWAGgHCsC2g6A54fWlAPwMYP+lBVnn3nEN3HcmtMIBTRlNcBQKxV1FhVysZdfQBs3NXHOwcsGBiTLwJ5KPxIogWQehdQY1Upi2ZW8cL2I+w8PMCTm/fTUFnCz//kCmZWl2Uqq56azjRQiA2Or1lYz2+6+vjOL9/nO7/ciQj85I8uZ1VrbQZzaozJBoFsAYSj8TGA6WX/s2vmsWnPMZ7cvJ9rls2kb3CEp986kIksek5VCUeVooJplskl8+g5Ocx3frmTyxc1UFxYwKMb92Qol8aYbBLIFkC8C2g6/d0An7+sjaODI7Q1VPKpi+Zy/b2v8MzWg3z5ioWZyKan4jOjptMFBLB2USN333g+I+Eon7tsPnf9aCvPvnuYv5vmgLIxJngCGQBGprkOIK6wQPj6tUsTz69ZNpPvvdTF6ZEI5SXj99EPktA5dIvFff6ytsTjq5fN5MnN+9lx6CQr5ta4lT1jTBYK5C1eOpXdaCtbaohElXcPBn/g81xmRiWzqiXW97+l+3jaeTLGZLeAB4A0KztnoDMXpkGOuFQmrfXl1FYUszUHysQYM7m8DgDNM8qYWV3K1v3Br+wSYwBplomIcMHcmpwoE2PM5AIaAOKDwOl1AQEsmz2D9w+fTPv3+C0UjgXFIjfKZFY1O48MEHE23TPG5KaABoBzmwaazNLmKnYeDn5lF58a68bMnSXN1YyEo+yxLSKMyWmBDgBuVXbD4Wjgj0YcOcepscksnRXbIiIXWkbGmIkFMwAktoJIv7sjXtntOBTsyi7RKipKv0wWzaxCBHYcGkj7dxljslcgA8CIi11A8cou6He7braKKkqKmFdfEfgyMcZMLpABIJyBym5HwCs7t6aBxi1prg58mRhjJhfIAJCYBTTNlcATWdJczfsB7wIKuzgzCmBpczW7ewdz+vwEY/JdIAPAuewGOpmlzdXs6h1kKBTcys7NLiCIjY2Eo8rOwzYOYEyuCmQASFR209z5ciKrWmuJRJVtAV785HYAuLDVtoQwJte5UluIyHUiskNEOkXkriTf/4KI9IjIW87Xl9NJLxSJUlggFBS40wKIV3Zv7j3myu/zw8g5nJM8mZa6chqrSnhzjwUAY3JV2rWFiBQC3wU+DpwHfEZEzkty6Q9V9ULn68F00gxN8/DzqTRVl9JaX85rHxx17Xd6Lb4S2I2ZURDbEuLC1jpe2x07Qc0Yk3vcqC0uATpVdZeqjgCPATe68HsnNN3Dz1PxseWzePn9XvpPhVz9vV5JdAG5sA4g7mPnzWTf0dM5sVmeMWY8N2rRucC+Uc+7ndfG+n0ReVtEnhCR1nQSDEWirt3pxv3e6rmMRKKs+8GbfOPHb/PzrQdd/f2ZFoq62wUEcN2K2ZQUFXDXj7fy1z/Zxr/+djfRgG+ZYYw5w6tB4H8D2lR1JfAc8PBEF4rI7SKySUQ29fT0JL0mFFbXWwAXtNTwlavaeaWzl8de38dXH30zcVh6EMS7gNwaGAeoKS/m7z65gq4jAzyycQ/ffOodOy7SmBziRm2xHxh9R9/ivJagqn2qOuw8fRC4eKJfpqoPqGqHqnY0NTUlvSYUibqyDcRYd318Gdvvvo7td19HY1Up//yrLtfTyJRMdAEBfLqjla3/+Vp2/Zfr6Zhfx/0v7bJWgDE5wo0A8DqwWEQWiEgJcDPw9OgLRGT2qKc3ANvTSXAkA11AcWXFhZQVF/L7F8/lN529DA6HM5KO29yeBjpaaVEhIsJnL53H/uOneffgCdfTMMZ4L+3aQlXDwDrgF8Qq9sdV9R0RuVtEbnAuu0NE3hGRLcAdwBfSSTMccb8LaKwrFjURjmpgZgbFp4EWuTQ1NpnLFzUC8OudvRlLwxjjHVdqUVV9RlWXqGq7qv6d89o3VfVp5/E3VPV8VV2lqr+jqu+lk14oEnW9q2OsjrY6SooK+G1AxgHiA+MimSuXmdVlLG2uDkyZGGMmF8iVwCMZmAY6VllxIctnVQdmdXA4EnV1bcREVrXW8M7+flsbYEwOCGQAyMQ6gGTOn1vDtoBUdqGIUuRBmayYW0Pf4AiHTgxlPC1jTGYFNAC4uxJ4IhfMreHEUJh9R09nPK10edEqglgAANiah4vDRKTWWcfynohsF5HLRKReRJ4TkZ3Ov3V+59OYVAU0AHhU2c2JVXbbDmR/ZRcKRynxICgunzWDAoFtB/JyJtA/Av+uqsuAVcQmPdwFPK+qi4HnnefGBEJAA0DmZwEBLJlVRXGhBGIcIDYwnvkyKS8pZNHMKt4JQJm4SURqgCuBhwBUdURVjxPb9iS+sPFh4JP+5NCY6QtoAMjcOoDRSosKWdJcHYi73VDUm6AIsZZREFpFLlsA9AD/n4hsFpEHRaQSaFbV+L4hh4DmZD+cygp3Y7wW2ADgxRgAOJVdAAaCQ2FvusUgNjh++MQwR07m1UBwEXAR8D1VXQ0MMqa7R2NvkqRvlFRWuBvjtWAGgHDUkxkvACvmzuDo4AgH+7O7svM2KM4A4J392d8yclE30K2qG53nTxALCIfjK92df4/4lD9jpi2QAWDEozEAiN3tAlk/DuDVuAgEp0zcpKqHgH0istR56RrgXWLbntzmvHYb8JQP2TPmnBT5nYFzEY56M+MF4LzZMygsiA0EX3v+LE/SPBcjHrYAqkqLWNhYydY8CgCO/wQ86ux5tQv4IrGbqMdF5EvAHuAPfMyfMdMSyADgZX93WXEhy2dX82qW7wkUikSpKvXuz3nhvFpefO8I0ai6djRntlPVt4COJN+6xuu8GOOGQHYBhSLqyZTHuCsWN/HmnmOcHMre08LCEfVkZlTclYubOHYqlI+zgYzJGYELAKrq2arXuKuWxHYGfe7dw56lOV1eLY6L+/DiRkTgZwE7Oc0Yc0bguoDC8aMPPex2uKStnqXN1fzj8zspLy7kQwvqaawq9Sz9VIx4tBAsrrGqlE+snMMjv93D0uZqPtRWT2t9hWfpG2PSF7gWwJmTr7zLekGB8Lc3nM/RwRG++uibXPnfXuS9Q9k1BTIUiXoaFAH+7Nol1FaUcOfjW7jq/36Rf992yNP0jTHpCWAAcP/w81Rc1t7AK39xNT/4w0upKCnir3+yzdP0p5KJc5KnMr+hkue/fhVPfe1yls2awV8+uZUR52xiY0z2C2AAiFUwXk0DHa2mvJjL2hv44uVtvL77GPuOnvI8DxPx4pCcZMqKC1nVWsvXr13C0cERfr3TtjkwJigCGwC8vtsd7YZVcwCyqsvD60Hgsa5Y3ERNeTE/z6IyMcZMLngBIOycfetjZddaX0FbQwWv7c6etQEhj6eBjlVSVMClC+t5PYvKxBgzucAFgJFEC8DfxUcXz6/njT3HsmaTOL9bAAAd8+vZ03cq3zaJMyawXKkxROQ6EdkhIp0iMu5ADBEpFZEfOt/fKCJt55pWOBofA/C5smur4+jgCLv7/B8HiEaVcFQp8jsotsUOw3pzz3Ff82GMSU3ataiIFALfBT4OnAd8RkTOG3PZl4BjqroI+Dbw9+eaXrwLyO+73ZUt2bMhWijq/7gInNk36R1bHWxScP9LXWzo6j3rtQ1dvdz/UpdPOco/btQYlwCdqrpLVUeAx4idkjTa6FOTngCuEZFzul0d8WEdQDKLZ1bHTgvLgsou7EyN9btVVFZcyOKZVVkRFE32W9lSw7r1mxNBYENXL+vWb07cXJnMc6PGmAvsG/W823kt6TWqGgb6gYZzSSyUJWMAJUUFLJ1VnRV74mdLmQCcP6cma05Q+/MntrB+416/s2EmsLa9kftuWc269Zu559kdrFu/mftuWc3a9ka/s5Y3sm4QeKqj80qKCljSXEV1abEPuTvbijk1vHPA/9PC4q0iP2dGxZ0/ZwY9J4c5csL/geBn3z2cdSu2zdnWtjdy65p53PtCJ7eumWeVv8fcqDH2A62jnrc4ryW9RkSKgBqgL9kvm+rovIvm1fHsn17FBVnQTDx/bg3HToU44PNpYfHV0SU+d4sBrIgfFpMlXWN+j4uYyW3o6uWRjXu54+pFPLJx77gxAZNZbnw6XgcWi8gC56CMm4mdkjTa6FOTbgJeUL9vm10QPxrR7z7vUDh7uoDOS5SJ/3feXu8aa6Yn3ud/3y2rufPapYnuIAsC3kn70+H06a8DfgFsBx5X1XdE5G4RucG57CGgQUQ6gTsZc5h2UC0fdVqYn7JhdXRctpwWpqqEIt6dHGem7+3u/rP6/ONjAm93+996zBeubAetqs8Az4x57ZujHg8Bn3YjrWwSPy3sjT3HfM3HSBYFAIidFvbSjh5UlXOc7JW2SFRRzY5xEZPcV65qH/fa2vZGGwfwkH060tQxv57Ne48n7sL9kC3TQOM+1FZPn8+L5PzaNdaYILFPR5o62uo4HYqwZZ9/q1+zqQsI4EPOimA/+3LPLI6zLiBjJpIdNUaAXbmkiZKiAn76tn9HI2bL/khx7U1VLGys5Kdb/CuT+MB4NsyMMiZb2acjTTPKirlm2Uye3LyfziMDRKPeT26Kd3dkS3+3iHDDhXN49YM+XtnZS8THMsmWVpEx2cg+HS74s/+wlFAkykfveYk1//V5NnR62/WRuNvNosrui5cvoKWunFsf2sgFf/sLHt+0b+ofclG8W6zI42MyjQmS7KkxAqy9qYqf/qcP81fXL6eqtIg/+59bPD0a8cw5ydlT2dWUF/Ojr67l/7zxfM6bPYP/48ltHOw/7Vn68W4x6wIyZmL26XDJwqYq/vDKhfztDedzoH+In2/zrv87FM3O7o6Z1WV87rI2vv2/XkhUlf/x2z2epZ1tA+PGZCP7dLjsikWNNFSW8OJ7RzxLMxu7gEZrra+go62OF3d4d15w2MYAjJmSfTpcVlAgfHhxI7/e2evZgHCivztLZgElc+WSJrYfPOHZaWHZNjPKmGxkASAD1rY30Dc4wgd9g56kF4Tujvjqzjd2e7NqOttbRcZkA/t0ZMCFrbGFUF4tDhsJQHfH8tnVlBQW8Fa3N2WSbVNjjclG9unIgEUzq6goKfQsAMRbANl8t1taVMjyOTM8LxPrAjJmYtlbYwRYYYFwwdwa3vJoV8NwQCq7C1tq2Nrd78nCsEx1i4lIoYhsFpGfOs8XiMhGEekUkR86W6IbEwgWADJkVWst2w+c8GQ9wEhEEYkFnmy2sqWWwZEIXT0DGU8rg4fk/DGxbc/j/h74tqouAo4BX3I7QWMyxQJAhqxqqWUkEvXkSMJQJEpxQYFvWy+nalVrLQBvedANlIkWgIi0AL8LPOg8F+Bq4AnnkoeBT7qWoDEZZgEgQ1a1xo5G9KLPOxSOZn33D8DCxkqqS4s8KZORzGwF8R3gz4F4s64BOO4cigTQDcx1M0FjMskCQIbMrS2nsaqEt/ZlfhwgFIlSHIAtDwoKhJWtNZ6c+BRyeSsIEfkEcERV3zjHn79dRDaJyKaeHu8WxBkzmeyvNQJKRFjVUssWD6Y9jgTo8PNVLbVsP3iCoVAko+mcOSfZtXK5HLhBRHYDjxHr+vlHoFZE4ifrtQD7k/2wqj6gqh2q2tHU1ORWnoxJSzBqjYBa1VpLV88AJ4dCGU0nHIlm9RTQ0Va11hKOKu8ezOzYSDixP5I7XUCq+g1VbVHVNuBm4AVV/SzwInCTc9ltwFOuJGiMB4JRawTUypYaVMn4AemhSDDGACDWAoDMj414eE7yXwB3ikgnsTGBhzKdoDFuceVQeJPcmcquP6MHXYciGpgVr7NqymieUZrxABAKZ251tKr+CviV83gXcInriRjjgbQ+HSJSLyLPichO59+6Ca6LiMhbztfT6aQZJHWVJcxvqPDkbjcoYwCAMzaS+VZRQQDWRhjjp3RrjbuA51V1MfC88zyZ06p6ofN1Q5ppBsqaBfX8emcPx0+NZCyNUCRKSUC6gAAuWVDPB72DbMtg11goYEHRGD+k+wm5kdjiF7BFMEl96cMLGRyJ8Lv3vsLl33qBe57dgaq7WyEErbL7gw+1Ul1WxG3ff40r/tsL3PnDt1xfMR2KaGAGxo3xS7qfkGZVjR99dQhonuC6MmcO9KsiMmmQyLX50ktnVfMPn17F7Joy6itLuPeFTl7c4e5hMaFwcKaBAswoK+a/33oxi5urmF1Tzo837+ehVz5wNY2grI0wxk9TDgKLyC+BWUm+9Vejn6iqishEt7bzVXW/iCwEXhCRraralexCVX0AeACgo6PDmxNVMuymi1u46eIWQpEoa/7L8/zozf1cvWyiWDl9oWiU0uJgjeevXdTI2kWxgfGbvreBH7/ZzVeuWujadhZBmhlljF+mvEVS1Y+q6ookX08Bh0VkNoDzb9JbW1Xd7/y7i9jsidWu/Q8CpLiwgOsvmMXz2w+72uURCtA6gGRuvHAOO48M0NXj3gE6I5EoRQXBLROTOfe/1MWGrt6zXtvQ1cv9LyW9J81p6X5Cnia2+AUmWAQjInUiUuo8biS2ovLdNNMNrMsWNjIUcneTuKB1AY11WXsDAG/ude+0sFBEM7ETqMkBK1tqWLd+cyIIbOjqZd36zaxsqfE5Z95L9xPyLeBjIrIT+KjzHBHpEJEHnWuWA5tEZAuxVZPfUtW8DQAXzY+tDdi8172poUHv717YWMWMsiJ3yyQgG+QZ761tb+S+W1azbv1m7nl2B+vWb+a+W1ZndK1Otkqr41hV+4Brkry+Cfiy83gDcEE66eSS2TXlNM8oZfPeY9y2ts2V3zkS8P7uggJhVWstm11sAYSjwZoZZby1tr2RW9fM494XOrnj6kV5WfmDbQXhixVzath+8KRrvy/oYwAAK+bW0HlkwLWxkSBtkGe8t6Grl0c27uWOqxfxyMa948YE8oV9QnywbHY1XT0DDIfd2REzHFGKAtwCAFg2q5qDRee2AAATD0lEQVRwVOk84s5pYaFw8IOiyYx4n/99t6zmzmuXJrqD8jEI2CfEB8tnz3C1sgvaVhDJnDd7BoBrg+OhSDTwQdFkxtvd/Wf1+cfHBLw4pyLbBGvyeI5YNitW2W0/eJLz56Q/8yAXuoAWNFZSUlTAdpe2iQ5FolSW2tvbjPeVq9rHvba2vTEvxwGCXWsE1ILGSkqLCnjPtcou+P3dRYUFLGmu4r1D7oyN5EKZGJNp9gnxQWGBsHRWNdtd6O6IRJVINDcqu+WzZrg2OB6KRCkpsi4gYyYT/FojoOKVXbobw8XPvi3Ogcpu2ewZ9A4M03NyOO3fFbQN8ozxg31CfLJsdjVHB0fSruwSRx/mwLYHy2dXA+4MBIcialtBGDMF+4T4ZLkz6yXds3HPHH4e/BbA8sTgePoBYMS6gIyZkgUAn8Qru3QHPc90AQX/T1lXWcKsGWW858I4gHUBGTM1+4T4pKaimDk1ZWnf7Xp4+Lknls2uTrtVBLHFcblSJsZkin1CfLR6Xh0buvqIRJWungF+8NrexB19qkKR2BhA0NcBxF00r44dh09y5MQQR04O8cire+g/FZr278mFxXHGZJqtlPHRdStm8bOtB/nnFzv59i/fJ6rQc3KYO65ZnPLviAeMXFn1et2KWdzz3Ps88PIuntpygJ6Tw/y2q4/vfvailH+HqgbunGRj/GC3SD66etlMZlaX8v889z4tdRWsaqnh//31LiLR1KeGjoRzqwtoSXM1F8+v48FXPuD0SISPLG3iZ1sPsu/oqZR/RySqqMYWlxmTTbLtMBr7hPiosrSIx//jZfzxNYt58o/W8r99eAEnh8LTGheITwPNlS4ggIdu6+COqxfx9LrL+YvrlgGw8YOjKf98vFssV4KiyR3ZdhiNdQH5rK2xkj/92BIALllQD8Cru/pYMTe1N0QoxwaBAWorSrjz2qUARKNKbUUxG3f1cdPFLSn9fCiaO1NjTW4ZfRjNrWvm8cjGvb4eRpM7tUYOmF1TzpyaMrbuT31XwlxaB5BMQYGwurX2nMrEjoQ02Wj0YTS3rpnn6yZ09gnJMouaq6e1TfRIDq0DmMji5mp29Q6mPDZiXUAmm2XTYTT2Ccky7U2V7OoZJDrdyi6Htz1ob6pkJByl+1hqA8GJmVEFudkqMsGVbYfR5G6tEVCLZlZxOhThQP/plK7Ppc3gJrJoZhUAXT2ptYzirSLrAjLZJtsOo0nrEyIinxaRd0QkKiIdk1x3nYjsEJFOEbkrnTRz3aKmeGU3mNL1uTgIPFZ7vEyOWJmYYPvKVe3j+vzXtjcmPaTGC+l+QrYBnwJenugCESkEvgt8HDgP+IyInJdmujlrQWMlAHv6Uq3scm8a6Fi1FSXUVhSzO8UyCWdgDEBEWkXkRRF517np+WPn9XoReU5Edjr/1rmWqDEZltYnRFW3q+qOKS67BOhU1V2qOgI8BtyYTrq5rKm6lPLiQnb3Tq+/O9fvdufXV7CnL7UyObM/kqvdYmHg66p6HnAp8DXnRuYu4HlVXQw87zw3JhC8qDXmAvtGPe92XktKRG4XkU0isqmnpyfjmcs2IsL8hgr2Hp1ud0fujgEAzG+oZE+qZRKfBupiUFTVg6r6pvP4JLCd2Pv4RuBh57KHgU+6lqgxGTblJ0REfiki25J8ZeQuXlUfUNUOVe1oamrKRBJZb35DBbtTvdsNx/cCyu0WQFtDBfuPnU78fycT7xbLVJmISBuwGtgINKvqQedbh4DmjCRqTAZMuRJYVT+aZhr7gdZRz1uc18wE2hoqeXFHD9GoUjDFVMYzc95zvwUQVeg+doqFzqDwRDK5QZ6IVAE/Av5EVU+InElDVVVEks7fFZHbgdsB5s2b53q+jDkXXtw2vg4sFpEFIlIC3Aw87UG6gTW/ITbv/dCJoSmvjd8RlxYVZjpbvmprrABIaRxg2CmTMpfLRESKiVX+j6rqj52XD4vIbOf7s4EjyX7WWrYmG6U7DfT3RKQbuAz4mYj8wnl9jog8A6CqYWAd8Ati/aaPq+o76WU7t81viFV2o2e93PfCTv7+398bd+1wOEJxoVCY44ue5tXHZkeNLpOntxzga4++OW7R3HA4AkBpsauzgAR4CNiuqveM+tbTwG3O49uAp1xL1JgMS2szOFV9EngyyesHgOtHPX8GeCadtPJJPADs6TvF2vbY5nD/8Oz7APzhFQupryxJXDsUiub83T9AY1UJlSWFiRbAwf7T3PGDzQB88fI2OtrqE9cOh+KtIlcbuJcDnwO2ishbzmt/CXwLeFxEvgTsAf7AzUSNySTbDTQLza4pp6SwIFHZ/duWA4nv/XzbQT67Zn7i+XA44nZFl5Vis6MqE+sjfvnu4cT3nt5y4OwAEG8BuBgYVfUVYKJm1jWuJWSMh3K/5gigwgJhXkMFnUcGUFVe3tnDR5c3U1NePO6sgOFwlLLi3G8BQGyRXKezHcRL7/fSWl/OJW31ScsEoMzFLiBjcpF9QrLUijkz2Lr/OLv7TrHv6GmuWtJIa305+46evUfQcDiaFy0AgBVza9h39DRHTg7x265erlzcREt9Od3HxpcJ5P7AuDHpyo+aI4BWtdZy+MQw/3NTbA3dFYubaK2rYN+YHTGHQpG82fRslXNq0sMbdjM4EkmUyaETQ4luH4iViUjuT401Jl35UXME0MqWWgD++VddzKuvoK2xktb62GIo1TOzXobDUUrzpAvogpYaROC7L3ZRWCCsXdRAa30FqnDg+Jkps8PhKGVFhYyeo2+MGc8CQJa6sLWWpupSAD67JrZwqKWunOFwlJ6Tw4nrhkMRyvKkBVBdVsx1588C4H9ZOZsZZcW01JUDnHVWwHAo4uoUUGNylc0CylKFBcKjX17DM1sP8qUPLwBgbm2ssjvQP8TMGWUADIWj1JQX+5ZPr9194woWNlVy+xWx7XPjZXJwVAsgNjXWAoAxU7EAkMWWNFezpLk68Tw+///o4NktgFKnpZAPmqpL+d//w7LE84aqWJn0DY4kXhsOR/JmZpQx6bDbpABpqIxV9H0DZyq7kTyaBZRMRUkRZcUFZwfFPC8TY1Jln5IAqa+KtwBG3+3mzzqAiTRUlo5pAeTH6mhj0mUBIEAqSwopKSo4KwAMhfJjJfBk6itLxpWJLQIzZmr2KQkQEaGhssTudscYGwCsTIxJjQWAgBlf2dmUx4bKkrPGRfJlfyRj0mWfkoCpH9UCiESVUERd3/c+aMYFxVA074OiMamwT0nANFSWcMyp7DKx730Q1VeVcDoU4fRIrDyGwpG8D4rGpCK/a44Aqht1t5uhfe8Dp74ivhYgNhXUWgDGpMY+JQHTUFnCwHCY4XBk1LbH+X23e2aBXLxlZIPAxqTCVgIHTL2zGOzo4Ii1ABwNY9ZHDNleQMakxAJAwMTvdvsGRhLnAFsL4ExQjEY1sRuoMWZyFgACZvTdbkVJrJKrKs3vP+PoLqDBkTAA1WX5XSbGpCKtdrKIfFpE3hGRqIh0THLdbhHZKiJvicimdNLMd6Mru5PDscquKs8ruxllRRQXCn2DIwzEyyTPg6IxqUj3U7IN+BTw31O49ndUtTfN9PJeQ+WZ3S/jXUDVeV7ZiQh1FSUcHRhhYMiCojGpSutToqrbATt5yUMzyoopLBCOje4CssousUDupLUAjEmZV1MlFHhWRN4Qkds9SjMnFRTE7nb7Bkfd7VplR0NVCUcHhxNlYmMAxkxtyk+JiPwSmJXkW3+lqk+lmM6HVXW/iMwEnhOR91T15QnSux24HWDevHkp/vr80lAZq+ziR0ZWllhlV19ZytZjx0eNAeTPKWnGnKspaw5V/Wi6iajqfuffIyLyJHAJkDQAqOoDwAMAHR0dmuyafFdXWcxRpwVQVVpEQYF1wdVXFJ/dKrIWgDFTyngXkIhUikh1/DFwLbHBY3OO4gegDAyHrPvHUV9ZysmhMEdPxRaDWbkYM7V0p4H+noh0A5cBPxORXzivzxGRZ5zLmoFXRGQL8BrwM1X993TSzXfx3S8HhsN2p+uIn5a29+gpwAKAMalIdxbQk8CTSV4/AFzvPN4FrEonHXO2+soSjp8K0X/aWgBx8emxe/tOUVFSmJgia4yZmG2YEkDx1cDdx07bbBdHfIHc3qOnLCgakyILAAEUr+z29J2yGUCOhjwNAPe/1MWGrrPXV27o6uX+l7p8ypEJEgsAAdTgbH4GMKumzMecZI+GqjNl0jzD+zIRketEZIeIdIrIXV6lu7KlhnXrNyeCwIauXtat38zKlhqvspB3/Aq6mUjXAkAALWmuSjxeNqvax5xkj7qK4kQrYKnHZSIihcB3gY8D5wGfEZHzUv35dD7Ya9sbue+W1axbv5l7nt3BuvWbue+W1axtb5zef+Ic+Nn68DNtv4JuJtK1ABBAo+92va7sspWIJMZGfAiKlwCdqrpLVUeAx4AbU/3hdD/Ya9sbuXXNPO59oZNb18zzpPIHf1sffqbtV9DNRLr501mao5Y0WwCIm1tbzvuHB2hrrPQ8aWDfqOfdwJpUf3j0B/vWNfN4ZOPeaX2wN3T18sjGvdxx9SIe2biXS9sbPAkC6eY7qGnH048H3TuuXhTYdK0FEFBPfe1y/ur65VTm0YDnVP7rp1byH69ayMXz6/zOyjgicruIbBKRTT09PeO+f6538fE73/tuWc2d1y5NVIpju0cyxa/Wh99pjw26XpW32+laAAioVa21/OGVC/3ORlaZVVPGNz6+nOJCz9/W+4HWUc9bnNcSVPUBVe1Q1Y6mpqZxv+BcP9hvd/efdecbvzN+u7v/XP8v0+JXRehn2n4F3Yykq6pZ+3XxxRerMZkCbFIX3qfEulJ3AQuAEmALcP5E1499X/+ms0dX3/2s/qazJ+nzbOVnvv1M+3u/6hyXzm86e/R7v+rMinSn876W2PXZqaOjQzdtsgPETGaIyBuqOuFJdtP8XdcD3wEKge+r6t9NdO3Y9/X9L3WxsqXmrC6MDV29vN3dz1euancjexnhZ76DWmZemM772gKAyVtuBoDpsPe1yaTpvK9tDMAYY/KUBQBjjMlTFgCMMSZPWQAwxpg8ZQHAGGPyVFbPAhKRHmBPkm81At6tOJmc5WW8bMkHTJ6X+ao6flVWhk3yvgZ/yy4f087F/3PK7+usDgATEZFNfkzfS8bykr35gOzKSyr8zG8+pp2P/+fRrAvIGGPylAUAY4zJU0ENAA/4nYFRLC/jZUs+ILvykgo/85uPaefj/zkhkGMAxhhj0hfUFoAxxpg0ZXUAmOqgbREpFZEfOt/fKCJtPublCyLSIyJvOV9fzlA+vi8iR0Rk2wTfFxG518nn2yJykU/5+IiI9I8qj29mIh9OWq0i8qKIvCsi74jIHye5xpNySYdfB8tP9bfMYLpT/t0ymHaZiLwmIluctP+zV2k76ReKyGYR+amX6Y6T6r7RXn8R21a3C1jImT3WzxtzzR8B9zuPbwZ+6GNevgDc50G5XAlcBGyb4PvXAz8HBLgU2OhTPj4C/NSj98ps4CLncTXwfpK/jyflksn3mF/vKT//bhlMW4Aq53ExsBG41MP/+53Aeq8+IxN9ZXMLIJWDtm8EHnYePwFcIyLiU148oaovA0cnueRG4F815lWgVkRm+5APz6jqQVV903l8EthO7Jze0TwplzT49h7z62+Z4t8tU2mrqg44T4udL08GREWkBfhd4EEv0ptMNgeAZAdtj31zJK5R1TDQDzT4lBeA33e6F54QkdYk3/dCqnn1wmVOE/vnInK+Fwk63YCrid3RjZZN5ZJMtucvoyb5u2UyzUIReQs4Ajynql6l/R3gz4GoR+lNKJsDQND8G9CmqiuB5zjTMslXbxJbkr4K+CfgJ5lOUESqgB8Bf6KqJzKdnnGHX383VY2o6oXEznC+RERWZDpNEfkEcERV38h0WqnI5gAw5UHbo68RkSKgBujzIy+q2qeqw87TB4GLM5CPVKRSbhmnqifiTWxVfQYoFpHGKX7snIlIMbFK5FFV/XGSS7KiXCaR7fnLiBT+bhmnqseBF4HrPEjucuAGEdlNrJvvahF5xIN0k8rmAPA6sFhEFohICbFB3qfHXPM0cJvz+CbgBXVGWLzOy5j+5BuI9Wf64Wng886sl0uBflU96HUmRGRWfDxGRC4h9l7LRHDGSechYLuq3jPBZVlRLpNI5f2eU1L8u2Uq7SYRqXUelwMfA97LdLqq+g1VbVHVNmJ/4xdU9dZMpzuRIr8SnoqqhkVkHfALzhy0/Y6I3E3s1Punib15/oeIdBIbxLrZx7zcISI3AGEnL1/IRF5E5AfEZtg0ikg38DfEBrBQ1fuBZ4jNeOkETgFf9CkfNwFfFZEwcBq4OUPBGWJ3VZ8Dtjp9ugB/CcwblR9PyuVcTfQe8yLtZH9LVX3Ig6ST/t2cFmOmzQYeFpFCYjcnj6uqv1MyfWArgY0xJk9lcxeQMcaYDLIAYIwxecoCgDHG5CkLAMYYk6csABhjTJ6yAGCMMXnKAoAxxuQpCwDGGJOn/n9oXwQqUSEH4wAAAABJRU5ErkJggg==\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def saw(domain, freq=1):\n",
" harmonics = np.asarray([1.0 / h * sine(domain, freq=freq * h) for h in range(1, Harmonics)])\n",
" wave = np.sum(harmonics, axis=0)\n",
" return wave\n",
"\n",
"wave = saw(time_space())\n",
"plot_signal_and_spectrum(time_space(), wave)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"You can invert a saw wave to get what many synths call a \"blade\" wave. Instead of gradually falling and then spiking up, blade waves gradually rise and the sharply fall."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(time_space(), -1 * saw(time_space()))\n",
"plot_signal_and_spectrum(time_space(), -1 * saw(time_space()))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Square Wave\n",
"\n",
"Square waves are made of every other harmonic above the fundamental frequency. Again, the amplitude of each harmonic _n_ is _1 / n_."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def square(domain, freq=1):\n",
" harmonics = np.asarray([1.0 / h * sine(domain, freq=freq * h) for h in range(1, Harmonics, 2)])\n",
" wave = np.sum(harmonics, axis=0)\n",
" return wave\n",
"\n",
"wave = square(time_space())\n",
"plot_signal_and_spectrum(time_space(), wave)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Triangle Wave"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 2 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def triangle(domain, freq=1):\n",
" def label(i):\n",
" return 2. * i + 1.\n",
" harmonics = np.asarray([((-1) ** h) * (label(h) ** -2) * sine(domain, freq=freq * label(h)) for h in range(Harmonics)])\n",
" wave = np.sum(harmonics, axis=0)\n",
" return wave\n",
"\n",
"wave = triangle(time_space())\n",
"plot_signal_and_spectrum(time_space(), wave)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.1"
}
},
"nbformat": 4,
"nbformat_minor": 2
}