diff --git a/Week 2/5 Discrete and Fast Fourier Transforms.ipynb b/Week 2/5 Discrete and Fast Fourier Transforms.ipynb index c19a0c0..d78ead0 100644 --- a/Week 2/5 Discrete and Fast Fourier Transforms.ipynb +++ b/Week 2/5 Discrete and Fast Fourier Transforms.ipynb @@ -66,7 +66,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 23, "metadata": { "deletable": false, "nbgrader": { @@ -83,7 +83,8 @@ }, "outputs": [], "source": [ - "import numpy as np" + "import numpy as np\n", + "from matplotlib import pyplot as plt" ] }, { @@ -118,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 63, "metadata": { "deletable": false, "nbgrader": { @@ -136,31 +137,31 @@ "outputs": [], "source": [ "def DFT(yk):\n", - " N = len(yk)\n", - " x = 2*np.pi*np.arange(N)/N\n", - " beta = yk.T * np.exp(-np.dot(np.arange(N), x)*1j)\n", + " len(yk)\n", + " xk = 2*np.pi*np.arange(N)/N\n", + " beta = yk * np.exp(np.dot(-np.arange(N), xk*1j).T)\n", " return beta" ] }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([-1.-8.57252759e-16j, -2.-1.71450552e-15j, -7.-6.00076932e-15j,\n", - " -6.-5.14351656e-15j])" + "array([-1.-1.66661945e-12j, -2.-3.33323889e-12j, -7.-1.16663361e-11j,\n", + " -6.-9.99971668e-12j, -8.-1.33329556e-11j])" ] }, - "execution_count": 21, + "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "DFT(np.array([1,2,7,6]))" + "DFT(np.array([1,2,7,6,8]))" ] }, { @@ -198,7 +199,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 88, "metadata": { "deletable": false, "nbgrader": { @@ -213,10 +214,43 @@ "task": false } }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], "source": [ - "# YOUR CODE HERE\n", - "raise NotImplementedError()" + "N = 128\n", + "\n", + "xk = np.arange(N)\n", + "yk0 = np.exp(20j*xk) + np.exp(40j*xk)\n", + "yk1 = np.exp(5j*xk*2)\n", + "\n", + "fig, ax = plt.subplots(1, 2, sharex=True, sharey=True, figsize=(16,6))\n", + "\n", + "ax[0].set_xlabel(\"j\")\n", + "ax[1].set_xlabel(\"j\")\n", + "\n", + "ax[0].set_title(\"$y_k = e^{20ix_k} + e^{40ix_k}$\")\n", + "ax[0].plot(np.abs(DFT(yk0)), label=\"DFT\")\n", + "ax[0].plot(np.abs(np.fft.fft(yk0)), label=\"numpy.fft.fft\")\n", + "ax[0].legend(loc=\"upper right\")\n", + "\n", + "ax[1].set_title(\"$y_k = e^{i5x^2_k}$\")\n", + "ax[1].plot(np.abs(DFT(yk1)), label=\"DFT\")\n", + "ax[1].plot(np.abs(np.fft.fft(yk1)), label=\"numpy.fft.fft\")\n", + "ax[1].legend(loc=\"upper right\")\n", + "\n", + "fig.show()" ] }, {