{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\n", "\n", "\n", "In this notebook, we discuss various padding strategies that become important when implementing and interpreting an STFT. For details on the STFT, we refer to Section 2.1.4 of [Müller, FMP, Springer 2015] and the notebook on STFT Basics.\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Padding Variants" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "When using the STFT with window size $N\\in\\mathbb{N}$, two aspects of padding can be considered:\n", "\n", "1. The center of the first window corresponds to the signal's sample index $N/2$. However, often it is convenient to think of the first window corresponding to the time of $0$. To achieve this, one can pad $N/2$ samples at the beginning of the signal.\n", "\n", "2. The last window's time range is fully contained in the signal's time range. Therefore, the end of the signal is not covered by as many overlapping windows as the rest of the signal. To counteract this, one can use padding at the end of the signal. The exact amount of necessary padding depends on the hop size as well as the window size. However, for practical reasons, one often just uses a padding length of $N/2$ again.\n", "\n", "One padding strategy is to expand the signal with zeros (**zero padding**). A different strategy is to expand the signal with samples by mirroring the signal on the first and last sample, respectively (**reflect padding**). Several other padding strategies are described in the documentation of [`numpy.pad`](https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.pad.html). The following example illustrates several padding strategies using a simple example." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-02-15T08:59:33.547092Z", "iopub.status.busy": "2024-02-15T08:59:33.546798Z", "iopub.status.idle": "2024-02-15T08:59:36.112307Z", "shell.execute_reply": "2024-02-15T08:59:36.111734Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "No padding:\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |