{ "nbformat": 4, "nbformat_minor": 0, "metadata": { "colab": { "provenance": [], "toc_visible": true, "name": "FMCW-Radar-104_Freq_est.ipynb" }, "kernelspec": { "name": "python3", "display_name": "Python 3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "source": [ "# FMCW Radar 104 - Freq estimator\n", "\n", "Goal:\n", "\n", "> Compare apple to apple frequency estimators since Frequency estimation is key for distance measurement in FMCW radar\n", "\n", "Summary:\n", "\n", "| method | precision (% of 1 bin width) | comment |\n", "|---|---|---|\n", "| fft| +/- 50% | default |\n", "| padding | -2% +0.5% | at 100x padding, unrealistic |\n", "| quinn's 2nd | -1.25% +0.5% | simple |\n", "| phase | -0.2% +0.7% | **broken** (need to compensate for $s*\\delta^2$|\n", "\n", "> => Assuming a range bin/ resolution of $\\frac{c}{2*B}$, a precision of 0.5% is equivalent to a precision of 0.2mm.\n", "\n", "Next:\n", "* Compensate for $s \\cdot \\delta^2$ phase shift in phase method.\n", "\n", "History:\n", "\n", "* 2022-Dec-17: fixed phase method and added summary values\n", "* 2022-Dec-16: MRE code for each method to simplify comparisons\n", "* 2022-Oct-13: added side by side comparison fft, padding, quinn's 2nd and phase\n", "* ??: creation" ], "metadata": { "id": "zhjhmdZgPghM" } }, { "cell_type": "markdown", "source": [ "Further reading:\n", "\n", "sources for phase method:\n", "* http://www.tsdconseil.fr/log/scriptscilab/festim/index-en.html\n", "* https://www.dsprelated.com/showarticle/773.php" ], "metadata": { "id": "edkdzEwQF879" } }, { "cell_type": "markdown", "source": [ "## MRE for frequency bin error computation" ], "metadata": { "id": "UpEoSwd99eua" } }, { "cell_type": "code", "source": [ "from numpy import abs ,angle, arange, arcsin, cos, pi, sqrt, tan\n", "import matplotlib.pyplot as plt\n", "from scipy.fft import fft\n", "\n", "def y_IF(f0_min, slope, T, antenna_tx, antenna_rx, target, v=3e8):\n", " \"\"\" This function implements the mathematical IF defined in latex as\n", " y_{IF} = cos(2 \\pi [f_0\\delta + s * \\delta * t - s* \\delta^2])\n", " into following python code\n", " y_IF = cos (2*pi*(f_0 * delta + slope * delta * T + slope * delta**2))\n", " Parameters:\n", " -----------\n", " f0_min: float\n", " the frequency at the begining of the chirp\n", " slope: float\n", " the slope with which the chirp frequency inceases over time\n", " T: ndarray\n", " the 1D vector containing time values\n", " antenna_tx: tuple of floats\n", " x, y, z coordinates\n", " antenna_rx: tuple of floats\n", " x, y, z coordinates\n", " target: tuple of floats\n", " x, y, z coordinates\n", " v: float\n", " speed of light in considered medium\n", " Returns:\n", " --------\n", " YIF: ndarray\n", " vector containing the IF values\n", " \"\"\"\n", " tx_x, tx_y, tx_z = antenna_tx\n", " rx_x, rx_y, rx_z = antenna_rx\n", " t_x, t_y, t_z = target\n", " distance = sqrt((tx_x-t_x)**2 + (tx_y-t_y)**2 + (tx_z-t_z)**2)\n", " distance += sqrt((rx_x-t_x)**2 + (rx_y-t_y)**2 + (rx_z-t_z)**2)\n", " # delta = sqrt((A.x-target.x)**2+(A.y-target.y)**2+(A.z-target.z)**2)/3e8\n", " delta = distance/v\n", " YIF = cos(2 *pi *(f0_min * delta + slope * delta * T + slope * delta**2))\n", " return YIF\n", "\n", "f0_min = 60e9\n", "c = 3e8\n", "# lambda ~5mm at 60GHz\n", "lambda0_max = 3e8/f0_min\n", "n_rx = 2\n", "Distance = 10\n", "k = 10e12\n", "n_samples = 512\n", "f_if = 2*k*Distance/c\n", "fs = 50e6\n", "ts = 1/fs\n", "\n", "antenna_tx = (-lambda0_max/2,0,0)\n", "antenna_rx = (0,0,0)\n", "T = arange(0, n_samples*ts+ts, ts)\n", "\n", "errors = []\n", "distances = arange(11, 12.4, 0.01)\n", "for d in distances:\n", " target = (0, d, 0)\n", " f_if = 2*k*d/c\n", " # sanity check\n", " assert f_if < 1/ts/2\n", "\n", " YIF = y_IF(f0_min, k, T, antenna_tx, antenna_rx, target)\n", " FT = fft(YIF)\n", " MAG = abs(FT)[0:int(n_samples/2)]\n", " ANG = angle(FT)[0:int(n_samples/2)]\n", "\n", " # now find the peak\n", " amplitude_peak = sorted(MAG, reverse = True)[0]\n", " i_peak = list(MAG).index(amplitude_peak)\n", " f_peak = i_peak * fs / n_samples\n", " d_calc = f_peak*c/2/k\n", " bin_size = fs*c/2/k/n_samples\n", " error = (d-d_calc)/bin_size\n", " errors.append(error*100)\n", "\n", "plt.title(\"distance error when only looking at frequency\")\n", "plt.ylabel(\"% error of distance bin\")\n", "plt.plot(distances,errors)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 298 }, "id": "6AGb_qpD8HQY", "outputId": "a09d0a16-de8e-4005-9f3d-20729f0a3ef5" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": {}, "execution_count": 12 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## MRE for Quinn's second frequency estimation" ], "metadata": { "id": "XHNuuTYj9j0I" } }, { "cell_type": "code", "source": [ "from numpy import log,sqrt\n", "from numpy import abs ,angle, arange, arcsin, cos, pi, sqrt, tan\n", "import matplotlib.pyplot as plt\n", "from scipy.fft import fft\n", "\n", "def quinnsecond(FFT,k):\n", " \"\"\" Provide frequency estimator via Quinn's second estimate\n", " Parameters:\n", " -----------\n", " FFT:\n", " k:\n", " Returns:\n", " --------\n", " d:\n", " Details:\n", " --------\n", " C code source: https://gist.github.com/hiromorozumi/f74fd4d5592a7f79028560cb2922d05f\n", " out[k][0] ... real part of FFT output at bin k\n", " out[k][1] ... imaginary part of FFT output at bin k\n", " c++ code:\n", " divider = pow(out[k][0], 2.0) + pow(out[k][1], 2.0);\n", " ap = (out[k+1][0] * out[k][0] + out[k+1][1] * out[k][1]) / divider;\n", " dp = -ap / (1.0 - ap);\n", " am = (out[k-1][0] * out[k][0] + out[k-1][1] * out[k][1]) / divider;\n", "\n", " dm = am / (1.0 - am);\n", " d = (dp + dm) / 2 + tau(dp * dp) - tau(dm * dm);\n", " \"\"\"\n", " out = [[z.real, z.imag] for z in FFT]\n", "\n", " def tau(x):\n", " return 1/4* log(3*x**2 + 6*x + 1) - sqrt(6)/24 * log((x + 1 - sqrt(2/3)) / (x + 1 + sqrt(2/3)))\n", "\n", " divider = out[k][0]**2.0+ out[k][1]**2\n", " ap = (out[k+1][0] * out[k][0] + out[k+1][1] * out[k][1]) / divider\n", " dp = -ap / (1.0 - ap)\n", " am = (out[k-1][0] * out[k][0] + out[k-1][1] * out[k][1]) / divider\n", "\n", " dm = am / (1.0 - am)\n", " d = (dp + dm) / 2 + tau(dp * dp) - tau(dm * dm)\n", "\n", " return d\n", "\n", "def y_IF(f0_min, slope, T, antenna_tx, antenna_rx, target, v=3e8):\n", " \"\"\" This function implements the mathematical IF defined in latex as\n", " y_{IF} = cos(2 \\pi [f_0\\delta + s * \\delta * t - s* \\delta^2])\n", " into following python code\n", " y_IF = cos (2*pi*(f_0 * delta + slope * delta * T + slope * delta**2))\n", " Parameters:\n", " -----------\n", " f0_min: float\n", " the frequency at the begining of the chirp\n", " slope: float\n", " the slope with which the chirp frequency inceases over time\n", " T: ndarray\n", " the 1D vector containing time values\n", " antenna_tx: tuple of floats\n", " x, y, z coordinates\n", " antenna_rx: tuple of floats\n", " x, y, z coordinates\n", " target: tuple of floats\n", " x, y, z coordinates\n", " v: float\n", " speed of light in considered medium\n", " Returns:\n", " --------\n", " YIF: ndarray\n", " vector containing the IF values\n", " \"\"\"\n", " tx_x, tx_y, tx_z = antenna_tx\n", " rx_x, rx_y, rx_z = antenna_rx\n", " t_x, t_y, t_z = target\n", " distance = sqrt((tx_x-t_x)**2 + (tx_y-t_y)**2 + (tx_z-t_z)**2)\n", " distance += sqrt((rx_x-t_x)**2 + (rx_y-t_y)**2 + (rx_z-t_z)**2)\n", " # delta = sqrt((A.x-target.x)**2+(A.y-target.y)**2+(A.z-target.z)**2)/3e8\n", " delta = distance/v\n", " YIF = cos(2 *pi *(f0_min * delta + slope * delta * T + slope * delta**2))\n", " return YIF\n", "\n", "f0_min = 60e9\n", "c = 3e8\n", "# lambda ~5mm at 60GHz\n", "lambda0_max = 3e8/f0_min\n", "n_rx = 2\n", "Distance = 10\n", "k = 10e12\n", "n_samples = 512\n", "f_if = 2*k*Distance/c\n", "fs = 50e6\n", "ts = 1/fs\n", "\n", "antenna_tx = (-lambda0_max/2,0,0)\n", "antenna_rx = (0,0,0)\n", "T = arange(0, n_samples*ts+ts, ts)\n", "\n", "errors = []\n", "distances = arange(11, 12.4, 0.01)\n", "for d in distances:\n", " target = (0, d, 0)\n", " f_if = 2*k*d/c\n", " # sanity check\n", " assert f_if < 1/ts/2\n", "\n", " YIF = y_IF(f0_min, k, T, antenna_tx, antenna_rx, target)\n", " FT = fft(YIF)\n", " MAG = abs(FT)[0:int(n_samples/2)]\n", " ANG = angle(FT)[0:int(n_samples/2)]\n", "\n", " # now find the peak\n", " amplitude_peak = sorted(MAG, reverse = True)[0]\n", " i_peak = list(MAG).index(amplitude_peak)\n", "\n", " delta_i = quinnsecond(FT, i_peak)\n", " f1_estimate = fs*(i_peak+delta_i)/len(T)\n", "\n", " d_calc = f1_estimate*c/2/k\n", " bin_size = fs*c/2/k/n_samples\n", " error = (d-d_calc)/bin_size\n", " errors.append(error*100)\n", "\n", "plt.title(\"error w/ Quinn's second\")\n", "plt.ylabel(\"% error of distance bin\")\n", "plt.plot(distances,errors)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 298 }, "id": "bXmhwSF69nWL", "outputId": "6983a18a-2966-47df-f399-0f26b3464094" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": {}, "execution_count": 11 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## MRE for Zero Padding" ], "metadata": { "id": "sxYuMA2IKwXE" } }, { "cell_type": "code", "source": [ "from numpy import abs ,angle, arange, arcsin, cos, pi, sqrt, tan\n", "import matplotlib.pyplot as plt\n", "from scipy.fft import fft\n", "\n", "def y_IF(f0_min, slope, T, antenna_tx, antenna_rx, target, v=3e8):\n", " \"\"\" This function implements the mathematical IF defined in latex as\n", " y_{IF} = cos(2 \\pi [f_0\\delta + s * \\delta * t - s* \\delta^2])\n", " into following python code\n", " y_IF = cos (2*pi*(f_0 * delta + slope * delta * T + slope * delta**2))\n", " Parameters:\n", " -----------\n", " f0_min: float\n", " the frequency at the begining of the chirp\n", " slope: float\n", " the slope with which the chirp frequency inceases over time\n", " T: ndarray\n", " the 1D vector containing time values\n", " antenna_tx: tuple of floats\n", " x, y, z coordinates\n", " antenna_rx: tuple of floats\n", " x, y, z coordinates\n", " target: tuple of floats\n", " x, y, z coordinates\n", " v: float\n", " speed of light in considered medium\n", " Returns:\n", " --------\n", " YIF: ndarray\n", " vector containing the IF values\n", " \"\"\"\n", " tx_x, tx_y, tx_z = antenna_tx\n", " rx_x, rx_y, rx_z = antenna_rx\n", " t_x, t_y, t_z = target\n", " distance = sqrt((tx_x-t_x)**2 + (tx_y-t_y)**2 + (tx_z-t_z)**2)\n", " distance += sqrt((rx_x-t_x)**2 + (rx_y-t_y)**2 + (rx_z-t_z)**2)\n", " # delta = sqrt((A.x-target.x)**2+(A.y-target.y)**2+(A.z-target.z)**2)/3e8\n", " delta = distance/v\n", " YIF = cos(2 *pi *(f0_min * delta + slope * delta * T + slope * delta**2))\n", " return YIF\n", "\n", "f0_min = 60e9\n", "c = 3e8\n", "# lambda ~5mm at 60GHz\n", "lambda0_max = 3e8/f0_min\n", "n_rx = 2\n", "Distance = 10\n", "k = 10e12\n", "n_samples = 512\n", "f_if = 2*k*Distance/c\n", "fs = 50e6\n", "ts = 1/fs\n", "\n", "antenna_tx = (-lambda0_max/2,0,0)\n", "antenna_rx = (0,0,0)\n", "T = arange(0, n_samples*ts+ts, ts)\n", "\n", "resize_factor = 100\n", "n_samples_resized = n_samples * resize_factor\n", "errors = []\n", "distances = arange(11, 12.4, 0.1)\n", "for d in distances:\n", " target = (0, d, 0)\n", " f_if = 2*k*d/c\n", " # sanity check\n", " assert f_if < 1/ts/2\n", "\n", " YIF = y_IF(f0_min, k, T, antenna_tx, antenna_rx, target)\n", " YIF.resize(n_samples_resized)\n", " FT = fft(YIF)\n", " MAG = abs(FT)[0:int(n_samples_resized/2)]\n", " ANG = angle(FT)[0:int(n_samples_resized/2)]\n", "\n", " # now find the peak\n", " amplitude_peak = sorted(MAG, reverse = True)[0]\n", " i_peak = list(MAG).index(amplitude_peak)\n", " f_peak = i_peak * fs / n_samples_resized\n", " d_calc = f_peak*c/2/k\n", " bin_size = fs*c/2/k/n_samples\n", " error = (d-d_calc)/bin_size\n", " errors.append(error*100)\n", "\n", "plt.title(\"distance error with 100x Zero Padding\")\n", "plt.ylabel(\"% error of distance bin\")\n", "plt.plot(distances,errors)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 298 }, "id": "m7ACEUHrKyt1", "outputId": "89aab300-05b2-4ac4-f679-b6b923060f76" }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": {}, "execution_count": 10 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## ~~MRE for PHASE to FREQ~~" ], "metadata": { "id": "b1c0k9NcADox" } }, { "cell_type": "code", "source": [ "# / \\\n", "# / ! \\ THIS CODE IS BROKEN/ BUGGED / DO NOT USE\n", "# / ! \\ the term # + slope * delta**2)) is commented out\n", "#/ ! \\ for real life usage this term needs to be compensated for\n", "\n", "from numpy import abs ,angle, arange, arcsin, cos, pi, sqrt, tan\n", "import matplotlib.pyplot as plt\n", "from scipy.fft import fft\n", "\n", "def y_IF(f0_min, slope, T, antenna_tx, antenna_rx, target, v=3e8):\n", " \"\"\" This function implements the mathematical IF defined in latex as\n", " y_{IF} = cos(2 \\pi [f_0\\delta + s * \\delta * t - s* \\delta^2])\n", " into following python code\n", " y_IF = cos (2*pi*(f_0 * delta + slope * delta * T + slope * delta**2))\n", " Parameters:\n", " -----------\n", " f0_min: float\n", " the frequency at the begining of the chirp\n", " slope: float\n", " the slope with which the chirp frequency inceases over time\n", " T: ndarray\n", " the 1D vector containing time values\n", " antenna_tx: tuple of floats\n", " x, y, z coordinates\n", " antenna_rx: tuple of floats\n", " x, y, z coordinates\n", " target: tuple of floats\n", " x, y, z coordinates\n", " v: float\n", " speed of light in considered medium\n", " Returns:\n", " --------\n", " YIF: ndarray\n", " vector containing the IF values\n", " \"\"\"\n", " tx_x, tx_y, tx_z = antenna_tx\n", " rx_x, rx_y, rx_z = antenna_rx\n", " t_x, t_y, t_z = target\n", " distance = sqrt((tx_x-t_x)**2 + (tx_y-t_y)**2 + (tx_z-t_z)**2)\n", " distance += sqrt((rx_x-t_x)**2 + (rx_y-t_y)**2 + (rx_z-t_z)**2)\n", " delta = distance/v\n", " YIF = cos(2 *pi *(f0_min * delta + slope * delta * T)) # + slope * delta**2))\n", " return YIF\n", "\n", "f0_min = 60e9\n", "c = 3e8\n", "# lambda ~5mm at 60GHz\n", "lambda0_max = 3e8/f0_min\n", "n_rx = 2\n", "Distance = 10\n", "k = 10e12\n", "n_samples = 512\n", "f_if = 2*k*Distance/c\n", "fs = 50e6\n", "ts = 1/fs\n", "\n", "antenna_tx = (-lambda0_max/2,0,0)\n", "antenna_rx = (0,0,0)\n", "T = arange(0, n_samples*ts, ts)\n", "print(\"len_T\",len(T))\n", "ns = n_samples//2\n", "\n", "errors = []\n", "phis = []\n", "distances = arange(10, 14, 0.01)\n", "for d in distances:\n", " target = (0, d, 0)\n", " f_if = 2*k*d/c\n", " # sanity check\n", " assert f_if < 1/ts/2\n", "\n", " YIF = y_IF(f0_min, k, T, antenna_tx, antenna_rx, target)\n", " FT = fft(YIF)\n", " MAG = abs(FT)[0:int(n_samples/2)]\n", " ANG = angle(FT)[0:int(n_samples/2)]\n", "\n", " # now find the peak\n", " amplitude_peak = sorted(MAG, reverse = True)[0]\n", " i_peak = list(MAG).index(amplitude_peak)\n", "\n", " # $$ \\epsilon = \\frac{\\phi}{\\pi}*\\frac{N}{N-1} $$\n", " phi = ANG[i_peak]/pi\n", " epsilon = (phi)*(n_samples)/(n_samples-1) # *0.96 why does 0.96 seems to improve it ?!?\n", " # epsilon = 0\n", " f0_estimate = fs*(i_peak)/n_samples +fs*phi/(n_samples)\n", " # fft_bin_size = fs/n_samples\n", " # f_error = (f_if-f0_estimate)/fft_bin_size\n", "\n", " d_calc = f0_estimate*c/2/k\n", " d_error = d - d_calc\n", " bin_size = fs*c/2/k/n_samples\n", " error = (d-d_calc)/bin_size\n", " errors.append(error * 100)\n", "\n", "plt.title(\"error w/ bin phase -- warning missing s*delta^2\")\n", "plt.plot(distances,errors)\n", "plt.ylabel(\"% error of distance bin\")\n" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 316 }, "id": "GlFrPNlhAhnV", "outputId": "0d050c73-73fb-4f59-a29b-0fda5e0075b3" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "len_T 512\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "Text(0, 0.5, '% error of distance bin')" ] }, "metadata": {}, "execution_count": 9 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## BACK-UP\n", "\n", "Not checked / not verified beyond this point" ], "metadata": { "id": "QKGi736-Mf9R" } }, { "cell_type": "markdown", "source": [ "## DFT PHASE vs FREQ in 1 bin (from maths)\n", "\n", "source: https://flylib.com/books/en/2.729.1/the_dft_frequency_response_to_a_complex_input.html\n", "\n", "$$ X_c(m) = e^{j[\\pi \\cdot (k-m) - \\pi \\cdot \\frac{k-m}{N}]} \\cdot \\frac{sin(\\pi \\cdot (k-m))}{sin(\\pi \\cdot \\frac{k-m}{N})}$$\n", "\n", "so\n", "$$ \\phi = \\pi \\cdot (k-m) - \\pi \\cdot \\frac{k-m}{N} $$\n", "$$ \\frac{\\phi}{\\pi} = (k-m) \\cdot \\frac{N-1}{N} $$\n", "$$ \\epsilon = \\frac{\\phi}{\\pi}*\\frac{N}{N-1} $$" ], "metadata": { "id": "TpdSAMNpUUwS" } }, { "cell_type": "code", "source": [ "from numpy.fft import fft, ifft,fftfreq\n", "from numpy import abs, angle, arange, dot, exp, sin, pi\n", "import matplotlib.pyplot as plt\n", "from numpy import exp\n", "\n", "def DFT_new(x):\n", " \"\"\"\n", " Function to calculate the\n", " discrete Fourier Transform\n", " of a 1D real-valued signal x\n", " \"\"\"\n", "\n", " N = len(x)\n", " n = arange(N)\n", " k = n.reshape((N, 1))\n", " e = exp(-2j * pi * k * n / N)\n", "\n", " X = dot(e, x)\n", "\n", " return X\n", "\n", "def dft_resp(k,m,N):\n", " \"\"\" function to provide the DFT response from the explicit formula from book\n", " \"\"\"\n", " if k==m:\n", " return N,0\n", " #dft = exp(1j*pi*((k-m)-(k-m)/N))*sin(pi*(k-m))/sin(pi*(k-m)/N)\n", " val = exp(1j*pi*((k-m)-(k-m)/N))*sin(pi*(k-m))/sin(pi*(k-m)/N)\n", " return abs(val),angle(val)\n", "\n", "def plot_phase(N=1024):\n", " k=100\n", " phases = []\n", " offsets = range(1000)\n", " ms = []\n", " for offset in offsets:\n", " m=k+offset/1e3\n", " _, phase = dft_resp(k,m,N)\n", " phases.append(phase)\n", " ms.append(m)\n", " plt.title(\"phase variation inside one bin (simulated)\")\n", " plt.plot(ms,phases,'b')\n", " plt.xlabel('m')\n", " plt.ylabel('phase')\n", "plot_phase()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 295 }, "id": "fZGPn3ebotG0", "outputId": "87c10069-9c3b-472d-93d1-139d01d5c1d2" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## DFT PHASE vs FREQ in 1 bin (from FFT)" ], "metadata": { "id": "BClivJ0C3DBP" } }, { "cell_type": "code", "source": [ "# phase measurement with FFT\n", "n_fft = 2000 #FFT points\n", "fs= 2000 #sampling frequency\n", "phases = []\n", "fos = []\n", "for fo in range(1,1000):\n", " f0 = 500.5+fo/1000 #signal frequency\n", " assert fs > 2*f0\n", " T = arange(0,n_fft/fs,1/fs)\n", " Y = sin(2*pi*f0*T+pi/2)\n", " FFT = fft(Y)\n", " MAG = abs(FFT)\n", " PHASE = angle(FFT)\n", "\n", " n_fft_points = int(len(MAG)/2)\n", "\n", " MAG = MAG[0:n_fft_points]\n", " PHASE = PHASE[0:n_fft_points]\n", "\n", " Npeaks=1\n", " sorted_magnitude = sorted(MAG,reverse = True)\n", " sorted_magnitude = sorted_magnitude[:Npeaks][0]\n", " fpeak = list(MAG).index(sorted_magnitude) #for peak in sorted_magnitude][0]\n", " fp = MAG[fpeak]\n", " ph_p = PHASE[fpeak]/pi\n", " phases.append(ph_p)\n", " fos.append(f0)\n", "print(\"done\")\n", "plt.title(\"phase measured from FFT\")\n", "plt.plot(fos,phases)" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 316 }, "id": "Mdjl56xBId_K", "outputId": "b884c459-d28a-4979-d648-2cfa72ff57fe" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "done\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": {}, "execution_count": 2 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## FREQ from PHASE\n", "\n", "checking interpolation from phase to freq - seems to work down to 0.003mm" ], "metadata": { "id": "uMOEyJwXQt7e" } }, { "cell_type": "code", "source": [ "#from v0.3 but backward: freq from phase\n", "#freq accuracy at 2000 points ~ 1/1000th better than FFT\n", "#FFT gives 3cm, phase gives <-> 0.003mm\n", "fs = 2000\n", "ts = 1.0/fs\n", "t_max = 1\n", "T = arange(0,t_max,ts)\n", "f0 = 500.5\n", "n_increments=8000\n", "phases = []\n", "f1s = []\n", "Xs = []\n", "Ys = []\n", "\n", "#for f1 in [200.6,200.55,200.732,200.8855]:\n", "#for f1o in [.1,.05,.232,.3855]:\n", "for f1o in arange(0,1,0.05):\n", " f1=f0+f1o\n", " Y=sin(2*pi*f1*T)\n", " FFT = fft(Y)\n", " MAG = abs(FFT)\n", " ANG = angle(FFT)\n", " n_fft_points = int(len(MAG)/2)\n", "\n", " MAG = MAG[0:n_fft_points]\n", " ANG = ANG[0:n_fft_points]\n", "\n", " Npeaks=1\n", " sorted_magnitude = sorted(MAG,reverse = True)\n", " sorted_magnitude = sorted_magnitude[:Npeaks][0]\n", " fpeak = list(MAG).index(sorted_magnitude)\n", " ph_peak = ANG[fpeak]\n", "\n", " epsilon_estimate = (ph_peak+pi)/(pi*(1-1/n_increments)) #+pi*()\n", " f1_estimate = f0+epsilon_estimate\n", " Xs.append(f1o)\n", " Ys.append((f1-f1_estimate)*100)\n", "max_error = max(abs(Ys))\n", "plt.title(f\"freq error from phase - max is {max_error:.2g} %\")\n", "plt.plot(Xs, Ys)\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 281 }, "id": "ITaXzibv87BB", "outputId": "9a895d79-f07b-4455-a760-7ab76d3ef165" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## Back-up #2\n", "\n", "> prep and research code (back-up)" ], "metadata": { "id": "rnnrVZCSs-BJ" } }, { "cell_type": "markdown", "source": [ "## Quinn's second order" ], "metadata": { "id": "iCKSRQNnwjA8" } }, { "cell_type": "code", "source": [ "from numpy import log,sqrt\n", "\n", "def quinnsecond(FFT,k):\n", " \"\"\" Provide frequency estimator via Quinn's second estimate\n", " Parameters:\n", " -----------\n", " FFT:\n", " k:\n", " Returns:\n", " --------\n", " d:\n", " Details:\n", " --------\n", " C code source: https://gist.github.com/hiromorozumi/f74fd4d5592a7f79028560cb2922d05f\n", " out[k][0] ... real part of FFT output at bin k\n", " out[k][1] ... imaginary part of FFT output at bin k\n", " c++ code:\n", " divider = pow(out[k][0], 2.0) + pow(out[k][1], 2.0);\n", " ap = (out[k+1][0] * out[k][0] + out[k+1][1] * out[k][1]) / divider;\n", " dp = -ap / (1.0 - ap);\n", " am = (out[k-1][0] * out[k][0] + out[k-1][1] * out[k][1]) / divider;\n", "\n", " dm = am / (1.0 - am);\n", " d = (dp + dm) / 2 + tau(dp * dp) - tau(dm * dm);\n", " \"\"\"\n", " out = [[z.real, z.imag] for z in FFT]\n", "\n", " def tau(x):\n", " return 1/4* log(3*x**2 + 6*x + 1) - sqrt(6)/24 * log((x + 1 - sqrt(2/3)) / (x + 1 + sqrt(2/3)))\n", "\n", " divider = out[k][0]**2.0+ out[k][1]**2\n", " ap = (out[k+1][0] * out[k][0] + out[k+1][1] * out[k][1]) / divider\n", " dp = -ap / (1.0 - ap)\n", " am = (out[k-1][0] * out[k][0] + out[k-1][1] * out[k][1]) / divider\n", "\n", " dm = am / (1.0 - am)\n", " d = (dp + dm) / 2 + tau(dp * dp) - tau(dm * dm)\n", "\n", " return d" ], "metadata": { "id": "vz9kb9ZhwER8" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "fs = 2000\n", "ts = 1.0/fs\n", "t_max = 1\n", "T = arange(0,t_max,ts)\n", "f0 = 500.5\n", "n_increments=8000\n", "phases = []\n", "f1s = []\n", "Xq = []\n", "Yq = []\n", "fft_size = len(T)\n", "\n", "#for f1 in [200.6,200.55,200.732,200.8855]:\n", "#for f1o in [.1,.05,.232,.3855]:\n", "for f1o in arange(0,1,0.05):\n", " f1=f0+f1o\n", " Y=sin(2*pi*f1*T)\n", " FFT = fft(Y)\n", " MAG = abs(FFT)\n", " ANG = angle(FFT)\n", " n_fft_points = int(len(MAG)/2)\n", "\n", " MAG = MAG[0:n_fft_points]\n", " ANG = ANG[0:n_fft_points]\n", "\n", " Npeaks=1\n", " sorted_magnitude = sorted(MAG,reverse = True)\n", " sorted_magnitude = sorted_magnitude[:Npeaks][0]\n", " fpeak = list(MAG).index(sorted_magnitude)\n", " ph_peak = ANG[fpeak]\n", "\n", " #epsilon_estimate = (ph_peak+pi)/(pi*(1-1/n_increments)) #+pi*()\n", " #f1_estimate = f0+epsilon_estimate\n", "\n", " d = quinnsecond(FFT,fpeak)\n", " f1_estimate = 1/ts*(fpeak+d)/fft_size\n", "\n", " Xq.append(f1o)\n", " Yq.append((f1-f1_estimate)*100)\n", "max_error = max(abs(Yq))\n", "plt.title(f\"freq error from quinn's 2d - max is {max_error:.2g} %\")\n", "plt.plot(Xq, Yq)\n", "plt.show()" ], "metadata": { "id": "XtATaRnBwCS8", "outputId": "3f3f81b5-093a-4bcc-b15a-f6aadab30ba6", "colab": { "base_uri": "https://localhost:8080/", "height": 281 } }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## PHASE to FREQ" ], "metadata": { "id": "Dw4ZJnDJ07yW" } }, { "cell_type": "code", "source": [ "#from v0.3 but backward: freq from phase\n", "#freq accuracy at 2000 points ~ 1/1000th better than FFT\n", "#FFT gives 3cm, phase gives <-> 0.003mm\n", "fs = 2000\n", "ts = 1.0/fs\n", "t_max = 1\n", "T = arange(0,t_max,ts)\n", "f0 = 500.5\n", "n_increments=8000\n", "phases = []\n", "f1s = []\n", "Xfs = []\n", "Yfs = []\n", "\n", "#for f1 in [200.6,200.55,200.732,200.8855]:\n", "#for f1o in [.1,.05,.232,.3855]:\n", "for f1o in arange(0,1,0.05):\n", " f1=f0+f1o\n", " Y=sin(2*pi*f1*T)\n", " FFT = fft(Y)\n", " MAG = abs(FFT)\n", " ANG = angle(FFT)\n", " n_fft_points = int(len(MAG)/2)\n", "\n", " MAG = MAG[0:n_fft_points]\n", " ANG = ANG[0:n_fft_points]\n", "\n", " Npeaks=1\n", " sorted_magnitude = sorted(MAG,reverse = True)\n", " sorted_magnitude = sorted_magnitude[:Npeaks][0]\n", " fpeak = list(MAG).index(sorted_magnitude)\n", " ph_peak = ANG[fpeak]\n", "\n", " epsilon_estimate = (ph_peak+pi)/(pi*(1-1/n_increments)) #+pi*()\n", " f1_estimate = f0+epsilon_estimate\n", " Xfs.append(f1o)\n", " Yfs.append((f1-f1_estimate)*100)\n", "max_error = max(abs(Yfs))\n", "plt.title(f\"freq error from phase - max is {max_error:.2g} %\")\n", "plt.plot(Xs, Ys)\n", "plt.show()" ], "metadata": { "id": "mMeqQ2QD0_Jd", "outputId": "c4b7bb94-852d-4e38-cf41-13654bdc2065", "colab": { "base_uri": "https://localhost:8080/", "height": 281 } }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## no code" ], "metadata": { "id": "sD_-EXeK1N3O" } }, { "cell_type": "code", "source": [ "#from v0.3 but backward: freq from phase\n", "#freq accuracy at 2000 points ~ 1/1000th better than FFT\n", "#FFT gives 3cm, phase gives <-> 0.003mm\n", "fs = 2000\n", "ts = 1.0/fs\n", "t_max = 1\n", "T = arange(0,t_max,ts)\n", "f0 = 500.5\n", "n_increments=8000\n", "phases = []\n", "f1s = []\n", "Xzs = []\n", "Yzs = []\n", "\n", "#for f1 in [200.6,200.55,200.732,200.8855]:\n", "#for f1o in [.1,.05,.232,.3855]:\n", "for f1o in arange(0,1,0.05):\n", " f1=f0+f1o\n", " Y=sin(2*pi*f1*T)\n", " FFT = fft(Y)\n", " MAG = abs(FFT)\n", " ANG = angle(FFT)\n", " n_fft_points = int(len(MAG)/2)\n", "\n", " MAG = MAG[0:n_fft_points]\n", " ANG = ANG[0:n_fft_points]\n", "\n", " Npeaks=1\n", " sorted_magnitude = sorted(MAG,reverse = True)\n", " sorted_magnitude = sorted_magnitude[:Npeaks][0]\n", " fpeak = list(MAG).index(sorted_magnitude)\n", " ph_peak = ANG[fpeak]\n", "\n", " f1_estimate = fpeak\n", " Xzs.append(f1o)\n", " Yzs.append((f1-f1_estimate)*100)\n", "max_error = max(abs(Yzs))\n", "plt.title(f\"freq error from phase - max is {max_error:.2g} %\")\n", "plt.plot(Xs, Ys)\n", "plt.show()" ], "metadata": { "id": "RktWRz_Z1r_4", "outputId": "5cc8c0a8-3afa-4828-84cc-b0df81d2e63d", "colab": { "base_uri": "https://localhost:8080/", "height": 281 } }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## zero padding" ], "metadata": { "id": "JCnbXcBk2Gt6" } }, { "cell_type": "code", "source": [ "#from v0.3 but backward: freq from phase\n", "#freq accuracy at 2000 points ~ 1/1000th better than FFT\n", "#FFT gives 3cm, phase gives <-> 0.003mm\n", "fs = 2000\n", "ts = 1.0/fs\n", "t_max = 1\n", "T = arange(0,t_max,ts)\n", "f0 = 500.5\n", "n_increments=8000\n", "phases = []\n", "f1s = []\n", "Xpas = []\n", "Ypas = []\n", "resize = 100 #100\n", "#for f1 in [200.6,200.55,200.732,200.8855]:\n", "#for f1o in [.1,.05,.232,.3855]:\n", "for f1o in arange(0,1,0.001):\n", " f1=f0+f1o\n", " X = sin(2*pi*f1*T)\n", " X.resize(fs*resize)\n", " FFT = fft(X)\n", " #FFT = DFT_new(X)\n", " MAG = abs(FFT)\n", " PHASE = angle(FFT)\n", "\n", " n_fft_points = int(len(MAG)/2)\n", "\n", " MAG = MAG[0:n_fft_points]\n", " PHASE = PHASE[0:n_fft_points]\n", "\n", " Npeaks=1\n", " sorted_magnitude = sorted(MAG,reverse = True)\n", " sorted_magnitude = sorted_magnitude[:Npeaks][0]\n", " fpeak = list(MAG).index(sorted_magnitude) #for peak in sorted_magnitude][0]\n", " f1_estimate = fpeak/resize\n", " ph_p = PHASE[fpeak]/pi\n", "\n", " Xpas.append(f1o)\n", " Ypas.append((f1-f1_estimate)*100)\n", "\n", "max_error = max(abs(Ypas))\n", "plt.title(f\"freq error from padding, fft_len: {n_fft_points} - max is {max_error:.2g} %\")\n", "plt.plot(Xpas, Ypas)\n", "plt.show()" ], "metadata": { "id": "ZtcaTIE12Jhu", "outputId": "f5a7c588-9162-474d-d479-4bce0e3fed38", "colab": { "base_uri": "https://localhost:8080/", "height": 281 } }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## OLD and crap from here" ], "metadata": { "id": "maajsuLd3Bse" } }, { "cell_type": "markdown", "source": [ "### v0.3 interpolation of f1 from phase" ], "metadata": { "id": "C2vbf3Th3q_c" } }, { "cell_type": "code", "source": [ "fs = 1000\n", "ts = 1.0/fs\n", "t_max = 1\n", "T = arange(0,t_max,ts)\n", "f0 = 200.5\n", "n_increments=2000\n", "phases = []\n", "f1s = []\n", "for f1_offset in range(1,n_increments+1):\n", " epsilon = f1_offset/n_increments\n", " f1 = f0+epsilon\n", " assert fs>f1*2\n", " Y=sin(2*pi*f1*T)\n", " FFT = fft(Y)\n", " MAG = abs(FFT)\n", " ANG = angle(FFT)\n", " n_fft_points = int(len(MAG)/2)\n", "\n", " MAG = MAG[0:n_fft_points]\n", " ANG = ANG[0:n_fft_points]\n", "\n", " Npeaks=1\n", " sorted_magnitude = sorted(MAG,reverse = True)\n", " sorted_magnitude = sorted_magnitude[:Npeaks][0]\n", " fpeak = list(MAG).index(sorted_magnitude)\n", " ph_peak = ANG[fpeak]\n", " f1s.append(f1)\n", " phases.append(ph_peak+pi+epsilon*pi*(-1+1/n_increments)) #+pi*()\n", "plt.title(\"phases\")\n", "plt.plot(f1s[2:],phases[2:])\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 281 }, "id": "g8Z1L7kO3uzO", "outputId": "a2ab50e4-717d-42fc-bd28-06e1092450ed" }, "execution_count": null, "outputs": [ { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "### v0.2 - check validity of dft_resp\n", "seems that :\n", "1. dft_resp accuracy increases as f1 increases\n", "2. not really impacted by fs" ], "metadata": { "id": "NUVnkBgMwIGv" } }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "deb_dNvXOqSm", "colab": { "base_uri": "https://localhost:8080/", "height": 366 }, "outputId": "6de5f3ec-59c1-4d5e-e817-e5266be199cd" }, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "FFT len 100\n", "Peak at: 50\n", "MAG-5 delta -0.092 %\n", "MAG-6 delta 0.82 %\n", "199.0\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ], "source": [ "# sampling rate\n", "fs = 200 #(2kHz)\n", "# sampling interval\n", "ts = 1.0/fs\n", "Tmax = 1\n", "T = arange(0,Tmax,ts) #Time vector\n", "ns = int(len(T)) #number samples\n", "Freqs = arange(0,fs,fs/ns)\n", "\n", "exponent=2\n", "fpeaks=[]\n", "FFT, MAG, PHASE = None, None, None\n", "for f1 in [50.1]:\n", " #f1 = 5.1\n", " X = sin(2*pi*f1*T)\n", " FFT = fft(X)\n", " #FFT = DFT_new(X)\n", " MAG = abs(FFT)\n", " PHASE = angle(FFT)\n", "\n", " n_fft_points = int(len(MAG)/2)\n", "\n", " MAG = MAG[0:n_fft_points]\n", " PHASE = PHASE[0:n_fft_points]\n", "\n", " Npeaks=1\n", " sorted_magnitude = sorted(MAG,reverse = True)\n", " sorted_magnitude = sorted_magnitude[:Npeaks][0]\n", " fpeak = list(MAG).index(sorted_magnitude) #for peak in sorted_magnitude][0]\n", " fp = MAG[fpeak]\n", " ph_p = PHASE[fpeak]/pi\n", " fpeaks.append(fp)\n", "\n", "print(\"FFT len\",len(MAG))\n", "print(\"Peak at:\",fpeak)\n", "bin0=fpeak\n", "theo_mag,theo_ang=dft_resp(bin0,f1,n_fft_points)\n", "error = (abs(MAG[bin0])-abs(theo_mag))/abs(theo_mag)\n", "print(f\"MAG-5 delta {error*100:.2g} %\")\n", "bin1=fpeak+1\n", "theo_mag,theo_ang=dft_resp(bin1,f1,n_fft_points)\n", "error = (abs(MAG[bin1])-abs(theo_mag))/abs(theo_mag)\n", "print(f\"MAG-6 delta {error*100:.2g} %\")\n", "\n", "print(Freqs[-1])\n", "plt.plot(Freqs[:n_fft_points],MAG,'b')\n", "plt.xlabel('Freq (Hz)')\n", "plt.ylabel('FFT Amplitude |X(freq)|')\n", "plt.xlim(0,fpeak*2)\n", "\n", "plt.show()\n" ] }, { "cell_type": "code", "source": [ "from numpy.fft import fft, ifft\n", "# sampling rate\n", "sr = 2000\n", "# sampling interval\n", "ts = 1.0/sr\n", "t = arange(0,1,ts)\n", "x = sin(2*pi*5.5*t)\n", "X = fft(x)\n", "N = len(X)\n", "\n", "n = arange(N)\n", "print(12,n[-1])\n", "T = N/sr\n", "freq = n/T #=n/N*sr=n/n*sr\n", "print(15,T)\n", "print(10,len(X),len(t),t[-1],freq[-1])\n", "\n", "plt.figure(figsize = (12, 6))\n", "plt.subplot(121)\n", "\n", "plt.plot(freq, abs(X), 'b') #, \\\n", " #markerfmt=\" \", basefmt=\"-b\")\n", "plt.xlabel('Freq (Hz)')\n", "plt.ylabel('FFT Amplitude |X(freq)|')\n", "plt.xlim(0, 10)\n", "\n", "plt.subplot(122)\n", "plt.plot(t, ifft(X), 'r')\n", "plt.xlabel('Time (s)')\n", "plt.ylabel('Amplitude')\n", "plt.tight_layout()\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 528 }, "id": "6_7Shar0bNQh", "outputId": "ba2ecbb0-ea17-4b22-ab6c-108f1e5bae11" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "12 1999\n", "15 1.0\n", "10 2000 2000 0.9995 1999.0\n" ] }, { "output_type": "stream", "name": "stderr", "text": [ "/usr/local/lib/python3.7/dist-packages/matplotlib/cbook/__init__.py:1317: ComplexWarning: Casting complex values to real discards the imaginary part\n", " return np.asarray(x, float)\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [], "metadata": { "id": "9YWzSZ1R5ELF" } }, { "cell_type": "code", "source": [ "#k1 = k-m\n", "#m=k+1-\n", "phase = pi*k1 -pi*k1/N\n" ], "metadata": { "id": "WpRThWqu4_5w" }, "execution_count": null, "outputs": [] }, { "cell_type": "markdown", "source": [ "## FFT padding" ], "metadata": { "id": "esbaigDD1NGN" } }, { "cell_type": "code", "source": [ "from matplotlib.backend_bases import ResizeEvent\n", "# sampling rate\n", "fs = 200 #(2kHz)\n", "# sampling interval\n", "ts = 1.0/fs\n", "t_max = 1\n", "T = arange(0,t_max,ts) #Time vector\n", "n_samples = int(len(T)) #number samples\n", "Freqs = arange(0,fs,fs/n_samples)\n", "\n", "FFT, MAG, PHASE = None, None, None\n", "resize=100\n", "for f in [50.05]:\n", " f1 = f\n", " X = sin(2*pi*f1*T)\n", " X.resize(fs*resize)\n", " FFT = fft(X)\n", " #FFT = DFT_new(X)\n", " MAG = abs(FFT)\n", " PHASE = angle(FFT)\n", "\n", " n_fft_points = int(len(MAG)/2)\n", "\n", " MAG = MAG[0:n_fft_points]\n", " PHASE = PHASE[0:n_fft_points]\n", "\n", " Npeaks=1\n", " sorted_magnitude = sorted(MAG,reverse = True)\n", " sorted_magnitude = sorted_magnitude[:Npeaks][0]\n", " fpeak = list(MAG).index(sorted_magnitude) #for peak in sorted_magnitude][0]\n", " fp = MAG[fpeak]\n", " ph_p = PHASE[fpeak]/pi\n", " fpeaks.append(fp)\n", "\n", "print(\"FFT len\",len(MAG))\n", "print(\"Peak at:\",fpeak/resize,f1)\n", "error = (fpeak/resize-abs(f1))/abs(f1)\n", "print(38,fpeak/resize-f1)\n", "print(error)\n", "print(f\"MAG-N delta {error*100:.2g} %\")\n", "\n", "print(n_fft_points)\n", "print(\"len Freqs\",len(Freqs))\n", "print(\"len MAG\",len(MAG))\n", "Freqs = arange(0,fs*1000,fs/n_samples)\n", "plt.plot(Freqs[:n_fft_points],MAG,'b')\n", "plt.xlabel('Freq (Hz)')\n", "plt.ylabel('FFT Amplitude |X(freq)|')\n", "plt.xlim(0,fpeak*2)\n", "\n", "plt.show()" ], "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 418 }, "id": "Nxv1-m_a1Uv5", "outputId": "65234518-2fef-43cf-abf5-3ca5c4816b98" }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "FFT len 10000\n", "Peak at: 50.05 50.05\n", "38 0.0\n", "0.0\n", "MAG-N delta 0 %\n", "10000\n", "len Freqs 200\n", "len MAG 10000\n" ] }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "### SPECTROGRAM" ], "metadata": { "id": "OLbkGaB85OTa" } }, { "cell_type": "markdown", "source": [ "### FFT SPECTROGRAM" ], "metadata": { "id": "9kkHgUQJ5QtO" } }, { "cell_type": "code", "source": [ "from numpy.fft import fft, ifft,fftfreq\n", "from numpy import abs, angle, arange, dot, exp, sin, pi\n", "import matplotlib.pyplot as plt\n", "from numpy import exp\n", "\n", "from scipy.signal import spectrogram\n", "from scipy import signal" ], "metadata": { "id": "7xwAV9gN5ahG" }, "execution_count": null, "outputs": [] }, { "cell_type": "code", "source": [ "df_max = 0.7 # non-resolved\n", "df_min = 0.8 # resolved\n", "f0, df = 500, 2\n", "f1, f2 = f0-df, f0+df\n", "n_fft = 1000 #FFT points\n", "fs= 2000 #sampling frequency\n", "T = arange(0,n_fft/fs,1/fs)\n", "# Nyquist\n", "assert fs> max(f1,f2)*2\n", "Y = sin(2*pi*f1*T) + sin(2*pi*f2*T)\n", "FFT = fft(Y)\n", "MAG = abs(FFT)\n", "PHASE = angle(FFT)\n", "n_fft_points = int(len(T)/2)\n", "F = [fs*i/2/n_fft_points for i in range(n_fft_points)]\n", "print(f1,f2,df)\n", "\n", "MAG = MAG[0:n_fft_points]\n", "PHASE = PHASE[0:n_fft_points]\n", "plt.title(\"FFT\")\n", "fmin, fmax = int((f0-20)/2), int((f0+20)/2)\n", "plt.plot(F[fmin: fmax], MAG[fmin: fmax]) # [min, max],MAG[min, max])" ], "metadata": { "id": "C6H4Ra3X5VD0", "outputId": "19215768-587a-497c-f610-f6ac9107369d", "colab": { "base_uri": "https://localhost:8080/", "height": 316 } }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "498 502 2\n" ] }, { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": {}, "execution_count": 19 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "markdown", "source": [ "## CROSS CORRELATION\n", "works great when delta f > 1 frequency bin" ], "metadata": { "id": "_dDfH51JbtEK" } }, { "cell_type": "code", "source": [ "## CROSS CORRELATION WORKS great down to 1 frequency bin but not below\n", "FREQS = arange(498,502,fs/n_fft_points/33)\n", "\n", "\n", "import numpy as np\n", "\n", "def cross_corr(y1, y2):\n", " \"\"\"Calculates the cross correlation and lags without normalization.\n", "\n", " The definition of the discrete cross-correlation is in:\n", " https://www.mathworks.com/help/matlab/ref/xcorr.html\n", "\n", " Args:\n", " y1, y2: Should have the same length.\n", "\n", " Returns:\n", " max_corr: Maximum correlation without normalization.\n", " lag: The lag in terms of the index.\n", " \"\"\"\n", " if len(y1) != len(y2):\n", " raise ValueError('The lengths of the inputs should be the same.')\n", "\n", " y1_auto_corr = np.dot(y1, y1) / len(y1)\n", " y2_auto_corr = np.dot(y2, y2) / len(y1)\n", " corr = np.correlate(y1, y2, mode='same')\n", " # The unbiased sample size is N - lag.\n", " unbiased_sample_size = np.correlate(\n", " np.ones(len(y1)), np.ones(len(y1)), mode='same')\n", " corr = corr / unbiased_sample_size / np.sqrt(y1_auto_corr * y2_auto_corr)\n", " shift = len(y1) // 2\n", "\n", " max_corr = np.max(corr)\n", " argmax_corr = np.argmax(corr)\n", " return max_corr, argmax_corr - shift\n", "\n", "CORRs = []\n", "\n", "for f in FREQS:\n", " SINE = sin(2*pi*f*T)\n", " # CORR = [(SINE[i]*Y[i])**2 for i in range(len(T))]\n", " # corr = sum(CORR)\n", " # CORRs.append(corr)\n", "\n", " max_corr, _ = cross_corr(Y,SINE)\n", " CORRs.append(max_corr)\n", "\n", "plt.plot(FREQS, CORRs)\n", "\n", "\n" ], "metadata": { "id": "Dmzv481U8859", "outputId": "51ca8c1e-739e-48cf-b9d9-587420aeb812", "colab": { "base_uri": "https://localhost:8080/", "height": 282 } }, "execution_count": null, "outputs": [ { "output_type": "execute_result", "data": { "text/plain": [ "[]" ] }, "metadata": {}, "execution_count": 21 }, { "output_type": "display_data", "data": { "text/plain": [ "
" ], "image/png": "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\n" }, "metadata": { "needs_background": "light" } } ] }, { "cell_type": "code", "source": [ "from numpy import angle, exp, pi\n", "i = exp(1j*pi)\n", "print(i)\n", "print(angle(i))" ], "metadata": { "id": "GsLgKLjoOdgz", "outputId": "edeb6913-6d26-4849-f55f-604190d2e504", "colab": { "base_uri": "https://localhost:8080/" } }, "execution_count": null, "outputs": [ { "output_type": "stream", "name": "stdout", "text": [ "(-1+1.2246467991473532e-16j)\n", "3.141592653589793\n" ] } ] } ] }