Working from home on zürich DSP.
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
|||||||
|
|||||||
Reference in New Issue
Block a user