124 lines
3.6 KiB
Matlab
124 lines
3.6 KiB
Matlab
|
|
M=4;
|
|
|
|
fdac = 256e9;%fsym;
|
|
fadc = 256e9;
|
|
fsym = [96:16:256].*1e9;
|
|
|
|
%fsym = 160e9;
|
|
% 1) PRBS Generation
|
|
O = 18; %order of prbs
|
|
N = 2^(O-1); %length of prbs
|
|
[~,seed] = prbs(O,1); %initialize first seed of prbs
|
|
bitpattern=[];
|
|
|
|
for i = 1:log2(M)
|
|
[bitpattern(:,i),seed] = prbs(O,N,seed);
|
|
end
|
|
|
|
if M == 6
|
|
bitpattern = reshape(bitpattern,[],1);
|
|
bitpattern = bitpattern(1:end-mod(length(bitpattern),5));
|
|
end
|
|
|
|
% 2 ) Build Inf. signal class
|
|
bits = Informationsignal(bitpattern);
|
|
|
|
% 3) Digi modulation -> PAM-M signal
|
|
digimod_out = PAMmapper(M,0).map(bits);
|
|
|
|
% 5) AWG (lowpass, quantization, sample and hold)
|
|
kover = 8;
|
|
LP_awg = Filter('filtdegree',4,"f_cutoff",75e9,"fs",fdac*kover,"filterType",filtertypes.butterworth);
|
|
|
|
powerlist = [];
|
|
for i = length(fsym):-1:1
|
|
digimod_out.fs = fsym(i);
|
|
|
|
X = Pulseformer("fsym",fsym(i),"fdac",fdac,"pulse","rrc","pulselength",16,"rrcalpha",0.1).process(digimod_out);
|
|
%X = digimod_out;
|
|
|
|
X = AWG("fdac",fdac,"dac_min",-1,"dac_max",1,"lpf_active",1,"H_lpf",LP_awg,"kover",kover,"bit_resolution",5.5,"normalize2dac",1,"upsampling_method","samplehold").process(X);
|
|
|
|
|
|
% 6) Lowpass behavior before laser
|
|
X = LP_modulator.process(X);
|
|
|
|
% 7) Normalize signal
|
|
X = X.normalize("mode","oneone");
|
|
|
|
% 1) Laser; Modulation -> OPTICAL DOMAIN
|
|
u_pi = 2;
|
|
vbias = -vb(m);
|
|
extmodlaser = EML("mode",eml_mode.im_cosinus,"power",3,"fsimu",X.fs,"lambda",1290,"bias",vbias,"u_pi",u_pi,"linewidth",laser_linewidth(l),"randomkey",pn_key(pnk));
|
|
E = X.*vp(n);
|
|
|
|
[Opt,extmodlaser] = extmodlaser.process(E);
|
|
|
|
figure(m)
|
|
hold on
|
|
scatter(E.signal(1:100000),(abs(Opt.signal(1:100000)).^2)*1e3,0.1,'.','DisplayName','Modulator TF')
|
|
xlabel('Input in V')
|
|
ylabel('abs(Output) in mW')
|
|
|
|
% ER = 10*log10(max(abs(Opt.signal).^2)/min(abs(Opt.signal).^2));
|
|
|
|
Opt = LP_opt.process(Opt);
|
|
|
|
cspr(s,l,pnk,n,m) = Opt.cspr;
|
|
mod_out_pow(s,l,pnk,n,m) = Opt.power;
|
|
|
|
% 2) ping pong fiber propagation
|
|
Interference_sig = Fiber("fsimu",Opt.fs,"fiber_length",mpi_path*2/1000,"alpha",0,"D",0,"lambda0",1310,"gamma",0).process(Opt);
|
|
|
|
Interference_sig = Amplifier("amp_mode","ideal_no_noise","gain_mode","gain","amplification_db",-sir(s)).process(Interference_sig);
|
|
|
|
% In the meantime: delay the main signal
|
|
[Main_sig,dly] = Opt.delay("delay_meter",mpi_path*2);
|
|
|
|
% Add
|
|
Combined_sig = Main_sig + Interference_sig;
|
|
|
|
% Cut (due to the delays there is a jump in the signals)
|
|
if dly == 0;dly = 1;end
|
|
Combined_sig.signal = Combined_sig.signal(ceil(dly):end);
|
|
|
|
% Fiber
|
|
Combined_sig = Fiber("fsimu",Combined_sig.fs,"fiber_length",2,"alpha",0.3,"D",0,"lambda0",1310,"gamma",0,"Dslope",0.08).process(Combined_sig);
|
|
|
|
|
|
|
|
|
|
powerlist(i)=X.power;
|
|
|
|
% Sample to 2x fsym
|
|
X = X.resample("fs_in",kover*fdac,"fs_out",2*fsym(i));
|
|
|
|
% Sync Rx signal with reference
|
|
[X,D,cuts] = X.tsynch("reference",digimod_out,"fs_ref",fsym(i));
|
|
|
|
[EQ_sig,EQ_sym] = EQ_silas("Ne",[50,0,0],"Nb",[2,0,0],"trainlength",4096,...
|
|
"sps",2,...
|
|
"mu_dc_dd",0.00,...
|
|
"mu_dc_train",0.0,...
|
|
"mu_ffe_train",0.00,...
|
|
"mu_dfe_train",0.005,...
|
|
"mu_ffe_dd",[0.0004 0.0006 0.0003],...
|
|
"mu_dfe_dd",0.005,...
|
|
"ddloops",3,...
|
|
"trainloops",3,...
|
|
"eq_parallelization_blocklength",1, ...
|
|
"eq_updatelatency",1,...
|
|
"eq_avg_blocklength",0).process(X,digimod_out);
|
|
|
|
% Demap
|
|
Rx_Bits = PAMmapper(M,0).demap(EQ_sig);
|
|
|
|
% BER
|
|
[~,errors_bm,BER(i),errors] = calc_ber(Rx_Bits.signal,bitpattern,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
|
|
end
|
|
|
|
|
|
figure()
|
|
stem(fsym.*1e-9,powerlist);
|
|
xticks(fsym.*1e-9) |