Skip to content

Instantly share code, notes, and snippets.

@Foadsf
Last active October 19, 2019 18:58
Show Gist options
  • Save Foadsf/c60c5152cf483dff0db80b2b28cf0b0c to your computer and use it in GitHub Desktop.
Save Foadsf/c60c5152cf483dff0db80b2b28cf0b0c to your computer and use it in GitHub Desktop.
Easy Fourier transform: implementing 3Blue1Brown's interpretation
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"# %matplotlib qt"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"def polarToRectangular(radii, angles): #from here https://stackoverflow.com/a/16445006/4999991\n",
" return radii * np.exp(1j * angles)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def frequencyGenerator(time, steps = 100):\n",
" 𝛿 = time.max() - time.min()\n",
" M = np.arange(1, steps + 1)[ :, np.newaxis]\n",
" return M / 𝛿\n",
" \n",
"\n",
"def easyFourierTransform(time, values, frequency = None, steps = 100):\n",
" if frequency is None: \n",
" ft = frequencyGenerator(time, steps)\n",
" frequency = ft.reshape(ft.shape[0])\n",
" else:\n",
" ft = frequency[ :, np.newaxis]\n",
" \n",
" 𝛿 = time.max() - time.min()\n",
" order = np.argsort(time)\n",
" ts = np.array(time)[order]\n",
" Xs = np.array(values)[order]\n",
" 𝜃 = (ts - time.min()) * 2 * np.pi * ft\n",
" Y = polarToRectangular(Xs, 𝜃)\n",
" amplitude = np.abs(Y.sum(axis=1))\n",
" return frequency, amplitude"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"N = 600 # number of samples\n",
"t = np.random.uniform(0.0, 1.0, N) # assuming the time start is 0.0 and time end is 1.0\n",
"S = 1.0 * np.sin(5.0 * 2 * np.pi * t) + 0.5 * np.sin(8.0 * 2 * np.pi * t) # generating signal\n",
"X = S + 0.1 * np.random.randn(N) # adding noise"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x113f19bd0>]"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"order = np.argsort(t)\n",
"ts = np.array(t)[order]\n",
"Xs = np.array(X)[order]\n",
"plt.plot(ts, Xs)"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [],
"source": [
"f, a = easyFourierTransform(t, X, steps = 100)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[<matplotlib.lines.Line2D at 0x118a37990>]"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.plot(f, a)"
]
},
{
"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.7.4"
},
"nteract": {
"version": "0.15.0"
},
"varInspector": {
"cols": {
"lenName": 16,
"lenType": 16,
"lenVar": 40
},
"kernels_config": {
"python": {
"delete_cmd_postfix": "",
"delete_cmd_prefix": "del ",
"library": "var_list.py",
"varRefreshCmd": "print(var_dic_list())"
},
"r": {
"delete_cmd_postfix": ") ",
"delete_cmd_prefix": "rm(",
"library": "var_list.r",
"varRefreshCmd": "cat(var_dic_list()) "
}
},
"types_to_exclude": [
"module",
"function",
"builtin_function_or_method",
"instance",
"_Feature"
],
"window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment