MPI Simulations and stuff

This commit is contained in:
Silas Oettinghaus
2024-08-14 09:36:51 +02:00
parent 1eeb970d8f
commit 34f9149346
61 changed files with 4295 additions and 429 deletions

View File

@@ -0,0 +1,124 @@
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)