Add PAMmapper bit mapping and Gray penalty visualization
This commit is contained in:
@@ -17,30 +17,42 @@ if 1
|
||||
|
||||
uloops = struct;
|
||||
uloops.precomp = [0];
|
||||
uloops.bitrate = [300].*1e9; %[300,330,360,390,420,450,480] [224,336,360,390,420,448] for MPI
|
||||
uloops.fsym = 180e9;
|
||||
% uloops.bitrate = 100e9;
|
||||
% 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.link_length = 1;
|
||||
% uloops.link_length = [0:2:10]; % 1,2,3,5,6,8,10
|
||||
uloops.channel_alpha = [0.5];
|
||||
uloops.channel_alpha = [0.8];
|
||||
uloops.duob_mode = db_mode.no_db;
|
||||
uloops.decoding_mode = "memoryless";
|
||||
uloops.channel_mode = "awgn_alphad";
|
||||
uloops.channel_snr_dB = [20:-2:0];
|
||||
uloops.channel_mode = "awgn_alphad"; %awgn_alphad
|
||||
uloops.channel_snr_dB = [20];
|
||||
uloops.rop = -6;
|
||||
|
||||
wh = DataStorage(uloops);
|
||||
wh.addStorage("ber");
|
||||
|
||||
wh = submit_handle(@imdd_model,wh,"parallel",1);
|
||||
wh = submit_handle(@imdd_model,wh,"parallel",0);
|
||||
|
||||
end
|
||||
|
||||
%%
|
||||
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, [300].*1e9 , 1293, 4, uloops.link_length,alpha,uloops.duob_mode,uloops.decoding_mode,uloops.channel_mode,uloops.channel_snr_dB);
|
||||
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);
|
||||
|
||||
|
||||
@@ -12,11 +12,12 @@ end
|
||||
%%% Run parameters
|
||||
% TX
|
||||
M = 4;
|
||||
fsym = 180e9;
|
||||
fsym = 150e9;
|
||||
bitrate = [];
|
||||
|
||||
apply_pulsef = 1;
|
||||
fdac = 256e9;
|
||||
fadc = 256e9;
|
||||
apply_pulsef = 0;
|
||||
fdac = 4*fsym;%256e9;
|
||||
fadc = 4*fsym;%256e9;
|
||||
random_key = 1;
|
||||
|
||||
rcalpha = 0.05;
|
||||
@@ -28,7 +29,7 @@ vbias = -vbias_rel*u_pi;
|
||||
|
||||
laser_wavelength = 1293;
|
||||
laser_linewidth = 0;
|
||||
tx_bw_nyquist = 0.8;
|
||||
tx_bw_nyquist = 0.65;
|
||||
|
||||
% Channel
|
||||
link_length = 1;
|
||||
@@ -38,7 +39,7 @@ channel_alpha = 0;
|
||||
channel_delay_symbols = 1;
|
||||
|
||||
% RX
|
||||
rop = -8;
|
||||
rop = 2;
|
||||
rx_bw_nyquist = 0.8;
|
||||
|
||||
vnle_order1 = 50;
|
||||
@@ -68,7 +69,7 @@ dfe_ = sum(dfe_order)>0;
|
||||
|
||||
duob_mode = db_mode.no_db;
|
||||
decoding_mode = [];
|
||||
bitrate = fsym * log2(M);
|
||||
providedFields = string.empty;
|
||||
|
||||
%%% change specific parameter if given in varargin
|
||||
% Parse optional input arguments
|
||||
@@ -76,28 +77,38 @@ if ~isempty(varargin)
|
||||
var_s = varargin{1};
|
||||
if isstruct(var_s)
|
||||
fields = fieldnames(var_s);
|
||||
providedFields = string(fields);
|
||||
for i = 1:numel(fields)
|
||||
if isnumeric(fields{i})
|
||||
eval([fields{i}, ' = ', num2str( var_s.(fields{i}) ), ';']);
|
||||
fprintf("%s <-- %.2f \n", fields{i}, var_s.(fields{i}));
|
||||
else
|
||||
eval([fields{i}, ' = ', 'var_s.(fields{',num2str(i),'})' , ';']);
|
||||
fieldName = fields{i};
|
||||
if ~isvarname(fieldName)
|
||||
error('Invalid parameter name "%s".', fieldName);
|
||||
end
|
||||
|
||||
eval([fieldName, ' = var_s.(fieldName);']);
|
||||
end
|
||||
else
|
||||
error('Optional variables should be passed as a struct.');
|
||||
end
|
||||
end
|
||||
|
||||
hasFsym = any(providedFields == "fsym");
|
||||
hasBitrate = any(providedFields == "bitrate");
|
||||
|
||||
fsym_ = floor( bitrate*1e-9./log2(M) ).*1e9;
|
||||
|
||||
if fsym_ ~= fsym
|
||||
fsym = fsym_;
|
||||
% fprintf('Adapted symbolrate to %d GBd, to match provided bitrate of %d GBit/s using PAM %d \n',fsym.*1e-9,bitrate.*1e-9, M);
|
||||
if M == 6
|
||||
bitsPerSymbol = 2.5;
|
||||
else
|
||||
bitsPerSymbol = log2(M);
|
||||
if abs(bitsPerSymbol - round(bitsPerSymbol)) > 1e-12
|
||||
error('Unsupported PAM order M=%d. Only powers of two and PAM-6 are supported.', M);
|
||||
end
|
||||
end
|
||||
|
||||
if hasFsym && hasBitrate
|
||||
error('either bitrate or symbolrate!')
|
||||
elseif hasBitrate
|
||||
fsym = bitrate / bitsPerSymbol;
|
||||
else
|
||||
bitrate = fsym * bitsPerSymbol;
|
||||
end
|
||||
|
||||
f_nyquist = fsym/2;
|
||||
|
||||
@@ -114,7 +125,6 @@ Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rc","pulselength",1
|
||||
|
||||
Digi_sig.spectrum("displayname",'Digi Spectrum','fignum',10,'normalizeTo0dB',1);
|
||||
|
||||
|
||||
channel_mode = lower(string(channel_mode));
|
||||
|
||||
switch channel_mode
|
||||
@@ -122,7 +132,7 @@ switch channel_mode
|
||||
|
||||
%%%%% AWG
|
||||
% El_sig = M8199A("kover",kover).process(Digi_sig);
|
||||
El_sig = AWG("fdac",fdac,"f_cutoff",fsym,"lpf_active",0,"kover",kover,"bit_resolution",12,"upsampling_method","samplehold","precomp_sinc_rolloff",1).process(Digi_sig);
|
||||
El_sig = AWG("fdac",fdac,"f_cutoff",fsym,"lpf_active",1,"kover",kover,"bit_resolution",12,"upsampling_method","samplehold","precomp_sinc_rolloff",0).process(Digi_sig);
|
||||
% El_sig.spectrum("displayname",'Digi Spectrum','fignum',100,'normalizeTo0dB',0);
|
||||
% El_sig = El_sig.setPower(0,"dBm");
|
||||
|
||||
@@ -199,7 +209,6 @@ dspParameters.use_vnle_mlse = 1;
|
||||
dspParameters.use_dbtgt = 0;
|
||||
dspParameters.use_dbenc = 0;
|
||||
dspParameters.use_ml_mlse = 0;
|
||||
dspParameters.showAnalysis = 0;
|
||||
dspParameters.pf_ncoeffs = pf_ncoeffs;
|
||||
dspParameters.ffe_order_ffe = [50, 0, 0];
|
||||
dspParameters.ffe_order_dfe = [50, 0, 0];
|
||||
@@ -217,7 +226,7 @@ scopeOutput = dsp_scope_signal(Rx_sig, Symbols, Tx_bits, ...
|
||||
"parameters", dspParameters, ...
|
||||
"preprocess_mode", "auto", ...
|
||||
"tx_pulseformer", txPulseformer, ...
|
||||
"debug_plots", false);
|
||||
"debug_plots", true);
|
||||
|
||||
output = struct();
|
||||
output.ffe_results = scopeOutput.ffe_package;
|
||||
@@ -230,3 +239,4 @@ output.mlmlse_results = scopeOutput.mlmlse_package;
|
||||
|
||||
disp('- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ')
|
||||
fprintf('\n')
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user