Files
imdd_silas/test/memoryless_decoding.m
2026-02-23 09:17:26 +01:00

76 lines
2.7 KiB
Matlab

% einstellungen
M = 4;
apply_precode_at_tx = 0;
emulate_precode = 1;
% daten erzeugen
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
if M == 6
bitpattern = reshape(bitpattern',[],1);
bitpattern = bitpattern(1:end-mod(length(bitpattern),5));
end
tx_bits = Informationsignal(bitpattern);
tx_symbols = PAMmapper(M,0).map(tx_bits);
if apply_precode_at_tx
tx_symbols = Duobinary().precode(tx_symbols);
if emulate_precode
% ansatz 1B) Omit precode (einfach precoded empfangen, nichts weiter machen und normal prozessieren - möglich weil konstellation sich nicht ändert)
rx_symbols = tx_symbols;
bits_rx = PAMmapper(M,0).demap(rx_symbols);
% beachten, dass man die tx_bits anpassen muss, da man ja mit precoded symbolen vergleicht
tx_bits = PAMmapper(M,0).demap(tx_symbols);
else
% ansatz 1A) Precode normal:
% Entschiedene Symbole codieren: d_DB(n) = d(n) + d(n-1) (im Fall von PAM4 7 level [0 1 2 3 4 5 6])
symbols_db = Duobinary().encode(tx_symbols);
% Entschiedene codierte Symbole decodieren: d_dec(n) = d_DB(n) mod4
rx_symbols = Duobinary().decode(symbols_db);
bits_rx = PAMmapper(M,0).demap(rx_symbols);
end
[~,~,ber,~] = calc_ber(tx_bits.signal,bits_rx.signal,"skip_front",0,"skip_end",0,"returnErrorLocation",1);
disp(['BER: ',sprintf('%.1E',ber)]);
assert(ber == 0)
else
if emulate_precode
% emulate 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])
symbols_db = Duobinary().encode(tx_symbols); % das wäre der FFE mit db target
% Entschiedene codierte Symbole decodieren: d_dec(n) = d_DB(n) mod4
rx_symbols = Duobinary().decode(symbols_db); % modulo
bits_rx = PAMmapper(M,0).demap(rx_symbols); % demappen
% ref symbole precoden, auch hier muss man wieder etwas fummeln wegen der emulation:
% encode + decode == remove precoding (mathematisch die gleiche operation)
tx_symbols_ref = Duobinary().encode(tx_symbols);
tx_symbols_ref = Duobinary().decode(tx_symbols_ref);
tx_bits = PAMmapper(M,0).demap(tx_symbols_ref);
else
% normal detection without any precode stuff
symbols_db = Duobinary().encode(tx_symbols);
rx_symbols = tx_symbols;
bits_rx = PAMmapper(M,0).demap(rx_symbols);
end
[~,~,ber,~] = calc_ber(tx_bits.signal,bits_rx.signal,"skip_front",1,"skip_end",1,"returnErrorLocation",1);
disp(['BER: ',sprintf('%.1E',ber)]);
assert(ber == 0)
end