Working from home on zürich DSP.

This commit is contained in:
silas (home)
2025-03-10 08:56:17 +01:00
parent affdb4ad6f
commit bc86fa8d98
22 changed files with 459 additions and 137 deletions

View File

@@ -71,20 +71,17 @@ classdef PAMsource
function [digi_sig,symbols,bits] = process(obj) function [digi_sig,symbols,bits] = process(obj)
%%%%% PRBS Generation in correct shape for Modulation Format %%%%%% %%%%% PRBS Generation in correct shape for Modulation Format %%%%%%
O = obj.order; %order of prbs
N = 2^(O-1); %length of prbs
[~,seed] = prbs(O,1); %initialize first seed of prbs
bitpattern=[]; bitpattern=[];
if obj.useprbs if obj.useprbs
% for i = 1:log2(obj.M) % O = obj.order; %order of prbs
% [bitpattern(:,i),seed] = prbs(O,N,seed); % N = 2^(O-1); %length of prbs
% end % [~,seed] = prbs(O,1); %initialize first seed of prbs
% % for i = 1:log2(obj.M)
% % [bitpattern(:,i),seed] = prbs(O,N,seed);
% % end
%%%%% MOVE-IT PRMS %%%% %%%%% MOVE-IT PRMS %%%%
state = struct(); state = struct();
para = struct(); para = struct();
@@ -155,24 +152,46 @@ classdef PAMsource
sym_max = max(symbols.signal); sym_max = max(symbols.signal);
end end
% symbols.spectrum("fignum",111,"displayname","1) RAW SIGNAL");
pulsf = Moveit_wrapper('pulsef');
pulsf.para.alpharacos = obj.pulseformer.alpha;
pulsf.para.f_sym = obj.fsym;
pulsf.para.fs = obj.fsym;
pulsf.para.pulse = 'racos';
pulsf.process(symbols);
%%%%% Pulse-forming %%%%%% %%%%% Pulse-forming %%%%%%
if obj.applypulseform if obj.applypulseform
%%% MY CODE
digi_sig = obj.pulseformer.process(symbols); digi_sig = obj.pulseformer.process(symbols);
%%% MOVEIT WRAPPER BETA
% symbols.spectrum("fignum",111,"displayname","1) RAW SIGNAL");
%
% pulsf = Moveit_wrapper('pulsef');
% pulsf.para.alpharacos = obj.pulseformer.alpha;
% pulsf.para.f_sym = obj.fsym;
% pulsf.para.fs = obj.fsym;
% pulsf.para.pulse = 2;
%
% digi_sig = pulsf.process(symbols);
% Design raised cosine filter with given order in symbols
% digi_sig = symbols;
% sps = 4;
% nsym = 128;
% rctFilt3 = comm.RaisedCosineTransmitFilter(...
% Shape='Square root', ...
% RolloffFactor=1, ...
% FilterSpanInSymbols=nsym, ...
% OutputSamplesPerSymbol=sps);
%
% digi_sig.signal = rctFilt3([symbols.signal; zeros(nsym/2,1)]);
% % Correct for propagation delay by removing filter transients
% fltDelay = nsym / (2*obj.fsym);
% digi_sig.signal = digi_sig.signal(fltDelay*sps*obj.fsym+1:end);
%
% digi_sig.fs = sps .* symbols.fs;
else else
digi_sig = symbols; digi_sig = symbols;
end end
% digi_sig.spectrum("fignum",112,"displayname","2) after pulseforming");
%%%%% Re-sample to f DAC %%%%%% %%%%% Re-sample to f DAC %%%%%%
n = 10; n = 10;

View File

@@ -110,7 +110,7 @@ classdef Moveit_wrapper < handle
previousLevel = currentLevel; previousLevel = currentLevel;
% Determine input type from obj.comment.type % Determine input type from obj.comment.type
if if 1
inputType = obj.comment.type.(fieldName); inputType = obj.comment.type.(fieldName);
else else
inputType = 'number'; % Default type inputType = 'number'; % Default type

View File

