Correct calculation of NF for OpenROADM amps

This fixes #420.

In order to be consistent with the OpenROADM MSA, the input power per
channel used for calculating incremental OSNR and NF should be scaled to
50 GHz slot width.

Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I64ca3e4cad6399f308827f4161d7c6b89be9d2ca
This commit is contained in:
Jonas Mårtensson
2021-10-15 09:20:34 +02:00
committed by Jan Kundrát
parent 57e98d7173
commit 99b2a554dc
2 changed files with 14 additions and 6 deletions

View File

@@ -636,6 +636,9 @@ class Edfa(_Node):
self.nch = frequencies.size
self.pin_db = lin2db(sum(pin * 1e3))
# The following should be changed when we have the new spectral information including slot widths.
# For now, with homogeneous spectrum, we can calculate it as the difference between neighbouring channels.
self.slot_width = self.channel_freq[1] - self.channel_freq[0]
"""in power mode: delta_p is defined and can be used to calculate the power target
This power target is used calculate the amplifier gain"""
@@ -673,13 +676,17 @@ class Edfa(_Node):
elif type_def == 'fixed_gain':
nf_avg = nf_model.nf0
elif type_def == 'openroadm':
pin_ch = self.pin_db - lin2db(self.nch)
# model OSNR = f(Pin)
nf_avg = pin_ch - polyval(nf_model.nf_coef, pin_ch) + 58
# OpenROADM specifies OSNR vs. input power per channel for 50 GHz slot width so we
# scale it to 50 GHz based on actual slot width.
pin_ch_50GHz = self.pin_db - lin2db(self.nch) + lin2db(50e9 / self.slot_width)
# model OSNR = f(Pin per 50 GHz channel)
nf_avg = pin_ch_50GHz - polyval(nf_model.nf_coef, pin_ch_50GHz) + 58
elif type_def == 'openroadm_preamp':
pin_ch = self.pin_db - lin2db(self.nch)
# model OSNR = f(Pin)
nf_avg = pin_ch - min((4 * pin_ch + 275) / 7, 33) + 58
# OpenROADM specifies OSNR vs. input power per channel for 50 GHz slot width so we
# scale it to 50 GHz based on actual slot width.
pin_ch_50GHz = self.pin_db - lin2db(self.nch) + lin2db(50e9 / self.slot_width)
# model OSNR = f(Pin per 50 GHz channel)
nf_avg = pin_ch_50GHz - min((4 * pin_ch_50GHz + 275) / 7, 33) + 58
elif type_def == 'openroadm_booster':
# model a zero-noise amp with "infinitely negative" (in dB) NF
nf_avg = float('-inf')

View File

@@ -27,6 +27,7 @@ def edfa_nf(gain_target, variety_type, equipment):
)
amp.pin_db = 0
amp.nch = 88
amp.slot_width = 50e9
return amp._calc_nf(True)