{"cells": [{"cell_type": "markdown", "id": "2535ab04", "metadata": {"tags": ["module-mm2", "module-mse1", "module-wave"]}, "source": ["# Fourier series in Python\n", "[Mathematics Methods 2](module-mm2) [Mathematics for Scientists and Engineers 1](module-mse1) [Waves](module-wave) \n", "```{index} Fourier series\n", "```\n", "\n", "In this notebook, Python will be used to calculate and generate these Fourier series and transforms.\n", "\n", "Waves of any shape can be modelled and described using Fourier series. \n", "\n", "The general Fourier series is of the form:\n", "\n", "$$y(t) = \\frac{a_0}{2} + \\sum_{n=1}^{\\infty} a_n \\sin(n\\omega t) +\\sum_{m=1}^{\\infty} b_m \\sin(m\\omega t) $$\n", "\n", "\n", "Here, \n", "\n", "$$a_0 = \\frac{2}{\\tau} \\int_{0}^{\\tau} y(t) \\,dt$$\n", "\n", "$$a_n = \\frac{2}{\\tau} \\int_{0}^{\\tau} y(t)\\sin(n\\omega t) \\,dt$$\n", "\n", "$$b_m = \\frac{2}{\\tau} \\int_{0}^{\\tau} y(t)\\cos(m\\omega t) \\,dt$$\n", "\n", "Where $\\tau$ is the period."]}, {"cell_type": "code", "execution_count": 2, "id": "442c046c", "metadata": {}, "outputs": [], "source": ["import sympy as sym\n", "from sympy import pi\n", "import matplotlib.pyplot as plt\n", "from scipy.signal import square\n", "import numpy as np\n", "import scipy.integrate as integrate\n", "from scipy import fftpack"]}, {"cell_type": "markdown", "id": "313a034c", "metadata": {}, "source": ["## Finding Fourier components"]}, {"cell_type": "code", "execution_count": 3, "id": "2f0bd2e9", "metadata": {}, "outputs": [{"data": {"text/plain": ["[]"]}, "execution_count": 3, "metadata": {}, "output_type": "execute_result"}, {"data": {"image/png": "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\n", "text/plain": ["