BCJR implementation
WDM code added (Pol Cont., Opt MUX/DEMUX, Opt Atten, DP_Fiber) -> the codebase is not optimized to always work with dp signals!
This commit is contained in:
@@ -1,65 +1,49 @@
|
||||
useprbs = 1;
|
||||
|
||||
|
||||
M = 6;
|
||||
randkey = 1;
|
||||
datarate = 224e9;
|
||||
fsym = round(datarate / log2(M)) ;
|
||||
apply_precode = 1;
|
||||
|
||||
db_pre = 1;
|
||||
bitpattern = [];
|
||||
s = RandStream('twister','Seed',1);
|
||||
for i = 1:log2(M)
|
||||
N = 2^(17-1); %length of prbs
|
||||
bitpattern(:,i) = randi(s,[0 1], N, 1);
|
||||
end
|
||||
|
||||
Pform = Pulseformer("fsym",fsym,"fdac",4*fsym,"pulse","rrc","pulselength",16,"rrcalpha",0.05);
|
||||
if M == 6
|
||||
bitpattern = reshape(bitpattern',[],1);
|
||||
bitpattern = bitpattern(1:end-mod(length(bitpattern),5));
|
||||
end
|
||||
|
||||
[d,Symbols,Bits] = PAMsource(...
|
||||
"fsym",fsym,"M",M,"order",17,"useprbs",1,...
|
||||
"fs_out",fsym,...
|
||||
"applyclipping",0,"clipfactor",1.5,...
|
||||
"applypulseform",0,"pulseformer",Pform,...
|
||||
"randkey",1,...
|
||||
"db_precode",db_pre,"db_encode",0,...
|
||||
"mrds_code",0,"mrds_blocklength",512).process();
|
||||
bits = Informationsignal(bitpattern);
|
||||
|
||||
%%%CHANNEL
|
||||
symbols = PAMmapper(M,0).map(bits);
|
||||
|
||||
% s = RandStream('twister','Seed',2);
|
||||
% start = 10000;
|
||||
% burstwidth = 100;
|
||||
% d_burst = d;
|
||||
% for pos = start:start+burstwidth
|
||||
% lvls = 1.5 .* PAMmapper(M,0).levels / rms(PAMmapper(M,0).levels);
|
||||
% d_burst.signal(pos) = d.signal(pos)+randn(s,1,1);
|
||||
% end
|
||||
bits_rx = PAMmapper(M,0).demap(symbols);
|
||||
[~,~,ber_direct,~] = calc_ber(bits.signal,bits_rx.signal,"skip_front",0,"skip_end",0,"returnErrorLocation",1);
|
||||
|
||||
d_resample = d.resample("fs_out",2.*fsym);
|
||||
if apply_precode
|
||||
symbols_tx = Duobinary().precode(symbols);
|
||||
else
|
||||
symbols_tx = symbols;
|
||||
end
|
||||
|
||||
eq_ffe = FFE("epochs_tr",5,"epochs_dd",5,"len_tr",1024,"mu_dd",0.0004,"mu_tr",0,"order",25,"sps",2,"decide",1);
|
||||
d_eq = eq_ffe.process(d_resample,Symbols);
|
||||
show2Dconstellation(symbols_tx,symbols_tx,"displayname",'VNLE Out','fignum',2241);
|
||||
|
||||
|
||||
% s = RandStream('twister','Seed',2);
|
||||
% start = 10000;
|
||||
% burstwidth = 100;
|
||||
% d_burst = d_eq;
|
||||
% for pos = start:start+burstwidth
|
||||
% lvls = 1.5 .* PAMmapper(M,0).levels / rms(PAMmapper(M,0).levels);
|
||||
% d_burst.signal(pos) = d_eq.signal(pos)+randn(s,1,1);
|
||||
% end
|
||||
%
|
||||
% d_burst = PAMmapper(M,0).decide_pamlevel(d_burst);
|
||||
|
||||
if db_pre
|
||||
if apply_precode
|
||||
% Entschiedene Symbole codieren: d_DB(n) = d(n) + d(n-1) (im Fall von PAM4 7 level [0 1 2 3 4 5 6])
|
||||
d_db = Duobinary().encode(d);
|
||||
symbols_db = Duobinary().encode(symbols_tx);
|
||||
|
||||
% Entschiedene codierte Symbole decodieren: d_dec(n) = d_DB(n) mod4
|
||||
d_dec = Duobinary().decode(d_db);
|
||||
symbols_rx = Duobinary().decode(symbols_db);
|
||||
else
|
||||
d_dec = d_burst;
|
||||
symbols_rx = symbols_tx;
|
||||
end
|
||||
|
||||
% Vergleichen von b(n) und d_dec(n)
|
||||
Rx_bits = PAMmapper(M,0).demap(d_dec);
|
||||
|
||||
Tx_bits = Bits;
|
||||
|
||||
[~,error_num,ber,error_pos] = calc_ber(Tx_bits.signal,Rx_bits.signal,"skip_front",0,"skip_end",0,"returnErrorLocation",1);
|
||||
bits_rx = PAMmapper(M,0).demap(symbols_rx);
|
||||
[~,~,ber,~] = calc_ber(bits.signal,bits_rx.signal,"skip_front",10,"skip_end",10,"returnErrorLocation",1);
|
||||
|
||||
disp(['BER: ',sprintf('%.1E',ber),' - - PAM-',num2str(M)]);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user