Skip to content

Instantly share code, notes, and snippets.

@fhk
Created June 25, 2018 22:54
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fhk/3945ddf73d8a5bd2c091cf64b91c71c4 to your computer and use it in GitHub Desktop.
Save fhk/3945ddf73d8a5bd2c091cf64b91c71c4 to your computer and use it in GitHub Desktop.
RF_modeling_mmWave_propagation
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Exploration of wireless network RF calculations"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Free space loss equation: http://www.tapr.org/ve3jf.dcc97.html\n",
"Assuming isotropic receiving antenna"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"$$\n",
"L_p = 32.4 + 20 log \\,f + 20 log\\,d\\,dB\\\\\n",
"f\\,in\\,MHz,\\,d\\,in\\,km\n",
"$$\n",
"\n",
"\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now lets combine this with the antenna gains and cable losses"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\\begin{align}\n",
"P_r & = P_t - L_p + G_t + G_r - L_t - L_r\\\\\n",
"\\\\\n",
"where &\\\\\n",
"\\\\\n",
"P_t & = transmitter\\,power\\,output\\,(dBm\\,or\\,dBW,\\,same\\,units\\,as\\,P_r)\\\\\n",
"...&\\\\\n",
"\\end{align}\n",
"\n",
"\n",
"Not taking into account refraction, defraction and reflection we can compute the loss. From [here](https://www.signalboosters.com/blog/what-is-decibel-db-gain-and-how-does-it-relate-to-cell-phone-reception) we can see that mobile phones operate in ideal conditions at - 50 dB and stop operating at - 100 dB. This post also shows you how to check your network readings from you iPhone/Android."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import math"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"-54.62842188132896"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"L_p = 32.4 + (20 * math.log10(915)) + (20 * math.log10(10))\n",
"P_t = 24\n",
"G_t = 25\n",
"G_r = 12\n",
"L_t = 2\n",
"L_r = 2\n",
"P_r = P_t - L_p + G_t + G_r - L_t - L_r\n",
"P_r"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Now lets explore the loss as we increase the frequency upto millimeter wave (mmWave)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"def calc_loss(freq, distance, tr_pwr=24, tr_gain=10, rec_gain=10, tr_loss=2, rec_loss=2):\n",
" \"\"\" Calculate the path loss for a frequency and distance\n",
" \n",
" Keyword arguments:\n",
" freq -- the frequnecy in MHz\n",
" distance -- the distance in km\n",
" tr_pwr -- the transmitter power in dB\n",
" tr_gain -- the transmitter gain in dB\n",
" rec_gain -- the receiver gain in dB\n",
" tr_loss - the transmitter loss in dB\n",
" rec_loss - the receiver loss in dB\n",
" \"\"\"\n",
" free_space_loss = 32.4 + (20 * math.log10(freq)) + (20 * math.log10(distance))\n",
" path_loss = tr_pwr - free_space_loss + tr_gain + rec_gain - tr_loss - rec_loss\n",
" return path_loss"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"losses = []\n",
"freq = np.arange(500, 10000, step=500)\n",
"dist = np.arange(0.00001, 20, step=0.2)\n",
"for x in freq:\n",
" row = []\n",
" for y in dist:\n",
" row.append(calc_loss(x, y))\n",
" losses.append(row)\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"l_a = np.array(losses)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-62.73381721669774\n",
"-68.75441712997736\n",
"-72.27624231109098\n",
"-74.77501704325698\n",
"-76.7132173034181\n",
"-78.29684222437061\n",
"-79.63577801698287\n",
"-80.79561695653662\n",
"-81.8186674054842\n",
"-82.73381721669773\n",
"-83.56167091986222\n",
"-84.31744213765019\n",
"-85.01268426283447\n",
"-85.6563779302625\n",
"-86.25564239781136\n",
"-86.81621686981622\n",
"-87.34279564426325\n",
"-87.83926731876383\n",
"-88.3088892357543\n"
]
}
],
"source": [
"for i in range(len(l_a)):\n",
" print(l_a[i].mean())"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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C+bhWDA3xhgTIyyYh2PB3BhjYtby5csTDjzwwHGjR4/eZ88999znN7/5zRB/289//vPhQ4YM2c8f8OSpp57K8Lddd911uaNGjZpYUFAw8Zlnnhnor581a9bAgoKCiaNGjZp4/fXX54Y656mnnlqQkpIy2e+sBuD8888fKSJTS0pKAgCpqamTg18TarjUnWHBPBwL5sYYE7MSEhK4/fbb165cufKrzz77bPEDDzwwZO7cucn+9ksuuWRjUVHRoqKiokVnnHFGBcDcuXOTn3322awlS5Z89dprry294oorRjU2NtLY2MiVV1456pVXXlm6dOnSr5555pms4GMFGzlyZN0TTzwxCKCpqYkPP/wwfciQIREfHtWCeTgWzI0xJmbl5+c3HHLIIdUAmZmZzWPGjKlZvXp1YkevmTVr1qBTTjlla0pKio4fP74+Pz+/bvbs2WmzZ89Oy8/Pr5swYUJ9cnKynnLKKVtnzZo1KNQxTj311K2zZs3KAnj55ZfTDzjggO2BQKBLvbP5NQXjx4+fkJycPOXll18e0PmrHOvONZykJKjYYSAcY4wx3XTBBYxcuJAeHQJ14kSqH3yQLg3gsmTJksRFixalHnbYYS0jpj3wwANDnnzyycGTJk2qvuuuu9bk5OQ0rVu3LvGggw5q2Wf48OH1a9asSQTIy8trGRp1xIgR9Z988knIQDtu3Li6V155ZVBpaWn8448/nnXOOedsmT17dks1fl1dXdz48eMn+MsVFRXxRx11VAVAUVHRIoDHH3884/bbb8898sgjq7p6PaxkHo6VzI0xJuZVVFTEnXLKKWNuu+22NVlZWc0AV1555abi4uIFixcvXpSbm9tw6aWXjoSwQ6BquPXhznniiSeWPfjgg1nz5s1LmzFjRpshV5OSkpr96v2ioqJF11133frg7QsWLEi64YYbRjzzzDMrk5KSutzfetSWzEUkHpgDrFPVE0RkD+BJIAuYB5yjqvUdHWOXWDA3xpge0dUSdE+rq6uT448/fsx3v/vdreeee265v37kyJGN/vxll11WesIJJ4wFV+L2S+IA69evTxwxYkQDwLp161rWr127NnH48OFh74Ofe+65ZdOmTdv7tNNO2xIfH9/l/FZWVsadfvrpY+6+++5if/jWrormkvnlwOKg5T8Cf1XVsUAZcGFEz27B3BhjYlZzczNnnnlm/rhx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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"% matplotlib inline\n",
"import matplotlib.pyplot as plt\n",
"\n",
"top = plt.plot(dist, l_a[0], 'r', label='%i MHz'% freq[0])\n",
"mid = plt.plot(dist, l_a[4], 'b', label='%i MHz'% freq[4])\n",
"bottom = plt.plot(dist, l_a[-1], 'g', label='%i MHz'% freq[-1])\n",
"plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\n",
"plt.title(\"Propagation of RF frequnecy for distance (km)\")\n",
"plt.ylabel('dB loss')\n",
"plt.xlabel('km')\n",
"plt.show()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now we want to check the distance at which each frequency hits -50 and -75 dB loss"
]
},
{
"cell_type": "code",
"execution_count": 59,
"metadata": {},
"outputs": [],
"source": [
"def calc_loss_at_distance(loss, distance):\n",
"\n",
" hits = []\n",
"\n",
" for c in l_a:\n",
" for i, l in enumerate(c):\n",
" if l <= loss:\n",
"\n",
" hits.append(distance[i])\n",
" break\n",
" return hits\n",
"\n",
"hits_fifty = calc_loss_at_distance(-50, dist)\n",
"hits_seventy = calc_loss_at_distance(-70, dist)\n",
" \n",
" "
]
},
{
"cell_type": "code",
"execution_count": 64,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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kpJSpkyZ0ibYMgAOHjxoI0eOjE9ISEhJTk5OefPNN6MB0tPTG/Xo0SO5oCZk9erVDXNzcyMGDhzYLTExMaV79+6pzzzzTMuSlluWRYsWtbj11lt3Adx66627Fi5cWGxZ+/fvt2HDhp2ekJCQcumll55++PBhC7asnJycyGbNmh2vaAy14pJuEREJsRtv7MyaNU1O6TLT0g4ye/Z3JRV//PHHTV5//fWY1atXrzt27Bi9evVK6d2798HAebZv3x75zjvvtPz666/XREREsHPnzshWrVodHzRoUM6wYcP2jh49eg9AbGxs3h133LET4Lbbbuvw5JNPtpo0adIOfxn109PTM1atWtVo+PDh3UaPHr3nlVdeafb222+3XL58eUZ0dHT+9u3bIwFuvvnmuKeffnpLjx49jrz//vtNx44d2+Vf//rXxoJ4EhMTj1533XXZUVFRxx988MHtABdeeGG3q666atevf/3rXdOnT48dO3Zs5yVLlnxVdHs3bdrU6NNPP92Qk5MTmZycnHbnnXdmN2zY8MeO2o888sj306ZNa/vBBx9sKm23Tp06tQ3Axo0b161cubLR0KFDu3/11Vdr/vSnP7UeN27c9rFjx+4+fPiw5eXlMW/evObt2rU79uGHH24C2LVrV5lNRgAXXXRRdzNj9OjR2RMmTNjpv7deXFzcMYC4uLhju3fvLpZjPP74420aN26cv3HjxnWfffZZ43POOSclsPz8889PcM5ZVlZWg9mzZ39dnlgChXVNzTvvwO9+F+ooRESkMj744IOooUOH5kRHR+fHxMTkDx48OKfoPDExMccbNmyYP2rUqLjnn3++RVRUVH6wZS1fvrxxnz59EhMSElLmz58fu3bt2h9rWC677LKcyMhI+vTpc3jXrl31ARYvXtzsmmuu2RkdHZ0P0LZt2+N79+6NWLlyZdQvfvGLrklJSSnjxo2L27FjR/2ytmPlypVNx4wZsxtg7Nixu5cvXx60aWrw4ME5jRs3du3bt8+LiYk5lpWVVamKh08//TTquuuu2wXQu3fvwx06dDi6evXqRv379z8wbdq09pMmTWqXmZnZICoqyp155pmHPv7442Zjx47tuGjRoqjY2Ngya0f+7//+L2PdunXr33333cxnnnmmzcKFC8vd1PbJJ59EXXvttbsAzjrrrEMJCQmFktSlS5duzMzMXJuenr5u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pIqIBNGsGfTt6z0C5eV5v6GKNqk1ahSSMEVqJdXUlFdJdckZGd4NQgo0agQJCcUTnsREb4AgEZFqopoaqWuU1JwKO3cGT3a++ca7jWyBzp2D34Cjptz1TETCipIaqWvU/HQqtGoF557rPQIdPgybNhUf9XD27MI9GaOjgyc7XbtCw4bVuy0iIiK1VK1IajZs2MDAgQMLTfvlL3/JuHHjOHjwIEOHDi32nhtuuIEbbriBnTt3MnLkyGLlY8eO5YorruC7777j2muvLVZ+xx138NOf/pQNGzZw6623FiufPHkygwYNYtWqVYwfP75Y+aOPPsqAAQP4NDeXe//ylxMFUVHQty/T772XXpGRLFmwgIdfe83rJfjFFz/2FJwFJEZG8mabNkw7cgSaNCl0O9U5v/wlnVu04OUvv2TGv/5VbP3zrr6aVk2b8tzy5Ty3fHmx8nduuIEmDRrw1LJlvLJ6dbHyD8eMAeDxjz7irYyMQmWN69dn4ejRADz03nu899VXhcpjmzRh/jXXAHDPokUs+/bbQuWdmjfnxbvugqQkxj/zDKvWri1UnpCQwNNPPw3AmDFj2LhxY6HyXr16MX36dACuueYasooMntS/f38ee+wxAEaMGMGuXbsKlV900UXcd999AFxyySUcChxlEhg2bBgTJkwAKHbcQS069j79lHvvvbdY+fTp0+nVqxdLlizh4YcfLlY+a9YsEhMTefPNN5k2bVqx8jlz5tC5c2defvllZsyYUax83rx5tGrViueee47nnnuuWPk777xDkyZNeOqpp3jllVeKlX/44YcAPP7447z11luFyho3bszChQsBeOihh3jvvfcKlcfGxjJ//nwA7rnnHpYtW1aovFOnTrz44osAjB8/nlWrVhUqD/djTyTc1YqkJiy1aQO9ennXoAYmFcePe8M8jxrlXSbx/vtesrNnjzdvgalTS19+kC+rQh54oPTye+6p2vIrrzzxvGFDL2kreERFebeVbdeu9GWIiIgEUJ+a2uL48cJXX9VmRTtdBzbNBTbLNWtWcrOcboooUib1qZG6JiQ1NWZ2MfAEEAk865z7XSjiqFUiI71HuOjRw3sEcg6+/754h+v33oMXXjgxX2Skd+m8rnWVumDWrOL99UQkqGpPaswsEvgL8BMgC/jczN5wzq2r7likhjGDTp28x6BBhcv27St8x7JNmwoP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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"neg_fifty = plt.plot(freq, hits_fifty, 'r', label='distance to hit loss -50 dB')\n",
"neg_seventy = plt.plot(freq, hits_seventy, 'b', label='distance to hit loss -70 dB')\n",
"plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)\n",
"plt.title(\"dB loss over distance as frequency increases with 400m baseline\")\n",
"plt.ylabel('distance (km)')\n",
"plt.xlabel('MHz')\n",
"plt.axhline(0.4, linestyle='--', color='k') # horizontal lines\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.6.5"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
# coding: utf-8
# # Exploration of wireless network RF calculations
# Free space loss equation: http://www.tapr.org/ve3jf.dcc97.html
# Assuming isotropic receiving antenna
# $$
# L_p = 32.4 + 20 log \,f + 20 log\,d\,dB\\
# f\,in\,MHz,\,d\,in\,km
# $$
#
#
#
# Now lets combine this with the antenna gains and cable losses
# \begin{align}
# P_r & = P_t - L_p + G_t + G_r - L_t - L_r\\
# \\
# where &\\
# \\
# P_t & = transmitter\,power\,output\,(dBm\,or\,dBW,\,same\,units\,as\,P_r)\\
# ...&\\
# \end{align}
#
#
# Not taking into account refraction, defraction and reflection we can compute the loss. From [here](https://www.signalboosters.com/blog/what-is-decibel-db-gain-and-how-does-it-relate-to-cell-phone-reception) we can see that mobile phones operate in ideal conditions at - 50 dB and stop operating at - 100 dB. This post also shows you how to check your network readings from you iPhone/Android.
# In[2]:
import math
# In[3]:
L_p = 32.4 + (20 * math.log10(915)) + (20 * math.log10(10))
P_t = 24
G_t = 25
G_r = 12
L_t = 2
L_r = 2
P_r = P_t - L_p + G_t + G_r - L_t - L_r
P_r
# ### Now lets explore the loss as we increase the frequency upto millimeter wave (mmWave)
# In[4]:
def calc_loss(freq, distance, tr_pwr=24, tr_gain=10, rec_gain=10, tr_loss=2, rec_loss=2):
""" Calculate the path loss for a frequency and distance
Keyword arguments:
freq -- the frequnecy in MHz
distance -- the distance in km
tr_pwr -- the transmitter power in dB
tr_gain -- the transmitter gain in dB
rec_gain -- the receiver gain in dB
tr_loss - the transmitter loss in dB
rec_loss - the receiver loss in dB
"""
free_space_loss = 32.4 + (20 * math.log10(freq)) + (20 * math.log10(distance))
path_loss = tr_pwr - free_space_loss + tr_gain + rec_gain - tr_loss - rec_loss
return path_loss
# In[5]:
import numpy as np
# In[6]:
losses = []
freq = np.arange(500, 10000, step=500)
dist = np.arange(0.00001, 20, step=0.2)
for x in freq:
row = []
for y in dist:
row.append(calc_loss(x, y))
losses.append(row)
# In[7]:
l_a = np.array(losses)
# In[8]:
for i in range(len(l_a)):
print(l_a[i].mean())
# In[17]:
get_ipython().run_line_magic('matplotlib', 'inline')
import matplotlib.pyplot as plt
top = plt.plot(dist, l_a[0], 'r', label='%i MHz'% freq[0])
mid = plt.plot(dist, l_a[4], 'b', label='%i MHz'% freq[4])
bottom = plt.plot(dist, l_a[-1], 'g', label='%i MHz'% freq[-1])
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.title("Propagation of RF frequnecy for distance (km)")
plt.ylabel('dB loss')
plt.xlabel('km')
plt.show()
# Now we want to check the distance at which each frequency hits -50 and -75 dB loss
# In[59]:
def calc_loss_at_distance(loss, distance):
hits = []
for c in l_a:
for i, l in enumerate(c):
if l <= loss:
hits.append(distance[i])
break
return hits
hits_fifty = calc_loss_at_distance(-50, dist)
hits_seventy = calc_loss_at_distance(-70, dist)
# In[64]:
neg_fifty = plt.plot(freq, hits_fifty, 'r', label='distance to hit loss -50 dB')
neg_seventy = plt.plot(freq, hits_seventy, 'b', label='distance to hit loss -70 dB')
plt.legend(bbox_to_anchor=(1.05, 1), loc=2, borderaxespad=0.)
plt.title("dB loss over distance as frequency increases with 400m baseline")
plt.ylabel('distance (km)')
plt.xlabel('MHz')
plt.axhline(0.4, linestyle='--', color='k') # horizontal lines
plt.show()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment