example_ber_estimation_10.py 4.37 KB
Newer Older
Arne Striegler's avatar
v1.0.0    
Arne Striegler committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
##!/usr/bin/env python2
# -*- coding: utf-8 -*-

#Import functions and libraries
import sys
sys.path.append('../')
from pypho_setup import pypho_setup
from pypho_bits import pypho_bits
from pypho_signalsrc import pypho_signalsrc
from pypho_lasmod import pypho_lasmod
from pypho_fiber import pypho_fiber
from pypho_fiber_birefringence import pypho_fiber_birefringence
from pypho_arbmod import pypho_arbmod
from pypho_oamp import pypho_oamp
from pypho_osnr import pypho_osnr
from pypho_sample import pypho_sample
from pypho_optfi import pypho_optfi
from pypho_cwlaser import pypho_cwlaser

from pypho_functions import *
import numpy as np
import copy
import matplotlib.pyplot as plt

from matplotlib import colors as mcolors
colors = dict(mcolors.BASE_COLORS, **mcolors.CSS4_COLORS)

plt.close('all')

# Define network elements
gp          = pypho_setup(nos = 512, sps = 128, symbolrate = 10e9)
bitsrc      = pypho_bits(glova = gp, nob = gp.nos, pattern = 'ones')
esigsrc     = pypho_signalsrc(glova = gp, pulseshape = 'gauss_rz' , fwhm = 0.25)
sig_1550    = pypho_lasmod(glova = gp, power = 0, Df = 0, teta = np.pi/4.0)
SSMF        = pypho_fiber(glova = gp, l = 80.0e3,  D = 17.0,   S = 0, alpha = 0.3, gamma = 1.14, phi_max = 0.4)
DCF         = pypho_fiber(glova = gp, l = 1.0e3,  D = -SSMF.D*SSMF.l,   S = 0, alpha = 0.2e-12, gamma = 1.0e-12, phi_max = 10.0)
amp         = pypho_oamp(glova = gp, Pmean = 3.0, NF = 5)
osnr        = pypho_osnr(glova = gp)
modulator   = pypho_arbmod(glova = gp) 
sigsampler  = pypho_sample(glova = gp) 
cw_src      = pypho_cwlaser(glova = gp, power = 3 , Df = 0,  teta = np.pi/4.0)
filter_f0   = pypho_optfi(glova = gp, Df = 0, B = 50)

# Simulation

# Create bitpattern
bits_x = np.append(bitsrc(pattern = 'random'), [bitsrc(pattern = 'random'), bitsrc(pattern = 'random'), bitsrc(pattern = 'random')])
bits_y = np.append(bitsrc(pattern = 'random'), [bitsrc(pattern = 'random'), bitsrc(pattern = 'random'), bitsrc(pattern = 'random')])

# Create pulsetrain
onebits = bitsrc(pattern = 'ones')
esig = esigsrc(bitsequence = onebits)
E_Tx = sig_1550(esig = esig)                                                      

# Define constellation points: 16-QAM
alpha = np.arctan(np.sqrt(1.0)/3.0)
constpts_x = [(           [np.sqrt(3.0**2 + 1.0)]*8 + [np.sqrt(2.0)]*4 + [np.sqrt(2*3.0**2)]*4),
             (          [2.0*np.pi*x/4.0+alpha for x in range(0,4)] + [2.0*np.pi*x/4.0+np.pi-alpha for x in range(0,4)] + [2.0*np.pi*x/4.0+np.pi/4 for x in range(0,8)] ),
             (          [colors.values()[x] for x in range(0,16)]),
             (          [x for x in range(0,16)]),
             ([(0),(0),(0),(0)], [(0),(0),(0),(1)], [(0),(0),(1),(0)], [(0),(0),(1),(1)], [(0),(1),(0),(0)], [(0),(1),(0),(1)], [(0),(1),(1),(0)], [(0),(1),(1),(1)],
              [(1),(1),(1),(1)], [(1),(1),(1),(0)], [(1),(1),(0),(1)], [(1),(1),(0),(0)], [(1),(0),(1),(1)], [(1),(0),(1),(0)], [(1),(0),(0),(1)], [(1),(0),(0),(0)]
             )]  # codes not optimized!    

constpts_y = constpts_x         # Constellation 

E   = modulator( E = E_Tx, constpoints = [constpts_x, constpts_y], bits = [bits_x, bits_y])          # Modulate

P0  = 0.0 
      
E   = amp(E = E, Pmean = 0)
LO  = cw_src(power = 10.0*np.log10(1e5*np.mean( np.abs( E[0]['E'][0])**2 ) ))   # Local oscillator
E   = amp(E = E, Pmean = P0)
E   = osnr( E = E, OSNR = 15.0 )          # Set initial OSNR to bad 20 dB


Arne Striegler's avatar
Arne Striegler committed
77
for c in range(0, 0):
Arne Striegler's avatar
v1.0.0    
Arne Striegler committed
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
    print('Span: ', c)
    fibres = pypho_fiber_birefringence.create_pmd_fibre(SSMF.l, 1e3, 0.00)
    E = SSMF(E = E, birefarray = fibres)         
    E = DCF(E = E, l = 1.0)  
    E = amp(E = E, Pmean = P0)
    print('OSNR = ', osnr( E = E))


############################
# Calculate decision matrix
############################

E = amp(E = E, Pmean = 0)

#Ein = copy.deepcopy(E)
plt.figure(1)
# Get decision matrix
Dec_x, Esx_re_ax, Esx_im_ax, Dec_y, Esy_re_ax, Esy_im_ax = get_decision_matrix(gp, E, [constpts_x, constpts_y], [bits_x, bits_y], LO, filter_f0, sigsampler)

# Plot decision matrix
plt.figure(1)
plt.subplot(2, 1, 1); h = plt.contourf(Esx_re_ax, Esx_im_ax, Dec_x, 32, cmap=plt.cm.bone  )  
plt.subplot(2, 1, 2); h = plt.contourf(Esy_re_ax, Esy_im_ax, Dec_y, 32, cmap=plt.cm.bone ) 
 
############################
# Calculate BER
############################

Arne Striegler's avatar
Arne Striegler committed
106
BER = calc_BER (gp, E, [constpts_x, constpts_y], osnr( E = E), Dec_x, Dec_y, Esx_re_ax, Esx_im_ax, Esy_re_ax, Esy_im_ax, 10, LO, filter_f0, sigsampler,[bits_x, bits_y])
Arne Striegler's avatar
v1.0.0    
Arne Striegler committed
107
print(BER)