{ "cells": [ { "cell_type": "markdown", "id": "1", "metadata": {}, "source": [ "# Fourier transform\n", "\n", "It's integeral transform that takes a function as input then ouputs another function that describes which frequenties are present in the original function" ] }, { "cell_type": "markdown", "id": "3", "metadata": {}, "source": [ "## Definition\n", "\n", "Allow you to transform any periodic function into a sum of sines and cosines. \n", "\n", "## Jean Baptiste Joseph Fourier (1768–1830)\n", "\n", "$F(u)$ holds the *amplitude* and *phase* of the sinusoid of frequency $u$.\n", "\n", "$$\n", "\\begin{align}\n", "F(u) &= \\int_{-\\infty}^{\\infty} f(x)\\, e^{-i2\\pi u x}\\, dx, \\\\\n", "F(u) &= \\Re\\{F(u)\\} + i\\,\\Im\\{F(u)\\}.\n", "\\end{align}\n", "$$\n", "\n", "The **amplitude** is\n", "\n", "$$\n", "A(u) = \\sqrt{ \\Re\\{F(u)\\}^2 + \\Im\\{F(u)\\}^2 }.\n", "$$\n", "\n", "and the **phase** is\n", "\n", "$$\n", "\\phi(u) = \\tan^{-1}\\!\\left(\\frac{\\Im\\{F(u)\\}}{\\Re\\{F(u)\\}}\\right).\n", "$$\n" ] }, { "cell_type": "markdown", "id": "4", "metadata": {}, "source": [ "\n", "---\n", "\n", "## Discrete Fourier Transform (DFT)\n", "\n", "Recall the continuous Fourier transform in time:\n", "\n", "$$\n", "X(F) = \\int_{-\\infty}^{\\infty} x(t)\\, e^{-i2\\pi F t}\\, dt.\n", "$$\n", "\n", "The **discrete version** is\n", "\n", "$$\n", "X_k = \\sum_{n=0}^{N-1} x_n\\, e^{-i2\\pi \\frac{k n}{N}},\n", "$$\n", "\n", "where\n", "\n", "$$\n", "\\frac{k}{N} \\approx F, \\qquad n \\approx t.\n", "$$\n", "\n", "Here:\n", "- $N$ is the total number of samples.\n", "- $k$ is the frequency index, ranging from $0$ to $N-1$.\n", "- $X_k$ is generally **complex**, representing both amplitude and phase of frequency component $k$.\n", "\n", "Expanding the sum using Euler’s formula $e^{-i\\theta} = \\cos(\\theta) - i\\sin(\\theta)$:\n", "\n", "$$\n", "\\begin{align}\n", "X_k &= \\sum_{n=0}^{N-1} x_n \\left[\\cos\\!\\left(2\\pi\\frac{k n}{N}\\right) - i \\sin\\!\\left(2\\pi\\frac{k n}{N}\\right)\\right] \\\\\n", "&= A_k + i B_k,\n", "\\end{align}\n", "$$\n", "\n", "where $A_k$ and $B_k$ correspond to the real and imaginary parts, respectively.\n", "\n", "At the end, you obtain a **complex number** $X_k$, which can be plotted on the complex plane. \n", "The **magnitude** $|X_k|$ gives the amplitude, and the **angle** $\\arg(X_k)$ gives the phase.\n", "\n", "---\n", "\n", "### Computing $X_k$ in Practice\n", "\n", "Imagine you have a simple $\\sin(x)$ function from $0$ to $2\\pi$. You then sample, for example, **5 points** — that is, $N=5$.\n", "\n", "Assume you want to compute $X_1$ (so $k=1$). You know $N$, and you have all values of $x_n = \\sin(x_n)$ for $n=0,1,2,3,4$. You plug them into\n", "\n", "$$\n", "X_k = \\sum_{n=0}^{N-1} x_n\\, e^{-i2\\pi \\frac{k n}{N}}.\n", "$$\n", "\n", "At the end, you’ll get a **complex number** representing that frequency component.\n", "\n", "You would then repeat the process for $k=2,3,4,$ and so on.\n", "\n", "---\n", "\n", "### How many $k$ Values?\n", "\n", "If you have $N$ samples, then you can compute $N$ discrete frequency components:\n", "\n", "$$\n", "k = 0, 1, 2, \\dots, N-1.\n", "$$\n", "\n", "However:\n", "- Because the DFT of real-valued signals is **symmetric**, you typically only need to examine up to $k = N/2$ (the “positive frequencies”).\n", "- The other half ($k > N/2$) contains the complex-conjugate mirror of those components.\n", "\n", "So, for $N = 5$, you can compute $k = 0, 1, 2, 3, 4$, but often interpret only the first $\\lfloor N/2 \\rfloor$ as unique frequency components.\n", "\n", "## How would you do this in 2D?\n", "\n", "Let $f(x,y)$ be a continuous function of spatial coordinates $x, y$. Its 2D Fourier transform is\n", "\n", "$$\n", "F(u,v) = \\iint_{-\\infty}^{\\infty} f(x,y)\\,e^{-i\\,2\\pi\\,(u x + v y)}\\,dx\\,dy,\n", "$$\n", "\n", "where $u, v$ are the spatial frequencies (cycles per unit length) along $x$ and $y$.\n", "\n", "The inverse transform is\n", "\n", "$$\n", "f(x,y) = \\iint_{-\\infty}^{\\infty} F(u,v)\\,e^{+i\\,2\\pi\\,(u x + v y)}\\,du\\,dv.\n", "$$\n", "\n", "\n", "### Discrete 2D DFT (samples on an $M\\times N$ grid)\n", "\n", "Assume you have **discrete** samples $f[x,y]$ for\n", "\n", "$$\n", "x=0,1,\\dots,M-1,\\qquad y=0,1,\\dots,N-1,\n", "$$\n", "\n", "and you want their 2D DFT $F[u,v]$ defined at the **discrete frequency indices**\n", "\n", "$$\n", "u=0,1,\\dots,M-1,\\qquad v=0,1,\\dots,N-1.\n", "$$\n", "\n", "**DFT:**\n", "\n", "$$\n", "F[u,v] = \\sum_{x=0}^{M-1}\\sum_{y=0}^{N-1}\n", "f[x,y]\\;e^{-i\\,2\\pi\\left(\\frac{u x}{M}+\\frac{v y}{N}\\right)}.\n", "$$\n", "\n", "**Inverse DFT (IDFT):**\n", "\n", "$$\n", "f[x,y] = \\frac{1}{MN}\\sum_{u=0}^{M-1}\\sum_{v=0}^{N-1}\n", "F[u,v]\\;e^{+i\\,2\\pi\\left(\\frac{u x}{M}+\\frac{v y}{N}\\right)}.\n", "$$\n", "\n", "## Example with numpy\n", "\n", "Here is an example of 2D Fourier transform where frequencies/pixels are shown as dots below:" ] }, { "cell_type": "code", "execution_count": null, "id": "5", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Source: https://thepythoncodingbook.com/2021/08/30/2d-fourier-transform-in-python-and-fourier-synthesis-of-images/\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "x = np.arange(-500, 501, 1)\n", "\n", "X, Y = np.meshgrid(x, x)\n", "\n", "wavelength = 100\n", "angle = np.pi/3\n", "grating = np.sin(\n", " 2*np.pi*(X*np.cos(angle) + Y*np.sin(angle)) / wavelength\n", ")\n", "\n", "plt.set_cmap(\"gray\")\n", "\n", "plt.subplot(121)\n", "plt.imshow(grating)\n", "\n", "# Calculate Fourier transform of grating\n", "# Shift the zero-frequency component to the center\n", "ft = np.fft.fft2(grating)\n", "ft = np.fft.fftshift(ft)\n", "\n", "plt.subplot(122)\n", "plt.imshow(abs(ft))\n", "plt.xlim([480, 520])\n", "plt.ylim([520, 480]) # Note, order is reversed for y\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "9", "metadata": {}, "source": [ "\n" ] } ], "metadata": { "kernelspec": { "display_name": "ophus-env", "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.13.7" } }, "nbformat": 4, "nbformat_minor": 5 }