m-thesis-introduction/simulations/02_discrete_signal_translation.ipynb

452 lines
227 KiB
Text
Raw Permalink Normal View History

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Translation of a discrete 1D signal\n",
"\n",
"\n",
"#### wave equation\n",
"\n",
"$$\n",
"\\frac{\\partial^2 u}{\\partial t^2}\n",
" = \n",
" v^2 \\frac{\\partial^2 u}{\\partial x^2}\n",
"$$\n",
"\n",
"\n",
"##### simple sine solution\n",
"\n",
"$$\n",
"u(x, t) = \\sin\\left( \\frac{2 \\pi x}{\\lambda} -2\\pi f t\\right)\n",
"= \\sin\\left( 2 \\pi f \\, ( \\frac{x}{v(f)} -t) \\right)\n",
"$$\n",
"\n",
"$$\\lambda = \\dfrac{v}{f}$$\n",
"##### plane wave per mode\n",
"\n",
"\n",
"\n",
"$$ \n",
"u_f(x,t) \n",
"= \n",
" A \\exp(- 2\\pi i f \\left[ \\frac{x}{v(f)} - t \\right] )\n",
" +\n",
" B \\exp(- 2\\pi i f \\left[ \\frac{x}{v(f)} + t \\right] )\n",
"$$\n"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"%matplotlib inline\n",
"\n",
"import numpy as np\n",
"import scipy.fft as ft\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.gridspec as gridspec\n",
"import matplotlib.ticker as tck\n",
"\n",
"rng = np.random.default_rng()"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"class TravelSignal:\n",
" \"\"\"\n",
" Model an arbitrary digitised signal that can be translated to another position and time.\n",
" \"\"\"\n",
"\n",
" def __init__(self, signal, sample_rate, t_0 = 0, x_0 = 0, periodic=True, interp1d_kw = None):\n",
" \"\"\"\n",
" Initialise by saving the raw signal\n",
" \n",
" Parameters\n",
" ----------\n",
" signal : arraylike\n",
" The raw signal to wrap.\n",
" sample_rate : float\n",
" Sample rate of the raw signal.\n",
" t_0 : float, optional\n",
" Time that this signal is sent out.\n",
" x_0 : float, optional\n",
" Location that this signal is sent out from.\n",
" periodic : bool, optional\n",
" Translated signal is 0 if it is not periodic\n",
" and the time/distance is outside the samples.\n",
" interp1d_kw : bool or dict, optional\n",
" Use scipy.interpolate's interp1d_kw for interpolation.\n",
" Set to True, or a dictionary to enable.\n",
" Dictionary will be entered in as **kwargs.\n",
" \"\"\"\n",
"\n",
" self.raw = signal\n",
" self.periodic = periodic\n",
"\n",
" self.sample_rate = sample_rate # Hz\n",
" self.sample_length = len(self.raw)\n",
" self.time_length = self.sample_length*sample_rate # s\n",
" \n",
" self.x_0 = x_0\n",
" self.t_0 = t_0\n",
"\n",
" # choose interpolation method\n",
" if not interp1d_kw:\n",
" self.interp_f = None\n",
"\n",
" else:\n",
" # offload interpolation to scipy.interpolate\n",
" import scipy.interpolate as interp\n",
"\n",
" interp1d_kw_defaults = {\n",
" \"copy\": False,\n",
" \"kind\": 'linear',\n",
" \"assume_sorted\": True,\n",
" \"bounds_error\": True\n",
" }\n",
"\n",
" if self.periodic:\n",
" interp1d_kw_defaults['bounds_error'] = False\n",
" interp1d_kw_defaults['fill_value'] = (self.raw[-1], self.raw[0])\n",
" \n",
" # merge kwargs\n",
" if interp1d_kw is not True:\n",
" interp1d_kw = { **interp1d_kw_defaults, **interp1d_kw }\n",
"\n",
" self.interp_f = interp.interp1d(\n",
" np.arange(0, self.sample_length),\n",
" self.raw,\n",
" **interp1d_kw\n",
" )\n",
" \n",
" def __len__(self):\n",
" return self.sample_length\n",
" \n",
" def __call__(self, t_f = None, x_f = None, **kwargs):\n",
" \"\"\"\n",
" Allow this class to be used as a function.\n",
" \"\"\"\n",
" return self._translate(t_f, x_f, **kwargs)[0]\n",
" \n",
" def _translate(self, t_f = None, x_f = None, t_0 = None, x_0 = None, velocity = None):\n",
" \"\"\"\n",
" Translate the signal from (t_0, x_0) to (t_f, x_f) with optional velocity.\n",
" \n",
" Returns the signal at (t_f, x_f)\n",
" \"\"\"\n",
" \n",
" if t_0 is None:\n",
" t_0 = self.t_0\n",
" \n",
" if velocity is None:\n",
" velocity = 1\n",
"\n",
"\n",
" ## spatial offset\n",
" if x_f is None:\n",
" spatial_time_offset = 0\n",
" else:\n",
" x_f = np.asarray(x_f)\n",
" if x_0 is None:\n",
" x_0 = self.x_0\n",
"\n",
" spatial_time_offset = np.sum(np.sqrt( (x_f - x_0)**2 )/velocity)\n",
"\n",
" ## temporal offset\n",
" if t_f is None:\n",
" temporal_time_offset = 0\n",
" else:\n",
" t_f = np.asarray(t_f)\n",
" \n",
" if t_0 is None:\n",
" t_0 = self.t_0\n",
" \n",
" temporal_time_offset = t_f - t_0\n",
"\n",
" # total offset\n",
" total_time_offset = spatial_time_offset + temporal_time_offset\n",
" n_offset = (total_time_offset * sample_rate )\n",
"\n",
" # periodic signal\n",
" if self.periodic:\n",
" n_offset = n_offset % self.sample_length\n",
"\n",
" # non-periodic and outside the bounds\n",
" else:\n",
" mask_idx = np.nonzero( (0 > n_offset) | (n_offset >= self.sample_length) )\n",
" n_offset[mask_idx] = 0\n",
"\n",
" # offload to scipy interpolation\n",
" if self.interp_f:\n",
" amplitude = self.interp_f(n_offset)\n",
" \n",
" # self written linear interpolation\n",
" else:\n",
" n_offset_eps, n_offset_int = np.modf(n_offset)\n",
" n_offset_int = n_offset.astype(int)\n",
"\n",
" if True:\n",
" amplitude = (1-n_offset_eps) * self.raw[n_offset_int] \\\n",
" + n_offset_eps * self.raw[(n_offset_int + 1) % self.sample_length]\n",
"\n",
" # use nearest value instead of interpolation\n",
" else:\n",
" amplitude = self.raw[n_offset_int]\n",
"\n",
" if not self.periodic:\n",
" amplitude[mask_idx] = 0\n",
" \n",
" return amplitude, total_time_offset"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Testing:"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Interpolation: Sine wave"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1152x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Sine wave\n",
"sample_rate = 1e3 # Hz\n",
"f_sine = 10\n",
"time = np.arange(0, 1, 1/(sample_rate)) #s\n",
"time2 = np.arange(0, 1, 1/(sample_rate*2)) #s\n",
"phase_offset = 0\n",
"\n",
"signal_func = lambda t: np.cos(2*np.pi*f_sine*t + phase_offset)\n",
"\n",
"mysignal = TravelSignal(signal_func(time), sample_rate)\n",
"\n",
"fig, ax = plt.subplots(figsize=(16,4))\n",
"ax.plot(time, signal_func(time), '.-', label=\"Raw signal\")\n",
"ax.plot(time, mysignal(time)+0.5, '.-', label=\"MySignal +0.5\")\n",
"ax.plot(time2, mysignal(time2)+0.25, '.--', label=\"MySignal(interp) +0.25\")\n",
"ax.set_ylabel(\"Amplitude\")\n",
"ax.set_xlabel(\"Time\")\n",
"ax.set_xlim(0, 1/f_sine)\n",
"ax.legend()\n",
"plt.show();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Extrapolation: Sine wave"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA7gAAAEGCAYAAABPZjl3AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjMsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+AADFEAAAgAElEQVR4nOx9d3xU15n2c2ZGXUIIFapQAUx1EEgWuIMbYDvYad4Y23G8STZlv+xmd3+/xHG+2BuvkzjJ2kn227SNU1xiO8YtcsNUU0wREgxdoIKkEQJGEpJQn3Lv98e5fdqd0dwi9jz++TfnltF9ec88M/fc932fl/A8DwYGBgYGBgYGBgYGBgaGiQ6H1QYwMDAwMDAwMDAwMDAwMCQDbIHLwMDAwMDAwMDAwMDAcEWALXAZGBgYGBgYGBgYGBgYrgiwBS4DAwMDAwMDAwMDAwPDFQG2wGVgYGBgYGBgYGBgYGC4IuCy2oBko6CggC8tLbXaDAYGBgYGBgYGBgYGBgYDUF9f383zfGG4Y1fcAre0tBR1dXVWm8HAwMDAwMDAwMDAwMBgAAghbZGOsRRlBgYGBgYGBgYGBgYGhisCbIHLwMDAwMDAwMDAwMDAcEWALXAZGBgYGBgYGBgYGBgYrgiwBS4DAwMDAwMDAwMDAwPDFQG2wGVgYGBgYGBgYGBgYGC4ImDpApcQ8kdCiJcQcjzC8VWEkH5CiFv4/3GzbWRgYGBgYGBgYGBgYGCYGLA6gvtnAGtjnLOb5/kK4f8nTbDJWNT9GXjxU/TVjvDUAq9uAH5/i31trPszte/VB6i9dgPzYXKw5Qngv5bRVzuCzfP4wXyYHHhqgd3P2Nc+BgYGBgYGE2FpH1ye53cRQkqttMFU1P0ZePef6bh5O9B7Frj9B5aapIKnFvjjWoAP0u1z9fS16ouWmRSCLU8AH/9C3j79AfD3m4DiautsUiKcD+02z8rPIWA/HwLAG18Bjr1Gxx//ArjcCXzm99bapATjyvjBuJIcHPwj8P6/ATwAVxrwcI297GNgYGBgYDAZVkdw9eBaQsgRQsgHhJDF4U4ghPwDIaSOEFLX1dVltn36cepv6u2Pf2mvJ+57fiHfbIrY/2trbAkHTy31mRJ8EDjysjX2hMORV0J9aLd53vtf6m0+qF4IWQ1Prby4FXHsNXv5cM/PGVfGi4nAlXA+tBtX3vtXgOcAcEBwDGjdbbVVDAwMDAwMlsLuC9xDAEp4nl8K4P8BeDvcSTzP/w/P81U8z1cVFhaaamBcWHiPZgdvn5slTy1w+v3Q/d1n7HPDeeQV0DCFBl1nTDclIjqPhNnJ22dh4akFLjWH7m/4wD7zvPvn4ffbiisfhO5nXIkP5w6H2WkzrvS2hO63FVeehXqeCVB6o1XWMDAwMDAw2AK2XuDyPH+Z5/lBYfw+gBRCSIHFZiWOqi8CJdep99nlZinSDbGdFuHnj4bf37bPHj701AKd9eGP2WVhsSfC4hGcPRYWnlrgTJjFI8C4Eg/CLh5hL66cj2CjXbiy+9kIB+zElU3qffPXsvRkBgYGBob/9bD1ApcQMo0QQoRxNai9PdZaNU7c9gOo3W6Tm6XL5yMfO73J+ptiT61c5xgCm/jwyCuRj7Xvt4cPT2+KfHzQBun9ERePgG3mub8z8jG7cOW8O8JBm/hwInDlzIeRj9uSKw7g+m9ZZQ0DAwMDA4NtYHWboFcA7AMwnxDSQQj5EiHka4SQrwmnfBbAcULIEQD/BeDzPM9HuvudGCiuBhbcqdlJLDFFhZFezQ6FTTxnfV1X625EXvjAHjecfR2aHXb0IafYYYPPnRZaemdP1ZxgA5uHL2l22HGebc6V3jbNDjv6cIJxZcE6Fr1lYGBgYGCAxQtcnufv53l+Os/zKTzPz+J5/g88z/+W5/nfCsf/m+f5xTzPL+V5fiXP83uttDdpmHu7envaUmvsEOGpBToOytuOFODqzylO4IGMfNPNUiFjinr76vsA4pS3G7dYG/Xx1AIt2+VtW/pQc/2rPwc4FELqVvsQACbNUG+X3azetgNXlGnodpzn9MnqbTty5exH8rYdfTgRuJKl0ZuYe4c1djAwMDAwMNgMtk5RvmIx0gNVROBCpHRCk9C6W6FmSoDlDwJFCxQnEMFmC9H2sWLDQe1b9qC8K+i3NurTuhvgAsKG0odE3mf1PA8r55BQ+5Z/Qd5ltQ8BoHWPYsMBDHeDcSVOaH1YtABYukHeZfU8t+4GuHA+tBFXhpRRbptypU35vNdh/eeOgYGBgYHBJmALXCtQeiPgTJG3D79sbTRAFa3ggWkVofusjKh4aoETb8nbzhTqwxnLFSdx1toYzoelNyqiPrz186xKWxXmVBURtdiHnlr14syZQpXH7cSV9DzFhk25omxHJnJlVpXiJMaVmAj6FRs25YpygSvOMwMDAwMDAwNb4FqC4mp7RR/b9yk2hEiAnaLM2ujosg3UhyOaiKSVEQxtdHSkR5jnB+TdVs9zqyYKHjLPFkfOtNHRZRuo8riduKLNJLAlVzQ+tB1XuhUbCq4s/by82+p5jvmdaAOuSDXCinlmYGBgYGBgYAtcy2CXaICnFjj+urwtRgLsFGUOF/EJt9/KiIpDSSWFLdOXKfZbPM9nd8rbynm2S+RMVWetmGc7ceWkohU340pi4JXiTQpbZtokyuypVT/IUHFFrGW2mCvhMgkYGBgYGBgYALAFrnVQRgOIhfVTkSI+2igzF7AuoqLyjcJX2oiKlVGp7ibFhtZGAVbPszY6Ks7zJ+6Tz7Nynvs9io0I82y1DxlXxo+eCcyVJZ+Rz7NynnvPKjZY/S0DAwMDA4MSbIFrFVRRH2JdtKL0RoAIN77OVLUYzdL7Id0UO5zW1XgVr5THylqz0hsBVxodEwt9CACBEcEOB7VJaaOoYOtwWefD0hshzaV2niu/KI+tnGep7pGE+pBxRR+Udel25Yp/WLDDzlwRoJ3nqi/JY0u54hMGGq4wMDAwMDAwsAWuZSiuBm55nI55Dtj0qHXpblI/xTC9M4kNPiIDFxQbChuLq4G1PxF2W+hDTy1wUhD2IQ5g7dPqejhxUWRlC2eOg+y7cPOsiO5ZAU8tsP83dOzQ+LC4Grj5O3RsOVfE9NpoXLGwZ+rlcwobtFx5mo6t5krD+3QcjSvR+vgaDa3AlBKEQBUJtwKeWuDgH+jY4Qz1IQMDAwMDw/9y2GD18r8Y0lN4HgiMWZPu1rob0k2cNuWudbd8Qx/0A0deNt08AOrrckG1jcrUPCt9KIpg8ZzaJqUPuYB1Pqz7gzzW+rB1t7z4tkrcp3U3wAkLC56PknJpNVcEROWKz7p5PrZRGPBhuHJJHlvpQzH9NxpXghZy5eBz8jgcV2AnrnAsPZmBgYGBgUEDtsC1EpnKNEGLRFVSs+Uxr7HBDgJEnlqgeYe8rU1dzLCBD5XXtKsPT7wpb080HwJAZoFiwyIbnenyOOw8WyxA5KkFzioWXBNtnu3ClVM18vZE8yEDAwMDAwMDW+BaCjuIqvQ0KzY0NhRXA1d/Vt62QlRFGdUJ1w7DDj4c6lJshPGh1QJEkcSRRKgEiCzyYSRxpHDHrZrnSxHEkQDqz8Wfkrct40qseRYPW+TDQWW5QRgfVijaajGuhEcsrjAwMDAwMPwvB1vgWgk7iKpIadKO8GIllY/IYytEVaIJvojHRQEiy8RzxDq9CIIvVgsQld4o14dG9GEqHVvlw5Ib5LFSHElE6Y2Qvq6s4kpgTBhE4IrVAkTRhMTE4w6RKw5r5lm5eAznwwqFzZZxJYYPreZK+mRhwASmGBgYGBgYwoEtcK0GsVCQxlMLHH6RjrXCPiLsIKoSTRypuBpY+Q065iwQz/HUArt+RsfhRHNEWC3iFE0cqbgauP1J+TwrBIiGuxUbEQSGrObK0b/ScSSuSCnKgG25co2wCOeC1nDl41/QcVSuWCzWFU10r7gauOX7wmGLvm8+/C4dE8IEphgYGBgYGMKALXCtROtuQd0WFqbjieJIEYR9oolQmYGWj+SxVvBFBFHUPgZ95trYulutuhrJh7yFPlTNYQQ
"text/plain": [
"<Figure size 1152x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Sine wave\n",
"sample_rate = 1e3 # Hz\n",
"f_sine = 10\n",
"time = np.arange(0, 1, 1/(sample_rate)) #s\n",
"time2 = np.arange(3/4, 2, 1/(sample_rate*2)) #s\n",
"phase_offset = 0\n",
"\n",
"signal_func = lambda t: np.cos(2*np.pi*f_sine*t + phase_offset)\n",
"\n",
"mysignal = TravelSignal(signal_func(time), sample_rate)\n",
"\n",
"fig, ax = plt.subplots(figsize=(16,4))\n",
"ax.plot(time, signal_func(time), '.-', label=\"Raw signal\")\n",
"ax.plot(time, mysignal(time)+0.5, '.-', label=\"MySignal +0.5\")\n",
"ax.plot(time2, mysignal(time2)+0.25, '.--', label=\"MySignal(interp) +0.25\")\n",
"ax.set_ylabel(\"Amplitude\")\n",
"ax.set_xlabel(\"Time\")\n",
"ax.legend()\n",
"plt.show();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Interpolation: Delta function"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1152x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"## 1d signal: Delta peak with time interval\n",
"sample_rate = 3e1 # Hz\n",
"interp_sample_rate = 2.3*sample_rate\n",
"time = np.arange(0, 1, 1/sample_rate) #s\n",
"time2 = np.arange(0, 2, 1/(interp_sample_rate)) #s\n",
"\n",
"signal = np.zeros(len(time))\n",
"if False:\n",
" signal[len(signal)//2] = 1\n",
"else:\n",
" signal[len(signal)//2-1] = 1\n",
" signal[len(signal)//2] = 0.75\n",
" signal[len(signal)//2+1] = 1\n",
"\n",
"mysignal = TravelSignal(signal, sample_rate)\n",
"time_signal, time_offsets = mysignal._translate(time)\n",
"time2_signal, time2_offsets = mysignal._translate(time2)\n",
"\n",
"raw_max_idx = np.argmax(signal)\n",
"my_max_idx = np.argmax(mysignal(time))\n",
"my2_max_idx = np.argmax(mysignal(time2))\n",
"\n",
"\n",
"fig, ax = plt.subplots(1,1,sharex=True, figsize=(16,4))\n",
"ax.plot(time, mysignal.raw, '.-', label=\"Raw signal\")\n",
"ax.plot(time, time_signal, '-', label=\"MySignal +0.5\")\n",
"ax.plot(time2, time2_signal, '--', label=\"MySignal(interp) +0.25\")\n",
"ax.plot(np.array([0, 1/sample_rate]) + time[raw_max_idx], [1.04, 1.04], label=\"Orig Samplerate\")\n",
"ax.plot(np.array([0, 1/interp_sample_rate]) + time[raw_max_idx], [1.02, 1.02], label=\"Interp Samplerate\")\n",
"ax.set_ylabel(\"Amplitude\")\n",
"ax.set_xlabel(\"Time\")\n",
"ax.legend()\n",
"\n",
"plt.show();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Non-Periodicity: Gaussian pulse"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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
"text/plain": [
"<Figure size 1152x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"sample_rate = 3e2 # Hz\n",
"interp_sample_rate = sample_rate * 1/10 # Hz\n",
"\n",
"t_offset = 1\n",
"periodic = False\n",
"\n",
"time = t_offset + np.arange(0, 1, 1/sample_rate) #s\n",
"time2 = np.arange(0, 3*t_offset, 1/(interp_sample_rate)) #s\n",
"\n",
"def gaussian(x, mu, sigma ):\n",
" return 1/(sigma*np.sqrt(2*np.pi)) * np.exp(- (x-mu)**2 / sigma**2 )\n",
"\n",
"signal = gaussian(time, time[len(time)//2], (time[-1] - time[0])/10)\n",
"\n",
"\n",
"mysignal = TravelSignal(signal, sample_rate, t_0 = t_offset, periodic=periodic)\n",
"\n",
"fig, ax = plt.subplots(1, 1, figsize=(16,4))\n",
"ax.set_ylabel(\"Amplitude\")\n",
"ax.set_xlabel(\"Time\")\n",
"\n",
"ax.plot(time, signal, label='Raw signal')\n",
"ax.plot(time, mysignal(time)+0.5, '-', label=\"MySignal +0.5\")\n",
"ax.plot( time2, mysignal(time2)+0.25 , '--', label=\"MySignal(interp) +0.25\")\n",
"ax.legend()\n",
"\n",
"plt.show();"
]
}
],
"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",
"version": "3.7.6"
}
},
"nbformat": 4,
"nbformat_minor": 4
}