osnr calculation

This commit is contained in:
Gilad Goldfarb
2017-07-25 23:31:45 -07:00
parent b15be2cf0d
commit 2c585faef6
4 changed files with 63 additions and 28 deletions

3
.gitignore vendored
View File

@@ -60,3 +60,6 @@ target/
# pyenv python configuration file
.python-version
# MacOS DS_store
.DS_Store

View File

@@ -5,11 +5,11 @@
"name": "",
"description": "Booster_Connection",
"parameters": {
"length": 0.0,
"length": 80.0,
"dispersion": null,
"dispersion_slope": 16.7,
"pmd": 0.0,
"loss": 0.0,
"loss": 0.2,
"fiber_type": "SMF-28e",
"nonlinear_coef": 0.0
}
@@ -20,11 +20,11 @@
"name": "",
"description": "Booster_Connection",
"parameters": {
"length": 0.0,
"length": 100.0,
"dispersion": null,
"dispersion_slope": 16.7,
"pmd": 0.0,
"loss": 0.0,
"loss": 0.2,
"fiber_type": "SMF-28e",
"nonlinear_coef": 0.0
}
@@ -35,11 +35,11 @@
"name": "",
"description": "Booster_Connection",
"parameters": {
"length": 0.0,
"length": 80.0,
"dispersion": null,
"dispersion_slope": 16.7,
"pmd": 0.0,
"loss": 0.0,
"loss": 0.2,
"fiber_type": "SMF-28e",
"nonlinear_coef": 0.0
}
@@ -110,7 +110,7 @@
"channels": [{
"manufacturer": "acme corp",
"manufacturer_pn": "acme model1",
"frequency": [193.95],
"frequency": 193.95,
"modulation": "QPSK",
"baud_rate": 32.0,
"capacity": 100,
@@ -121,12 +121,12 @@
"filter_params": [0.4],
"polarization_mux": "interleaved",
"osnr": 40.0,
"power": -5.0
"power": -10.0
},
{
"manufacturer": "acme corp",
"manufacturer_pn": "acme model1",
"frequency": [194.15],
"frequency": 194.15,
"modulation": "QPSK",
"baud_rate": 32.0,
"capacity": 100,

View File

@@ -1,22 +1,55 @@
import matplotlib.pyplot as plt
import networkx as nx
import gnpy
import numpy as np
from pprint import pprint as pp
plt.rcdefaults()
config_fn = './gnpy/examples/config/config_ex1.json'
nw = gnpy.Network(config_fn)
def db_to_lin(val):
return 10 ** (val / 10)
def chan_osnr(chan_params, amp_params):
in_osnr = db_to_lin(chan_params['osnr'])
pin = db_to_lin(chan_params['power']) / 1e3
nf = db_to_lin(amp_params.nf[0])
ase_cont = nf * gnpy.h * chan_params['frequency'] * 12.5 * 1e21
ret = -10 * np.log10(1 / in_osnr + ase_cont / pin)
return ret
def edge_dict(chan, osnr, d_power):
dct = {'frequency': chan['frequency'],
'osnr': osnr if osnr else chan['osnr'],
'power': chan['power'] + d_power}
return dct
def calc_path_osnr(nw, opath):
print(opath)
pp(opath[0].params.channels)
return None
for en, chan in enumerate(opath[0].params.channels):
for pen, p in enumerate(opath):
print(en, type(p), p, pen)
print("*** ")
for en, leg in enumerate(opath[:-1]):
edge = nw.g[opath[en]][opath[en + 1]]
suc_class = opath[en].__class__
if suc_class == gnpy.network_elements.Tx:
for chan in opath[en].params.channels:
edge['channels'].append(edge_dict(chan, None, 0))
elif suc_class == gnpy.network_elements.Fiber:
attn = opath[en].params.length * opath[en].params.loss
for inedge in nw.g.in_edges([opath[en]]):
pedge = nw.g[inedge[0]][inedge[1]]
for chan in pedge['channels']:
edge['channels'].append(edge_dict(chan, None, -attn))
elif suc_class == gnpy.network_elements.Edfa:
for inedge in nw.g.in_edges([opath[en]]):
pedge = nw.g[inedge[0]][inedge[1]]
gain = opath[en].params.gain
for chan in pedge['channels']:
osnr = chan_osnr(chan, opath[en].params)
edge['channels'].append(edge_dict(chan, osnr, gain[0]))
print(leg, edge['channels'])
def calc_osnr(nw):
@@ -24,14 +57,17 @@ def calc_osnr(nw):
for rx in nw.nw_elems['Rx']:
for opath in nx.all_simple_paths(nw.g, tx, rx):
calc_path_osnr(nw, opath)
print("*" * 10)
calc_osnr(nw)
if 0:
graph_pos = nx.fruchterman_reingold_layout(nw.g)
nx.draw_networkx_nodes(nw.g, graph_pos, node_size=1000, node_color='b', alpha=0.2)
nx.draw_networkx_edges(nw.g, graph_pos, width=2, alpha=0.3, edge_color='green')
nx.draw_networkx_labels(nw.g, graph_pos, font_size=10)
if 1:
layout = nx.spring_layout(nw.g)
nx.draw_networkx_nodes(nw.g, layout, node_size=1000,
node_color='b', alpha=0.2)
nx.draw_networkx_labels(nw.g, layout)
nx.draw_networkx_edges(nw.g, layout, width=2,
alpha=0.3, edge_color='green')
#nx.draw_networkx_edge_labels(nw.g, layout, font_size=10)
plt.show()

View File

@@ -15,10 +15,6 @@ class Params:
setattr(self, k, v)
class Channels():
pass
class Network:
g = nx.DiGraph()
nw_elems = {}
@@ -38,7 +34,7 @@ class Network:
n0 = Utils.find_by_node_id(self.g, gpath[0])
for nid in gpath[1:]:
n1 = Utils.find_by_node_id(self.g, nid)
self.g.add_edge(n0, n1, channels=Channels())
self.g.add_edge(n0, n1, channels=[])
n0 = n1