コード例 #1
0
 def test_pmd(self, method1, method2):
     theta = np.pi / 5
     dgd = 120e-12
     fb = 40.e9
     os = 2
     fs = os * fb
     N = 2**16
     snr = 15
     beta = 0.9
     mu1 = 4e-4
     mu2 = 4e-4
     M = 32
     ntaps = 21
     s = signals.SignalQAMGrayCoded(M, N, nmodes=2, fb=fb)
     s = s.resample(fs, beta=beta, renormalise=True)
     s = impairments.apply_PMD(s, theta, dgd)
     sout, wxy, err = equalisation.dual_mode_equalisation(
         s, (mu1, mu2),
         Ntaps=ntaps,
         methods=(method1, method2),
         adaptive_stepsize=(True, True))
     sout = helpers.normalise_and_center(sout)
     ser = sout.cal_ser()
     if ser.mean() > 0.4:
         ser = sout[::-1].cal_ser()
     npt.assert_allclose(ser, 0,
                         atol=1.01 * 2 / N)  # can tolerate 1-2 errors
コード例 #2
0
 def test_dual_mode_64qam(self):
     sig = signals.SignalQAMGrayCoded(64, 10**5, nmodes=2)
     sig = impairments.change_snr(sig, 30)
     sig = sig.resample(sig.fb*2, beta=0.1)
     E, wx, e = equalisation.dual_mode_equalisation(sig, (1e-3, 1e-3), 19, adaptive_stepsize=(True, True))
     ser = np.mean(E.cal_ser())
     assert ser < 1e-5
コード例 #3
0
 def test_pmd_phase(self, method1, method2, lw):
     theta = np.pi / 4.5
     dgd = 100e-12
     fb = 40.e9
     os = 2
     fs = os * fb
     N = 2**16
     snr = 15
     beta = 0.9
     mu1 = 2e-3
     if method2 == "mddma":
         mu2 = 1.0e-3
     else:
         mu2 = 2e-3
     M = 32
     ntaps = 21
     s = signals.SignalQAMGrayCoded(M, N, nmodes=2, fb=fb)
     s = s.resample(fs, beta=beta, renormalise=True)
     s = impairments.apply_phase_noise(s, lw)
     s = impairments.apply_PMD(s, theta, dgd)
     sout, wxy, err = equalisation.dual_mode_equalisation(
         s, (mu1, mu2),
         Ntaps=ntaps,
         methods=(method1, method2),
         adaptive_stepsize=(True, True))
     sout, ph = phaserec.bps(sout, M, 21)
     sout = helpers.normalise_and_center(sout)
     sout = helpers.dump_edges(sout, 50)
     ser = sout.cal_ser()
     if ser.mean() > 0.4:
         ser = sout[::-1].cal_ser()
     npt.assert_allclose(ser, 0,
                         atol=1.01 * 3 / N)  # Three wrong symbols is ok
コード例 #4
0
 def test_pol_rot(self, method1, method2, phi):
     phi = np.pi / phi
     fb = 40.e9
     os = 2
     fs = os * fb
     N = 2**16
     beta = 0.9
     mu1 = 0.1e-2
     mu2 = 0.1e-2
     M = 32
     s = signals.SignalQAMGrayCoded(M, N, nmodes=2, fb=fb)
     s = s.resample(fs, beta=beta, renormalise=True)
     s = impairments.rotate_field(s, phi)
     sout, wxy, err = equalisation.dual_mode_equalisation(
         s, (mu1, mu2),
         Ntaps=5,
         Niter=(3, 3),
         methods=(method1, method2),
         adaptive_stepsize=(True, True))
     sout = helpers.normalise_and_center(sout)
     ser = sout.cal_ser()
     #plt.plot(sout[0].real, sout[0].imag, 'r.')
     #plt.plot(sout[1].real, sout[1].imag, 'b.')
     #plt.show()
     if ser.mean() > 0.5:
         ser = sout[::-1].cal_ser()
     npt.assert_allclose(ser, 0)
