stuff from star
This commit is contained in:
@@ -355,7 +355,7 @@ classdef Signal
|
|||||||
end
|
end
|
||||||
|
|
||||||
if isempty(options.fft_length)
|
if isempty(options.fft_length)
|
||||||
options.fft_length = 2^(nextpow2(length(obj.signal))-7);
|
options.fft_length = 2^(nextpow2(length(obj.signal))-9);
|
||||||
end
|
end
|
||||||
|
|
||||||
if options.normalizeToNyquist == 0
|
if options.normalizeToNyquist == 0
|
||||||
@@ -837,9 +837,9 @@ classdef Signal
|
|||||||
|
|
||||||
mode = 1;
|
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 = 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
|
hist_data=zeros(histpoints,histpoints_horizontal ); %% initilize eye diagram
|
||||||
|
|
||||||
if isa(obj,'Opticalsignal')
|
if isa(obj,'Opticalsignal')
|
||||||
@@ -895,16 +895,22 @@ classdef Signal
|
|||||||
hist_data(:,n)=flip(nn.'); %without flip, the eye is upside down :-(
|
hist_data(:,n)=flip(nn.'); %without flip, the eye is upside down :-(
|
||||||
end
|
end
|
||||||
|
|
||||||
|
ax = gca;
|
||||||
|
|
||||||
plot_data = 20*log10(hist_data);
|
plot_data = 20*log10(hist_data);
|
||||||
plot_data(plot_data==-Inf) = 0;
|
plot_data(plot_data==-Inf) = 0;
|
||||||
|
|
||||||
imagesc(plot_data);
|
imagesc(plot_data);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
% beautify
|
% 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')
|
if isa(obj,'Opticalsignal')
|
||||||
title(['Optical Eye ',options.displayname])
|
title(['Optical Eye ',options.displayname])
|
||||||
ylabel("Power in mW");
|
ylabel("Power in mW");
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ classdef PAMsource
|
|||||||
options.mrds_blocklength = 512;
|
options.mrds_blocklength = 512;
|
||||||
|
|
||||||
options.applypulseform = 1;
|
options.applypulseform = 1;
|
||||||
options.pulseformer Pulseformer;
|
options.pulseformer;
|
||||||
|
|
||||||
options.fs_out ;
|
options.fs_out ;
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,10 @@ function [eq_package] = vnle(eq_,M,rx_signal,tx_symbols,tx_bits,options)
|
|||||||
end
|
end
|
||||||
|
|
||||||
%FFE or VNLE
|
%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_sd,eq_noise] = eq_.process(rx_signal,tx_symbols);
|
||||||
|
|
||||||
eq_signal_hd = PAMmapper(M,0).quantize(eq_signal_sd);
|
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.evm_lvl = evm_lvl;
|
||||||
eq_package.inf_rate_vnle = inf_rate;
|
eq_package.inf_rate_vnle = inf_rate;
|
||||||
|
|
||||||
|
eq_package.snr = snr(eq_signal_sd.signal,eq_noise.signal);
|
||||||
|
|
||||||
if options.showAnalysis
|
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 EVM lvl: ',repmat('%.3f ',1,numel(evm_lvl)),' \n'],evm_lvl);
|
||||||
|
|
||||||
fprintf('VNLE BER: %.2e \n',ber);
|
fprintf('VNLE BER: %.2e \n',ber);
|
||||||
|
|||||||
51
Functions/Theory/Neuer Ordner/duobinary_histogram.m
Normal file
51
Functions/Theory/Neuer Ordner/duobinary_histogram.m
Normal file
@@ -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
|
||||||
18
Functions/Theory/Neuer Ordner/duobinary_transferfunction.m
Normal file
18
Functions/Theory/Neuer Ordner/duobinary_transferfunction.m
Normal file
@@ -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
|
||||||
@@ -4,9 +4,9 @@ params = struct;
|
|||||||
|
|
||||||
params.M = [4];
|
params.M = [4];
|
||||||
params.datarate = [184];
|
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
|
postfilter = 0; % noise whiten. approach -> Postfilter + MLSE
|
||||||
|
|
||||||
db_precode = 0;
|
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);
|
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
|
% Receiver ROP curve
|
||||||
parfor i = 1:i_
|
for i = 1:i_
|
||||||
|
|
||||||
rop=wh.parameter.rop.values(i);
|
rop=wh.parameter.rop.values(i);
|
||||||
|
|
||||||
|
|||||||
@@ -3,18 +3,18 @@
|
|||||||
% db = DBHandler("pathToDB",[basePath,'silas_labor.db']);
|
% db = DBHandler("pathToDB",[basePath,'silas_labor.db']);
|
||||||
if 1
|
if 1
|
||||||
uloops = struct;
|
uloops = struct;
|
||||||
uloops.precomp = [0,1];
|
uloops.precomp = [1];
|
||||||
uloops.db_precode = [0,1];
|
uloops.db_precode = [0];
|
||||||
uloops.bitrate = [300,330,360,390,420,450,480].*1e9; %[300,330,360,390,420,450,480]
|
uloops.bitrate = [300,330,360,390,420,450,480].*1e9; %[300,330,360,390,420,450,480]
|
||||||
% uloops.bitrate = 390e9;
|
% uloops.bitrate = 390e9;
|
||||||
% uloops.laser_wavelength = [1293,1297.5,1302,1306.5,1310,1313.4,1318,1322.7,1327.4];
|
% uloops.laser_wavelength = [1293,1297.5,1302,1306.5,1310,1313.4,1318,1322.7,1327.4];
|
||||||
uloops.laser_wavelength = [1293];
|
uloops.laser_wavelength = [1310];
|
||||||
uloops.M = [4,6,8];
|
uloops.M = [6];
|
||||||
uloops.link_length = [2]; % 1,2,3,5,6,8,10
|
uloops.link_length = [2]; % 1,2,3,5,6,8,10
|
||||||
wh = DataStorage(uloops);
|
wh = DataStorage(uloops);
|
||||||
wh.addStorage("ber");
|
wh.addStorage("ber");
|
||||||
|
|
||||||
wh = submit_simulations(wh,"parallel",0,"simulation_mode",1);
|
wh = submit_simulations(wh,"parallel",0,"simulation_mode",0);
|
||||||
end
|
end
|
||||||
|
|
||||||
wh_ana = wh;
|
wh_ana = wh;
|
||||||
@@ -30,7 +30,7 @@ alpha = {};
|
|||||||
ber_dfe = {};
|
ber_dfe = {};
|
||||||
ngmi = [];
|
ngmi = [];
|
||||||
|
|
||||||
wavelength=1293;
|
wavelength=uloops.laser_wavelength;
|
||||||
for m = [4,6,8]
|
for m = [4,6,8]
|
||||||
%1302
|
%1302
|
||||||
%VNLE
|
%VNLE
|
||||||
@@ -40,14 +40,14 @@ for m = [4,6,8]
|
|||||||
ber_vnle = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a);
|
ber_vnle = cellfun(@(x) x.vnle_pf_package{1,1}.ber_vnle, a);
|
||||||
|
|
||||||
%MLSE
|
%MLSE
|
||||||
precomp = 0;
|
% precomp = 0;
|
||||||
precode = 1;
|
% precode = 1;
|
||||||
a = wh_ana.getStoValue('ber',precomp, precode, uloops.bitrate , wavelength, m, uloops.link_length);
|
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);
|
ber_mlse = cellfun(@(x) x.vnle_pf_package{1,1}.ber_mlse, a);
|
||||||
|
|
||||||
%DB
|
%DB
|
||||||
precomp = 0;
|
% precomp = 0;
|
||||||
precode = 1;
|
% precode = 1;
|
||||||
a = wh_ana.getStoValue('ber',precomp, precode, uloops.bitrate , wavelength, m, uloops.link_length);
|
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);
|
ber_dbtgt = cellfun(@(x) x.dbtgt_package{1,1}.ber, a);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
% 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",336,"fft_length",2^12);
|
||||||
% Raw_signal.move_it_spectrum("fignum",334);
|
% Raw_signal.move_it_spectrum("fignum",334);
|
||||||
|
% Raw_signal.move_it_spectrum("fignum",334);
|
||||||
|
|
||||||
fsym = Symbols.fs;
|
fsym = Symbols.fs;
|
||||||
|
|
||||||
@@ -259,7 +260,7 @@ vnle_dfe_package = {};
|
|||||||
dbtgt_package = {};
|
dbtgt_package = {};
|
||||||
|
|
||||||
|
|
||||||
proc_occ = min(8,length(Scpe_cell));
|
proc_occ = min(1,length(Scpe_cell));
|
||||||
for occ = 1:proc_occ
|
for occ = 1:proc_occ
|
||||||
|
|
||||||
Scpe_sig = Scpe_cell{occ};
|
Scpe_sig = Scpe_cell{occ};
|
||||||
@@ -284,12 +285,12 @@ for occ = 1:proc_occ
|
|||||||
mu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3];
|
mu_ffe = [mu_ffe1 mu_ffe2 mu_ffe3];
|
||||||
|
|
||||||
% %%%%% VNLE + DFE %%%%
|
% %%%%% 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);
|
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;
|
vnle_dfe_package{occ} = result;
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
%%%%% VNLE + PF + MLSE %%%%
|
%%%%% VNLE + PF + MLSE %%%%
|
||||||
|
|||||||
Reference in New Issue
Block a user