diff --git a/Classes/00_signals/Signal.m b/Classes/00_signals/Signal.m index 1ae61d2..97ccbac 100644 --- a/Classes/00_signals/Signal.m +++ b/Classes/00_signals/Signal.m @@ -355,7 +355,7 @@ classdef Signal end if isempty(options.fft_length) - options.fft_length = 2^(nextpow2(length(obj.signal))-7); + options.fft_length = 2^(nextpow2(length(obj.signal))-9); end if options.normalizeToNyquist == 0 @@ -837,9 +837,9 @@ classdef Signal mode = 1; - histpoints = 1024; %% verticale resolution + histpoints = 2048; %% verticale resolution histpoints = floor(histpoints/2)*2+1; %% to have the eye digram centered around one point make the vertical resolution uneven - histpoints_horizontal = 512; %% horizontal resolution + histpoints_horizontal = 2048; %% horizontal resolution hist_data=zeros(histpoints,histpoints_horizontal ); %% initilize eye diagram if isa(obj,'Opticalsignal') @@ -895,16 +895,22 @@ classdef Signal hist_data(:,n)=flip(nn.'); %without flip, the eye is upside down :-( end + ax = gca; + plot_data = 20*log10(hist_data); plot_data(plot_data==-Inf) = 0; imagesc(plot_data); - - % beautify - colormap(cbrewer2("Blues",4096)); - + cm=flip(cbrewer2("RdYlBu",4096)); + % cm=flip(cbrewer2("RdBu",4096)); + cm(1,:) = [1,1,1]; + cm(1,:) = [0,0,0]; + colormap(cm); + % colormap('turbo'); + ax.Colormap(1,:) = [1,1,1]; + % ax.CLim = [0 50]; if isa(obj,'Opticalsignal') title(['Optical Eye ',options.displayname]) ylabel("Power in mW"); diff --git a/Classes/01_transmit/PAMsource.m b/Classes/01_transmit/PAMsource.m index 4a410a0..eb94a04 100644 --- a/Classes/01_transmit/PAMsource.m +++ b/Classes/01_transmit/PAMsource.m @@ -43,7 +43,7 @@ classdef PAMsource options.mrds_blocklength = 512; options.applypulseform = 1; - options.pulseformer Pulseformer; + options.pulseformer; options.fs_out ; diff --git a/Functions/EQ_structures/vnle.m b/Functions/EQ_structures/vnle.m index ba705d7..7746650 100644 --- a/Functions/EQ_structures/vnle.m +++ b/Functions/EQ_structures/vnle.m @@ -25,6 +25,10 @@ function [eq_package] = vnle(eq_,M,rx_signal,tx_symbols,tx_bits,options) end %FFE or VNLE + if length(rx_signal)/2 == length(tx_symbols)+0.5 + rx_signal.signal = rx_signal.signal(1:end-1); + elseif length(rx_signal)/2 == length(tx_symbols)-1 + end [eq_signal_sd,eq_noise] = eq_.process(rx_signal,tx_symbols); eq_signal_hd = PAMmapper(M,0).quantize(eq_signal_sd); @@ -75,8 +79,11 @@ function [eq_package] = vnle(eq_,M,rx_signal,tx_symbols,tx_bits,options) eq_package.evm_lvl = evm_lvl; eq_package.inf_rate_vnle = inf_rate; + eq_package.snr = snr(eq_signal_sd.signal,eq_noise.signal); + if options.showAnalysis + snr(eq_signal_sd.signal,eq_noise.signal); fprintf(['VNLE EVM lvl: ',repmat('%.3f ',1,numel(evm_lvl)),' \n'],evm_lvl); fprintf('VNLE BER: %.2e \n',ber); diff --git a/Functions/Theory/Neuer Ordner/duobinary_histogram.m b/Functions/Theory/Neuer Ordner/duobinary_histogram.m new file mode 100644 index 0000000..a71396b --- /dev/null +++ b/Functions/Theory/Neuer Ordner/duobinary_histogram.m @@ -0,0 +1,51 @@ + + + +figure(2) +tiledlayout(1,3) +cols = linspecer(5); +cnt = 1; +for m = [4,6,8] + + M = m; + fsym = 112e9; + fdac = 256e9; + + [Digi_sig,Symbols,Tx_bits] = PAMsource(... + "fsym",fsym,"M",M,"order",19,"useprbs",1,... + "fs_out",fdac,... + "applyclipping",0,"clipfactor",1.5,... + "applypulseform",0,"pulseformer",NaN,... + "randkey",33,... + "db_precode",1,"db_encode",0,... + "mrds_code",0,"mrds_blocklength",512).process(); + + Symbols_pre = Duobinary().precode(Symbols); + + Symbols_db = Duobinary().encode(Symbols_pre); + + if M == 4 + Symbols_db.signal = Symbols_db.signal .*sqrt(2.5); + elseif M == 6 + Symbols_db.signal = Symbols_db.signal .*sqrt(5.8); + elseif M == 8 + Symbols_db.signal = Symbols_db.signal .*sqrt(10.5); + end + + % figure(1) + % hold on + % histogram(Symbols_db.signal,"EdgeAlpha",0.3,"Normalization","probability"); + + + % figure(1) + nexttile + hold on + bar(unique(Symbols_db.signal),histcounts(int32(Symbols_db.signal),"Normalization","probability"),"FaceColor",cols(cnt,:),"FaceAlpha",0.6,"BarWidth",1-(0.2*cnt),"LineWidth",0.5,"EdgeColor",'black','DisplayName',['Duobinary PAM-',num2str(M)]); + xticks(unique(Symbols_db.signal)); + ylim([0 0.26]); + xlabel("Symbol") + + + cnt = cnt+1, + +end \ No newline at end of file diff --git a/Functions/Theory/Neuer Ordner/duobinary_transferfunction.m b/Functions/Theory/Neuer Ordner/duobinary_transferfunction.m new file mode 100644 index 0000000..ccc7448 --- /dev/null +++ b/Functions/Theory/Neuer Ordner/duobinary_transferfunction.m @@ -0,0 +1,18 @@ + + +% Define the filter taps +h_ = {[1],[1 1],[1 2 1],[1 3 3 1]}; + +for i = 1:length(h_) + h = h_{i}; + + [H, w] = freqz(h, 1, 1024, 1); + + figure(1); + hold on + plot(w, 10*log10(abs(H)), 'LineWidth', 2,'DisplayName',['$(1+D)^2$']); %todo + xlabel('Normalized Frequency'); + ylabel('Amplitude in dB'); + grid on; + ylim([-20,10]) +end \ No newline at end of file diff --git a/projects/400G_FTN_setups/imdd_dsp_lab_copy_200G.m b/projects/400G_FTN_setups/imdd_dsp_lab_copy_200G.m index 998d9dd..15d77ac 100644 --- a/projects/400G_FTN_setups/imdd_dsp_lab_copy_200G.m +++ b/projects/400G_FTN_setups/imdd_dsp_lab_copy_200G.m @@ -4,9 +4,9 @@ params = struct; params.M = [4]; params.datarate = [184]; -params.rop = [-12:-5]; +params.rop = [-5]; -precomp_mode = 0; %0=do nothing ; 1= measure; 2=precomp active +precomp_mode = 1; %0=do nothing ; 1= measure; 2=precomp active postfilter = 0; % noise whiten. approach -> Postfilter + MLSE db_precode = 0; @@ -124,7 +124,7 @@ for M = wh.parameter.M.values Opt_sig = Fiber("fsimu",Opt_sig.fs,"fiber_length",link_length/1000,"alpha",0.3,"D",0,"lambda0",1310,"gamma",0,"Dslope",0.07).process(Opt_sig); % Receiver ROP curve - parfor i = 1:i_ + for i = 1:i_ rop=wh.parameter.rop.values(i); diff --git a/projects/IMDD_base_system/imdd_it.m b/projects/IMDD_base_system/imdd_it.m index d0f4084..01a40cd 100644 --- a/projects/IMDD_base_system/imdd_it.m +++ b/projects/IMDD_base_system/imdd_it.m @@ -3,18 +3,18 @@ % db = DBHandler("pathToDB",[basePath,'silas_labor.db']); if 1 uloops = struct; - uloops.precomp = [0,1]; - uloops.db_precode = [0,1]; + uloops.precomp = [1]; + uloops.db_precode = [0]; uloops.bitrate = [300,330,360,390,420,450,480].*1e9; %[300,330,360,390,420,450,480] % uloops.bitrate = 390e9; % uloops.laser_wavelength = [1293,1297.5,1302,1306.5,1310,1313.4,1318,1322.7,1327.4]; - uloops.laser_wavelength = [1293]; - uloops.M = [4,6,8]; + uloops.laser_wavelength = [1310]; + uloops.M = [6]; uloops.link_length = [2]; % 1,2,3,5,6,8,10 wh = DataStorage(uloops); wh.addStorage("ber"); - wh = submit_simulations(wh,"parallel",0,"simulation_mode",1); + wh = submit_simulations(wh,"parallel",0,"simulation_mode",0); end wh_ana = wh; @@ -30,7 +30,7 @@ alpha = {}; ber_dfe = {}; ngmi = []; -wavelength=1293; +wavelength=uloops.laser_wavelength; for m = [4,6,8] %1302 %VNLE @@ -40,14 +40,14 @@ for m = [4,6,8] ber_vnle = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a); %MLSE - precomp = 0; - precode = 1; + % precomp = 0; + % precode = 1; a = wh_ana.getStoValue('ber',precomp, precode, uloops.bitrate , wavelength, m, uloops.link_length); ber_mlse = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a); %DB - precomp = 0; - precode = 1; + % precomp = 0; + % precode = 1; a = wh_ana.getStoValue('ber',precomp, precode, uloops.bitrate , wavelength, m, uloops.link_length); ber_dbtgt = cellfun(@(x) x.dbtgt_package{1,1}.ber, a); diff --git a/projects/IMDD_base_system/imdd_model.m b/projects/IMDD_base_system/imdd_model.m index 49e6723..800e946 100644 --- a/projects/IMDD_base_system/imdd_model.m +++ b/projects/IMDD_base_system/imdd_model.m @@ -240,10 +240,11 @@ else % % Raw_signal = Filter('filtdegree',4,"f_cutoff",Symbols.fs.*0.55,"fs",Raw_signal.fs,"filterType",filtertypes.gaussian,"active",true).process(Raw_signal); % - % Scpe_cell{1}.eye(fsym,M,"displayname",'eye','fignum',227); + Scpe_cell{1}.eye(fsym,M,"displayname",'eye','fignum',227); % % Raw_signal.spectrum("normalizeTo0dB",0,"fignum",336,"fft_length",2^12); % Raw_signal.move_it_spectrum("fignum",334); + % Raw_signal.move_it_spectrum("fignum",334); fsym = Symbols.fs; @@ -259,7 +260,7 @@ vnle_dfe_package = {}; dbtgt_package = {}; -proc_occ = min(8,length(Scpe_cell)); +proc_occ = min(1,length(Scpe_cell)); for occ = 1:proc_occ Scpe_sig = Scpe_cell{occ}; @@ -284,12 +285,12 @@ for occ = 1:proc_occ mu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3]; % %%%%% VNLE + DFE %%%% - if 0 + if 1 eq_vnle_dfe = EQ("Ne",vnle_order,"Nb",[0,0,0],"training_length",len_tr,"training_loops",5,"dd_loops",5,"K",2,"DCmu",mu_dc,"DDmu",[mu_ffe mu_dfe],"DFEmu",0.005,"FFEmu",0,"plotfinal",1,"ideal_dfe",0); - [result] = vnle(eq_vnle_dfe,M,Scpe_sig,Symbols,Tx_bits,"precode_mode",doub_mode,"showAnalysis",0); + [result] = vnle(eq_vnle_dfe,M,Scpe_sig,Symbols,Tx_bits,"precode_mode",doub_mode,"showAnalysis",1); vnle_dfe_package{occ} = result; - + end %%%%% VNLE + PF + MLSE %%%%