@@ -9,6 +9,7 @@ arguments
tx_bits tx_bits
options.precode_mode db_mode options.precode_mode db_mode
options.showAnalysis = 0; options.showAnalysis = 0;
options.eth_style_symbol_mapping = 0;
end end
%Duobinary Targeting %Duobinary Targeting
@@ -18,7 +19,7 @@ end
% dir = [1,1]; % dir = [1,1];
mlse_sig_sd = mlse_.process(eq_signal); mlse_sig_sd = mlse_.process(eq_signal);
mlse_sig_hd = PAMmapper(M,0).quantize(mlse_sig_sd); mlse_sig_hd = PAMmapper(M,0,"eth_style",options.eth_style_symbol_mapping).quantize(mlse_sig_sd);
% precoding to mitigate error propagation, most prominently used in % precoding to mitigate error propagation, most prominently used in
% combination with duobinary signaling to avoid catastrophic error % combination with duobinary signaling to avoid catastrophic error
@@ -37,12 +38,12 @@ end
tx_symbols_precoded = Duobinary().encode(tx_symbols); tx_symbols_precoded = Duobinary().encode(tx_symbols);
tx_symbols_precoded = Duobinary().decode(tx_symbols_precoded); tx_symbols_precoded = Duobinary().decode(tx_symbols_precoded);
tx_bits = PAMmapper(M,0).demap(tx_symbols_precoded); tx_bits = PAMmapper(M,0,"eth_style",options.eth_style_symbol_mapping).demap(tx_symbols_precoded);
case db_mode.db_discard case db_mode.db_discard
% normal dsp for precoded sequence == discard/omit/ignore precode % normal dsp for precoded sequence == discard/omit/ignore precode
tx_bits = PAMmapper(M,0).demap(tx_symbols); tx_bits = PAMmapper(M,0,"eth_style",options.eth_style_symbol_mapping).demap(tx_symbols);
case db_mode.db_encoded case db_mode.db_encoded
@@ -56,7 +57,7 @@ end
end end
% M = numel(unique(tx_symbols.signal)); % M = numel(unique(tx_symbols.signal));
rx_bits = PAMmapper(M,0).demap(mlse_sig_hd); rx_bits = PAMmapper(M,0,"eth_style",options.eth_style_symbol_mapping).demap(mlse_sig_hd);
[~,numErrors,ber,~] = calc_ber(rx_bits.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1); [~,numErrors,ber,~] = calc_ber(rx_bits.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
@@ -66,11 +67,15 @@ end
if options.showAnalysis if options.showAnalysis
eq_noise = eq_noise - mean(eq_noise.signal); eq_noise = eq_noise - mean(eq_noise.signal);
rx_signal.spectrum("normalizeTo0dB",1,"fignum",250); rx_signal.spectrum("normalizeTo0dB",1,"fignum",250,"displayname","Rx Spectrum");
Duobinary().encode(tx_symbols).spectrum("normalizeTo0dB",1,"fignum",250,"displayname","DB encoded reference");
showEQNoisePSD(eq_noise,"fignum",250,"displayname",'Duobinary Target Noise after Equalization');
fprintf('DB tgt BER: %.2e \n',ber);
showEQNoisePSD(eq_noise,"fignum",250,"displayname",'Duobinary Target Noise');
Duobinary().encode(tx_symbols).spectrum("normalizeTo0dB",1,"fignum",250);
end end

View File

@@ -74,20 +74,21 @@ function [eq_package] = vnle(eq_,M,rx_signal,tx_symbols,tx_bits,options)
[~,numErrors,ber,~] = calc_ber(rx_bits.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1); [~,numErrors,ber,~] = calc_ber(rx_bits.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
[evm_total,evm_lvl] = calc_evm(eq_signal_sd,tx_symbols); [evm_total,evm_lvl] = calc_evm(eq_signal_sd,tx_symbols);
[inf_rate] = calc_air(eq_signal_sd,tx_symbols,"skip_front",10000,"skip_end",10000); [inf_rate] = calc_air(eq_signal_sd,tx_symbols,"skip_front",10000,"skip_end",10000);
snr(eq_signal_sd.signal,eq_noise.signal)
eq_package.ber_vnle = ber; eq_package.ber_vnle = ber;
eq_package.evm_total = evm_total; eq_package.evm_total = evm_total;
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); eq_package.snr = snr(eq_signal_sd.signal,eq_noise.signal);
eq_package.signal = eq_signal_sd;
if options.showAnalysis if options.showAnalysis
snr(eq_signal_sd.signal,eq_noise.signal); fprintf('SNR: %d dB \n',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);

View File

@@ -10,6 +10,7 @@ arguments
tx_bits tx_bits
options.precode_mode db_mode options.precode_mode db_mode
options.showAnalysis = 0; options.showAnalysis = 0;
options.eth_style_symbol_mapping = 0;
end end
%FFE or VNLE %FFE or VNLE
@@ -23,7 +24,7 @@ end
% [mlse_sig_hd,mlse_sig_sd] = mlse_.process(mlse_sig_sd,tx_symbols); % [mlse_sig_hd,mlse_sig_sd] = mlse_.process(mlse_sig_sd,tx_symbols);
mlse_sig_sd = mlse_.process(mlse_sig_sd); mlse_sig_sd = mlse_.process(mlse_sig_sd);
mlse_sig_hd = PAMmapper(M,0).quantize(mlse_sig_sd); mlse_sig_hd = PAMmapper(M,0,"eth_style",options.eth_style_symbol_mapping).quantize(mlse_sig_sd);
% precoding to mitigate error propagation, most prominently used in % precoding to mitigate error propagation, most prominently used in
% combination with duobinary signaling to avoid catastrophic error % combination with duobinary signaling to avoid catastrophic error
@@ -46,12 +47,12 @@ end
tx_symbols_precoded = Duobinary().encode(tx_symbols); tx_symbols_precoded = Duobinary().encode(tx_symbols);
tx_symbols_precoded = Duobinary().decode(tx_symbols_precoded); tx_symbols_precoded = Duobinary().decode(tx_symbols_precoded);
tx_bits = PAMmapper(M,0).demap(tx_symbols_precoded); tx_bits = PAMmapper(M,0,"eth_style",options.eth_style_symbol_mapping).demap(tx_symbols_precoded);
case db_mode.db_discard case db_mode.db_discard
% normal dsp for precoded sequence == discard/omit/ignore precode % normal dsp for precoded sequence == discard/omit/ignore precode
tx_bits = PAMmapper(M,0).demap(tx_symbols); tx_bits = PAMmapper(M,0,"eth_style",options.eth_style_symbol_mapping).demap(tx_symbols);
case db_mode.db_encoded case db_mode.db_encoded
@@ -68,7 +69,7 @@ end
end end
% METRICS OF VNLE % % METRICS OF VNLE %
rx_bits_vnle = PAMmapper(M,0).demap(eq_signal_hd); rx_bits_vnle = PAMmapper(M,0,"eth_style",options.eth_style_symbol_mapping).demap(eq_signal_hd);
[~,~,ber_vnle,~] = calc_ber(rx_bits_vnle.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1); [~,~,ber_vnle,~] = calc_ber(rx_bits_vnle.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);
% correct TUM implementation of AIR % correct TUM implementation of AIR
@@ -76,7 +77,7 @@ end
[evm_vnle_total,evm_vnle_lvl] = calc_evm(eq_signal_sd,tx_symbols); [evm_vnle_total,evm_vnle_lvl] = calc_evm(eq_signal_sd,tx_symbols);
% METRICS OF MLSE (HD-VITERBI) % METRICS OF MLSE (HD-VITERBI)
rx_bits_mlse = PAMmapper(M,0).demap(mlse_sig_hd); rx_bits_mlse = PAMmapper(M,0,"eth_style",options.eth_style_symbol_mapping).demap(mlse_sig_hd);
[~,~,ber_mlse,~] = calc_ber(rx_bits_mlse.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1); [~,~,ber_mlse,~] = calc_ber(rx_bits_mlse.signal,tx_bits.signal,"skip_front",100,"skip_end",150,"returnErrorLocation",1);

View File

@@ -6,20 +6,13 @@ if 1
uloops.precomp = [0]; uloops.precomp = [0];
uloops.db_precode = [0]; uloops.db_precode = [0];
uloops.bitrate = [330].*1e9; %[300,330,360,390,420,450,480] 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.laser_wavelength = [1310];
uloops.M = [6]; 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",0); wh = submit_simulations(wh,"parallel",0,"simulation_mode",1);
end end
wh_ana = wh; wh_ana = wh;

View File

@@ -35,7 +35,7 @@ tx_bw_nyquist = 0.8;
link_length = 1; link_length = 1;
% RX % RX
rop = -8; rop = -5;
rx_bw_nyquist = 0.8; rx_bw_nyquist = 0.8;
vnle_order1 = 50; vnle_order1 = 50;
@@ -61,7 +61,7 @@ mu_dfe = 0.0004;
dfe_ = sum(dfe_order)>0; dfe_ = sum(dfe_order)>0;
doub_mode = db_mode.db_precoded; doub_mode = db_mode.no_db;
%%% change specific parameter if given in varargin %%% change specific parameter if given in varargin
% Parse optional input arguments % Parse optional input arguments
@@ -132,10 +132,14 @@ f_nyquist = fsym/2;
%%% run the simulation or measurement or ... %%% run the simulation or measurement or ...
if simulation_mode if simulation_mode
Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"rrcalpha",rcalpha); rcalpha = 1;
Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"alpha",rcalpha);
db_precode = 0;
db_encode = 0;
apply_pulsef = 1;
[Digi_sig,Symbols,Tx_bits] = PAMsource(... [Digi_sig,Symbols,Tx_bits] = PAMsource(...
"fsym",fsym,"M",M,"order",16,"useprbs",0,... "fsym",fsym,"M",M,"order",18,"useprbs",1,...
"fs_out",fdac,... "fs_out",fdac,...
"applyclipping",0,"clipfactor",1.5,... "applyclipping",0,"clipfactor",1.5,...
"applypulseform",apply_pulsef,"pulseformer",Pform,... "applypulseform",apply_pulsef,"pulseformer",Pform,...
@@ -143,7 +147,7 @@ if simulation_mod