M = 4; apply_precode_at_tx = 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 if M == 6 bitpattern = reshape(bitpattern',[],1); bitpattern = bitpattern(1:end-mod(length(bitpattern),5)); end bits = Informationsignal(bitpattern); symbols = PAMmapper(M,0).map(bits); if apply_precode_at_tx symbols_tx = Duobinary().precode(symbols); else symbols_tx = symbols; end disp(['Tx Sequenz: -- RMS:',sprintf('%.1f',rms(symbols_tx.signal)),' - - Levels -',num2str(numel(unique(symbols_tx.signal)))]); unique(symbols_tx.signal) disp('- - - - - - - - - -'); symbols_tx.signal = awgn(symbols_tx.signal,20,"measured",1); % show2Dconstellation(symbols_tx,symbols_tx,"displayname",'VNLE Out','fignum',2241); if apply_precode_at_tx % 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(symbols_tx); disp(['DB encoded -- RMS:',sprintf('%.1f',rms(symbols_db.signal)),' - - Levels -',num2str(numel(unique(symbols_db.signal)))]); unique(symbols_db.signal) disp('- - - - - - - - - -'); % Entschiedene codierte Symbole decodieren: d_dec(n) = d_DB(n) mod4 symbols_rx = Duobinary().decode(symbols_db); else symbols_db = Duobinary().encode(symbols_tx); symbols_rx = Duobinary().decode(symbols_db); end % Vergleichen von b(n) und d_dec(n) bits_rx = PAMmapper(M,0).demap(symbols_rx); disp(['Wieder normal -- RMS:',sprintf('%.1f',rms(symbols_rx.signal)),' - - Levels -',num2str(numel(unique(symbols_rx.signal)))]); unique(symbols_rx.signal) disp('- - - - - - - - - -'); [~,~,ber,~] = calc_ber(bits.signal,bits_rx.signal,"skip_front",10,"skip_end",10,"returnErrorLocation",1); disp(['BER: ',sprintf('%.1E',ber),' - - PAM-',num2str(M)]); figure() subplot(1,2,1) histogram(symbols_tx.signal,100,'Normalization','count') subplot(1,2,2) histogram(symbols_db.signal,100,'Normalization','count')