コード例 #5
0
 def test_nd_dualmode(self, N):
     import numpy as np
     from qampy import impairments
     s = signals.ResampledQAM(16, 2**16, fb=20e9, fs=40e9, nmodes=N)
     s2 = impairments.change_snr(s, 25)
     E, wx, err = equalisation.dual_mode_equalisation(
         s2, (1e-3, 1e-3), 11, apply=True, adaptive_stepsize=(True, True))
     assert np.mean(E.cal_ber() < 1e-3)
コード例 #6
0
 def test_eq_applykw_dual(self):
     s2 = impairments.simulate_transmission(self.s,
                                            self.s.fb,
                                            self.s.fs,
                                            snr=20,
                                            dgd=100e-12)
     s3, wx, err = equalisation.dual_mode_equalisation(s2, (1e-3, 1e-3),
                                                       11,
                                                       apply=True)
     assert type(s3) is type(self.s)
コード例 #7
0
sig = signals.ResampledQAM(M,
                           N,
                           nmodes=2,
                           fb=fb,
                           fs=fs,
                           resamplekwargs={
                               "beta": 0.01,
                               "renormalise": True
                           })
sig = impairments.change_snr(sig, snr)

SS = impairments.apply_PMD(sig, theta, t_pmd)

E_m, wxy_m, (err_m, err_rde_m) = equalisation.dual_mode_equalisation(
    SS.astype(np.complex64), (muCMA, muRDE),
    ntaps,
    TrSyms=(Ncma, Nrde),
    methods=("mcma", "sbd"),
    adaptive_stepsize=(True, True))
E_s, wxy_s, (err_s, err_rde_s) = equalisation.dual_mode_equalisation(
    SS, (muCMA, muRDE),
    ntaps,
    TrSyms=(Ncma, Nrde),
    methods=("mcma", "sbd"),
    adaptive_stepsize=(True, True))
E, wxy, (err, err_rde) = equalisation.dual_mode_equalisation(
    SS, (muCMA, muRDE),
    ntaps,
    TrSyms=(Ncma, Nrde),
    methods=("mcma", "mddma"),
    adaptive_stepsize=(True, True))
コード例 #8
0
ファイル: 64qam_data_test.py プロジェクト: yaohuic/QAMpy
    "data/20GBaud_SRRC0P05_64QAM_PRBS15.mat",
    64, (("X_Symbs", ), ),
    fb=20e9,
    normalise=True,
    fake_polmux=True)
sig = io.create_signal_from_matlab(
    symbs, "data/OSNRLoading_IdealRxLaser_1544p91_Att_1_OSNR_38_1.mat", 50e9,
    (("CH1", "CH2"), ("CH3", "CH4")))
sig = sig[:, :10**6]
sig = helpers.normalise_and_center(sig)
sig = sig.resample(2 * symbs.fb, beta=0.05, renormalise=True)
#sig = analog_frontend.comp_IQ_inbalance(sig)

E, wxy, err_both = equalisation.dual_mode_equalisation(
    sig, (muCMA, muRDE),
    ntaps,
    Niter=(niter, niter),
    methods=("mcma", "sbd"),
    adaptive_stepsize=(True, True))
#E, wxy, err = equalisation.equalise_signal(sig, muCMA, Ntaps=33, apply=True)

E = helpers.normalise_and_center(E)
gmi = E.cal_gmi()
print(gmi)
#sys.exit()
plt.figure()
plt.subplot(211)
plt.hexbin(E[0].real, E[0].imag)
plt.subplot(212)
plt.hexbin(E[1].real, E[1].imag)
plt.show()
コード例 #9
0
ファイル: 32_qam_equalisation.py プロジェクト: yaohuic/QAMpy
ntaps = 11
t_pmd = 20.e-12
#Ncma = N//4//os -int(1.5*ntaps)
Ncma = 10000
Nrde = N // 2 // os - int(1.5 * ntaps)

