{ "cells": [ { "cell_type": "markdown", "id": "efbaabb5-2ac7-40b0-bca7-1e933bb53aa1", "metadata": {}, "source": [ "# Resynthesizing sound via spectogram\n", "\n", "After we took a look how we can generate sounds in Python via numpy we want to take a look how we can re-synthesize a signal using numpy and some machine learning algorithms we have learned.\n", "This allows us to yield interesting high-quality sounds without relying on neural networks that are exhausive on resources.\n", "\n", "Instead of writing audio analysis algorithms from scratch we can use the library [librosa](https://librosa.org/doc/latest/index.html) which is a library build with the help of numpy." ] }, { "cell_type": "code", "execution_count": null, "id": "1f8cf66f-8078-43ea-8e84-19d1a4768da0", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import matplotlib as mpl\n", "import librosa\n", "import librosa.display\n", "from IPython.display import display, Audio\n", "\n", "# remove warning in plotting via librosa\n", "import warnings\n", "import matplotlib.cbook\n", "warnings.filterwarnings(\"ignore\",category=matplotlib.cbook.mplDeprecation)\n", "\n", "np.random.seed(42)\n", "\n", "mpl.rcParams['figure.figsize'] = (15, 8)" ] }, { "cell_type": "markdown", "id": "095ea451-553f-4a35-a3d8-91561eced228", "metadata": {}, "source": [ "## Loading a sound file" ] }, { "cell_type": "code", "execution_count": null, "id": "316d9898-53f9-4df8-8f30-43fa72590fa6", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "path = 'trumpet.flac'\n", "data, sr = librosa.load(path, sr=None, mono=True)\n", "display(Audio(path))" ] }, { "cell_type": "markdown", "id": "30a1c925-24bd-43e9-b042-ca8789683020", "metadata": {}, "source": [ "We start by loading a recording of a trumpet.\n", "We set the samplerate to `None` because otherwise librosa will not use the original samplerate of the file but will downsample the signal to $22'050~\\text{Hz}$, which is handier from a computational point of view as it contains less data, but not very pleasing from an aesthetic experience.\n", "We will also force the signal to be mono, but this could be an interesting extension to the algorithm.\n", "\n", "As [`librosa.load`](https://librosa.org/doc/main/generated/librosa.load.html) returns two values we can unpack this list by declaring two values on the left side.\n", "`data` will contain the data of our audio signal in a [PCM (Pulse Code Modulation)](https://en.wikipedia.org/wiki/Pulse-code_modulation) format, which gives us for each point in time its amplitude.\n", "The resolution of the time domain is defined by the samplerate, which is stored in variable `sr`.\n", "The resolution of the amplitude is given by its bitsize.\n", "16 bits allow for $2^{16} = 65'536$ discerete values and 24 bits allow for $2^{24} = 16'777'216$ discrete values of resolution.\n", "\n", "For this notebook we will use [trumpetsolo1_hikmet.aiff by emirdemirel](https://freesound.org/people/emirdemirel/sounds/416025/) from [freesound.org](https://freesound.org/) (converted to 16 bit FLAC) but you are welcome to exchange the file with another one.\n", "\n", "We can take a look at `data` which is simply an array of the amplitude floats in time." ] }, { "cell_type": "code", "execution_count": null, "id": "b060f5c5-6a87-41c6-9e5d-4a8ed30367d0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 0.0000000e+00, -3.0517578e-05, 6.1035156e-05, ...,\n", " 4.5776367e-04, 1.2207031e-04, -1.5258789e-04], dtype=float32)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "code", "execution_count": null, "id": "bc707256-1316-4472-a488-26640c61e124", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(896841,)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.shape" ] }, { "cell_type": "markdown", "id": "31c45a8c-604b-409a-8211-9a4711719e51", "metadata": {}, "source": [ "`data` is a single vector in time and we can verify the length of the signal by dividing it with our samplerate `sr`." ] }, { "cell_type": "code", "execution_count": null, "id": "7efe3ad6-c3d3-4c2b-9f9c-00755ccc8134", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Samplerate is 44100\n", "Length of the signal in seconds: 20.336530612244896\n" ] } ], "source": [ "print(f\"Samplerate is {sr}\")\n", "print(f\"Length of the signal in seconds: {data.shape[0]/sr}\")" ] }, { "cell_type": "markdown", "id": "e6f6272e-62fa-4398-9adf-c4f9c15bc404", "metadata": {}, "source": [ "## FFT\n", "\n", "Before we talk about the infamous *FFT* we need to talk about Fourier analysis, especially the [Fourier series](https://en.wikipedia.org/wiki/Fourier_series).\n", "The Fourier series allows us to deconstruct any given periodic function into a series of summed sines and cosines, so\n", "\n", "$$\n", "f(t) \\approx \\sum_{k=0}^{\\infty} a_k \\cos(kt) + b_k \\sin(kt)\n", "$$\n", "\n", "where $a_k, b_k \\in \\mathbb{R}$.\n", "This may seem a bit underhelming at first but it is indeed not trivial that we can describe any periodic (*\"repeating\"*) function as a sum of sine and cosines.\n", "As we increase the number of $k \\in \\mathbb{N}$ we increase the *resolution* and therefore come closer to the signal we want to approximate.\n", "\n", "But there is one problem: The audio signal we want to analyze is most of the time not periodic but aperiodic.\n", "It turns out that this problem can be solved by the [Fourier transformation](https://en.wikipedia.org/wiki/Fourier_transform) which is generalization of the former mentioned Fourier series.\n", "This Fourier transformation works on continous signals and returns a continous spectrum (the space of time, frequency and amplitude) which works well in a mathematical context but computers need discrete signals - in the end computers work binary and rely on discrete values.\n", "For more information about the resolution we refer to the groundbreaking paper *On Computable Numbers, with an Application to the Entscheidungsproblem* by Alan Turing {cite}`turing1936a`.\n", "The [difference between discrete and continious](https://en.wikipedia.org/wiki/Continuous_or_discrete_variable) is indeed not trivial as it may seems and for a proper definition of these terms rely on measure theory and [topology](https://en.wikipedia.org/wiki/Continuous_function#Continuous_functions_between_topological_spaces).\n", "A classical example form statistics is that the height of a person is continous (as there are infinite many [infinitesimal](https://en.wikipedia.org/wiki/Infinitesimal) possibilities between $160~\\text{cm}$ and $161~\\text{cm}$) and the outcome of rolling a traditional dice is finite (1,2,3,4,5,6) is discrete.\n", "\n", "Thankfully there is a discrete version of the Fourier transformation, called the *Discrete Fourier transformation* (DFT) of which an algorithmic optimized version called *Fast Fourier Transformation (FFT)* exists.\n", "So in the end the FFT allows us analyze the finite set of frequencies of sine waves which make up a discrete signal within a given time range.\n", "*Sweeping* over the signal in time range *windows* with a step size (also called hop size) is called *Short-time Fourier transformation*.\n", "But this *time range* is also more complicated than it may seem at first as introduces a new problem: We now have a trade off between frequency and time resolution:\n", "The shorter the selected time range, the more precise we know when a certain frequency is audible.\n", "At the same time if our selected time range is too small we can not pick up low frequencies.\n", "This is famously known as the *uncertainty principle*, see [Gabor limit](https://en.wikipedia.org/wiki/Uncertainty_principle#Signal_processing) for more information on it.\n", "A way to tackle this problem is the [discrete wavelet transformation](https://en.wikipedia.org/wiki/Discrete_wavelet_transform) which we will not cover here.\n", "\n", "It is also possible to convert the FFT back into the PCM format, which is called the inverse Fourier transformation.\n", "\n", "We now know the motivation behind FFT but we have not talked about what it actually returns.\n", "Depending on the chosen window and hop size we have $T = \\lbrace t_0, t_1, \\dots t_n \\rbrace$ windows and depending on our sample rate $r$ we have $B = \\lbrace b_0, b_1, \\dots b_m \\rbrace$ frequency bins.\n", "\n", "For each tuple $(t_i, b_j)$ the FFT gives us a value $z$.\n", "This value is covering not just the amplitude of the associated sine wave for the given tuple but also gives information about the position of the sine wave that currently occurs.\n", "If we do not respect the position of the sine wave we can not tell `SinOsc.ar(freq: 200.0, phase: 0.5*pi)` and `SinOsc.ar(freq: 200.0, phase: 0.0)` apart and we can not re-construct the original PCM signal perfectly anymore.\n", "\n", "Instead of storing the necesarry tuple of phase and amplitude in 2 numbers we can use the complex numbers.\n", "Let $x, y \\in \\mathbb{R}$.\n", "A complex number $z := x + iy$ consisits of a real part $x$ and an imaginary part $y$, where $i := \\sqrt{-1} \\notin \\mathbb{R}$.\n", "We can therefore imagine the complex number as a 2 dimensional plane.\n", "The notion only $i$ introduces convenient circumstances which we will not discuss in detail here but it spawned a whole new field of mathematics called *Funktionentheorie*, see {cite}`Königsberger2013` for more information on this topic.\n", "\n", "Let us define $z_{i, j}$ as the associated complex number for the $i$-th time window and $j$-th frequency bin.\n", "The amplitude of this tuple is defined by $\\text{amp}(z) := |z| = \\sqrt{x^2 + y^2}$ which is equal to the [euclidean distance](https://en.wikipedia.org/wiki/Euclidean_distance) of a 2 dimensional point $(x, y)$ to the 0-point $(0, 0)$.\n", "The phase of our sine wave is defined by $\\text{phase}(z) := \\text{arctan2}(x, y)$ where [arctan2](https://en.wikipedia.org/wiki/Atan2) is a modified version of the arctangent.\n", "It measures the angle between the 2 vectors $(x, y)$ and $(1, 0)$.\n", "\n", "A good visual representation of the FFT is availaible on the website [Seeing circles, sines and signals](https://jackschaedler.github.io/circles-sines-signals/dft_introduction.html).\n", "\n", "Before we continue with our examples in Python we will need to define 2 constants for this notebook which we will need to define to perform the STFT.\n", "`WIN_LENGTH` defines is the size of our window in samples, `HOP_LENGTH` the number of samples between each window and `N_FFT` the number of frequency bins used to analyse the signal which needs to be at least half the sample size.\n", "As we want the windows of the STFT to overlap we need to choose a smaller hop length than the window length." ] }, { "cell_type": "code", "execution_count": null, "id": "7f0bfeef-7361-4122-ac1a-b86b99436343", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(11026, 123)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "WIN_LENGTH = int(sr/4)\n", "HOP_LENGTH = int(sr/6)\n", "N_FFT = int(sr/2)\n", "\n", "data_fft = librosa.stft(data, n_fft=N_FFT, hop_length=HOP_LENGTH, win_length=WIN_LENGTH)\n", "data_fft.shape" ] }, { "cell_type": "markdown", "id": "1611a4fe-92c3-4b29-a29f-cef0e20db8d4", "metadata": {}, "source": [ "The mono signal got transfered to a 2 dimensional array where the first dimension gives us the number of frequency bins and the second dimension the number of time windows used.\n", "\n", "We can now take a look at the raw data of the STFT." ] }, { "cell_type": "code", "execution_count": null, "id": "fd94f288-f5a6-44ff-bb14-9e4f63b9fe1b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 9.66972053e-01+0.0000000e+00j, -8.16252291e-01+0.0000000e+00j,\n", " -3.73325378e-01+0.0000000e+00j, ...,\n", " -6.43045232e-02+0.0000000e+00j, -1.68261409e-01+0.0000000e+00j,\n", " 1.67719409e-01+0.0000000e+00j],\n", " [-1.20298362e+00+1.5370498e-04j, 7.32871294e-01+1.0257830e-01j,\n", " 2.27439582e-01+5.3965297e-02j, ...,\n", " 3.31833810e-02-2.7371196e-02j, 1.09452739e-01-1.4467488e-01j,\n", " -2.07813919e-01+2.3785539e-02j],\n", " [ 1.78492057e+00-2.3307584e-04j, -5.49815536e-01-1.4575520e-01j,\n", " 1.41225010e-01-1.4921878e-01j, ...,\n", " 4.48968671e-02+6.2899567e-02j, 2.30876897e-02+1.9451287e-01j,\n", " 2.71128535e-01-2.9871117e-02j],\n", " ...,\n", " [ 5.46663720e-03-4.7056403e-07j, 2.62198132e-03+3.2184920e-03j,\n", " 1.10907322e-02-7.4709475e-04j, ...,\n", " 1.42986812e-02-1.1434390e-02j, -6.79174345e-03-2.4079946e-03j,\n", " -7.96438847e-03+1.9497715e-04j],\n", " [-6.69784704e-03-1.8464819e-07j, -1.50201190e-03-2.0925521e-03j,\n", " -1.30195906e-02+8.5797138e-04j, ...,\n", " -1.55045651e-02+7.2950507e-03j, 1.60112455e-02+2.0183965e-03j,\n", " 1.51164755e-02-1.9905735e-04j],\n", " [ 7.11801788e-03+0.0000000e+00j, 1.18425570e-03+0.0000000e+00j,\n", " 1.37792919e-02+0.0000000e+00j, ...,\n", " 1.59060229e-02+0.0000000e+00j, -1.98078137e-02+0.0000000e+00j,\n", " -1.83464885e-02+0.0000000e+00j]], dtype=complex64)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_fft" ] }, { "cell_type": "markdown", "id": "9c031872-2729-4b3b-bc01-a04f8055e51a", "metadata": {}, "source": [ "We can take a look at the amplitudes (also called magnitude) of each bin for the first window.\n", "We use pandas to plot the distribution of the values for us." ] }, { "cell_type": "code", "execution_count": null, "id": "8e3c3553", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Amplitude values: [0.96697205 1.2029836 1.7849206 ... 0.00546664 0.00669785 0.00711802]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# data_fft has the frequency bins in its first dim and the\n", "# time windows in its second dim\n", "amps = np.abs(data_fft[:, 0])\n", "print(\"Amplitude values: \", amps)\n", "ax = pd.Series(amps).plot.hist(logy=True, bins=100)\n", "ax.set_xlabel(\"Amplitude value\")\n", "ax.set_ylabel(\"Num of occurences\");" ] }, { "cell_type": "markdown", "id": "8689b1b6", "metadata": {}, "source": [ "And we can also take a look at the phase of each bin for the first window." ] }, { "cell_type": "code", "execution_count": null, "id": "65561906", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Phase values: [ 0.000000e+00 3.141465e+00 -1.305805e-04 ... -8.607925e-05 -3.141565e+00\n", " 0.000000e+00]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# data_fft has the frequency bins in its first dim and the\n", "# time windows in its second dim\n", "phases = np.angle(data_fft[:, 0])\n", "print(\"Phase values: \", phases)\n", "ax = pd.Series(phases).plot.hist(logy=True, bins=100)\n", "ax.set_xlabel(\"Phase value\")\n", "ax.set_ylabel(\"Num of occurences\");" ] }, { "cell_type": "markdown", "id": "bfc47805", "metadata": {}, "source": [ "We note that the values of phase lie in $(-\\pi, \\pi]$ as this is the image domain of atan2.\n", "\n", "Before we start modifying the values of the STFT we will convert the STFT values back to a PCM encoded signal which we can easily playback." ] }, { "cell_type": "code", "execution_count": null, "id": "8e4ebb61-9f50-49e2-bb13-832d3a33fb46", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Audio(\n", " data=librosa.istft(data_fft, hop_length=HOP_LENGTH, win_length=WIN_LENGTH),\n", " rate=sr,\n", "))" ] }, { "cell_type": "markdown", "id": "ed309808-3d33-40c2-a4d3-06bc8d2a1cf5", "metadata": {}, "source": [ "We can hear that although we transformed it via STFT and the inverse STFT we still can reconstruct the original signal perfectly." ] }, { "cell_type": "markdown", "id": "3bb7cbe0-fb8b-49e5-84cc-994c2e601605", "metadata": {}, "source": [ "### Modifying the FFT matrix\n", "\n", "As we have access to the FFT matrix we can also its values.\n", "This allows us to modify the signal in a different way than just having access to the PCM values.\n", "\n", "#### Modifying values\n", "\n", "We start by removing the phase information by setting it to 0.\n", "We can achive this by using the absolute value $|z| = \\sqrt{x^2 + y^2}$, which defines the amplitude, as the real component and leave the imaginary component zero." ] }, { "cell_type": "code", "execution_count": null, "id": "dbd785a9-73d8-4826-af53-828ab83f6435", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Audio(\n", " data=librosa.istft(np.abs(data_fft), hop_length=HOP_LENGTH, win_length=WIN_LENGTH),\n", " rate=sr,\n", "))" ] }, { "cell_type": "markdown", "id": "fd6cb091-784b-4abf-8987-b424291bf50c", "metadata": {}, "source": [ "We can already hear that this introduces an amplitude modulation as all sine waves start at the same time.\n", "Therefore the beginning of each window we have silence as $\\sin(\\text{freq}*\\text{phase}) = 0$ if $\\text{phase}=0$.\n", "The `WIN_LENGTH` and `HOP_LENGTH` define the characteristics of the amplitude modulation in this case.\n", "\n", "We can also take a look how the signal sounds if we *conjugate* our complex values.\n", "Given a complex number $z:=x+iy$ the conjugate of $z$ is defined via $\\overline{z}:=x-iy$.\n", "We therefore change the phase of our values but do not modify its amplitude as $|z| = |\\overline{z}|$.\n", "\n", "![Complex absolute value](https://upload.wikimedia.org/wikipedia/commons/6/69/Complex_conjugate_picture.svg)\n", "\n", "Source: https://commons.wikimedia.org/wiki/File:Complex_conjugate_picture.svg" ] }, { "cell_type": "code", "execution_count": null, "id": "ae34a426-13e7-4c3e-b218-43b59bf527cb", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Audio(\n", " data=librosa.istft(np.conj(data_fft), hop_length=HOP_LENGTH, win_length=WIN_LENGTH),\n", " rate=sr,\n", "))" ] }, { "cell_type": "markdown", "id": "500f4f58-f4e5-46c1-8cd8-29c8bf09f12d", "metadata": {}, "source": [ "This introduces an interesting shift of time for each frequency bin.\n", "It behaves like a multiband delay whose delay times (negative and positive) get shuffled at each time window, although the shuffeling is not random but is dependent on its other parts." ] }, { "cell_type": "markdown", "id": "26532117-ad7f-47e6-ac4d-854e8b64162a", "metadata": {}, "source": [ "#### Modifying order\n", "\n", "We can use some array slicing in numpy to re-arange the order of our FFT matrix.\n", "From {ref}`working-with-matrices` we know that Python and numpy use the notion of\n", "\n", "```\n", "start:stop:step_size\n", "```\n", "\n", "for the selection and re-arranging of arrays where, if not defined, the start is 0 and the stop is the end of the array and the step size is one.\n", "Therefore `::-1` reverses the array.\n", "We use `:` to keep the dimension untouced.\n", "\n", "We start by inversing the second axis which is the time domain." ] }, { "cell_type": "code", "execution_count": null, "id": "19ef76a1-91a9-4c39-b1b7-65c4630cacd9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Audio(\n", " data=librosa.istft(\n", " stft_matrix=data_fft[:, ::-1],\n", " hop_length=HOP_LENGTH,\n", " win_length=WIN_LENGTH\n", " ),\n", " rate=sr,\n", "))" ] }, { "cell_type": "markdown", "id": "d5ef23d7-fce3-4175-90a9-d58271315748", "metadata": {}, "source": [ "We can also reverse the order of the bins which is the first dimension of our FFT matrix." ] }, { "cell_type": "code", "execution_count": null, "id": "ed679774-f11c-4c9e-b0c5-33d32dcdb2fe", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Audio(\n", " data=librosa.istft(\n", " stft_matrix=data_fft[::-1, :],\n", " hop_length=HOP_LENGTH,\n", " win_length=WIN_LENGTH\n", " ),\n", " rate=sr,\n", "))" ] }, { "cell_type": "markdown", "id": "b3e758dd-a0ce-4ca6-b36f-d860002791de", "metadata": {}, "source": [ "We can also scramble the fft bins for both dimensions.\n", "For this we use `np.arange` to create a series of $n$ numbers and use `np.random.permutation` to permutate those numbers into a new ordering.\n", "We then can use this reordered series of numbers as the indices of our FFT matrix which will reorder it.\n", "\n", "We start by re-arranging along the bin axis." ] }, { "cell_type": "code", "execution_count": null, "id": "a22c2b6f-45af-4905-a81a-282d4b9c99e8", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Audio(\n", " data=librosa.istft(\n", " stft_matrix=data_fft[np.random.permutation(np.arange(0, data_fft.shape[0])), :],\n", " hop_length=HOP_LENGTH,\n", " win_length=WIN_LENGTH\n", " ),\n", " rate=sr,\n", "))" ] }, { "cell_type": "markdown", "id": "5963c1ac-b5cd-4acb-8064-8da0c65f567c", "metadata": {}, "source": [ "And now allong the time axis." ] }, { "cell_type": "code", "execution_count": null, "id": "0a179959-91a4-4dbd-aa3f-cae004419774", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "display(Audio(\n", " data=librosa.istft(\n", " stft_matrix=data_fft[\n", " :,\n", " np.random.permutation(np.arange(0, data_fft.shape[1]))\n", " ],\n", " hop_length=HOP_LENGTH,\n", " win_length=WIN_LENGTH\n", " ),\n", " rate=sr,\n", "))" ] }, { "cell_type": "markdown", "id": "0879d570-c63f-4fed-bc48-e36dd8893c4d", "metadata": {}, "source": [ "We can also reset the phase to 0 via the $\\text{abs}$ function (as seen above), mute all even frequency bins on even time windows and vice versa." ] }, { "cell_type": "code", "execution_count": null, "id": "a33702a4-24c5-4c9e-9ad4-473c24ef22db", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "copy_fft = np.copy(data_fft)\n", "\n", "# reset phase\n", "copy_fft = np.abs(copy_fft)\n", "\n", "# mute even frequencies on even time\n", "copy_fft[::2, ::2] = 0\n", "# vice versa\n", "copy_fft[1::2, 1::2] = 0\n", "\n", "display(Audio(\n", " data=librosa.istft(\n", " stft_matrix=copy_fft,\n", " hop_length=HOP_LENGTH,\n", " win_length=WIN_LENGTH\n", " ),\n", " rate=sr,\n", "))" ] }, { "cell_type": "markdown", "id": "e43e11e2-e730-4688-87e8-80a0adf32396", "metadata": {}, "source": [ "## Spectogram\n", "\n", "When working with sound files we often use a [spectogram](https://en.wikipedia.org/wiki/Spectrogram) to display the amplitude of a frequency at a specific time.\n", "As this 3 dimensional vector is rather difficult to plot on a 2 dimensional screen we tend to transcend the dimension of amplitude into a color representation.\n", "The main difference to FFT is that we are not interested in the phase of our signal as we have no need to re-construct the original signal from the visual representation but the spectogram relies on FFT as well.\n", "\n", "Librosa has a built-in way to calculate the [mel spectogram](https://librosa.org/doc/main/generated/librosa.feature.melspectrogram.html)." ] }, { "cell_type": "code", "execution_count": null, "id": "bc49c0c9-122c-41a0-b33a-95af99bde30d", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(128, 123)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_spec = librosa.feature.melspectrogram(data, sr=sr, hop_length=HOP_LENGTH, win_length=WIN_LENGTH, n_fft=N_FFT)\n", "data_spec.shape" ] }, { "cell_type": "code", "execution_count": null, "id": "112348be-dd5a-4ed9-9b3e-f6ba5879e288", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[6.1129981e-01, 6.9615573e-02, 9.2120416e-02, ..., 3.2474060e-02,\n", " 4.0274881e-02, 2.6646625e-02],\n", " [1.1160107e+00, 8.6185392e-03, 1.9175248e-02, ..., 9.1835700e-02,\n", " 3.9624672e-02, 2.2018056e-02],\n", " [2.1654862e-01, 7.8314170e-03, 8.7827826e-03, ..., 1.6649935e-02,\n", " 8.5100941e-03, 7.2227293e-03],\n", " ...,\n", " [3.0609652e-05, 3.5152865e-05, 5.4686083e-05, ..., 5.9910279e-05,\n", " 6.2108615e-05, 4.9236445e-05],\n", " [4.1872801e-05, 4.2257307e-05, 4.6182246e-05, ..., 5.3868574e-05,\n", " 5.9915208e-05, 4.2955351e-05],\n", " [4.8739221e-05, 3.9803021e-05, 4.5088007e-05, ..., 5.3943058e-05,\n", " 5.6274108e-05, 5.2992524e-05]], dtype=float32)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_spec" ] }, { "cell_type": "code", "execution_count": null, "id": "e0494474-3dff-4006-9567-3197462d0dfd", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(128, 123)" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data_spec.shape" ] }, { "cell_type": "markdown", "id": "70437271-4134-4977-abff-93daf40feaf2", "metadata": {}, "source": [ "Right now we are still using the notion of amplitude from our PCM signal but the more common way to talk about the volume of signals is *decibel* - thankfully librosa has already a built-in function to help us out on the conversion here and also a function which takes care of the scaling of our plot." ] }, { "cell_type": "code", "execution_count": null, "id": "504ee0c6-62cf-4b0a-9c18-96925daf81a7", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "librosa.display.specshow(\n", " librosa.amplitude_to_db(data_spec),\n", " x_axis='time',\n", " y_axis='mel',\n", " sr=sr,\n", " fmax=20000,\n", " hop_length=HOP_LENGTH,\n", ")\n", "plt.colorbar()\n", "plt.show()" ] }, { "cell_type": "markdown", "id": "7ee6742c-6366-4f89-8e16-4e060641d21b", "metadata": {}, "source": [ "## Re-Arranging the spectogram\n", "\n", "The basic idea was to re-order the windows of our spectogram.\n", "Of course we could use any ordering but we want to focus here on an aproach which acounts the characteritics and patterns of our data which is one of the fundamental tasks of data science.\n", "\n", "As an trivial ordering of elements is only possible in a single dimension we could use a dimensionality reduction algorithm to reduce the number of our frequency bins to 1.\n", "By reducing it to 1 dimension we obtain a new ordering of our material which is based by the similarity by the content of each time window instead of the original temperal ordering.\n", "\n", "We will use 2 algorithms: PCA and TSNE and compare how the differ.\n", "Also we will train each algorithm on a reduction to 1 and to 2 dimensions - 1 dimension is necessary for our ordering but we can observe the characteristics of the algorithm better when using a 2 dimensional plot." ] }, { "cell_type": "code", "execution_count": null, "id": "d5a6e68b-e06f-469a-9a1c-050a936f9186", "metadata": {}, "outputs": [], "source": [ "from sklearn.decomposition import PCA\n", "from sklearn.manifold import TSNE\n", "\n", "pca = PCA(n_components=1)\n", "pca_2 = PCA(n_components=2)\n", "tsne = TSNE(n_components=1, random_state=42)\n", "tsne_2 = TSNE(n_components=2, random_state=42)" ] }, { "cell_type": "markdown", "id": "ed8b4037-4151-469c-be45-77c388dcdf60", "metadata": {}, "source": [ "Instead of working on the raw spectogram data we transfer it to a decibel range which reflects our hearing and perception of amplitude in a better way.\n", "\n", "We could also skip go back to amplitude range to compare the performance of the algorithms." ] }, { "cell_type": "code", "execution_count": null, "id": "b22aa02f-1938-47b1-9b0a-98fd2ae64ea3", "metadata": {}, "outputs": [], "source": [ "data_spec_db = librosa.amplitude_to_db(data_spec)" ] }, { "cell_type": "markdown", "id": "4174c939-d834-402f-9432-255d65924c81", "metadata": {}, "source": [ "### PCA" ] }, { "cell_type": "code", "execution_count": null, "id": "d6206f2f-d803-4ef4-a9e7-a390725345bf", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data_pca = pca.fit_transform(data_spec_db.T)\n", "plt.scatter(x=data_pca, y=np.zeros(data_pca.shape), c=np.arange(len(data_pca)))\n", "#plt.scatter(x=data_pca, y=np.arange(len(data_pca)), c=np.arange(len(data_pca)))\n", "\n", "plt.colorbar(location='bottom');" ] }, { "cell_type": "code", "execution_count": null, "id": "22114ced-215d-43d8-adfe-89e9822bf9a3", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data_pca_2 = pca_2.fit_transform(data_spec_db.T)\n", "plt.scatter(x=data_pca_2[:, 0], y=data_pca_2[:, 1], c=np.arange((len(data_pca))))\n", "plt.colorbar(location='bottom');" ] }, { "cell_type": "markdown", "id": "fad51448-b5f0-42d2-8b59-7a7b41363ebd", "metadata": {}, "source": [ "### T-sne" ] }, { "cell_type": "code", "execution_count": null, "id": "eb6d7ea5-2b43-48a0-9cbd-7ab766d3df1f", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data_tsne = tsne.fit_transform(data_spec_db.T)\n", "plt.scatter(x=data_tsne, y=np.zeros(data_tsne.shape), c=np.arange(len(data_tsne)))\n", "plt.colorbar(location='bottom');" ] }, { "cell_type": "code", "execution_count": null, "id": "3d25aadd-b059-413c-913c-2e2cc95fb017", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "data_tsne_2 = tsne_2.fit_transform(data_spec_db.T)\n", "plt.scatter(x=data_tsne_2[:, 0], y=data_tsne_2[:, 1], c=np.arange(len(data_tsne)))\n", "plt.colorbar(location='bottom');" ] }, { "cell_type": "markdown", "id": "1795424c-1f18-4494-8a44-b94ddddd5c9c", "metadata": {}, "source": [ "When comparing the arragements of PCA and TSNE we see that the structure of TSNE is much mor distinct and has more structure which is reflected by our hearing.\n", "\n", "There are some ways to make PCA also distinguish the structure by pre-processing (e.g. amp to decibel) the data and therefore shifting the focus on the aspects of data we want to distinguish." ] }, { "cell_type": "markdown", "id": "e43440dd-c4b5-4539-a900-c6a55ca47cf5", "metadata": {}, "source": [ "### Reordering the spectorgram\n", "\n", "We can use the 1-dimensional re-ordering of our spectogram as a new ordering of our spectogram.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "791b411b-9b0c-40bd-afce-de3ffd1021b7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([122, 120, 121, 32, 33, 34, 35])" ] }, "execution_count": null, "metadata": {}, "output_type": "execute_result" } ], "source": [ "order = np.argsort(data_pca[:, 0])\n", "order[[0, 1, 2, 3, 4, 5, 6]]" ] }, { "cell_type": "code", "execution_count": null, "id": "4920251b-ba61-42d2-b2b3-0b5b119e0ed5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "PCA reordering:\n", "[122 120 121 32 33 34 35 36 37 38 73 72 71 70 69 68 67 75\n", " 74 13 14 103 12 105 106 104 102 101 118 119 107 11 31 30 29 100\n", " 66 90 96 10 27 24 42 28 26 15 99 117 25 52 65 0 40 98\n", " 23 64 116 97 115 114 63 89 62 61 60 41 113 59 58 85 88 20\n", " 56 39 57 46 16 9 54 87 22 112 55 21 91 86 51 109 17 4\n", " 110 111 47 18 19 53 44 8 92 50 93 76 1 43 5 48 6 7\n", " 84 108 95 45 3 83 2 94 80 79 78 82 49 77 81]\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "pca_order = np.argsort(data_pca[:, 0])\n", "print(f\"PCA reordering:\\n{pca_order}\")\n", "fft_pca_order = data_fft[:, pca_order]\n", "signal_pca = librosa.istft(fft_pca_order, hop_length=HOP_LENGTH, win_length=WIN_LENGTH)\n", "display(Audio(signal_pca, rate=sr))" ] }, { "cell_type": "code", "execution_count": null, "id": "1b1475dd-be9c-4531-af7b-4a422ab39776", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "tSNE reordering:\n", "[111 99 42 41 98 97 48 84 78 82 79 49 83 80 109 2 108 81\n", " 94 76 95 43 6 5 44 92 19 16 18 22 20 21 17 39 23 40\n", " 110 59 60 112 113 55 54 57 58 56 61 62 63 115 116 64 65 117\n", " 25 26 28 24 27 51 47 86 96 85 10 29 66 31 90 107 104 102\n", " 69 70 103 101 105 106 122 38 67 34 37 73 72 71 12 14 75 13\n", " 121 120 119 118 33 11 74 32 68 36 35 30 100 15 114 89 88 87\n", " 91 46 3 77 45 4 9 8 7 50 53 1 52 0 93]\n" ] }, { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "tsne_order = np.argsort(data_tsne[:, 0])\n", "print(f\"tSNE reordering:\\n{tsne_order}\")\n", "fft_tsne_order = data_fft[:, tsne_order]\n", "signal_tsne = librosa.istft(fft_tsne_order, hop_length=HOP_LENGTH, win_length=WIN_LENGTH)\n", "display(Audio(signal_tsne, rate=sr))" ] }, { "cell_type": "markdown", "id": "df534a15-1d1c-4432-9ff6-67f51c459ca1", "metadata": {}, "source": [ "## Re-writing into a class\n", "\n", "After we have know the basic procedure of our algorithm we can wrap everything into a class to make it more reusable and also have a single command to run an experiment which allows us to speed up the search for more aesthetic pramaters." ] }, { "cell_type": "code", "execution_count": null, "id": "1485e3c3-7e9f-46f0-b572-75dcaef47244", "metadata": {}, "outputs": [], "source": [ "from typing import Optional, Callable\n", "\n", "class SpectReorder:\n", " def __init__(\n", " self,\n", " file_path: str,\n", " hop_length: Optional[int] = None,\n", " win_length: Optional[int] = None,\n", " n_fft: Optional[int] = None,\n", " sr: Optional[int] = None,\n", " pre_process: Optional[Callable] = None,\n", " \n", " ):\n", " self.file_path = file_path\n", " self._data, self._sr = librosa.load(file_path, sr=sr, mono=True)\n", " \n", " self.hop_length = hop_length if hop_length else int(self._sr/2)\n", " self.win_length = win_length if win_length else int(self._sr)\n", " self.n_fft = n_fft if n_fft else self.win_length\n", " \n", " self._fft = librosa.stft(\n", " self._data,\n", " n_fft=self.n_fft,\n", " hop_length=self.hop_length,\n", " win_length=self.win_length,\n", " )\n", " \n", " self._spectogram = librosa.feature.melspectrogram(\n", " self._data,\n", " sr=self._sr,\n", " hop_length=self.hop_length,\n", " win_length=self.win_length,\n", " n_fft=self.n_fft\n", " )\n", " self.pre_process = pre_process if pre_process else lambda x: librosa.amplitude_to_db(x)\n", " \n", " def run_algorithm(self, dim_reduction = None):\n", " dim_reduction = dim_reduction if dim_reduction else TSNE(n_components=1)\n", " spect = self.pre_process(self._spectogram)\n", " spect_reduced = dim_reduction.fit_transform(spect.T)\n", " fft_re_order = self._fft[:, np.argsort(spect_reduced[:, 0])]\n", " reordered_signal = librosa.istft(\n", " fft_re_order,\n", " hop_length=self.hop_length,\n", " win_length=self.win_length,\n", " )\n", " return reordered_signal" ] }, { "cell_type": "code", "execution_count": null, "id": "370f64bd-e933-4326-a845-477c42b6a2cd", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "experiment = SpectReorder('violin.flac', hop_length=400, win_length=2000, sr=44100)\n", "signal = experiment.run_algorithm()\n", "display(Audio(signal, rate=experiment._sr))" ] }, { "cell_type": "markdown", "id": "1c48577b-7fdf-4b15-a265-4dd97d3d7653", "metadata": {}, "source": [ "Now we can tweak all parameters of our algorithm in a single line and compare multiple results because the config of the algorithm is now attached to the instance of our experiment and not shared globally by every experiment." ] }, { "cell_type": "markdown", "id": "e9b5e80c-a4c9-474f-b5cd-76f30cf7284f", "metadata": {}, "source": [ "## Fine tuning the results\n", "\n", "While listening to the results at least the PCA aproach relies too much on the amplitude of the signal and not on its " ] }, { "cell_type": "code", "execution_count": null, "id": "fea0f46d-ade7-4097-8337-7cde7da1ba1f", "metadata": {}, "outputs": [], "source": [ "volume_scaling = lambda x: librosa.amplitude_to_db(x/np.sum(x, axis=1)[:, np.newaxis])" ] }, { "cell_type": "code", "execution_count": null, "id": "cda1d514-05c5-47d6-9bc6-adf1a402be16", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "experiment = SpectReorder(\n", " 'trumpet.flac',\n", " hop_length=400,\n", " win_length=2000,\n", " sr=44100,\n", " pre_process=volume_scaling\n", ")\n", "signal = experiment.run_algorithm()\n", "display(Audio(signal, rate=experiment._sr))" ] }, { "cell_type": "markdown", "id": "e3530055-3175-4cd1-912d-d23c16e43b1d", "metadata": {}, "source": [ "We can also apply a scaling on each frequency so that he higher frequencies are less important for our clustering than the low frequencies.\n", "We can use an inversed log scale for this and multiply a matrix of these value to our spectogram." ] }, { "cell_type": "code", "execution_count": null, "id": "25a9747b-1eec-4d15-aebf-f01e15ba25a1", "metadata": {}, "outputs": [], "source": [ "log_scaling = lambda x: np.matmul(np.repeat(np.log(np.arange(len(x)+1, 1, -1))[np.newaxis, :], len(x), axis=0), x)" ] }, { "cell_type": "code", "execution_count": null, "id": "421249a7-b746-457a-916c-b3b2e42e9b6d", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "experiment = SpectReorder(\n", " 'violin.flac',\n", " hop_length=400,\n", " win_length=2000,\n", " sr=44100,\n", " pre_process=log_scaling\n", ")\n", "signal = experiment.run_algorithm()\n", "display(Audio(signal, rate=experiment._sr))" ] }, { "cell_type": "markdown", "id": "95defc10-d8d4-4068-83fc-8ac1f9a26d2d", "metadata": {}, "source": [ "We can now combine these two pre-processing steps into one by nesting the functions." ] }, { "cell_type": "code", "execution_count": null, "id": "e4985413-68a0-44c1-bb3d-d2ac49b35259", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "experiment = SpectReorder(\n", " 'violin.flac',\n", " hop_length=400,\n", " win_length=2000,\n", " sr=44100,\n", " pre_process=lambda x: log_scaling(volume_scaling(x))\n", ")\n", "signal = experiment.run_algorithm()\n", "display(Audio(signal, rate=experiment._sr))" ] }, { "cell_type": "markdown", "id": "438c4b4b-f81b-48dd-9b0e-c37f282a59b0", "metadata": {}, "source": [ "## Where to go from here" ] }, { "cell_type": "markdown", "id": "9ed30175-b318-4eb4-9776-3c1e7345541d", "metadata": {}, "source": [ "Currently we are not considering the cluster of similar grains.\n", "Instead of playing them in their ordinal order we could play them according to the distance of their reduced dimensionality.\n", "\n", "We also restricted ourselves to a 1 dimensional reduction as the ordering then becomes trivial. But by moving to higher dimensions the replacing of samples could be composed via [n nearest neighbors](https://scikit-learn.org/stable/modules/neighbors.html)." ] }, { "cell_type": "code", "execution_count": null, "id": "fad6673b-2284-4026-ad88-c2be08a7ff15", "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" } }, "nbformat": 4, "nbformat_minor": 5 }