{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "In this notebook, we introduce the inverse DFT and then show how a signal can be recovered from its STFT under relatively mild conditions on the windowing process. In most parts, we closely follow Section Section 2.4.2 and Section 8.1.2.1 of [Müller, FMP, Springer 2015].\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Inverse DFT\n", "\n", "\n", "Given a vector $x\\in \\mathbb{C}^N$ of length $N\\in\\mathbb{N}$, the [**discrete Fourier transform**](../C2/C2_DFT-FFT.html) is defined by the matrix–vector product\n", "\n", "$$\n", "X = \\mathrm{DFT}_N \\cdot x\n", "$$\n", "\n", "with the DFT matrix $\\mathrm{DFT}_N \\in \\mathbb{C}^{N\\times N}$ given by \n", "\n", "$$\n", "\\mathrm{DFT}_N(n, k) = \\mathrm{exp}(-2 \\pi i k n / N)\n", "$$\n", "\n", "for $n\\in[0:N-1]$ and $k\\in[0:N-1]$. The DFT is **invertible** in the sense that the vector $x$ can be recovered from its spectral vector $X$. The inverse DFT is again specified by a matrix–vector product\n", "\n", "$$\n", "x = \\mathrm{DFT}_N^{-1} \\cdot X, \n", "$$\n", "\n", "where $\\mathrm{DFT}_N^{-1}$ denotes the **inverse** of the DFT matrix $\\mathrm{DFT}_N$. It is a well-known fact that this inverse is given by \n", "\n", "$$\n", "\\mathrm{DFT}_N^{-1}(n, k) = \\frac{1}{N}\\mathrm{exp}(2 \\pi i k n / N)\n", "$$\n", "\n", "for $n\\in[0:N-1]$ and $k\\in[0:N-1]$. In other words, the inverse essentially coincides with the DFT matrix up to some normalizing factor and complex conjugation. In the following code cell, we generate the DFT matrix and its inverse. Furthermore, we show that the two matrices are indeed inverse to each other (up to some numerical issues\n", "due to rounding in floating point arithmetic). To this end, we measure the entry-wise difference between $\\mathrm{DFT}_N \\cdot \\mathrm{DFT}_N^{-1}$ and the the identity matrix $I_N\\in \\mathbb{R}^{N\\times N}$ as well as between $\\mathrm{DFT}_N^{-1} \\cdot\\mathrm{DFT}_N$ and $I_N$." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:59:40.354986Z", "iopub.status.busy": "2024-02-15T08:59:40.354693Z", "iopub.status.idle": "2024-02-15T08:59:43.529118Z", "shell.execute_reply": "2024-02-15T08:59:43.528399Z" } }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |