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",
"execution_count": 2,
"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",
" plt.subplot(121)\n",
" 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",
" plt.subplot(122)\n",
" plt.plot(freqs[:Harmonics], mags[:Harmonics], '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 09:37:06 -08:00
"execution_count": 3,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 09:37:06 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 09:37:06 -08:00
"<Figure size 432x288 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 09:37:06 -08:00
"execution_count": 4,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 09:37:06 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 09:37:06 -08:00
"<Figure size 432x288 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 09:37:06 -08:00
"execution_count": 5,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 09:37:06 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 09:37:06 -08:00
"<Figure size 432x288 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
"plt.plot(time_space(), -1 * saw(time_space()))\n",
"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 09:37:06 -08:00
"execution_count": 6,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 09:37:06 -08:00
"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+JobaUHsThdIuQtIRGKVXV9uD3iGIrFT0lL
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 09:37:06 -08:00
"<Figure size 432x288 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 09:37:06 -08:00
"execution_count": 7,
2018-03-08 08:09:39 -08:00
"metadata": {},
"outputs": [
{
"data": {
2018-03-08 09:37:06 -08:00
"image/png": "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
2018-03-08 08:09:39 -08:00
"text/plain": [
2018-03-08 09:37:06 -08:00
"<Figure size 432x288 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
]
},
{
"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
}