m-thesis-introduction/simulations/03_emitter_receiver_simulation.ipynb

221 lines
34 KiB
Text

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Emitter/Receiver Simulation with Signals"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"import matplotlib.pyplot as plt"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Signal"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"from lib import TravelSignal\n",
"\n",
"####\n",
"from scipy.stats import norm\n",
"\n",
"sample_rate = 3e2 # Hz\n",
"interp_sample_rate = sample_rate * 1/10 # Hz\n",
"\n",
"t_offset = 8\n",
"periodic = False\n",
"\n",
"time = t_offset + np.arange(0, 1, 1/sample_rate) #s\n",
"time2 = t_offset + np.arange(-1.5, 1, 1/sample_rate) #s\n",
"\n",
"signal = norm.pdf(time, time[len(time)//2], (time[-1] - time[0])/10)\n",
"\n",
"if False:\n",
" mysignal = TravelSignal(signal, sample_rate, t_0 = t_offset, periodic=True)\n",
" mysignal2 = TravelSignal(signal, sample_rate, t_0 = t_offset, periodic=False)\n",
"\n",
" fig, ax = plt.subplots(1, 1, figsize=(16,4))\n",
" ax.set_title(\"Raw and TravelSignal\")\n",
" ax.set_ylabel(\"Amplitude\")\n",
" ax.set_xlabel(\"Time\")\n",
"\n",
" ax.plot(time, signal, label='Raw signal')\n",
" ax.plot(time2, mysignal(time2)+0.5, '.-', label='TravelSignal(periodic)+0.5')\n",
" ax.plot(time2, mysignal2(time2)-0.5, '.-', label='TravelSignal-0.5')\n",
"\n",
" ax.legend()\n",
"\n",
" plt.show();"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## New code"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"from lib.location import Receiver, Emitter"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Testing"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 144x144 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 864x432 with 4 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"if True:\n",
" sample_rate = 3e2 # Hz\n",
" periodic = False\n",
" \n",
" t_offset = 8\n",
" t_start = 0\n",
" t_end = 1\n",
" time = t_offset + np.arange(t_start, t_end, 1/sample_rate) #s\n",
" \n",
" t_longstart = 0\n",
" t_longend = 30*t_end\n",
" longtime = np.arange(t_longstart, t_longend, 1/sample_rate) #s\n",
"\n",
"if False:\n",
" if True:\n",
" freq = sample_rate/8\n",
" signal = np.cos(2*np.pi*freq*time)\n",
" else: \n",
" from scipy.stats import norm\n",
" signal = norm.pdf(time, time[len(time)//2], (time[-1] - time[0])/10)\n",
"\n",
"\n",
"#####\n",
"# Setup Signal, Emitter and Antennae\n",
"\n",
"mysignal = TravelSignal(signal, sample_rate, t_0 = t_offset, periodic=periodic)\n",
"\n",
"source = Emitter([1,1])\n",
"emitted = source.emit(mysignal)\n",
"\n",
"antennae = [\n",
" Receiver([2,3]),\n",
" Receiver([10,10]),\n",
" Receiver([-2,-3]),\n",
"]\n",
" \n",
"#####\n",
"# Follow traces, and show geometry\n",
"ylabel_kw = {\"rotation\": \"horizontal\", \"va\":\"center\", \"ha\":\"center\", \"labelpad\": 30}\n",
"\n",
"fig, axs = plt.subplots(1,1, figsize=(2,2))\n",
"axs = [ axs ]\n",
"\n",
"### Geometry Plot\n",
"i = 0\n",
"axs[i].set_title(\"Geometry of Emitter(s) and Antennae\")\n",
"axs[i].set_ylabel(\"y\", **ylabel_kw)\n",
"axs[i].set_xlabel(\"x\")\n",
"axs[i].plot(*source.x, '*', label=\"Emitter\")\n",
"\n",
"for j, ant in enumerate(antennae):\n",
" axs[i].plot(*ant.x, '+', label=\"Antenna {}\".format(j))\n",
"\n",
"### Plot Traces\n",
"fig, axs = plt.subplots(1+len(antennae),1, sharex=True, figsize=(12,6))\n",
"axs[0].set_title(\"Traces of Emitter and Antennae\")\n",
"\n",
"# Emitter\n",
"i = 0\n",
"axs[i].set_ylabel(\"Emitter\\n at ({},{})\".format(*source.x), **ylabel_kw)\n",
"axs[i].plot(time, emitted(time))\n",
"\n",
"# Antenna\n",
"for j, ant in enumerate(antennae):\n",
" i +=1\n",
" axs[i].set_ylabel(\"Antenna {}\\n at ({},{})\".format(j, *ant.x), **ylabel_kw)\n",
" axs[i].plot(longtime, ant.recv(emitted)(longtime), label=\"Antenna {}\".format(j))\n",
" "
]
}
],
"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
}