diff --git a/Classes/04_DSP/Coding/Duobinary.m b/Classes/04_DSP/Coding/Duobinary.m index e93c594..6f3460b 100644 --- a/Classes/04_DSP/Coding/Duobinary.m +++ b/Classes/04_DSP/Coding/Duobinary.m @@ -26,7 +26,9 @@ classdef Duobinary M = numel(u); %make unipolar - if M == 4 + if M == 2 + data = data; + elseif M == 4 data = data .* sqrt(5); elseif M == 6 data = data .* sqrt(10); @@ -59,7 +61,9 @@ classdef Duobinary bk = bk .* 2; bk = bk + b; - if M == 4 + if M == 2 + bk = bk; + elseif M == 4 bk = bk ./ sqrt(5); elseif M == 6 bk = bk ./ sqrt(10); @@ -100,7 +104,9 @@ classdef Duobinary end %make unipolar - if options.M == 4 + if options.M == 2 + data = data; + elseif options.M == 4 data = data .* sqrt(5); elseif options.M == 6 data = data .* sqrt(10); @@ -140,7 +146,9 @@ classdef Duobinary mean_power = sum((unique_points .^ 2) .* probabilities); scaling_factor = sqrt(mean_power); - if options.M == 4 + if options.M == 2 + data = data ./ sqrt(0.5); + elseif options.M == 4 data = data ./ sqrt(2.5); % 7-level constellation weighted with probability after DB code i.e. mean([-3 3 -2 -2 2 2 -1 -1 -1 1 1 1 0 0 0 0].^2) = 2.5 --> sqrt(2.5) == rms(constellation) elseif options.M == 6 data = data ./ sqrt(5.8); @@ -186,7 +194,9 @@ classdef Duobinary end %make unipolar - if I == 7 || I == 6 + if I == 3 + data = data .* 0.5; + elseif I == 7 || I == 6 data = data .* sqrt(2.5); elseif I == 11 data = data .* sqrt(5.8); @@ -206,7 +216,9 @@ classdef Duobinary data = data .* 2; data = data - round(mean(data)); - if M == 4 + if M == 2 + data = data; + elseif M == 4 data = data ./ sqrt(5); elseif M == 6 data = data ./ sqrt(10); diff --git a/Classes/04_DSP/Equalizer/Postfilter.m b/Classes/04_DSP/Equalizer/Postfilter.m index 1fed009..9a3119b 100644 --- a/Classes/04_DSP/Equalizer/Postfilter.m +++ b/Classes/04_DSP/Equalizer/Postfilter.m @@ -67,22 +67,29 @@ classdef Postfilter < handle end - function showFilter(obj,noiseclass_in,options) + function showFilter(obj,options) arguments obj - noiseclass_in + options.noiseclass_in =[] options.fignum = 121 options.color = [] end % noiseclass_in.spectrum('displayname','Noise PSD shifted to 0dBm','fignum',options.fignum,'normalizeTo0dB',1); - + if ~isempty(options.noiseclass_in) + len = length(options.noiseclass_in); + fs = options.noiseclass_in.fs; + else + len = 1024; + fs = 1; + end + figure(options.fignum) - [h,w] = freqz(1,obj.coefficients,length(noiseclass_in),"whole",noiseclass_in.fs); + [h,w] = freqz(1,obj.coefficients,len,"whole",fs); h = h/max(abs(h)); hold on - w_ = (w - noiseclass_in.fs/2); + w_ = (w - fs/2); if isempty(options.color) plot(w_.*1e-9,20*log10(fftshift(abs(h))),'DisplayName',['Burg Coeffs: ', num2str(round(obj.coefficients,2)), ' '],'LineWidth',2); diff --git a/Classes/04_DSP/TransmissionPerformance.m b/Classes/04_DSP/TransmissionPerformance.m index 49ca0c7..4e1c7ee 100644 --- a/Classes/04_DSP/TransmissionPerformance.m +++ b/Classes/04_DSP/TransmissionPerformance.m @@ -59,8 +59,19 @@ classdef TransmissionPerformance 1.03e-2, 9.29e-3, 8.33e-3, 7.54e-3, 7.04e-3, 4.70e-3]; %% LUT for KP4-FEC and Inner Code https://grouper.ieee.org/groups/802/3/dj/public/23_03/patra_3dj_01b_2303.pdf + CODE_RATE_KP4_AND_INNER = [0.885799]; BERTHRESHOLDS_KP4_AND_INNER = 4.85e-3; + + % https://www.ieee802.org/3/bs/public/14_11/parthasarathy_3bs_01a_1114.pdf + CODE_RATE_KP4 = [1/(1+0.052)];%Reed-Solomon RS(544, 514) == KP4 + BERTHRESHOLDS_KP4 = 2.2e-4; + + CODE_RATE_HDFEC = [1/(1+0.067)]; %Beyond 300 Gbps Short-Reach Links Using TFLN MZMs With 500 mVpp and Linear Equalization + BERTHRESHOLDS_HDFEC = 3.8e-3; + + CODE_RATE_O_FEC = [1/(1+0.15)]; %Stefano im Meeting + BERTHRESHOLDS_O_FEC = 2e-2; diff --git a/Datatypes/clr.m b/Datatypes/clr.m new file mode 100644 index 0000000..b9aa515 --- /dev/null +++ b/Datatypes/clr.m @@ -0,0 +1,70 @@ +classdef clr + properties (Constant) + % Set1 colormap + Set1 = struct( ... + 'red', [0.8941, 0.1020, 0.1098], ... + 'blue', [0.2157, 0.4941, 0.7216], ... + 'green', [0.3020, 0.6863, 0.2902], ... + 'purple', [0.5961, 0.3059, 0.6392], ... + 'orange', [1.0000, 0.4980, 0.0000], ... + 'yellow', [1.0000, 1.0000, 0.2000], ... + 'brown', [0.6510, 0.3373, 0.1569], ... + 'pink', [0.9686, 0.5059, 0.7490], ... + 'gray', [0.6000, 0.6000, 0.6000]); + + % Paired colormap + Paired = struct( ... + 'lightblue', [0.6510, 0.8078, 0.8902], ... + 'blue', [0.1216, 0.4706, 0.7059], ... + 'lightgreen', [0.6980, 0.8745, 0.5412], ... + 'green', [0.2000, 0.6275, 0.1725], ... + 'lightred', [0.9843, 0.6039, 0.6000], ... + 'red', [0.8902, 0.1020, 0.1098], ... + 'lightorange',[0.9922, 0.7490, 0.4353], ... + 'orange', [1.0000, 0.4980, 0.0000], ... + 'lightpurple',[0.7922, 0.6980, 0.8392], ... + 'purple', [0.4157, 0.2392, 0.6039], ... + 'lightyellow',[1.0000, 1.0000, 0.6000], ... + 'brown', [0.6941, 0.3490, 0.1569]); + + end + + methods (Static) + function showRGB(colorArray, names) + % Visualize colors in a horizontal bar chart + if nargin < 2 + names = repmat({''}, size(colorArray, 1), 1); + end + + figure; + hold on; + for i = 1:size(colorArray, 1) + fill([0 1 1 0], [i-1 i-1 i i], colorArray(i, :), 'EdgeColor', 'k'); + text(1.1, i-0.5, names{i}, 'FontSize', 12, 'Interpreter', 'none'); + end + ylim([0, size(colorArray, 1)]); + xlim([0, 1.5]); + axis off; + title('Color Preview'); + hold off; + end + + function showSet(colorStruct) + % Show colors from a structure in a bar plot + names = fieldnames(colorStruct); + colors = cell2mat(struct2cell(colorStruct)'); + + figure; + hold on; + for i = 1:size(colors, 1) + fill([0 1 1 0], [i-1 i-1 i i], colors(i, :), 'EdgeColor', 'k'); + text(1.1, i-0.5, names{i}, 'FontSize', 12, 'Interpreter', 'none'); + end + ylim([0, size(colors, 1)]); + xlim([0, 1.5]); + axis off; + title('Color Preview'); + hold off; + end + end +end diff --git a/Datatypes/pulseform.m b/Datatypes/pulseform.m index 2c0b95b..d753291 100644 --- a/Datatypes/pulseform.m +++ b/Datatypes/pulseform.m @@ -1,8 +1,8 @@ classdef pulseform < int32 enumeration - rc (1) %raised cosine (use this at Tx without matched filter) - rrc (2) %root raised cosine (usually with matched filter) + rc (2) %raised cosine (use this at Tx without matched filter) + rrc (1) %root raised cosine (usually with matched filter) end end \ No newline at end of file diff --git a/Functions/beautifyBERplot.m b/Functions/beautifyBERplot.m index 690c4ba..fddc7f3 100644 --- a/Functions/beautifyBERplot.m +++ b/Functions/beautifyBERplot.m @@ -9,7 +9,9 @@ function beautifyBERplot() for i = 1:length(lines) lines(i).LineWidth = 1.3; % Thicker line width %lines(i).LineStyle = '-'; % Solid lines for simplicity - lines(i).Marker = markers{mod(i-1, num_markers) + 1}; % Assign markers cyclically + if string(lines(i).Marker) == "none" + lines(i).Marker = markers{mod(i-1, num_markers) + 1}; % Assign markers cyclically + end lines(i).MarkerSize = 4; % Marker size lines(i).MarkerFaceColor = 'auto'; % Use line color for marker face end diff --git a/Functions/showTransferFunction.m b/Functions/showTransferFunction.m new file mode 100644 index 0000000..ef4635e --- /dev/null +++ b/Functions/showTransferFunction.m @@ -0,0 +1,22 @@ + +function showTransferFunction(coeffs,options) + +arguments + coeffs + options.fignum = 765 + options.DisplayName = '' + options.color = [1 1 0.1] +end +% Define the filter taps + + [H, w] = freqz(coeffs, 1, 1024, 1); + + figure(options.fignum); + hold on + plot(w, 10*log10(abs(H)), 'LineWidth', 2,'DisplayName',options.DisplayName,'Color',options.color); %todo + xlabel('Normalized Frequency'); + ylabel('Amplitude in dB'); + grid on; + ylim([-20,10]) + +end \ No newline at end of file diff --git a/projects/IMDD_base_system/analyze_burg.m b/projects/IMDD_base_system/analyze_burg.m new file mode 100644 index 0000000..e624b92 --- /dev/null +++ b/projects/IMDD_base_system/analyze_burg.m @@ -0,0 +1,68 @@ +% basePath = 'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\'; +% db = DBHandler("pathToDB",[basePath,'silas_labor.db']); +if 0 + + uloops = struct; + uloops.precomp = [0]; + uloops.db_precode = [0]; + uloops.bitrate = [330,390,450].*1e9; %[300,330,360,390,420,450,480] + uloops.laser_wavelength = [1310]; + uloops.M = [4]; + uloops.link_length = [2]; % 1,2,3,5,6,8,10 + %uloops.alpha = [0:0.1:1]; + + wh = DataStorage(uloops); + wh.addStorage("ber"); + + wh = submit_simulations(wh,"parallel",1,"simulation_mode",0); + +end + +col = cbrewer2('spectral',6);% +col=linspecer(5); + +cnt = 1; +for br = uloops.bitrate + a = wh_burg.getStoValue('ber',uloops.precomp, uloops.db_precode, br , uloops.laser_wavelength, uloops.M, uloops.link_length); + ber_mlse = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a); + alpha = cellfun(@(x) x.vnle_pf_package{1,1}.pf.coefficients, a,'UniformOutput', false); + figure(23) + hold on + scatter(alpha{1}(2),ber_mlse,100,'MarkerEdgeColor',col(cnt,:),'Marker','x','LineWidth',2,'HandleVisibility','off'); + cnt = cnt+1; +end + + + +cnt = 1; +alpha = []; + +for br = uloops.bitrate + + a = wh_alphas.getStoValue('ber',uloops.precomp, uloops.db_precode, br , uloops.laser_wavelength, uloops.M, uloops.link_length, [0:0.1:1]); + ber_mlse = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a); + + x_ax = [0:0.1:1]; + + figure(23) + hold on + % title(sprintf('%d km | %d nm | PAM %d',uloops.link_length,wavelength,uloops.M)); + plot(x_ax,ber_mlse,'DisplayName',sprintf(' %d GBps PAM 4',br.*1e-9),'LineStyle','-','HandleVisibility','on','Color',col(cnt,:)); + + xticks(x_ax); + set(gca, 'YScale', 'log'); + ylim([1e-5 0.4]); + xlim([min(x_ax), max(x_ax) ]); + yline([3.8e-3, 2e-2],'HandleVisibility','off'); + legend + beautifyBERplot(); + xlabel('Channel $\alpha$'); + ylabel('BER'); + + cnt = cnt+1; + +end + + + + diff --git a/projects/IMDD_base_system/analyze_equalizer_taps.m b/projects/IMDD_base_system/analyze_equalizer_taps.m new file mode 100644 index 0000000..a393e25 --- /dev/null +++ b/projects/IMDD_base_system/analyze_equalizer_taps.m @@ -0,0 +1,57 @@ +% basePath = 'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\'; +% db = DBHandler("pathToDB",[basePath,'silas_labor.db']); +if 0 + + uloops = struct; + uloops.precomp = [0]; + uloops.db_precode = [0]; + uloops.bitrate = [390].*1e9; %[300,330,360,390,420,450,480] + uloops.laser_wavelength = [1310]; + uloops.M = [4]; + uloops.link_length = [2]; % 1,2,3,5,6,8,10 + uloops.vnle_order1 = [5,10:10:100]; + uloops.vnle_order2 = [0]; + uloops.vnle_order3 = [0]; + + wh = DataStorage(uloops); + wh.addStorage("ber"); + + wh = submit_simulations(wh,"parallel",1,"simulation_mode",0); + +end + + +col = cbrewer2('spectral',6);% +col=linspecer(5); +cnt = 1; +for n3 = uloops.vnle_order3 + + a = wh.getStoValue('ber',uloops.precomp, uloops.db_precode, uloops.bitrate , uloops.laser_wavelength, uloops.M, uloops.link_length,... + uloops.vnle_order1,... + uloops.vnle_order2,... + n3); + + 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); + ber_db = cellfun(@(x) x.dbtgt_package{1,1}.ber, a); + log_bers = log10(ber_vnle + 1e-12); + + figure(20) + hold on + title(sprintf('%d km | %d nm | PAM %d',uloops.link_length,wavelength,uloops.M)); + % plot(uloops.vnle_order1,ber_vnle,'DisplayName',sprintf('Tx precomp. + VNLE'),'LineStyle','-','HandleVisibility','on','Color',col(cnt,:)); + plot(uloops.vnle_order1,ber_mlse,'DisplayName',sprintf('VNLE + Postfilter + ;MLSE'),'LineStyle','-','HandleVisibility','on','Color',col(cnt,:)); + plot(uloops.vnle_order1,ber_db,'DisplayName',sprintf('DB tgt. VNLE + MLSE'),'LineStyle','-','HandleVisibility','on','Color',col(cnt+2,:)); + xticks(uloops.vnle_order1([1:1:end])); + set(gca, 'YScale', 'log'); + ylim([5e-5 0.4]); + xlim([min(uloops.vnle_order1), max(uloops.vnle_order1) ]); + yline([3.8e-3, 2e-2],'HandleVisibility','off'); + legend + beautifyBERplot(); + xlabel('Number of 1st order coeff.'); + ylabel('BER'); + + cnt = cnt+1; +end + diff --git a/projects/IMDD_base_system/analyze_lambda.m b/projects/IMDD_base_system/analyze_lambda.m new file mode 100644 index 0000000..6146a7d --- /dev/null +++ b/projects/IMDD_base_system/analyze_lambda.m @@ -0,0 +1,50 @@ +if 0 + uloops = struct; + uloops.precomp = [0]; + uloops.db_precode = [0,1]; + uloops.bitrate = [420].*1e9; %[300,330,360,390,420,450,480] + % uloops.laser_wavelength = [1293,1297.5,1302,1306.5,1310,1313.4,1318,1322.7,1327.4]; + uloops.laser_wavelength = [1293, 1302,1310,1318,1327.4]; + uloops.M = [4,6,8]; + uloops.link_length = [5]; % 1,2,3,5,6,8,10 + wh = DataStorage(uloops); + wh.addStorage("ber"); + + wh = submit_simulations(wh,"parallel",1,"simulation_mode",0); +end + +col = cbrewer2('Set2',6);% +col=linspecer(5); +cnt = 1; + +m = 8; + +% a = wh.getStoValue('ber',1, 0, uloops.bitrate , uloops.laser_wavelength, m, uloops.link_length); +% ber_vnle = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a); + +a = wh.getStoValue('ber',0, 0, uloops.bitrate , uloops.laser_wavelength, m, uloops.link_length); +ber_mlse = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a); + +a = wh.getStoValue('ber',0, 1, uloops.bitrate , uloops.laser_wavelength, m, uloops.link_length); +ber_db = cellfun(@(x) x.dbtgt_package{1,1}.ber, a); + +x_ax = uloops.laser_wavelength; + +figure(21) +hold on +% title(sprintf('%d km | %d GBd | PAM %d',uloops.link_length,uloops.bitrate/log2(m).*1e-9,m)); +% plot(x_ax,ber_vnle,'DisplayName',sprintf('Tx precomp. + VNLE'),'LineStyle','-','HandleVisibility','on','Color',col(cnt+1,:)); +plot(x_ax,ber_mlse,'DisplayName',sprintf('VNLE + Postfilter + MLSE'),'LineStyle','-','HandleVisibility','on','Color',colorsets.DeepRed.RGB); +% plot(x_ax,ber_db,'DisplayName',sprintf('DB tgt. VNLE + MLSE'),'LineStyle','-','HandleVisibility','on','Color',col(cnt,:)); +xticks(x_ax([1:1:end])); +set(gca, 'YScale', 'log'); +ylim([5e-5 0.4]); +xlim([min(x_ax)-3, max(x_ax)+3 ]); +yline([3.8e-3, 2e-2],'HandleVisibility','off'); +legend +beautifyBERplot(); +xlabel('Number of 1st order coeff.'); +ylabel('BER'); + +cnt = cnt+1; + diff --git a/projects/IMDD_base_system/analyze_postfilter_taps.m b/projects/IMDD_base_system/analyze_postfilter_taps.m new file mode 100644 index 0000000..834b35a --- /dev/null +++ b/projects/IMDD_base_system/analyze_postfilter_taps.m @@ -0,0 +1,70 @@ +% basePath = 'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\'; +% db = DBHandler("pathToDB",[basePath,'silas_labor.db']); +if 0 + + uloops = struct; + uloops.precomp = [0]; + uloops.db_precode = [0]; + uloops.bitrate = [300,330,360,390,420,450,480].*1e9; %[300,330,360,390,420,450,480] + uloops.laser_wavelength = [1310]; + uloops.M = [4]; + uloops.link_length = [2]; % 1,2,3,5,6,8,10 + uloops.vnle_order1 = [50]; + uloops.vnle_order2 = [7]; + uloops.vnle_order3 = [7]; + uloops.pf_ncoeffs = [1,2,3]; + + wh = DataStorage(uloops); + wh.addStorage("ber"); + + wh = submit_simulations(wh,"parallel",1,"simulation_mode",0); + +end + +col = cbrewer2('spectral',6);% +col=linspecer(5); +cnt = 1; +alpha = []; +for n = uloops.pf_ncoeffs + + a = wh.getStoValue('ber',uloops.precomp, uloops.db_precode, uloops.bitrate , uloops.laser_wavelength, uloops.M, uloops.link_length,... + uloops.vnle_order1,... + uloops.vnle_order2,... + uloops.vnle_order3,... + n); + + 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); + + % PF = cellfun(@(x) x.vnle_pf_package{1,1}.pf.coefficients, a,'UniformOutput',false); + % + % showTransferFunction(PF{3}.coefficients,"fignum",12,"color",clr.Set1.red,"DisplayName",['360 GBd']); + % + % showTransferFunction(PF{4}.coefficients,"fignum",12,"color",clr.Set1.blue,"DisplayName",['390 GBd']); + % + % showTransferFunction(PF{5}.coefficients,"fignum",12,'color',clr.Set1.green,"DisplayName",['420 GBd']); + % ber_db = cellfun(@(x) x.dbtgt_package{1,1}.ber, a); + + x_ax = uloops.bitrate.*1e-9; + + figure(23) + hold on + title(sprintf('%d km | %d nm | PAM %d',uloops.link_length,wavelength,uloops.M)); + if n==1 + plot(x_ax,ber_vnle,'DisplayName',sprintf('Tx precomp. + VNLE'),'LineStyle','-','HandleVisibility','on','Color',col(cnt+4,:)); + end + plot(x_ax,ber_mlse,'DisplayName',sprintf('VNLE + Postfilter + ;MLSE'),'LineStyle','-','HandleVisibility','on','Color',col(cnt,:)); + % plot(x_ax,ber_db,'DisplayName',sprintf('DB tgt. VNLE + MLSE'),'LineStyle','-','HandleVisibility','on','Color',col(cnt+2,:)); + xticks(x_ax([1:1:end])); + set(gca, 'YScale', 'log'); + ylim([1e-5 0.4]); + xlim([min(x_ax(2:end)), max(x_ax) ]); + yline([3.8e-3, 2e-2],'HandleVisibility','off'); + legend + beautifyBERplot(); + xlabel('Gross Bitrate in Gbps'); + ylabel('BER'); + + cnt = cnt+1; +end + diff --git a/projects/IMDD_base_system/imdd_it.m b/projects/IMDD_base_system/imdd_it.m index dc1779c..631c975 100644 --- a/projects/IMDD_base_system/imdd_it.m +++ b/projects/IMDD_base_system/imdd_it.m @@ -1,150 +1,308 @@ % basePath = 'C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\'; % db = DBHandler("pathToDB",[basePath,'silas_labor.db']); -if 1 +if 0 uloops = struct; - uloops.precomp = [0]; - uloops.db_precode = [0]; - uloops.bitrate = [330].*1e9; %[300,330,360,390,420,450,480] 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]; uloops.laser_wavelength = [1310]; - uloops.M = [6]; + uloops.M = [4,6,8]; 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",0); end -wh_ana = wh; +wh_ana = wh_master; -ber_mlse = {}; -ber_vnle = {}; -inf_rate_vnle ={}; +cols = cbrewer2('Paired',8); -ber_dbtgt ={}; +figure() -ber_dbenc ={}; -alpha = {}; -ber_dfe = {}; -ngmi = []; +for precomp = [0,1] + wavelength=uloops.laser_wavelength; + for m = [6] -wavelength=uloops.laser_wavelength; -for m = [4,6,8] - %1302 - %VNLE - precomp = 1; - precode = 0; - a = wh_ana.getStoValue('ber',precomp, precode, uloops.bitrate , wavelength, m, uloops.link_length); - ber_vnle = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a); - - %MLSE - % 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; - 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); - - figure(m+20) - hold on - title(sprintf('%d km | %d nm | PAM %d',uloops.link_length,wavelength,m)); - - plot(uloops.bitrate,ber_vnle,'DisplayName',sprintf('VNLE'),'Color',cols(3,:),'LineStyle','-','HandleVisibility','on'); - - 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_mlse,'DisplayName',sprintf('VNLE + 1 tap post-filter + MLSE',uloops.link_length,uloops.M),'Color',cols(4,:),'LineStyle','-','HandleVisibility','on'); - - set(gca, 'YScale', 'log'); - ylim([5e-5 0.3]); - % 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('BER'); -end + baudrate = wh_ana.parameter.bitrate.values; -cols = linspecer(7);%cbrewer2('Set2',10); + %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); -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 + 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 -tp = TransmissionPerformance; -netRatesVNLE = tp.calculateNetRate(uloops.bitrate, 'NGMI', cellfun(@min, inf_rate_vnle)./log2(uloops.M), 'BER', cellfun(@min, ber_vnle)); -pam8= [2.9515 2.9284 2.9203 2.9311 2.8473 2.7740 2.6253]; -pam6 = [2.5280 2.5452 2.5579 2.5549 2.5272 2.4243 2.2617]; -pam4 = [ 1.9982 1.9972 1.9690 1.7909 1.2493 0.8014 0.6385]; -figure(6) -hold on -title(sprintf('Performance at 1310 for all lengths')); -% plot(uloops.bitrate.*1e-9,cellfun(@min, inf_rate_vnle),'DisplayName',sprintf('NGMI VNLE; %d km',uloops.link_length),'Color',cols(3,:),'LineStyle',':'); -plot(uloops.bitrate.*1e-9,pam4/2,'DisplayName',sprintf('GMI VNLE; PAM 4'),'Color',cols(1,:),'LineStyle',':'); -plot(uloops.bitrate.*1e-9,pam6/log2(6),'DisplayName',sprintf('GMI VNLE; PAM 6'),'Color',cols(2,:),'LineStyle',':'); -plot(uloops.bitrate.*1e-9,pam8/3,'DisplayName',sprintf('GMI VNLE; PAM 8'),'Color',cols(3,:),'LineStyle',':'); -xlabel('Gross Bitrate in Gbps'); -ylabel('NGMI') -beautifyBERplot() -ylim([0,1]); +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)); @@ -165,7 +323,7 @@ legend % 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'); @@ -177,13 +335,13 @@ legend % 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)); @@ -191,98 +349,98 @@ legend % 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'); @@ -292,7 +450,7 @@ legend % r = 1; % for rate = uloops.bitrate -% +% % i = 1; % for alpha = uloops.alpha % cols = linspecer(7);%cbrewer2('Set2',10); @@ -302,24 +460,24 @@ legend % 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) @@ -328,23 +486,23 @@ legend % 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); @@ -352,21 +510,21 @@ legend % 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'); \ No newline at end of file diff --git a/projects/IMDD_base_system/imdd_model.m b/projects/IMDD_base_system/imdd_model.m index 5f90ddb..230ee05 100644 --- a/projects/IMDD_base_system/imdd_model.m +++ b/projects/IMDD_base_system/imdd_model.m @@ -45,6 +45,7 @@ vnle_order3 = 7; vnle_order=[vnle_order1,vnle_order2,vnle_order3]; dfe_order = [0 0 0]; +pf_ncoeffs = 1; alpha = 0; @@ -54,6 +55,7 @@ mu_ffe1 = 0.0001; mu_ffe2 = 0.0008; mu_ffe3 = 0.001; mu_dc = 0.005; +% mu_dc = 0; mu_ffe = [mu_ffe1 mu_ffe3 mu_ffe3]; mu_dfe = 0.0004; @@ -132,7 +134,7 @@ f_nyquist = fsym/2; %%% run the simulation or measurement or ... if simulation_mode - Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"rrcalpha",rcalpha); + Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",16,"alpha",rcalpha); [Digi_sig,Symbols,Tx_bits] = PAMsource(... "fsym",fsym,"M",M,"order",16,"useprbs",0,... @@ -240,9 +242,9 @@ 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.spectrum("normalizeTo0dB",0,"fignum",11,"fft_length",2^12); % Raw_signal.move_it_spectrum("fignum",334); % Raw_signal.move_it_spectrum("fignum",334); @@ -283,15 +285,15 @@ for occ = 1:proc_occ % eq_mlse = FFE_DCremoval("epochs_tr",5,"epochs_dd",5,"len_tr",len_tr,"mu_dd",mu_ffe(1),"mu_tr",0,"order",ffe_order(1),"sps",2,"decide",0,"dc_buffer_len",512,"mu_dc",0.05); mu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3]; + vnle_order=[vnle_order1,vnle_order2,vnle_order3]; % %%%%% VNLE + DFE %%%% - 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); + if 0 + 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",0,"ideal_dfe",0); - [result] = vnle(eq_vnle_dfe,M,Scpe_sig,Symbols,Tx_bits,"precode_mode",doub_mode,"showAnalysis",1); + [result] = vnle(eq_vnle_dfe,M,Scpe_sig,Symbols,Tx_bits,"precode_mode",doub_mode,"showAnalysis",0); vnle_dfe_package{occ} = result; - end %%%%% VNLE + PF + MLSE %%%% if 1 @@ -299,7 +301,7 @@ for occ = 1:proc_occ % len_tr = length(Symbols)-1000; eq_vnle_ = EQ("Ne",vnle_order,"Nb",dfe_order,"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",0,"ideal_dfe",1); % eq_vnle_ = VNLE("epochs_tr",5,"epochs_dd",5,"len_tr",4096*2,"mu_dd",[0.0004 0.0005 0.0006],"mu_tr",0,"order",vnle_order,"sps",2,"decide",0); - pf_ = Postfilter("ncoeff",1,"useBurg",1); + pf_ = Postfilter("ncoeff",pf_ncoeffs,"useBurg",1); mlse_ = MLSE_viterbi("duobinary_output",0,'M',M,'trellis_states',PAMmapper(M,0).levels); [result] = vnle_postfilter_mlse(eq_vnle_,pf_,mlse_,M,Scpe_sig,Symbols,Tx_bits,"precode_mode",doub_mode,'showAnalysis',1); @@ -309,12 +311,12 @@ for occ = 1:proc_occ %%%%% Duobinary Targeting %%%% - if 1 + if 0 mlse_db = MLSE_viterbi("DIR",[1,1],"duobinary_output",0,"M",M,"trellis_states",PAMmapper(M,0).levels); eq_db = EQ("Ne",vnle_order,"Nb",dfe_order,"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",0,"ideal_dfe",1); - [result] = duobinary_target(eq_db, mlse_db, M, Scpe_sig, Symbols, Tx_bits, "precode_mode", doub_mode,'showAnalysis',1); + [result] = duobinary_target(eq_db, mlse_db, M, Scpe_sig, Symbols, Tx_bits, "precode_mode", doub_mode,'showAnalysis',0); dbtgt_package{occ} = result; diff --git a/projects/Lab_2024/offline_dsp_analysis/load_n_plot_transfer_characteristic.m b/projects/Lab_2024/offline_dsp_analysis/load_n_plot_transfer_characteristic.m index a23d25a..17d04f5 100644 --- a/projects/Lab_2024/offline_dsp_analysis/load_n_plot_transfer_characteristic.m +++ b/projects/Lab_2024/offline_dsp_analysis/load_n_plot_transfer_characteristic.m @@ -1,7 +1,7 @@ -precomp_path = "C:\Users\Silas\Documents\MATLAB\imdd_simulation\projects\standard_system"; -precomp_filename = "lab_mpi_setup_2"; +precomp_path = "C:\Users\Silas\Documents\MATLAB\Datensätze\sioe_labor\precomp"; +precomp_filename = "lab_high_speed"; freqresp = ChannelFreqResp("Nacq",1024,"Navg",64,"Ncp",63,'f_ref',92e9); freqresp.load('loadPath',precomp_path,'fileName',precomp_filename); diff --git a/test/duobinary_minimal_example.m b/test/duobinary_minimal_example.m index f817713..8866e69 100644 --- a/test/duobinary_minimal_example.m +++ b/test/duobinary_minimal_example.m @@ -1,11 +1,11 @@ useprbs = 1; -M = 6; +M = 2; randkey = 1; datarate = 448e9; fsym = round(datarate / log2(M)) ; %%%%% PRBS Generation in correct shape for Modulation Format %%%%%% -O = 15; %O of prbs +O = 16; %O of prbs N = 2^(O); %length of prbs [~,seed] = prbs(O,1); %initialize first seed of prbs bitpattern=[]; @@ -47,28 +47,79 @@ Tx_bits = Informationsignal(bitpattern); %%%%% Duobinary %%%%%% +precode = 1; +db_encode = 0; + close all Symbols_tx = PAMmapper(M,0).map(Tx_bits); Symbols_tx.fs = fsym; -Symbols1 = Duobinary().precode(Symbols_tx); -figure;histogram(Symbols1.signal); +%%% precode +if precode + Symbols0 = Duobinary().precode(Symbols_tx); +else + Symbols0 = Symbols_tx; +end -Symbols2 = Duobinary().encode(Symbols1); -figure;histogram(Symbols2.signal); +figure;histogram(Symbols0.signal); -Symbols3 = Duobinary().decode(Symbols2); -figure;histogram(Symbols3.signal); -autoArrangeFigures; +for n = 0:200 -Rx_bits = PAMmapper(M,0).demap(Symbols3); + if db_encode + Symbols1 = Duobinary().encode(Symbols0); + else + Symbols1 = Symbols0; + end -%%%%% Check BER of Bit Sequence %%%%%% + Symbols2 = Symbols1; + pos = 1; + if n~=0 + for pos = 1:n + po = randi(100); + a = Symbols2.signal(100+pos) == Symbols1.signal(100+po); + while a == 1 + po = po+1; + po = randi(100); + a = Symbols2.signal(100+pos) == Symbols1.signal(100+po); + end + Symbols2.signal(100+pos) = Symbols1.signal(100+po); + end + end -[~,error_num,ber,error_pos] = calc_ber(Tx_bits.signal,Rx_bits.signal,"skip_front",0,"skip_end",0,"returnErrorLocation",1); + % disp(Symbols2.signal(100:100+pos)==Symbols1.signal(100:100+pos)) + + %%% encode + + if db_encode + + % figure;histogram(Symbols2.signal); + + Symbols3 = Duobinary().decode(Symbols2); + % figure;histogram(Symbols3.signal); + % autoArrangeFigures; + elseif precode + Symbols3 = Duobinary().encode(Symbols2); + Symbols3 = Duobinary().decode(Symbols3); + % figure;histogram(Symbols3.signal); + else + Symbols3 = Symbols2; + end + + Rx_bits = PAMmapper(M,0).demap(Symbols3); + + %%%%% Check BER of Bit Sequence %%%%%% + + [~,error_num(n+1),ber,error_pos] = calc_ber(Tx_bits.signal,Rx_bits.signal,"skip_front",10,"skip_end",10,"returnErrorLocation",1); + + % disp(['BER: ',sprintf('%.1E',ber),sprintf(' - Num. Err: %.1d',error_num(n+1)-2),' - - PAM-',num2str(M)]); + fprintf('n: %d - Num. Err: %.1d \n',n,error_num(n+1)); +end -disp(['BER: ',sprintf('%.1E',ber),' - - PAM-',num2str(M)]); -% + +figure() +hold on +scatter(1:length(Symbols3),Symbols3.signal,1,'.'); +scatter(error_pos,Symbols3.signal(error_pos),14,'o'); figure(3);