2018-03-08 08:09:39 -08:00
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
2018-03-08 09:37:06 -08:00
"metadata": {},
2018-03-08 08:09:39 -08:00
"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",
2018-03-08 09:37:06 -08:00
"Steps = 200"
]
},
{
"cell_type": "code",
2018-03-08 17:09:07 -08:00
"execution_count": 2,
2018-03-08 09:37:06 -08:00
"metadata": {
"scrolled": true
},
"outputs": [],
"source": [
2018-03-08 08:09:39 -08:00
"# 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",
2018-03-08 09:37:06 -08:00
" 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",
2018-03-08 08:09:39 -08:00
"\n",
"def frequency_spectrum(data):\n",
2018-03-08 09:37:06 -08:00
" '''Perform an FFT on `data`.'''\n",
" # Get the signal frequencies.\n",
" fft = np.abs(np.fft.fft(data))\n",
2018-03-08 08:09:39 -08:00
" \n",
2018-03-08 09:37:06 -08:00
" # 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",
2018-03-08 08:09:39 -08:00
" \n",
2018-03-08 09:37:06 -08:00
" return freqs, fft\n",
"\n",
"def plot_signal_and_spectrum(domain, data):\n",
" '''Plot the signal and spectrum in a stacked plot.'''\n",
2018-03-08 13:41:31 -08:00
" plt.figure(figsize=(10,6))\n",
" plt.subplot(211)\n",
2018-03-08 17:09:07 -08:00
" plt.axhline(color='#666666', linewidth=0.75)\n",
2018-03-08 09:37:06 -08:00
" plt.plot(domain, data)\n",
2018-03-08 08:09:39 -08:00
" \n",
2018-03-08 09:37:06 -08:00
" freqs, mags = frequency_spectrum(data)\n",
2018-03-08 13:41:31 -08:00
" num_freqs = Harmonics * 2\n",
" plt.subplot(212)\n",
" plt.xticks(range(num_freqs))\n",
" plt.plot(freqs[:num_freqs], mags[:num_freqs], 'x')"
2018-03-08 08:09:39 -08:00
]
},
{
"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",
2018-03-08 17:09:07 -08:00
"execution_count": 3,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 17:09:07 -08:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAl8AAAFpCAYAAACidE0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvFvnyVgAAIABJREFUeJzs3Xd8VFX+//HXSYUkEAIJvSUhdEKLIKACiooNLNh7+WJdu65dxC72dXcVy4q9IFIECypWFEkoIQkt1ISWQEggvZ3fHxn3F1lKIJO5M5P38/HIIzN37sz9HCYzvO+955xrrLWIiIiIiGcEOF2AiIiISGOi8CUiIiLiQQpfIiIiIh6k8CUiIiLiQQpfIiIiIh6k8CUiIiLiQQpfIiIiIh6k8CUiIiLiQQpfIiIiIh6k8CUiIiLiQUFOF3Ag0dHRtmvXrk6XISIiInJIKSkpO621MXVZ12vDV9euXUlOTna6DBEREZFDMsZsquu6bjntaIx5yxiTY4xJO8DjxhjzsjEm0xiTaowZ5I7tioiIiPgad/X5ehsYe5DHTwESXD8TgX+7absiIiIiPsUt4cta+xOQd5BVxgPv2Bq/Ay2MMe3csW0RERERX+KpPl8dgKxa97Ndy7Z5aPsCFBRXsH5nIfklFRSWVlJZXU14SBARTYLo2CKMDlFNCQwwTpcpIm5SXW3ZWlBCVl4JhWWVFJVVEhBgaBYaRPOmwcRGh9MyPMTpMkUaHa/qcG+MmUjNaUk6d+7scDW+zVrL2pxCfl67k4WZO1meXcDOwrKDPickKICE1hEcHdeKEd1aMSwumqYhgR6qWETqq6yyikXr81i4bhe/rd/F6u17KK2oPuhzosKC6dexBcPjW3FMt2j6tG+OMdoJE2lIxlrrnhcypivwhbW2734eew34wVr7oev+amCUtfaAR76SkpKsRjsevpy9pcxYsoXPl2xh9Y69AHRtFUZS15YktI4gLiaCVhEhNAsNIjDAUFxexZ7SCrLyilmXW8SK7AJSNu+mvLKa8JBAxvZtxzmDOzAsrpW+kEW8kLWWpVn5TE/JZm7qNgpKKggONAzo1ILEji2Ij4mgS6swmjcJJjw0kGpr2Vtaye7ictbnFpGZU0jKpt2szSkEIDY6nDMHdGBCUkc6tGjqcOtEfIcxJsVam1SXdT115Gs2cJMx5iNgKFBwsOAlh2/DziKm/rSOz1K2UF5VzcDOLXh0fB+O79Wmbl+g8f//ZmlFFYs35jFn+VbmrdjOZ0uy6dO+OdeOjOfUvm0JCtTcvCJOq662fLtyB6/+uI4lm/NpEhzAyX3aMn5Ae46Oa0VYyKG/3o/v+f9v5+wpZcHqHD5fuoUXvl3Dy9+v5YzEdlw3Kp6ebZs3YEtEGh+3HPkyxnwIjAKigR3Aw0AwgLX2VVNzyOQVakZEFgNXWmsPelhLR77qJndvGc/PX83Hi7MICgzg3MEdueqYWOJjItzy+iXlVcxevoXXflrP+twiurWO4P7TejG6R2u3vL6IHL5F63fx6NwM0rbsoWNUU/7v2DjOGdyRiFD37E9n5RXz9sKNfPjHZorLqxg/oD13j+2pI2EiB3E4R77cdtrR3RS+Dq6q2vLWLxt46bu1lFZUcemwLtwwqhsxzUIbZHvV1Zav07fz9Fer2LirmJHdY3h0fF86twprkO2JyP/asaeUR+akM2/FdtpHNuGOk3owfkD7BjsanV9czus/r+eNnzcAcN3IeG4c3Y2QIB39FtmXwpefW7tjL3dNT2VZVj4n9GzN/af1Is5NR7oOpbyymnd+28hL366lstry97E9uGxYVwI0SlKkwVhr+WzJFibPSae8qpobR3XjmmPjPDYgZkt+CU99uYo5y7fSs20zpkzoT7+OkR7ZtoivUPjyU9Za3v19E499sZLw0EAeGd+XMxLbOdIRfmt+CffOWMGPa3IZHt+KFy8YQOtmTTxeh4i/Kyiu4M7py5mfsYOjukbxzIT+xEaHO1LL96t2cO+MFewsLOe2MQncMKqbdrxEXBS+/NDe0grumbGCuanbGN0jhmcm9G+wU4x1Za3lk+QsHp6dTkRoMC9fOIDh8dGO1iTiT5Zn5XPjB0vYXlDKPaf05KoRsY6HnYKSCh6Ymcac5VsZ2T2GF84foLnCRFD48jubdhVx1duL2birmDtP6sG1x8U5/gVc26rte7jh/SVs3FnEA6f15soRXTUthUg9fZaSzb0zVhDTLJR/XDSQQZ2jnC7pv6y1vL9oM5PnZBAdEcKbVxxFr3YaESmN2+GEL/Wa9HJ/bMjjzH/+yq6ict67eijXj4r3quAF0LNtc2bfdAxjerVh8hcZPDQrncqqg0/sKCL7V11tefbr1dzx6XKSukbxxd+O8argBWCM4ZKjuzD9+mFUWcuEfy9kwaocp8sS8RkKX17si9StXPLGIqLCQvj8hhEMi2/ldEkHFBEaxKuXDOba4+J49/dNXPNOMiXlVU6XJeJTyiurufXjZbyyIJMLjurEtKuGEOXFp/QSO7Zg1o3H0DU6nKunLeb9RZucLknEJyh8eamP/tjM3z5cSv9Okcy4YbhjHWwPR0CA4d5Te/HEWf34cU0ul721iD2lFU6XJeITSsqruPbdZGYv38rdY3vw5Nn9CPaBCY3bRjbhk2uHMbJ7DPd/nsarP65zuiQRr+f9n+xG6I2f13PPjBUclxDDO1cNpUWY9+757s9FQzvzjwsHsiwrnwun/k5eUbnTJYl4tcKySi7/zx/8sCaXJ87qxw2juvlUv8nw0CBeuzSJ0xPb8dSXq3j269V4a39iEW+g8OVl3vh5PY/NXcmp/dry+mVJPnth69MT2zP1siQycwq5+I1F5BcrgInsT3F5JVf+5w9SNu3mpQsGctHQzk6XdERCggJ46YKBXDikE68syOS5b9YogIkcgMKXF3nnt408Nnclp/Rty8sXDPT5WaRH92jN65clsS6nkEvf/IOCEp2CFKmtpLyKq99OdgWvAYzr397pkuolMMDw+Jn9/hvAXv4u0+mSRLySb//v7kc+WZzFQ7PSObF3G16+cKDfXLz6uO4xvHbpYFZt38MV//mD4vJKp0sS8QrlldVc+14Kv2/YxfPnDeD0RN8OXn8KcAWwCYM78sK3a3hNfcBE/od//A/v4+Zn7OCeGakcmxDNKxcN9IlOtodjdM/W/OPCQSzPyueG95dQoWkopJGrrrbcNX05P63J5emzEzlzYAenS3KrgADD0+ckclpiO578chXTU7KdLknEq/jX//I+KHljHjd9sIR+HSJ59ZLBhAb5Zh+vQxnbty2Pn9WPH1bn8vfpqVRXqy+INE7WWh6bu5JZy2pGNZ53VCenS2oQgQGG58/rz4hurfj7Z6l8v2qH0yWJeA2FLwetzy3k6mnJdGjRlLeuOIrw0CCnS2pQFw7pzB0ndmfG0i08N3+10+WIOOLNXzbw1q8buHJEV64fGe90OQ0qNCiQ1y5None75tzw/hJWZBc4XZKIV1D4csjuonKuensxQQGGaVcNoVWEs9dp9JSbju/GhUM68c8F63QqQhqdbzN28Pi8lYzt05YHT+vtU9NJHKmI0CDeuuIoWoWHcvW0xWwrKHG6JBHHKXw5oLyymuveS2FrQSlTLxtMp5ZhTpfkMcYYJo/vy4hurbh3RiqL1u9yuiQRj0jfWsDNHy2lX4dIXjh/gNddJqwhxTQL5a0rjqLYNbqzqEwDb6RxU/hywKQ56SzakMeUCYkM7tLS6XI8LjgwgH9dVBM6r3svhezdxU6XJNKg8orK+b9pyUQ2DeYNH56/rz56tG3GKxcNZNX2Pdz56XLNASaNmsKXh32anMUHizZz/ah4xg/wrxFOhyMyLJg3Lz+KyirLje8voaxS14EU/1RVbbn5w6XsLCpn6qVJtG7exOmSHDOqR2vuPaUXX6Zt5/Wf1ztdjohjFL48KH1rAQ/MTGN4fCvuOLG70+U4LjY6nGfP68/y7AIemZPhdDkiDeKF+Wv4JXMnj47vQ7+OkU6X47hrjo3l1H5tefqr1fyubgfSSCl8eUhBcQXXvZdCVFiIX02
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 13:41:31 -08:00
"<Figure size 720x432 with 2 Axes>"
2018-03-08 08:09:39 -08:00
]
},
"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",
2018-03-08 09:37:06 -08:00
"plot_signal_and_spectrum(time_space(), wave)"
2018-03-08 08:09:39 -08:00
]
},
{
"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",
2018-03-08 17:09:07 -08:00
"execution_count": 8,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 17:09:07 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 13:41:31 -08:00
"<Figure size 720x432 with 2 Axes>"
2018-03-08 08:09:39 -08:00
]
},
"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",
2018-03-08 09:37:06 -08:00
"plot_signal_and_spectrum(time_space(), wave)"
2018-03-08 08:09:39 -08:00
]
},
{
"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",
2018-03-08 17:09:07 -08:00
"execution_count": 5,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 17:09:07 -08:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAlkAAAFpCAYAAACvaj13AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvFvnyVgAAIABJREFUeJzs3Xd81dX9x/HXyR6EDDLIZBNEQIEIiBPU1mpbR63FVbVafrVa+9Pu36/j122HbbWuugcuXFVbZxVcCBhANoEkjCRABgnZ897z+yMXDBDI/Oau9/PxyIPk3u+993O4uTfve875nmOstYiIiIjI4ArxdgEiIiIigUghS0RERMQBClkiIiIiDlDIEhEREXGAQpaIiIiIAxSyRERERBygkCUiIiLiAIUsEREREQcoZImIiIg4QCFLRERExAFh3i4AIDk52Y4ePdrbZYiIiIj0aNWqVVXW2pSejvOJkDV69Gjy8/O9XYaIiIhIj4wxO3tznIYLRURERBygkCUiIiLiAIUsEREREQcoZImIz2tq6+DDbVVYa71diogMkeLKBraV13u7jAFRyBIRn1ZR18Kl//iYKx9awW1vbFHQEgkC/9lUzvl3fsgFd3/Eqp013i6n3xSyRMRnbS2v56J7llFc2cjZx6Xyj/eKuWdpkbfLEhEHPfrRdhY+kc+EtGGkxkVy7SMr2bynzttl9YtCloj4pJZ2F1c+uIJ2l5vF/3Uy91+Vx0XTM/nTmwUszi/xdnki4oB3Npfzf69u4qzj0nhm4RwWXT+b2MgwrnpoJXtqm71dXp8pZImIT1qcX0JFfSt3LJjOlMx4QkIMf7xkGidmJ/DA+8XeLk9EBpm1ljvfLSQrMZp7rphBTEQYWYkxPPaNWVQ1tPLSmjJvl9hnClki4nPaXW7+8V4xM0clMmds0sHLw0ND+NIJGWyraKCkusmLFYrIYPu4aB9rS/bzrTPGER76WTyZmBbHlMzhLNlS4cXq+kchS0R8zsuf7qZsfzM3zhuHMeaQ6+ZPSgXgXT98wxWRo7t7aSEpcZFcMjPriOvm56ayamcN+5vavFBZ/ylkiYhPcbkt9ywt5Lj04czLTT3i+jHJsYxJjlXIEgkga3bV8FHhPr552hiiwkOPuH7epFTcFt7bWumF6vpPIUtEfMrbm/ZSXNnYbS/WAfNyU/m4eB9NbR1DXJ2IOOHepUXER4dzxexR3V5/QlYCI2Ij/G7IUCFLRHzKouW7yEyI5gtT0o96zPxJqbR1uFlWuG8IKxMRJ+ypbeY/m8u5fHYOsZFh3R4TEmI4IzeFpVsrcbn9Z608hSwR8Rk79zXyYWEVXzspm9CQ7nuxAGaNSSI2IpR3C/zrU62IHGnxJ6W4LVx2Us4xj5s/KZX9Te2s2eU/i5MqZImIz3j2kxJCDFyal33M4yLCQjh1QjJLtlRoBXgRP+ZyWxbnl3DahGRyRsQc89jTJqQQGmL8aj6mQpaI+IR2l5vF+aXMn5TKyPioHo+fPymVPbUtbKtoGILqRMQJ72+rpGx/M5fNOnYvFkB8dDh5oxL9avK7QpaI+IR3NpdT1dDaqzdbgBk5iQBs3F3rZFki4qCnV+wieVgEZx+X1qvjZ4xKZGt5Pe0ut8OVDQ6FLBHxCU+vLCE9PoozJqb06vjRybGEhxoK9qonS8QfVdS18M6WCr4yM4uIsN7Fkdy0ONpdlu1VjQ5XNzgUskTE64oqG3h/WyWX5mUTFtq7t6Xw0BDGpQyjYK9/bhwrEuwWrdiF29oeJ7x3lTsyDoAte+udKmtQKWSJiNc99OF2wkNDuHJO92vkHE3uyDi2lqsnS8TfNLe5eOLjHZw1KY3RybG9vt3YlFhCQwxbFbJERHq2r6GVF1aVcvH0TFLiIvt029yRcZTtb6aupd2h6kTECS+sLqWmqZ1vnjamT7eLDAtlbHKserJERHpj0fJdtHa4ub6Pb7bQOT8DYFu5f7zhigi43ZaHPtzOCVnxzBqT1PMNDjNxZBxb/eQ1r5AlIl7T0u7i8Y93MC83hfGpcX2+vb/NzxAR+M/mcrZXNXL9aWOPunXWsUxKi2NXdRONrb6/rVb369eLiPRCYUUD/9lcTnuHm1MnJDMtK+GYK7UfbnF+Cfsa2/jm6WP79fiZCdEMiwzzm/kZIv6urcPNiu37+KhwH6NHxHD6xBQyEqJ7fXu323Lve0WerbNG9quGiZ4PV9sqGjgxO6Ff9zFUFLJEpM/W7KrhB8+vo9CzEKgxcPvbW0mMCefWcyZyxexRhPQQtkqqm/jD61uYMzaJk8eO6Fcdxhgmpg1TT5aIw6y13LO0iPveK6K+pQNj4MBmCydkJ/DbC6cwJTO+x/t5dNkO1uzazx8vmdbrM4kPN8kTsgr21ilkiUhgeWdzOTc+tZqUuEh+dcHxnH1cGlHhoXywrZLF+SX87OWNvL5hL3/4yjSyk7rfJsPltnzvubUYY/jzV0/o15DBAbkj43hjw16stQO6HxHpXofLzU//uYFnPinh7OPS+NpJ2Zw6Ppld1U28t7WCBz7YzoV3f8RN88dz47zxhB8lPBVW1POHN7Zw1qRUvjozq9/1ZCfGEB0e6hdr5GlOloj02vOrSln4xCompMbx4g2n8PWTR5OREE1SbAQXnJjJoutm8/uLp7K2ZD/n/u19nlqxq9u9BR/+cDsrt1fziy9NJivx2PuV9SQ3LY6apnYq61sHdD8icqS2DjffWrSKZz4p4aZ543ng6zM5Z3Ia0RGh5I6MY+Hp43j7ltP54rR0/vafbVxw10ds3nPk2nXtLje3PLuWmIhQfv+VqQP6QBQS0tmDXVDu+2vkKWSJSK+s3F7Nj15Yx8ljR/DMwjndLrdgjOGyWTm8ecvpnJCdwP+8tJ6vP7ySJQUVNLZ2UFLdxPefW8vvX9/MOZPTuGQAn2YPODA/o8BPzjYS8Se//tcm/rO5gl9dcDzf/3xut+EoISaCvy2Yzn1XzqSivoUv3/Uhf3pzCxvKanG5LUsKKrjw7o9YX1bL7y6aSmpcz3uT9mRiWpxf9GQ5MlxojHkY+CJQYa2d4sRjiMjQqahr4canVpOTFMM9V84gNvLYbx1ZiTEsum42T67cxW2vbeaDbVWEhRiM6Qxi1506hpvPmjAow3sHlnEo2FvPaRN6tyWPiPTspTWlPLF8JwtPH8vXTx7d4/HnThnJrDFJ/OKVjdy9pIi7lxQRHR5Kc7uLnKQY7rxsOl+Ymj4oteWOjOO5VaXsa2hlxLC+ra83lJyak/UocBfwuEP3LyJDpN3l5qan1tDQ0sGi62YzPCq8V7cLCTFcNWcUl8zIYtXOGpYVVdHhtlx7ymjS43t/NlJPRgyLJHlYJAWa/C4yaDbvqeMnL65n9pgkfvj53F7fLik2gr9fNp3/Pe84Pi6uIn9HDZMzhvPVmdm93p+wN3K79GDPDbaQZa193xgz2on7FpGh9de3t7JyRzV3LDjx4BtbX0RHhHLqhGROnZDsQHWdJqYNY1uF7w8diPiDxtYObnxyNcOjwvn75dP7dRbgyPgoLpqexUXTBz4loDsTPT3YhRUNzB3n3HvLQGlOlogc1UeFVdz7XhGXzcrmghMzvV3OUY0aEUNpTZO3yxAJCL98dSPb9zVyx4LpgzJ/ygmpcZFEhoVQUu3br3uvhSxjzEJjTL4xJr+ystJbZYjIUexraOWWZz9lXMowfv7F471dzjFlJcZQ1dBGU5vvrwAt4steWbubxfml3DRvPCeP69/6dUPBGEN2Ugwl1c3eLuWYvBayrLX3W2vzrLV5KSmarCriSw6sY7W/uZ07F0wnOiLU2yUdU45nPS5ff8MV8WXbqxr53xfXMyMnge+eNcHb5fQoJymGXerJEhF/89t/b2ZpQSU//+JkJmcM93Y5Pco+GLJ8+w1XxFfVNLbxjUc/ITwshDsW9G8e1lDLToympLqp27X4fIUj/4vGmKeBj4FcY0ypMeY6Jx5HRAbfEx/v4OGPtnPtKaO5cs4ob5fTKwd6snz9U62IL2rtcPFfi1ZRVtPM/VfNPOpODb4mOymG+tYOapvbvV3KUTl1duF
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 13:41:31 -08:00
"<Figure size 720x432 with 2 Axes>"
2018-03-08 08:09:39 -08:00
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
2018-03-08 09:37:06 -08:00
"plot_signal_and_spectrum(time_space(), -1 * saw(time_space()))"
2018-03-08 08:09:39 -08:00
]
},
{
"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",
2018-03-08 17:09:07 -08:00
"execution_count": 6,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 17:09:07 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 13:41:31 -08:00
"<Figure size 720x432 with 2 Axes>"
2018-03-08 08:09:39 -08:00
]
},
"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",
2018-03-08 09:37:06 -08:00
"plot_signal_and_spectrum(time_space(), wave)"
2018-03-08 08:09:39 -08:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Triangle Wave"
]
},
{
"cell_type": "code",
2018-03-08 17:09:07 -08:00
"execution_count": 7,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 17:09:07 -08:00
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAl8AAAFpCAYAAACidE0wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvFvnyVgAAIABJREFUeJzs3Xd4U+f5//H3bRubPW323pAwDLYho9l7kT0BY0PIHk3TZjSjzbf9JWmbpKFpJjaYnR3SzCZkNSF4sTdmb8w2G9vP7w+L1KEQDJZ0JPnzui5flo6OdO4HWeZj6TnPbc45RERERCQ4orwuQERERKQqUfgSERERCSKFLxEREZEgUvgSERERCSKFLxEREZEgUvgSERERCSKFLxEREZEgUvgSERERCSKFLxEREZEgUvgSERERCaIYrws4mvj4eNe2bVuvyxARERE5pvz8/M3OuYSK7Buy4att27bk5eV5XYaIiIjIMZnZyoruq48dRURERIJI4UtEREQkiBS+RERERIJI4auKWrF5N98v2UxxSanXpYhIEJSWOqYt28LijUVelyJS5YXshHsJjG8WbSLj++X8Z8lmAJrWrc5NKa0Zclpb6tWo5nF1IuJvew4UM/bHlYzLXsnqrXsBSGnXkLRT23LRyU0xM48rFKl69M5XFTLmxxUMGZXLko27eOD8zrx8Sx86N63DC18u5paR09i576DXJYqIH+09UELaqFye/nQhzerV4MUbe/PIxV1Zv2Mvd4yfzogpBV6XKFIl6Z2vKuLtvNU8MXke53dvwj9v7kNsTFnuvqRHM75euInhY/NIG5XL2KEp1IzVj4VIuDtQXMod4/PJWbGVv9/QmysTW/x027Bfteehd2fzwpeLqRkbza1ntPewUpGqR+98VQGfzV3PQ+/O5led4nnp5sSfgtchZ3dtzIgbE5mxahvDx+RzUPPARMJaaanj12/O5JtFhTx9VY+fBS+A6Cjj2Wt6cmmPZvz5kwVMylnlUaUiVZPCV4RbtKGIB96aRa9W9XltUF/iYqKPuN/FPZrx7DU9+b5gM3/+eEGQqxQRf3rp6wI+nrOeRy/pyo0prY+4T3SU8cINvTmjcwKPT55L/sqtQa5SpOpS+IpgO/Ye5LaxedSKi+HVgX2P+XHidUmtSD+tHaOnruD9GWuCVKWI+NPXCzfxwpeLuTqxBbf+6pc/ToyNieIfNybSvH4N7hg3nU079wWpSpGqTeErQpWWOh54cyZrtu3llVv60KRu9Qrd75FLutKvXUMeeW8Oc9fuCHCVIuJPK7fs5r5JM+jWtC5/vqpHhc5krFezGq8N6kvRvmLuHD+dA8WadiASaApfEerpTxcwZeEmnri8O0ltG1b4ftWio3jp5j40qBnLrWPy2Ki/hEXCwvY9B0gbnUtUlPHaoL7UiD3yFIMj6dq0Ln+5tid5K7fxyHtzcM4FsFIR8Uv4MrNMM9tkZnOPcruZ2QgzKzCz2WbWxx/HlSMb++MK3vjPcgaf0oZB/dsc9/0T6sQxMjWJnXsPkjYql137i/1fpIj4zf7iEm4bm8+arXt5bWBfWjWsedyPcXmv5tx3bifenb6Gf3ylJShEAslf73yNBi76hdsvBjr5voYDr/jpuHKYKQs28uSH8zi3a2OeuKz7CS+geFLzerx0Sx8WbSzingnTdQakSIgqLXU89M5sspdv5a/X9aRf+0Yn/Fj3n9eJqxNb8PwXi3lvuuZ9igSKX8KXc+474JdOlRkAjHFlpgH1zayZP44t//Xt4kLuGD+d7s3rMuKmRGKiK/f0nt2lMU8NOImvFxVy36QZCmAiIaa01PH7D+bwwcx1PHhBZwb0bnHsO/0CM+OZa3pySvtG/Pad2Xw0e52fKhWR8oI156sFsLrc9TW+beIn3y0u5NYxeXRIqM3Y9H7UivPPQqm39GvDY5d245M5G7h/0kz1ghQJEWXBay4Tc1Zz51kduOvsjn553NiYKEamJtGndX3umzSTj2ev98vjish/hdSEezMbbmZ5ZpZXWFjodTlh4z9LyoJX+/hajB/Wjwa1Yv36+MN+1Z7fX9KNj+es5743FcBEvFZa6nhs8lwm5qzijrM68NsLu/i1R2OtuBhGpaWQ2Ko+906awSdzFMBE/ClY4Wst0Krc9Za+bT/jnHvdOZfknEtKSEgIUmnh7fslmxmWlUe7+FpMuLU/Df0cvA659Yz2PHpJVz6evZ77FcBEPOOc4/HJc5mQvYrbz+zA7/wcvA6pHRfD6PSyAHbPxBl8qgAm4jfBCl8fAoN9Zz32B3Y45/RKrqQfCjYzNCs34MHrkOFndOCRi7vy0ez1/PqtWZSU6nR0kWByzvHE5HmMz17FbWe256GLAhO8DjkUwHr7Athnc/VrW8Qf/LXUxETgR6CLma0xs6FmdruZ3e7b5RNgGVAAvAHc6Y/jVmVz1uzg1jF5tG1U9lFjoIPXIbed2YGHL+7Kv2at47EPtB6QSDA9/8Vixk5byfAz2vPwRV0DGrwOqR0Xw+i0ZHq2rMc9E2fw/ZLNAT+mSKSzUP3PMykpyeXl5XldRkhatWUPV7/yA3Ex0bx356kVXr3en/76+UL++fVS7jmnI7+5oEvQjy9S1YybtpLHPpjLDUmteOaaiq1e70879hzkhtd/ZPXWPUwc3p+eLesH9fgioc7M8p1zSRXZN6Qm3Muxbdm1n9RRORSXOrLSUzwJXgAPXtCFG5Nb8Y+vChj9w3JPahCpKv49bwNPTJ7L2V0S+PNVJwc9eEFZG6Ks9BQa1IolbVQuywp3Bb0GkUih8BVG9hwoJj0rj3Xb9zJycBIdG9f2rBYz409XnswF3Zvwx4/m8+EsrQckEgj5K7dyz8QZ9GhRj3/e0qfS6/dVRpO61RmTngLAoIwctR8TOUEKX2GiuKSUuyfMYM6a7Yy4KfG4+jUGSkx0FCNuSiS5bUN+89ZMvlus5UFE/Klg0y6GZuXRrF51MockUzPWP+v3VUb7hNqMTkth+54DDM7IYceeg16XJBJ2FL7CgHOOxz6Yy1cLN/HUgJO58KSmXpf0k+rVohmZmkTHxnW4fVw+M1dv97okkYiwaec+UjNziIkystJTaFQ7zuuSftKjZT1eH5zE8s27GTYml30HS7wuSSSsKHyFgRenLGFS7mruPrsjA0+gUXag1a1ejay0ZBrVjiVtVA4FmzQXRKQyivYdZMioXLbtOUDmkGTaNKrldUn/47SO8bxwQ2/yVm7j7gnTtfafyHFQ+ApxE3NW8fcvl3Bt35b85oLOXpdzVI3rVmdsej+io4zUzBzW79jrdUkiYelAcSm3j8tn8cYiXr6lT0ifVXhpz2Y8NeBkvlywiUfe09IzIhWl8BXCPp+3gd+/P4czOyfw9NXBP7X8eLWNr8XotBR27D1IamYO2/cc8LokkbBSUup48O1Z/FCwhWeu6clZXRp7XdIxDerfhvvO7cTb+Wt49rNFXpcjEhYUvkLUN4s2cc+EGfRoWZ+Xb+lDNQ/PcDoeJ7eox+uD+7Ji8x6GZuWx94DmgohURGmp49H35vDhrHU8dFFXru3b0uuSKuz+8zoxsH9rXv12KSP/s8zrckRCXnj8j17F/Lh0C7eNzadj49qMSUuhVpz3Zzgdj1M7xPPijb2Zvmobd02YzkHNBRH5Rc45/vivebyZt5p7z+nIHWd18Lqk42Jm/PGKk7mkR1P+9PEC3pu+xuuSREKawleIyV+5jaFZubRuWJOxQ1OoV7Oa1yWdkIt7NONPV57MVws38dC7sylVH0iRI3LO8cynC8n6cSW3/qodvz4/dOd2/pLoKOOFG3pzaodG/O6d2Xy9cJPXJYmELIWvEDJnzQ6GZObQuE4c44f1C6lTy0/ELf3a8MD5nXlv+lqe+Wyh1+WIhKQXpyzhte+WMbB/ax69pFvIz+38JXEx0bw+OImuzepwx/h88ldu87okkZCk8BUiFm8sYlBmNnVrVGP8rf1p7FHbIH+755yODD6lDa9/t4zXvl3qdTkiIeX175b+dDbzU1d40zbI38oacafQtG510kfnsnhjkdcliYQcha8QsG7
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 13:41:31 -08:00
"<Figure size 720x432 with 2 Axes>"
2018-03-08 08:09:39 -08:00
]
},
"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",
2018-03-08 09:37:06 -08:00
"plot_signal_and_spectrum(time_space(), wave)"
2018-03-08 08:09:39 -08:00
]
}
],
"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
}