Commit before first big baudrate sweep

This commit is contained in:
Silas Labor Zizou
2024-10-24 19:41:59 +02:00
parent cfd1bdb513
commit bafc7f12b7
11 changed files with 588 additions and 318 deletions

View File

@@ -2,31 +2,31 @@
%% Parameter to simulate and save
params = struct;
params.M = [4];
params.datarate = [448];
params.rop = [0];
params.M = [6];
params.datarate = [250];
params.rop = [-10];
params.sir = 40;%15:1:40;
params.random_key_laser_phase = 10:20;
params.random_key_laser_phase = 1;
precomp_mode = 0; %0=do nothing ; 1= measure; 2=precomp active
postfilter = 0; % noise whiten. approach -> Postfilter + MLSE
precomp_mode = 1; %0=do nothing ; 1= measure; 2=precomp active
postfilter = 1; % noise whiten. approach -> Postfilter + MLSE
db_precode = 1;
db_precode = 0;
db_encode = 0;
db_channelapproach = 1;
db_channelapproach = 0;
laser_linewidth = 50e5;
laser_linewidth = 0e5;
random_key_sequence = 15;
random_key_laser_phase = 66;
sir = 20;
sir = 60;
if ismac
precomp_path = "/Users/silasoettinghaus/Documents/MATLAB/imdd_simulation/projects/standard_system";
else
precomp_path = "C:\Users\Silas\Documents\MATLAB\imdd_simulation\projects\standard_system\";
precomp_path = "C:\Users\sioe\Documents\MATLAB\imdd_simulation\projects\standard_system\";
end
precomp_fn = "400G_simulative_setup";
precomp_fn = "400G_simulative_setup_meas";
usemrds = 0;
@@ -78,9 +78,9 @@ for M = wh.parameter.M.values
% Digi_sig.normalize("mode","rms").spectrum("displayname",'Tx Signal','fignum',10);
if precomp_mode == 1 %measure
freqresp = ChannelFreqResp("Nacq",1024,"Navg",64,"Ncp",63,'f_ref',Digi_sig.fs);
Digi_sig = freqresp.buildOFDM();
Digi_sig_I = freqresp.buildOFDM();
precomp_est = ChannelFreqResp("Nacq",1024,"Navg",64,"Ncp",63,'f_ref',Digi_sig.fs);
Digi_sig = precomp_est.buildOFDM();
Digi_sig_I = precomp_est.buildOFDM();
elseif precomp_mode == 2 %apply
Digi_sig = ChannelFreqResp("Nacq",1024,"Navg",64,"Ncp",63,'f_ref',Digi_sig.fs).precomp(Digi_sig,'maxampdb',3,'loadPath',precomp_path,'fileName',precomp_fn);
Digi_sig_I = ChannelFreqResp("Nacq",1024,"Navg",64,"Ncp",63,'f_ref',Digi_sig_I.fs).precomp(Digi_sig_I,'maxampdb',3,'loadPath',precomp_path,'fileName',precomp_fn);
@@ -117,7 +117,7 @@ for M = wh.parameter.M.values
% MAIN SIGNAL
%%%%% MODULATE E/O CONVERSION %%%%%%
vbias_rel = 0.5;
vbias_rel = 0.7;
u_pi = 2.9;
vbias = -vbias_rel*u_pi;
@@ -180,10 +180,12 @@ for M = wh.parameter.M.values
"adcresolution",10,"quantbuffer",0.1,'block_dc',1,'lpf_active',1,'H_lpf',Lp_scpe).process(Rx_sig);
if precomp_mode == 1
freqresp.estimate(Scpe_sig,"save",true,"savePath",precomp_path,"fileName",precomp_fn);
freqresp.plot();
precomp_est.estimate(Scpe_sig,"save",true,"savePath",precomp_path,"fileName",precomp_fn);
precomp_est.plot();
end
% Scpe_sig_normalized = Scpe_sig.normalize("mode","rms");
% Scpe_sig.normalize("mode","rms").spectrum("displayname",'After Scope','fignum',10);
@@ -193,6 +195,8 @@ for M = wh.parameter.M.values
%%%%%% Sync Rx signal with reference %%%%%%
[Scpe_sig,S] = Scpe_sig.tsynch("reference",Symbols,"fs_ref",fsym);
Scpe_sig.eye(fsym,M,"fignum",50,"displayname",'Simulated after Scope');
%%%%% EQUALIZE %%%%%%
Eq = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"mu_dd",1e-4,"mu_tr",0,"order",25,"sps",2,"decide",0);
@@ -237,8 +241,34 @@ for M = wh.parameter.M.values
% Noi_.normalize('mode','rms').spectrum('displayname','Noise PSD','fignum',1234,'normalizeTo0dB',1,'normalizeToNyquist',1,'color',cols(nc+1,:));
Rx_bits = PAMmapper(M,0).demap(EQ_sig);
[~,~,ber_vnle(i,j),~] = calc_ber(Rx_bits.signal,Bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
[~,~,ber_ffe(i,j),~] = calc_ber(Rx_bits.signal,Bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
if 1
figure(55);
clf
title(sprintf('PAM %d ; BER: %1.2e',M, ber_ffe(i,j)));
constellation = unique(Symbols.signal);
received = NaN(numel(constellation),length(Symbols));
for lvl = 1:numel(constellation)
%Separate the equalized signal into the
%respective levels based on the actually
%transmitted level!
received(lvl,Symbols.signal==constellation(lvl)) = EQ_sig.signal(Symbols.signal==constellation(lvl));
intermediate = received(lvl,:);
cnt(lvl) = numel(intermediate(~isnan(intermediate)));
hold on
histogram(received(lvl,:),1000,"EdgeAlpha",0,'DisplayName',['Lvl ',num2str(lvl),' | ',num2str(cnt(lvl)),' entries']);
end
legend
end
cols = linspecer(8);
EQ_sig.normalize('mode','rms').spectrum('displayname','EQ Out','fignum',1234,'normalizeTo0dB',1,'normalizeToNyquist',1,'color',cols(nc,:));
Noi.normalize('mode','rms').spectrum('displayname','Noise PSD optimal','fignum',1234,'normalizeTo0dB',1,'normalizeToNyquist',1,'color',cols(nc+1,:));
@@ -256,7 +286,7 @@ for M = wh.parameter.M.values
% EQ_sig.spectrum("displayname","Signal Spectrum after MLSE","fignum",1234);
if 1
cols = linspecer(12);