% 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