M = 4; if M == 2 file_codes = {'20250221T035221' '20250221T035354' '20250221T035824' '20250221T035931' '20250221T040035' '20250221T040132' '20250221T040226' '20250221T040523' '20250221T040646' '20250221T040723' '20250221T040843' '20250221T041011' '20250221T041101' '20250221T041244'}; elseif M == 4 file_codes = {'20250221T030844' '20250221T032043' '20250221T032312' '20250221T032424' '20250221T032529' '20250221T032632' '20250221T032800' '20250221T033035' '20250221T033138' '20250221T033246' '20250221T033425' '20250221T033527' '20250221T033642' '20250221T033743' '20250221T033851' '20250221T034314' '20250221T034529' '20250221T034647' '20250221T034756' '20250221T034915'}; elseif M == 6 file_codes = {'20250221T041445' '20250221T041512' '20250221T041539' '20250221T041607' '20250221T041633' '20250221T041702' '20250221T041729' '20250221T041758' '20250221T041825' '20250221T041854' '20250221T041922' '20250221T041951' '20250221T042019' '20250221T042048' '20250221T042117' '20250221T042147' '20250221T042215'}; elseif M ==8 file_codes = {'20250221T004926' '20250221T023534' '20250221T024256' '20250221T024629' '20250221T024929' '20250221T025305' '20250221T025505' '20250221T025856' '20250221T030122' '20250221T030311' '20250221T030513'}; end if 1 uloops = struct; uloops.filecode = file_codes; uloops.vnle_order1 = [50]; uloops.vnle_order2 = [5]; uloops.vnle_order3 = [5]; wh = DataStorage(uloops); wh.addStorage("ber"); wh = submit_handle(@dsp_ief_file,wh,"parallel",0); end if 0 % Bring figure(5) to focus fig = figure(2); % Get handles to all line objects in the figure lines = findobj(fig, 'Type', 'line'); % Preallocate cell arrays to store the data for each line xData = cell(numel(lines),1); yData = cell(numel(lines),1); % Loop through each line and extract its data for k = 1:numel(lines) xData{k} = get(lines(k), 'XData'); yData{k} = get(lines(k), 'YData'); end ief.M2.baudr_new = xData{4}; ief.M2.ngmi_new = yData{4}; ief.M4.baudr_new = xData{3}; ief.M4.ngmi_new = yData{3}; ief.M6.baudr_new = xData{2}; ief.M6.ngmi_new = yData{2}; ief.M8.baudr_new = xData{1}; ief.M8.ngmi_new = yData{1}; ief.M2.ber_new = yData{4}; ief.M4.ber_new = yData{3}; ief.M6.ber_new = yData{2}; ief.M8.ber_new = yData{1}; pam2_baudr = xData{4}; pam2_ber = yData{4}; pam2_ngmi = yData{4}; pam4_baudr = xData{3}; pam4_ber = yData{3}; pam4_ngmi = yData{3}; pam6_baudr = xData{2}; pam6_ber = yData{2}; pam6_ngmi = yData{2}; pam8_baudr = xData{1}; pam8_ber = yData{1}; pam8_ngmi = yData{1}; pam2_baudr_lowdsp = xData{4}; pam2_ber_lowdsp = yData{4}; pam2_ngmi_lowdsp = yData{4}; pam4_baudr_lowdsp = xData{3}; pam4_ber_lowdsp = yData{3}; pam4_ngmi_lowdsp = yData{3}; pam6_baudr_lowdsp = xData{2}; pam6_ber_lowdsp = yData{2}; pam6_ngmi_lowdsp = yData{2}; pam8_baudr_lowdsp = xData{1}; pam8_ber_lowdsp = yData{1}; pam8_ngmi_lowdsp = yData{1}; end close all figure(1) cnt = 1; for M = [2,4,6,8] % for i = 1:numel(uloops.vnle_order2) % for j = 1:numel(uloops.vnle_order3) wh = eval(sprintf('wh_pam%d',M)); a =wh.getStoValue('ber',wh.parameter.filecode.values, wh.parameter.vnle_order1.values, wh.parameter.vnle_order2.values,wh.parameter.vnle_order3.values); % a =wh_mit_1001.getStoValue('ber',uloops.filecode, wh_mit_1001.parameter.vnle_order1.values, wh_mit_1001.parameter.vnle_order2.values,wh_mit_1001.parameter.vnle_order3.values); baudrate = cell2mat(cellfun(@(a) a.config.fsym, a, 'UniformOutput', false)); [baudrate, idx] = sort(baudrate); % get best results per baudrate vnle = 0; try ber_vnle_values = cellfun(@(a) cellfun(@(y) y.ber_vnle, a.vnle_package, 'UniformOutput', false), a, 'UniformOutput', false); ber_vnle_infrate = cellfun(@(a) cellfun(@(y) y.inf_rate_vnle, a.vnle_package, 'UniformOutput', false), a, 'UniformOutput', false); best_vnle = cellfun(@(x) min(cell2mat(x)), ber_vnle_values); best_vnle = best_vnle(idx); best_gmi_vnle = cellfun(@(x) min(cell2mat(x)), ber_vnle_infrate); best_gmi_vnle = best_gmi_vnle(idx); % netRateVNLE = TransmissionPerformance().calculateNetRate(log2(M)*baudrate,'NGMI',best_gmi_vnle./log2(M), 'BER',best_vnle); vnle = 1; end mlse = 0; try ber_vnle_values = cellfun(@(a) cellfun(@(y) y.ber_vnle, a.vnle_pf_package, 'UniformOutput', false), a, 'UniformOutput', false); best_vnle_2 = cellfun(@(x) min(cell2mat(x)), ber_vnle_values); best_vnle_2 = best_vnle_2(idx); gmi_vnle_values = cellfun(@(a) cellfun(@(y) y.gmi, a.vnle_pf_package, 'UniformOutput', false), a, 'UniformOutput', false); best_gmi_vnle = cellfun(@(x) min(cell2mat(x)), gmi_vnle_values); best_gmi_vnle = best_gmi_vnle(idx); ber_mlse_values = cellfun(@(a) cellfun(@(y) y.ber_mlse, a.vnle_pf_package, 'UniformOutput', false), a, 'UniformOutput', false); best_mlse = cellfun(@(x) min(cell2mat(x)), ber_mlse_values); best_mlse = best_mlse(idx); if M == 8 best_vnle_2(2) = []; best_mlse(2) = []; best_gmi_vnle(2) = []; best_db(2) = []; baudrate(2) = []; elseif M == 4 end mlse = 1; end db = 0; try ber_db_values = cellfun(@(a) cellfun(@(y) y.ber, a.dbtgt_package, 'UniformOutput', false), a, 'UniformOutput', false); best_db = cellfun(@(x) min(cell2mat(x)), ber_db_values); best_db = best_db(idx); if M == 4 best_db(end-1:end) = []; baudrate(end-1:end) = []; end db = 1; end %% BER PLOT % figure(1) subplot(1,2,1) cols = cbrewer2('Set1',6); hold on title(sprintf('BER')); % title(sprintf('%d 1st order',uloops.vnle_order1(i))); xax = baudrate.*1e-9; if M == 4 || M == 2 plot(xax,best_db,'DisplayName',sprintf('PAM %d | DB+MLSE',M),'Color',cols(M/2,:),'LineStyle',':','HandleVisibility','on','Marker','o','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); plot(ief.(sprintf('M%d', M)).baudr_new,ief.(sprintf('M%d', M)).ber_new,'DisplayName',sprintf('PAM %d |VNLE',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','square','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); elseif M == 6 plot(xax,best_vnle_2,'DisplayName',sprintf('PAM %d |VNLE',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','square','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); % plot(ief.(sprintf('M%d', M)).baudr_new,ief.(sprintf('M%d', M)).ber_new,'DisplayName',sprintf('PAM %d |VNLE',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','square','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); else % plot(xax,best_vnle_2,'DisplayName',sprintf('PAM %d |VNLE',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','square','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); plot(ief.(sprintf('M%d', M)).baudr_new,ief.(sprintf('M%d', M)).ber_new,'DisplayName',sprintf('PAM %d |VNLE',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','square','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); end if 0 if vnle plot(xax,best_vnle,'DisplayName',sprintf('VNLE'),'Color',cols(2,:),'LineStyle','-','HandleVisibility','on'); end if mlse plot(xax,best_vnle_2,'DisplayName',sprintf('VNLE'),'Color',cols(2,:),'LineStyle','-','HandleVisibility','on'); plot(xax,best_mlse,'DisplayName',sprintf('VNLE + 1 tap post-filter + MLSE'),'Color',cols(3,:),'LineStyle','-','HandleVisibility','on'); end if db plot(xax,best_db,'DisplayName',sprintf('DB tgt. + MLSE'),'Color',cols(1,:),'LineStyle','-','HandleVisibility','on'); end plot(ief.(sprintf('M%d', M)).baudr,ief.(sprintf('M%d', M)).ber,'DisplayName',sprintf('VNLE [100,15,15] (ETH)'),'Color',cols(4,:),'LineStyle','-','HandleVisibility','on'); plot(ief.(sprintf('M%d', M)).baudr_lowdsp,ief.(sprintf('M%d', M)).ber_lowdsp,'DisplayName',sprintf('VNLE [100,15,15] (ETH)'),'Color',cols(4,:),'LineStyle','-','HandleVisibility','on'); end set(gca, 'YScale', 'log'); ylim([1e-6 0.3]); xlim([92, 260 ]); xticks([0:16:280]); yline([4.85e-3, 2e-2],'HandleVisibility','off'); % legend % beautifyBERplot() xlabel('baudrate in GBd'); ylabel('BER'); set(findall(gca, '-property', 'Interpreter'), 'Interpreter', 'latex'); set(gcf, 'Color', 'w'); set(gca, 'Box', 'on', 'LineWidth', 0.8); % Thicker border grid on; set(gca, 'FontSize', 10, 'FontName', 'Times New Roman'); % %% NGMI PLOT % figure(2) % cols = cbrewer2('Set1',6); % hold on % title(sprintf('%d km ; %.1f nm ; PAM %d',1,1313,M)); % xax = baudrate.*1e-9; % % plot(xax,best_gmi_vnle./log2(M),'DisplayName',sprintf('NGMI VNLE'),'Color',cols(2,:),'LineStyle','-','HandleVisibility','on'); % % plot(ief.(sprintf('M%d', M)).baudr,ief.(sprintf('M%d', M)).ngmi,'DisplayName',sprintf('VNLE [100,15,15] (ETH)'),'Color',cols(4,:),'LineStyle','-','HandleVisibility','on'); % plot(ief.(sprintf('M%d', M)).baudr_lowdsp,ief.(sprintf('M%d', M)).ngmi_lowdsp,'DisplayName',sprintf('VNLE [100,15,15] (ETH)'),'Color',cols(4,:),'LineStyle','-','HandleVisibility','on'); % % set(gca, 'YScale', 'log'); % ylim([0.7 1]); % xlim([min(xax), max(xax) ]); % xticks(xax); % yline([0.8],'HandleVisibility','off'); % legend % beautifyBERplot() % xlabel('Baudrate in GBd'); % ylabel('NGMI'); %% AIR Plot % subplot(1,3,2) % % netRateMLSE = TransmissionPerformance().calculateNetRate(log2(M)*baudrate,'BER',best_mlse); % netRateVNLE = TransmissionPerformance().calculateNetRate(log2(M)*baudrate,'NGMI',best_gmi_vnle./log2(M), 'BER',best_vnle_2); % netRateDB = TransmissionPerformance().calculateNetRate(log2(M)*baudrate,'BER',best_db); % % netRateIEF = TransmissionPerformance().calculateNetRate(log2(M)*ief.(sprintf('M%d', M)).baudr,'BER',ief.(sprintf('M%d', M)).ber,'NGMI',ief.(sprintf('M%d', M)).ngmi); % netRateIEF_lowdsp = TransmissionPerformance().calculateNetRate(log2(M)*ief.(sprintf('M%d', M)).baudr_lowdsp,'BER',ief.(sprintf('M%d', M)).ber_lowdsp,'NGMI',ief.(sprintf('M%d', M)).ngmi_lowdsp); % % cols = cbrewer2('Set1',8); % hold on % title(sprintf('AIR')); % xax = baudrate.*1e-9; % % if M == 2 || M == 4 % % % plot(xax,netRateMLSE.HD.NetRate.*1e-9,'DisplayName',sprintf('MLSE - HD'),'Color',cols(1,:),'LineStyle',':','HandleVisibility','on'); % % plot(xax,netRateVNLE.SDHD.NetRate.*1e-9,'DisplayName',sprintf('VNLE SD+HD'),'Color',cols(4,:),'LineStyle','-','HandleVisibility','on'); % plot(xax,netRateDB.HD.NetRate.*1e-9,'DisplayName',sprintf('PAM %d | DB+MLSE HD',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on'); % plot(xax,netRateDB.O_FEC.NetRate.*1e-9,'DisplayName',sprintf('PAM %d | DB+MLSE O-FEC',M),'Color',cols(M/2,:),'LineStyle',':','HandleVisibility','on'); % % plot(xax,netRateDB.KP4_hamming.NetRate.*1e-9,'DisplayName',sprintf('PAM %d | DB+MLSE KP4-FEC',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on'); % % else % % % plot(xax,netRateMLSE.HD.NetRate.*1e-9,'DisplayName',sprintf('MLSE - HD'),'Color',cols(1,:),'LineStyle',':','HandleVisibility','on'); % % plot(xax,netRateVNLE.SDHD.NetRate.*1e-9,'DisplayName',sprintf('VNLE SD+HD'),'Color',cols(4,:),'LineStyle','-','HandleVisibility','on'); % % plot(ief.(sprintf('M%d', M)).baudr,netRateIEF.HD.NetRate,'DisplayName',sprintf('PAM %d | HD IEF',M),'Color',cols(M/2,:),'LineStyle',':','HandleVisibility','on'); % plot(ief.(sprintf('M%d', M)).baudr,netRateIEF.SDHD.NetRate,'DisplayName',sprintf('PAM %d | SD+HD IEF',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on'); % % end % set(gca, 'YScale', 'log'); % ylim([92 450]); % xlim([min(xax), max(xax) ]); % xlim([92, 260 ]); % xticks([0:16:280]); % yline([0.8],'HandleVisibility','off'); % legend % beautifyBERplot() % xlabel('Baudrate in GBd'); % ylabel('Net Rate in Gbps'); % % %% NDR PLOT subplot(1,2,2) netRateIEF = TransmissionPerformance().calculateNetRate(log2(M)*ief.(sprintf('M%d', M)).baudr,'BER',ief.(sprintf('M%d', M)).ber,'NGMI',ief.(sprintf('M%d', M)).ngmi); netRateIEF_lowdsp = TransmissionPerformance().calculateNetRate(log2(M)*ief.(sprintf('M%d', M)).baudr_lowdsp,'BER',ief.(sprintf('M%d', M)).ber_lowdsp,'NGMI',ief.(sprintf('M%d', M)).ngmi_lowdsp); netRateIEF_new = TransmissionPerformance().calculateNetRate(log2(M)*ief.(sprintf('M%d', M)).baudr_new,'BER',ief.(sprintf('M%d', M)).ber_new,'NGMI',ief.(sprintf('M%d', M)).ngmi_new); cols = cbrewer2('Set1',8); hold on title(sprintf('Net Bitrate')); xax = baudrate.*1e-9; if M == 2 || M == 4 log2M = log2(M); netRateDB = TransmissionPerformance().calculateNetRate(log2(M)*baudrate,'BER',best_db); % plot(xax,netRateMLSE.HD.NetRate.*1e-9,'DisplayName',sprintf('MLSE - HD'),'Color',cols(1,:),'LineStyle',':','HandleVisibility','on'); % plot(xax,netRateVNLE.SDHD.NetRate.*1e-9,'DisplayName',sprintf('VNLE SD+HD'),'Color',cols(4,:),'LineStyle','-','HandleVisibility','on'); plot(xax,netRateDB.HD.NetRate.*1e-9,'DisplayName',sprintf('PAM %d | DB+MLSE HD',M),'Color',cols(M/2,:),'LineStyle',':','HandleVisibility','on','Marker','square','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); plot(xax,netRateDB.O_FEC.NetRate.*1e-9,'DisplayName',sprintf('PAM %d | DB+MLSE O-FEC',M),'Color',cols(M/2,:),'LineStyle','-.','HandleVisibility','on','Marker','x','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); % plot(xax,netRateDB.KP4_hamming.NetRate.*1e-9,'DisplayName',sprintf('PAM %d | DB+MLSE KP4-FEC',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','*','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); plot(ief.(sprintf('M%d', M)).baudr_new,netRateIEF_new.SDHD.NetRate,'DisplayName',sprintf('PAM %d | SD+HD',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','o','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); plot(ief.(sprintf('M%d', M)).baudr_new,ief.(sprintf('M%d', M)).ngmi_new.*ief.(sprintf('M%d', M)).baudr_new.*log2M ,'DisplayName',sprintf('PAM %d | AIR',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','o','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); elseif M == 6 log2M = 2.5; netRateMLSE = TransmissionPerformance().calculateNetRate(log2(M)*baudrate,'BER',best_mlse); netRateVNLE = TransmissionPerformance().calculateNetRate(log2(M)*baudrate,'NGMI',best_gmi_vnle./log2(M), 'BER',best_vnle_2); plot(xax,netRateVNLE.HD.NetRate.*1e-9,'DisplayName',sprintf('MLSE - HD'),'Color',cols(M/2,:),'LineStyle',':','HandleVisibility','on','Marker','square','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); plot(xax,netRateVNLE.SDHD.NetRate.*1e-9,'DisplayName',sprintf('VNLE SD+HD'),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','o','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); % plot(ief.(sprintf('M%d', M)).baudr_new,netRateIEF_new.HD.NetRate,'DisplayName',sprintf('PAM %d | HD IEF',M),'Color',cols(M/2,:),'LineStyle',':','HandleVisibility','on','Marker','square','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); % plot(ief.(sprintf('M%d', M)).baudr_new,netRateIEF_new.SDHD.NetRate,'DisplayName',sprintf('PAM %d | SD+HD IEF',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','o','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); else log2M = log2(M); netRateMLSE = TransmissionPerformance().calculateNetRate(log2(M)*baudrate,'BER',best_mlse); netRateVNLE = TransmissionPerformance().calculateNetRate(log2(M)*baudrate,'NGMI',best_gmi_vnle./log2(M), 'BER',best_vnle_2); % plot(xax,netRateVNLE.HD.NetRate.*1e-9,'DisplayName',sprintf('MLSE - HD'),'Color',cols(M/2,:),'LineStyle',':','HandleVisibility','on','Marker','square','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); % plot(xax,netRateVNLE.SDHD.NetRate.*1e-9,'DisplayName',sprintf('VNLE SD+HD'),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','o','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); plot(ief.(sprintf('M%d', M)).baudr_new,netRateIEF_new.HD.NetRate,'DisplayName',sprintf('PAM %d | HD IEF',M),'Color',cols(M/2,:),'LineStyle',':','HandleVisibility','on','Marker','square','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); plot(ief.(sprintf('M%d', M)).baudr_new,netRateIEF_new.SDHD.NetRate,'DisplayName',sprintf('PAM %d | SD+HD IEF',M),'Color',cols(M/2,:),'LineStyle','-','HandleVisibility','on','Marker','o','MarkerFaceColor',[1,1,1],'MarkerEdgeColor',cols(M/2,:),'MarkerSize',4,'LineWidth',1.4); end set(gca, 'YScale', 'log'); ylim([150 450]); xlim([min(xax), max(xax) ]); xlim([92, 270 ]); xticks([0:16:280]); yline([0.8],'HandleVisibility','off'); % legend xlabel('Baudrate in GBd'); ylabel('Net Rate in Gbps'); set(findall(gca, '-property', 'Interpreter'), 'Interpreter', 'latex'); set(gcf, 'Color', 'w'); set(gca, 'Box', 'on', 'LineWidth', 0.8); % Thicker border grid on; set(gca, 'FontSize', 10, 'FontName', 'Times New Roman'); end