#S, symbols, bits = QAM.generate_signal(N, snr,  baudrate=fb, samplingrate=fs, PRBSorder=(15,23))
sig = signals.SignalQAMGrayCoded(M, N, fb=fb, nmodes=2)
S = sig.resample(fs, beta=0.1, renormalise=True)
S = impairments.change_snr(S, snr)

SS = impairments.apply_PMD(S, theta, t_pmd)

E, wx, (err,
        err_rde) = equalisation.dual_mode_equalisation(SS, (muCMA, muRDE),
                                                       ntaps,
                                                       methods=("mcma", "sbd"),
                                                       adaptive=(True, True))
E = helpers.normalise_and_center(E)
evm = E.cal_evm()
evm_s = S[:, ::2].cal_evm()

#sys.exit()
plt.figure()
plt.subplot(121)
plt.title('Recovered MCMA/MDDMA')
plt.plot(E[0].real, E[0].imag, 'r.', label=r"$EVM_x=%.1f\%%$" % (evm[0] * 100))
plt.plot(E[1].real, E[1].imag, 'g.', label=r"$EVM_y=%.1f\%%$" % (100 * evm[1]))
plt.legend()
plt.subplot(122)
plt.title('Original')
plt.plot(S[0, ::2].real,
コード例 #10
0
os = 2
fs = os*fb
N = 2**18
theta = np.pi/2.35
M = 16
snr = 24
muCMA = 1e-3
muRDE = 0.5e-3
ntaps = 30
t_pmd = 50e-12

sig = signals.ResampledQAM(M, N, nmodes=2, fb=fb, fs=fs, resamplekwargs={"beta":0.01, "renormalise":True})
sig = impairments.change_snr(sig, snr)
SS = impairments.apply_PMD(sig, theta, t_pmd)

E_s, wxy_s, (err_s, err_rde_s) = equalisation.dual_mode_equalisation(SS, (muCMA, muRDE), ntaps,
                                                                            methods=("mcma", "mrde"))
E_s = helpers.normalise_and_center(E_s)
evm = sig[:, ::2].cal_evm()
evmE_s = E_s.cal_evm()
gmiE = E_s.cal_gmi()
print(gmiE)


plt.figure()
plt.subplot(221)
plt.hexbin(E_s[0].real, E_s[0].imag)
plt.text(0.999, 0.9, r"$EVM_x={:.1f}\%$".format(100*evmE_s[0]), color='w', horizontalalignment="right", fontsize=14)
plt.subplot(222)
plt.title('Recovered MCMA/MRDE')
plt.hexbin(E_s[1].real, E_s[1].imag)
plt.text(0.999, 0.9, r"$EVM_y={:.1f}\%$".format(100*evmE_s[1]), color='w', horizontalalignment="right", fontsize=14)
コード例 #11
0
ファイル: 64_qam_equalisation.py プロジェクト: yaohuic/QAMpy
sig = signals.ResampledQAM(M,
                           N,
                           nmodes=2,
                           fb=fb,
                           fs=fs,
                           resamplekwargs={
                               "beta": 0.01,
                               "renormalise": True
                           })
sig = impairments.change_snr(sig, snr)

SS = impairments.apply_PMD(sig, theta, t_pmd)

E_s, wxy_s, (err_s, err_rde_s) = equalisation.dual_mode_equalisation(
    SS, (muCMA, muRDE),
    ntaps,
    TrSyms=(Ncma, Nrde),
    methods=("mcma", "sbd"),
    adaptive_stepsize=(True, True))

E_s = helpers.normalise_and_center(E_s)
evm = sig[:, ::2].cal_evm()
evmE_s = E_s.cal_evm()
gmiE = E_s.cal_gmi()
print(gmiE)

plt.figure()
plt.subplot(221)
plt.hexbin(E_s[0].real, E_s[0].imag)
plt.text(0.999,
         0.9,
         r"$EVM_x={:.1f}\%$".format(100 * evmE_s[0]),
コード例 #12
0
snr = 24
muCMA = 1e-3
muRDE = 0.5e-3
ntaps = 30
t_pmd = 50e-12
Ncma = N // 6 // os - int(1.5 * ntaps)
Nrde = 5 * N // 6 // os - int(1.5 * ntaps)

S, symbols, bits = QAM.generate_signal(N,
                                       snr,
                                       baudrate=fb,
                                       samplingrate=fs,
                                       PRBSorder=(15, 23))
SS = impairments.apply_PMD_to_field(S, theta, t_pmd, fs)

E_m, (wx_m, wy_m), (err_m, err_rde_m) = equalisation.dual_mode_equalisation(
    SS, os, M, ntaps, methods=("mcma", "mrde"), TrSyms=(Ncma, Nrde))

evmX = QAM.cal_evm(S[0, ::2])
evmY = QAM.cal_evm(S[1, ::2])
evmEx_m = QAM.cal_evm(E_m[0])
evmEy_m = QAM.cal_evm(E_m[1])
#sys.exit()
plt.figure()
plt.subplot(121)
plt.title('Recovered MCMA/MRDE')
plt.plot(E_m[0].real,
         E_m[0].imag,
         'r.',
         label=r"$EVM_x=%.1f\%%$" % (evmEx_m * 100))
plt.plot(E_m[1].real,
         E_m[1].imag,
コード例 #13
0
#X = utils.pre_filter(X, 2*3.9)
#Y = utils.pre_filter(Y, 2*3.9)
#X = utils.resample(X, 2.5, 2)
#Y = utils.resample(Y, 2.5, 2)
X = qampy.resample.rrcos_resample(X, 2.5, 2, beta=0.05, Ts=1)
Y = qampy.resample.rrcos_resample(Y, 2.5, 2, beta=0.05, Ts=1)
X = analog_frontend.comp_IQ_inbalance(X)
Y = analog_frontend.comp_IQbalance(Y)
print(X.shape)
print(Y.shape)
SS = np.vstack([X[5000:-5000],Y[5000:-5000]])

SS = SS[:,:int(2e5)]

E, wxy, err_both = equalisation.dual_mode_equalisation(SS, os, M, ntaps, Niter=(5, 5), methods=("mcma", "sbd"),
                                                       adaptive_stepsize=(True, True))

X = signal_quality.norm_to_s0(E[0, :], M)
Y = signal_quality.norm_to_s0(E[1, :], M)
E = np.vstack([X,Y])

foe = phaserecovery.find_freq_offset(E, fft_size =2 ** 10)


E = phaserecovery.comp_freq_offset(E, foe)

#Ec = E[:,2e4:-2e4]
wx, err_both = equalisation.equalise_signal(E, 1, M, Ntaps=ntaps, Niter=4, method="sbd", adaptive_stepsize=False)
Ec = equalisation.apply_filter(E, 1, wx)
E = Ec
コード例 #14
0
N = 10**6
theta = np.pi/2.35
M = 16
QAM = signals.QAMModulator(16)
snr = 24
muCMA = 3e-4
muRDE = 3e-4
ntaps = 30
trsyms = N//os//2-(ntaps+5) # use full width for training
methods = ("mcma", "sbd")

S, symbols, bits = QAM.generate_signal(N, snr,  baudrate=fb, samplingrate=fs, PRBSorder=(15,23))

t_pmd = 50e-12

SS = impairments.apply_PMD_to_field(S, theta, t_pmd, fs)

t1 = timer()
E, (wx, wy), (err, err_rde) = equalisation.dual_mode_equalisation(SS, os, M, ntaps, methods=methods, beta=4)
t2 = timer()
print("EQ time: %.1f"%(t2-t1))


evmX = QAM.cal_evm(S[0, ::2])
evmY = QAM.cal_evm(S[1, ::2])
evmEx = QAM.cal_evm(E[0])
evmEy = QAM.cal_evm(E[1])
print(evmEx)
print(evmY)
#sys.exit()