% IMDD simulation entrypoint % % Processing stages: % -> imdd_it % -> submit_handle % -> imdd_model % -> PAMsource / AWG / EML / Fiber / Photodiode / Filter / Scope % -> dsp_scope_signal % -> preprocessSignal % -> FFE / DFE / VNLE+MLSE / DB target DSP branches % -> result packages stored in DataStorage % close all; if 1 uloops = struct; uloops.precomp = [0]; uloops.fsym = [152:8:212].*1e9; % uloops.bitrate = 380e9; % uloops.laser_wavelength = [1293,1297.5,1302,1306.5,1310,1313.4,1318,1322.7,1327.4]; uloops.laser_wavelength = [1310]; uloops.M = [4]; uloops.link_length = 2; % uloops.link_length = [0:2:10]; % 1,2,3,5,6,8,10 uloops.channel_alpha = [0.5]; uloops.duob_mode = db_mode.db_precoded; uloops.decoding_mode = db_decoder.sequencedetection; uloops.channel_mode = channel_model.physical; uloops.channel_snr_dB = [20]; uloops.rop = 0; wh = DataStorage(uloops); wh.addStorage("ber"); wh = submit_handle(@imdd_model,wh,"parallel",0); end %% wh = load("C:\Users\Silas\Documents\MATLAB\Datensätze\Diss_400G\highspeed_loop.mat"); wh = wh.wh; M = 6; rate = 212e9; precomp = wh.parameter.precomp.values(1); wavelength = wh.parameter.laser_wavelength.values(1); link_length = wh.parameter.link_length.values(1); alpha = wh.parameter.channel_alpha.values(1); duob_mode = wh.parameter.duob_mode.values(1); decoding_mode = wh.parameter.decoding_mode.values(1); channel_mode = wh.parameter.channel_mode.values(1); snr_dB = wh.parameter.channel_snr_dB.values(1); rop = wh.parameter.rop.values; fsym = wh.parameter.fsym.values; %% get all ROP values for M = 4 and rate = 92e9: a = wh.getStoValue('ber',precomp, rate, wavelength, M, link_length,alpha,duob_mode,decoding_mode,channel_mode,snr_dB,rop); ber_ffe = getResultBER(a, "ffe_results"); ber_dfe = getResultBER(a, "dfe_results"); ber_vnle = getResultBER(a, "vnle_results"); ber_mlse = getResultBER(a, "mlse_results"); ber_dbt = getResultBER(a, "dbt_results"); figure(44) clf hold on plot(rop,ber_ffe,"LineWidth",0.5,"LineStyle","-","Marker",".","MarkerSize",15,"DisplayName","FFE"); plot(rop,ber_dfe,"LineWidth",0.5,"LineStyle","-","Marker",".","MarkerSize",15,"DisplayName","DFE"); plot(rop,ber_vnle,"LineWidth",0.5,"LineStyle","-","Marker",".","MarkerSize",15,"DisplayName","VNLE"); plot(rop,ber_mlse,"LineWidth",0.5,"LineStyle","-","Marker",".","MarkerSize",15,"DisplayName","MLSE"); plot(rop,ber_dbt,"LineWidth",0.5,"LineStyle","-","Marker",".","MarkerSize",15,"DisplayName","DB target"); yline(3.8e-3,'DisplayName','HD-FEC','LineStyle','--','HandleVisibility','off'); xlabel('Received Optical Power (dBm)'); ylabel('Bit Error Rate (BER)'); title(sprintf('BER vs. ROP | PAM %d | %.0f GBd',M,rate.*1e-9)); set(gca,'yscale','log'); set(gca,'Box','on'); grid on; grid minor legend('Interpreter','none'); beautifyBERplot() %% get all baudrate values for M = 4 and fixed ROP: rop_ = -6; a = wh.getStoValue('ber',precomp, fsym, wavelength, M, link_length,alpha,duob_mode,decoding_mode,channel_mode,snr_dB,rop_); ber_ffe = getResultBER(a, "ffe_results"); ber_dfe = getResultBER(a, "dfe_results"); ber_vnle = getResultBER(a, "vnle_results"); ber_mlse = getResultBER(a, "mlse_results"); ber_dbt = getResultBER(a, "dbt_results"); figure(45) clf hold on plot(fsym.*1e-9,ber_ffe,"LineWidth",0.5,"LineStyle","-","Marker",".","MarkerSize",15,"DisplayName","FFE"); plot(fsym.*1e-9,ber_dfe,"LineWidth",0.5,"LineStyle","-","Marker",".","MarkerSize",15,"DisplayName","DFE"); plot(fsym.*1e-9,ber_vnle,"LineWidth",0.5,"LineStyle","-","Marker",".","MarkerSize",15,"DisplayName","VNLE"); plot(fsym.*1e-9,ber_mlse,"LineWidth",0.5,"LineStyle","-","Marker",".","MarkerSize",15,"DisplayName","MLSE"); plot(fsym.*1e-9,ber_dbt,"LineWidth",0.5,"LineStyle","-","Marker",".","MarkerSize",15,"DisplayName","DB target"); yline(3.8e-3,'DisplayName','HD-FEC','LineStyle','--','HandleVisibility','off'); xlabel('Baudrate (GBd)'); ylabel('Bit Error Rate (BER)'); title(sprintf('BER vs. Baudrate | PAM %d | ROP %g dBm',M,rop_)); set(gca,'yscale','log'); set(gca,'Box','on'); grid on; grid minor legend('Interpreter','none'); beautifyBERplot() % figure % hold on % if isfield(uloops, 'fsym') && isfield(uloops, 'bitrate') % error('Define only one of uloops.fsym or uloops.bitrate.'); % elseif isfield(uloops, 'fsym') % rateLookup = uloops.fsym; % elseif isfield(uloops, 'bitrate') % rateLookup = uloops.bitrate; % else % error('Define either uloops.fsym or uloops.bitrate.'); % end % for alpha = uloops.channel_alpha % a=wh.getStoValue('ber',0, rateLookup, uloops.laser_wavelength, uloops.M, uloops.link_length,alpha,uloops.duob_mode,uloops.decoding_mode,uloops.channel_mode,uloops.channel_snr_dB); % gmi_ffe = cellfun(@(x) x.ffe_results.metrics.GMI, a); % alpha_ffe = cellfun(@(x) x.ffe_results.metrics.Alpha, a); % gmi_mlse = cellfun(@(x) x.mlse_results.metrics.GMI, a); % plot(uloops.channel_snr_dB,gmi_ffe,'DisplayName',sprintf(''),'LineStyle','-','HandleVisibility','on'); % plot(uloops.channel_snr_dB,gmi_mlse,'DisplayName',sprintf(''),'LineStyle','-','HandleVisibility','on'); % end % set(gca, 'YScale', 'log'); % % ylim([5e-5 0.5]); % % yline([3.8e-3, 2e-2],'HandleVisibility','off'); % legend % beautifyBERplot() % ylabel('BER'); % % wh_ana = wh_master; % % cols = cbrewer2('Paired',8); % % figure() % % for precomp = [0,1] % wavelength=uloops.laser_wavelength; % for m = [6] % % baudrate = wh_ana.parameter.bitrate.values; % % % %VNLE % precode = 1; % a = wh_ana.getStoValue('ber',precomp, precode, baudrate , wavelength, m, uloops.link_length); % ber_vnle_pc = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a); % %MLSE % ber_mlse_pc = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a); % %DB % ber_dbtgt_pc = cellfun(@(x) x.dbtgt_package{1,1}.ber, a); % % precode = 0; % a = wh_ana.getStoValue('ber',precomp, precode, baudrate , wavelength, m, uloops.link_length); % ber_vnle = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a); % %MLSE % ber_mlse = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a); % %DB % ber_dbtgt = cellfun(@(x) x.dbtgt_package{1,1}.ber, a); % % if precomp % legndname1 = ['Pre-Emphasis']; % else % legndname1 = ['No Pre-Emphasis']; % end % % % baudrate = floor( uloops.bitrate.*1e-9 ./log2(m) ) .* 2.5 .* 1e9; % % subplot(1,3,1) % hold on % title(sprintf('%d km | %d nm | PAM %d',uloops.link_length,wavelength,m)); % title(sprintf('PAM %d',m)); % plot(baudrate.*1e-9,ber_vnle,'DisplayName',['Pre-Emphasis: ', num2str(precomp), '| Diff.-Code: 0'],'Color',cols(1+precomp,:),'LineStyle','-','HandleVisibility','on'); % plot(baudrate.*1e-9,ber_vnle_pc,'DisplayName',['Pre-Emphasis: ', num2str(precomp), '| Diff.-Code: 1'],'Color',cols(1+precomp,:),'LineStyle','-.','HandleVisibility','on'); % xticks(baudrate.*1e-9); % set(gca, 'YScale', 'log'); % ylim([5e-5 0.4]); % xlim([min(baudrate(2).*1e-9), max(baudrate.*1e-9) ]); % yline([3.8e-3, 2e-2],'HandleVisibility','off'); % legend % beautifyBERplot() % xlabel('Bit Rate in Gbps'); % ylabel('BER'); % % % % subplot(1,3,2) % hold on % % title(sprintf('%d km | %d nm | PAM %d',uloops.link_length,wavelength,m)); % title(sprintf('PAM %d',m)); % plot(baudrate.*1e-9,ber_dbtgt,'DisplayName',['Pre-Emphasis: ', num2str(precomp), '| Diff.-Code: 0'],'Color',cols(5+precomp,:),'LineStyle','-','HandleVisibility','on'); % plot(baudrate.*1e-9,ber_dbtgt_pc,'DisplayName',['Pre-Emphasis: ', num2str(precomp), '| Diff.-Code: 1'],'Color',cols(5+precomp,:),'LineStyle','-.','HandleVisibility','on'); % xticks(baudrate.*1e-9); % set(gca, 'YScale', 'log'); % ylim([5e-5 0.4]); % xlim([min(baudrate(2).*1e-9), max(baudrate.*1e-9) ]); % yline([3.8e-3, 2e-2],'HandleVisibility','off'); % legend % beautifyBERplot() % xlabel('Bit Rate in Gbps'); % ylabel('BER'); % % % subplot(1,3,3) % hold on % % title(sprintf('%d km | %d nm | PAM %d',uloops.link_length,wavelength,m)); % title(sprintf('PAM %d',m)); % plot(baudrate.*1e-9,ber_mlse,'DisplayName',['Pre-Emphasis: ', num2str(precomp), '| Diff.-Code: 0'],'Color',cols(3+precomp,:),'LineStyle','-','HandleVisibility','on'); % plot(baudrate.*1e-9,ber_mlse_pc,'DisplayName',['Pre-Emphasis: ', num2str(precomp), '| Diff.-Code: 1'],'Color',cols(3+precomp,:),'LineStyle','-.','HandleVisibility','on'); % xticks(baudrate.*1e-9); % set(gca, 'YScale', 'log'); % ylim([5e-5 0.4]); % xlim([min(baudrate(2).*1e-9), max(baudrate.*1e-9) ]); % yline([3.8e-3, 2e-2],'HandleVisibility','off'); % legend % beautifyBERplot() % xlabel('Bit Rate in Gbps'); % ylabel('BER'); % end % end % % % % % cols = linspecer(7);%cbrewer2('Set2',10); % % % for w = uloops.laser_wavelength % % figure(w) % figcnt = 0; % % for precode = uloops.db_precode % % for precomp = uloops.precomp % % for m = uloops.M % % a = wh_ana.getStoValue('ber',precomp, precode, uloops.bitrate , w, m, uloops.link_length); % ber_dbtgt = cellfun(@(x) x.dbtgt_package{1,1}.ber, a); % % ber_vnle = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a); % % ber_mlse = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a); % % figcnt = figcnt+1; % subplot(4,3,figcnt); % hold on % title(sprintf('precomp = %d | precode = %d | %d km | %d nm | PAM %d',precomp,precode,uloops.link_length,w,m)); % % plot(uloops.bitrate,ber_dbtgt,'DisplayName',sprintf('DB tgt. + MLSE',uloops.link_length,uloops.M),'Color',cols(1,:),'LineStyle','-','HandleVisibility','on'); % % plot(uloops.bitrate,ber_vnle,'DisplayName',sprintf('VNLE'),'Color',cols(3,:),'LineStyle','-','HandleVisibility','on'); % % plot(uloops.bitrate,ber_mlse,'DisplayName',sprintf('VNLE + 1 tap post-filter + MLSE',uloops.link_length,uloops.M),'Color',cols(4,:),'LineStyle','-','HandleVisibility','on'); % % % plot(uloops.bitrate,cellfun(@min, ber_dfe),'DisplayName',sprintf('VNLE + DFE',uloops.link_length,uloops.M),'Color',cols(2,:),'LineStyle','--'); % % % plot(uloops.bitrate,cellfun(@min, ber_dbenc),'DisplayName',sprintf('DB Encoded',uloops.link_length,uloops.M),'Color',cols(5,:),'LineStyle','-'); % % set(gca, 'YScale', 'log'); % ylim([5e-5 0.5]); % % xlim([min(uloops.bitrate.*1e-9), max(uloops.bitrate.*1e-9) ]); % yline([3.8e-3, 2e-2],'HandleVisibility','off'); % legend % beautifyBERplot() % xlabel('Bit Rate in Gbps'); % ylabel('Channel Wavelength (nm)'); % % end % end % end % end % % m = 6; % ir = [2,2.5,3]; % cols = linspecer(6); % baudrate_gather = []; % for i = 1:3 % m = uloops.M(i); % % %%% GET VNLE VALS % precode = 0; % precomp = 1; % a = wh_master.getStoValue('ber',precomp, precode, uloops.bitrate , uloops.laser_wavelength, m, uloops.link_length); % ber_vnle(i,:) = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a); % % %%% GET DB VALS % precode = 1; % precomp = 0; % a = wh_master.getStoValue('ber',precomp, precode, uloops.bitrate , uloops.laser_wavelength, m, uloops.link_length); % ber_db(i,:) = cellfun(@(x) x.dbtgt_package{1,1}.ber, a); % % %%% GET MLSE VALS % precode = 0; % precomp = 0; % a = wh_master.getStoValue('ber',precomp, precode, uloops.bitrate , uloops.laser_wavelength, m, uloops.link_length); % ber_mlse(i,:) = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a); % % inf_rate_pam(i,:) = cellfun(@(x) x.vnle_pf_package{1,1}.air, a); % inf_rate_pam(i,:) = inf_rate_pam(i,:)./log2(m); % % bitrate = floor( uloops.bitrate.*1e-9 ./log2(m) ) .* ir(i) .* 1e9; % baudrate = floor( uloops.bitrate.*1e-9 ./log2(m) ) .* 1e9; % baudrate_gather = union(baudrate_gather,baudrate); % baudrate_ticks = 100:20:240; % bitrate_ticks = 300:30:480; % % tp = TransmissionPerformance; % netRatesVNLE = tp.calculateNetRate(bitrate, 'NGMI', inf_rate_pam(i,:), 'BER', ber_vnle(i,:)); % % %%% NGMI % figure(12) % hold on % title(sprintf('Performance at 1310 nm')); % plot(baudrate.*1e-9,inf_rate_pam(i,:),'DisplayName',sprintf('NGMI; PAM %d',m),'Color',cols(i,:),'LineStyle','-'); % xlabel('Baud rate in GBd'); % ylabel('NGMI') % beautifyBERplot() % xticks(baudrate_ticks); % xlim([min(baudrate_ticks) max(baudrate_ticks)]); % % % %%% AIR % figure(14) % hold on % title(sprintf('Performance at 1310 nm')); % plot(baudrate.*1e-9,inf_rate_pam(i,:).*bitrate.*1e-9,'DisplayName',sprintf('AIR; PAM %d',m),'Color',cols(i,:),'LineStyle','-'); % xlabel('Baud rate in GBd'); % ylabel('AIR'); % beautifyBERplot() % xticks(baudrate_ticks); % xlim([min(baudrate_ticks) max(baudrate_ticks)]); % % %%% RATES % figure(16) % hold on % title(sprintf('Performance at 1310 nm')); % if i == 1 % hv = 'on'; % else % hv = 'off'; % end % plot(baudrate*1e-9,netRatesVNLE.SDHD.NetRate.*1e-9,'DisplayName',sprintf('SD+HD FEC',m),'Color',cols(i,:),'LineStyle','-','HandleVisibility',hv,'Marker','o'); % plot(baudrate.*1e-9,netRatesVNLE.HD.NetRate.*1e-9,'DisplayName',sprintf('HD FEC',m),'Color',cols(i,:),'LineStyle',':','HandleVisibility',hv,'Marker','diamond'); % plot(baudrate.*1e-9,netRatesVNLE.KP4_hamming.NetRate*1e-9,'DisplayName',sprintf('KP4+Hamming',m),'Color',cols(i,:),'LineStyle','-.','HandleVisibility',hv,'Marker','square'); % xticks(baudrate_ticks); % xlim([min(baudrate_ticks) max(baudrate_ticks)]); % xlabel('Baud rate in GBd'); % ylabel('Net Bitrate in Gbps') % beautifyBERplot() % ylim([250 410]) % % %%% CODE OVERHEAD IN % % figure(18) % hold on % title(sprintf('Performance at 1310 nm')); % plot(baudrate*1e-9,100.*(1-netRatesVNLE.SDHD.CodeRate)./netRatesVNLE.SDHD.CodeRate,'DisplayName',sprintf('SD+HD FEC',m),'Color',cols(i,:),'LineStyle','-','HandleVisibility',hv,'Marker','o'); % plot(baudrate.*1e-9,100.*(1-netRatesVNLE.HD.CodeRate)./netRatesVNLE.HD.CodeRate,'DisplayName',sprintf('HD FEC',m),'Color',cols(i,:),'LineStyle',':','HandleVisibility',hv,'Marker','diamond'); % plot(baudrate.*1e-9,100.*(1-netRatesVNLE.KP4_hamming.CodeRate)./netRatesVNLE.KP4_hamming.CodeRate,'DisplayName',sprintf('KP4+Hamming',m),'Color',cols(i,:),'LineStyle','-.','HandleVisibility',hv,'Marker','square'); % xticks(baudrate_ticks); % xlim([min(baudrate_ticks) max(baudrate_ticks)]); % xlabel('Baud rate in GBd'); % ylabel('FEC Overhead in %') % beautifyBERplot() % % %%% CLASSIC BER % figure(22) % subplot(1,4,i) % hold on % plot(baudrate*1e-9,ber_vnle(i,:),'DisplayName',sprintf('Tx precomp + VNLE',m),'Color',cols(i,:),'LineStyle','-','HandleVisibility','on','Marker','o'); % plot(baudrate*1e-9,ber_mlse(i,:),'DisplayName',sprintf('VNLE + PF + MLSE',m),'Color',cols(i,:),'LineStyle',':','HandleVisibility','on','Marker','square'); % plot(baudrate*1e-9,ber_db(i,:),'DisplayName',sprintf('Diff. Code + DB tgt.',m),'Color',cols(i,:),'LineStyle','--','HandleVisibility','on','Marker','diamond'); % yline(4.85e-3,'HandleVisibility','off'); % yline(2e-2,'HandleVisibility','off'); % xticks(baudrate*1e-9); % xlim([min(baudrate*1e-9) max(baudrate*1e-9)]); % ylim([1e-4 0.3]); % xlabel('Baudrate in GBd'); % if i == 1 % ylabel('BER') % end % beautifyBERplot() % set(gca, 'YScale', 'log'); % legend % subplot(1,4,4) % hold on % if m == 4 % % plot(bitrate*1e-9,ber_db(i,:),'DisplayName',sprintf('Diff. Code + DB tgt.'),'Color',cols(i,:),'LineStyle','--','HandleVisibility','on','Marker','diamond'); % % elseif m == 6 % % plot(bitrate*1e-9,ber_vnle(i,:),'DisplayName',sprintf('VNLE + PF + MLSE'),'Color',cols(i,:),'LineStyle','-','HandleVisibility','on','Marker','o'); % % plot(bitrate*1e-9,ber_mlse(i,:),'DisplayName',sprintf('MLSE',m),'Color',cols(i,:),'LineStyle',':','HandleVisibility',hv,'Marker','square'); % % elseif m ==8 % % plot(bitrate*1e-9,ber_vnle(i,:),'DisplayName',sprintf('Tx precomp + VNLE'),'Color',cols(i,:),'LineStyle','-','HandleVisibility','on','Marker','o'); % % plot(bitrate*1e-9,ber_mlse(i,:),'DisplayName',sprintf('MLSE',m),'Color',cols(i,:),'LineStyle',':','HandleVisibility',hv,'Marker','square'); % % end % yline(4.85e-3,'HandleVisibility','off'); % yline(2e-2,'HandleVisibility','off'); % xticks(bitrate_ticks); % xlim([min(bitrate_ticks) max(bitrate_ticks)]); % ylim([1e-4 0.3]); % xlabel('Gross Bitrate in Gbps'); % % ylabel('BER') % beautifyBERplot() % set(gca, 'YScale', 'log'); % % % end % % % % figure() % title(sprintf('%d km | 1310 nm | PAM %d | VNLE',uloops.link_length,uloops.M)); % hold on % line([min(uloops.bitrate.*1e-9) max(uloops.bitrate.*1e-9)],[min(uloops.bitrate.*1e-9) max(uloops.bitrate.*1e-9)],'Color',[.7,.7,.7],'Marker','none','Handlevisibility','off'); % plot(uloops.bitrate.*1e-9,cellfun(@min, inf_rate_vnle).*uloops.bitrate./log2(uloops.M).*1e-9,'DisplayName',sprintf('AIR'),'Color',cols(1,:),'LineStyle',':'); % plot(uloops.bitrate.*1e-9,netRatesVNLE.SDHD.NetRate.*1e-9,'DisplayName',sprintf('SD+HD'),'Color',cols(2,:),'LineStyle',':'); % plot(uloops.bitrate.*1e-9,netRatesVNLE.HD.NetRate.*1e-9,'DisplayName',sprintf('HD'),'Color',cols(3,:),'LineStyle',':'); % plot(uloops.bitrate.*1e-9,netRatesVNLE.KP4_hamming.NetRate.*1e-9,'DisplayName',sprintf('KP4+Hamming'),'Color',cols(4,:),'LineStyle',':'); % beautifyBERplot() % xlim([min(uloops.bitrate.*1e-9) max(uloops.bitrate.*1e-9)]) % xlabel('Gross Bitrate in Gbps'); % ylabel('Net Bitrate in Gbps'); % legend % plot(uloops.bitrate.*1e-9,ber_vnle,'DisplayName',sprintf('NGMI MLSE; %d km',len),'Color',cols(1,:),'LineStyle','-'); % plot(uloops.bitrate.*1e-9,ber_dfe,'DisplayName',sprintf('NGMI MLSE; %d km',len),'Color',cols(1,:),'LineStyle','-'); % plot(uloops.bitrate.*1e-9,ber_mlse,'DisplayName',sprintf('NGMI MLSE; %d km',len),'Color',cols(1,:),'LineStyle','-'); % plot(uloops.bitrate.*1e-9,ber_db,'DisplayName',sprintf('NGMI VNLE; %d km',len),'Color',cols(2,:),'LineStyle','-'); % % set(gca, 'YScale', 'log'); % ylim([1e-5, 0.1]); % yline([3.8e-3;1e-2],'LineWidth',1,'HandleVisibility','off'); % for alpha = uloops.alpha % for precode = uloops.db_precode % for precomp = uloops.precomp % % % cols = linspecer(6);%cbrewer2('Set2',10); % cnt = 1; % a = wh.getStoValue('ber',alpha,uloops.vnle_order2,uloops.vnle_order3,precomp, precode, uloops.bitrate,uloops.M); % % % for i = 1:numel(a) % ber_db(i) = mean((a{i}.ber_db)); % ber_vnle(i) = mean((a{i}.ber_vnle)); % ber_vnle_dfe(i) = mean((a{i}.ber_vnle_dfe)); % ber_mlse(i) = mean((a{i}.ber_mlse)); % pf_taps(i) = a{i}.pf_taps{1}(2); % vnle_taps(i,:) = a{i}.eq_vnle{1}.e; % % figure(222) % % % subplot(7,3,3*(i-1)+1) % ylim([-0.5 1]); % title(sprintf('%d GBps',uloops.bitrate(i).*1e-9)); % hold on % stem(a{i}.eq_vnle{1}.e) % % subplot(7,3,3*(i-1)+2) % ylim([-0.5 1]); % title(sprintf('%d GBps',uloops.bitrate(i).*1e-9)); % hold on % stem(a{i}.eq_vnle{1}.e2) % % subplot(7,3,3*(i-1)+3) % ylim([-0.5 1]); % title(sprintf('%d GBps',uloops.bitrate(i).*1e-9)); % hold on % stem(a{i}.eq_vnle{1}.e3) % % showEQNoisePSD(a{i}.noise_vnle{1},"fignum",220,"displayname",sprintf('%d 2nd order taps; %d GBps',vnle_order2,uloops.bitrate(i).*1e-9),"postfilter_taps",a{i}.pf_taps{1}); % % eq_sig = a{i}.signal_vnle{1}; % % % end % % figure() % hold on % % if precomp % lsty = '-'; % else % lsty = '-'; % end % % if precode % coloffset = 1; % else % coloffset=1; % end % % % plot(uloops.bitrate,ber_mlse,'DisplayName',sprintf('Precomp: %d; Precode %d',precomp,precode),'Color',cols(cnt,:)); % title(sprintf('Precomp: %d; Precode %d',precomp,precode)); % plot(uloops.bitrate.*1e-9,ber_vnle,'DisplayName','VNLE','Color',cols(4,:),'LineStyle',lsty); % plot(uloops.bitrate.*1e-9,ber_vnle_dfe,'DisplayName','VNLE+DFE','Color',cols(2,:),'LineStyle',lsty); % plot(uloops.bitrate.*1e-9,ber_mlse,'DisplayName','VNLE+PF+MLSE','Color',cols(3,:),'LineStyle',lsty); % plot(uloops.bitrate.*1e-9,ber_db,'DisplayName','DB tgt.','Color',cols(1,:),'LineStyle',lsty); % % cnt = cnt+1; % yline([3.8e-3;1e-2],'LineWidth',1,'HandleVisibility','off'); % beautifyBERplot() % end % end % end % % % % for vnle_order3 = uloops.vnle_order3([1,3,5,7,9,10]) % cnt = 0; % for vnle_order2 = 3%= uloops.vnle_order2 % for precode = uloops.db_precode % for precomp = uloops.precomp % % % cols = linspecer(10);%cbrewer2('Set2',10); % cnt = cnt+1; % a = wh.getStoValue('ber',vnle_order2,vnle_order3,precomp, precode, uloops.bitrate,uloops.M); % % % ber_db(cnt) = mean((a{1}.ber_db)); % ber_vnle(cnt) = mean((a{1}.ber_vnle)); % ber_vnle_dfe(cnt) = mean((a{1}.ber_vnle_dfe)); % ber_mlse(cnt) = mean((a{1}.ber_mlse)); % pf_taps(cnt) = a{1}.pf_taps{1}(2); % % showEQNoisePSD(a{1}.noise_vnle{1},"fignum",220,"displayname",sprintf('%d 3rd order taps; %d GBps',vnle_order3,uloops.bitrate(i).*1e-9)); % % eq_sig = a{1}.signal_vnle{1}; % % % end % end % end % % figure(180) % hold on % scatter(uloops.vnle_order2,ber_mlse,'MarkerEdgeColor',cols(vnle_order3,:),'LineWidth',1,'DisplayName',sprintf('%d 3rd order taps',vnle_order3)); % ylim([1e-3 0.5]); % % end % title(sprintf('%d GBps',uloops.bitrate(i).*1e-9)); % ylabel('BER'); % xlabel('VNLE 2nd order taps'); % yline([3.8e-3;1e-2],'LineWidth',1,'HandleVisibility','off'); % beautifyBERplot() % r = 1; % for rate = uloops.bitrate % % i = 1; % for alpha = uloops.alpha % cols = linspecer(7);%cbrewer2('Set2',10); % cnt = 1; % a = wh.getStoValue('ber',alpha,uloops.vnle_order2,uloops.vnle_order3,precomp, precode, rate,uloops.M); % ber_mlse(i) = mean((a{1}.ber_mlse)); % pf_taps(i) = a{1}.pf_taps{1}(2); % i = i+1; % end % % figure(150) % hold on % scatter(pf_taps(1),ber_mlse(1),200,'DisplayName','Burg','MarkerEdgeColor',cols(r,:),'Marker','x','LineWidth',2,'HandleVisibility','off'); % plot(uloops.alpha(2:end),ber_mlse(2:end),'DisplayName',sprintf('%d GBps',rate.*1e-9),'Color',cols(r,:),'LineStyle','-'); % r=r+1; % % end % % % % title(sprintf('%d GBps',uloops.bitrate.*1e-9)); % ylabel('BER'); % xlabel('Alpha'); % yline([3.8e-3;1e-2],'LineWidth',1,'HandleVisibility','off'); % beautifyBERplot() % % % % figure(2024) % hold on % for j = 1:numel(uloops.vnle_order3) % all2nd = wh.getStoValue('ber',uloops.vnle_order3(j), uloops.vnle_order2, uloops.bitrate,uloops.M); % for i = 1:numel(a) % ber_mlse(i) = all2nd{i}.ber_mlse; % ber_vnle(i) = all2nd{i}.ber_vnle; % pf_taps(:,i) = all2nd{i}.pf_taps; % % end % plot(uloops.vnle_order2,ber_mlse,'DisplayName',sprintf('%d 3rd order',uloops.vnle_order3(j))); % end % % yline(3.8e-3,'LineWidth',2,'DisplayName','3.8e-3'); % yline(2e-2,'LineWidth',2,'LineStyle','--','DisplayName','2e-2'); % beautifyBERplot() % legend % % figure(2025) % clf; % Clear figure so we start fresh % % numJ = numel(uloops.vnle_order3); % numI = numel(uloops.vnle_order2); % ber_mlse_mat = zeros(numJ, numI); % % % Gather data into a 2D matrix % for j = 1:numJ % all2nd = wh.getStoValue('ber', uloops.vnle_order3(j), uloops.vnle_order2, uloops.bitrate, uloops.M); % for i = 1:numI % ber_mlse_mat(j,i) = all2nd{i}.ber_mlse; % end % end % % % Create a 2D plot % % 'imagesc' displays the matrix as an image with a colorbar. % imagesc(uloops.vnle_order2, uloops.vnle_order3, ber_mlse_mat); % set(gca,'YDir','normal'); % Ensure that lower vnle_order3 is at the bottom % colorbar; % Add a colorbar to show BER scale % % xlabel('VNLE Order 2'); % ylabel('VNLE Order 3'); % title('BER MLSE as a function of VNLE Orders'); % % % If you want to highlight certain BER levels, you can add contour lines: % hold on; % [C,h] = contour(uloops.vnle_order2, uloops.vnle_order3, ber_mlse_mat, [3.8e-3, 2e-2], 'LineWidth',2,'LineColor','k'); % clabel(C,h,'Color','k','FontWeight','bold'); % % beautifyBERplot(); % legend('BER contour lines'); function ber = getResultBER(results, resultField) ber = nan(size(results)); resultField = char(resultField); for k = 1:numel(results) if isempty(results{k}) || ~isstruct(results{k}) || ~isfield(results{k}, resultField) continue end branch = results{k}.(resultField); if isempty(branch) || ~isstruct(branch) || ~isfield(branch, 'metrics') continue end val = branch.metrics.BER; if ~isempty(val) ber(k) = val(1); end end end