{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "Computing a discrete Fourier transform results in complex-valued Fourier coefficients. Each such coefficient can be represented by a magnitude and a phase component. Follow Section 2.3.2 of [Müller, FMP, Springer 2015], we discuss in this notebook the role of the phase component. \n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Polar Representation of Fourier Coefficients\n", "\n", "Let $x=(x(0), x(1), ..., x(N-1))$ be a signal with samples $x(n)\\in\\mathbb{R}$ for $n\\in[0:N-1]$. The complex Fourier coefficient $c_k:=X(k)\\in\\mathbb{C}$ for $k\\in[0:N-1]$, as computed by the [discrete Fourier transform (DFT)](../C2/C2_DFT-FFT.html), is given by\n", "\n", "$$ \n", "c_k :=X(k) = \\sum_{n=0}^{N-1} x(n) \\exp(-2 \\pi i k n / N). \n", "$$\n", "\n", "Let $c_k = a_k + i b_k$ with real part $a_k\\in\\mathbb{R}$ and imaginary part $b_k\\in\\mathbb{R}$. Recall from the [FMP notebook on complex numbers](../C2/C2_ComplexNumbers.html) that the **absolute value** is defined by \n", "\n", "$$|c_k| := \\sqrt{a_k^2 + b_k^2}$$\n", "\n", "and the **angle** (given in radians) by\n", "\n", "$$\\gamma_k := \\mathrm{angle}(c_k) := \\mathrm{atan2}(b_k, a_k) \\in [0,2\\pi).$$\n", "\n", "Using the [exponential function](../C2/C2_ExponentialFunction.html), this yields the **polar coordinate representation**\n", "\n", "$$\n", " c_k = |c_k| \\cdot \\mathrm{exp}(i \\gamma_k).\n", "$$" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Optimality Property\n", "\n", "Let $\\mathbf{cos}_{k,\\varphi}:[0:N-1]\\to\\mathbb{R}$ be a sampled sinusoid of with frequency parameter $k$ and phase $\\varphi\\in[0,1)$, defined by\n", "\n", "$$\n", " \\mathbf{cos}_{k,\\varphi}(n) = \\sqrt{2}\\mathrm{cos}\\big( 2\\pi (kn/N - \\varphi) \\big)\n", "$$\n", "\n", "for $n\\in[0,N-1]$. Intuitively speaking, when computing the Fourier transform for some discrete signal $x$ of length $N$ and for some frequency parameter $k$, one computes an inner product (a kind of correlation) of the signal $x$ and the sinusoid $\\mathbf{cos}_{k,\\varphi_k}$. The phase $\\varphi_k$ has the remarkable property that it maximizes the correlation between $x$ and all possible sinusoids $\\mathbf{cos}_{k,\\varphi}$ with $\\varphi\\in[0,1)$. In other words:\n", "\n", "$$\n", " \\varphi_k = \\mathrm{argmax}_{\\varphi\\in[0,1)} \\langle x | \\mathbf{cos}_{k,\\varphi} \\rangle. \n", "$$\n", "\n", "The complex Fourier coefficient $X(k)$ encodes this optimal phase, which is basically given by the angle of the complex number. More precisely, let $\\gamma_k$ be the angle of $X(k)$, then one can show that the optimal phase $\\varphi_k$ is given by\n", "\n", "$$\n", " \\varphi_k := - \\frac{\\gamma_k}{2 \\pi}.\n", "$$\n", "\n", "In the following code cell, we demonstrate this optimality property." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:58:36.394127Z", "iopub.status.busy": "2024-02-15T08:58:36.393764Z", "iopub.status.idle": "2024-02-15T08:58:38.928527Z", "shell.execute_reply": "2024-02-15T08:58:38.927998Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Sinusoid with phase from Fourier coefficient resulting in an optimal correlation.\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |