for M = [4] bits = Signalgenerator("form", signalform.prms,"M", M,"order", 18).process(); mapper = PAMmapper(M,0); symbols = mapper.map(bits); db = Duobinary(); pr1 = Partialresponse(); symbols_pre = db.precode(symbols); symbols_db = db.encode(symbols_pre); %%% TEST 1 symbols_db_ = awgn_channel(symbols_db,"snr_dB",15); figure(1003042); showLevelHistogram(symbols_db_,symbols_db,"ref_symbol_uncoded",symbols); showLevelHistogram(symbols_db_,symbols_db); symbols_rx = db.decode(symbols_db); bits_rx = PAMmapper(M,0).demap(symbols_rx); [~,~,ber,~] = calc_ber(bits.signal,bits_rx.signal,"skip_front",0,"skip_end",0,"returnErrorLocation",1); disp(['Class BER: ',sprintf('%.1E',ber),' - PAM-',num2str(M)]); symbols_pre_pr = pr1.precode(symbols,"M",M); symbols_db_pr = pr1.encode(symbols_pre_pr,"M",M); %%% TEST 2 symbols_db_pr_ = awgn_channel(symbols_db_pr,"snr_dB",15); figure(1003043); % showLevelHistogram(symbols_db_pr_,symbols_db_pr,"ref_symbol_uncoded",symbols); symbols_rx_pr = pr1.decode(symbols_db_pr,"M",M); bits_rx_pr = mapper.demap(symbols_rx_pr); [~,~,ber_pr,~] = calc_ber(bits.signal,bits_rx_pr.signal,"skip_front",0,"skip_end",0,"returnErrorLocation",1); disp(['Partialresponse BER: ',sprintf('%.1E',ber_pr),' - PAM-',num2str(M)]); pre_match = isequaln(symbols_pre.signal, symbols_pre_pr.signal); enc_match = isequaln(symbols_db.signal, symbols_db_pr.signal); dec_match = isequaln(symbols_rx.signal, symbols_rx_pr.signal); pre_maxdiff = max(abs(symbols_pre.signal - symbols_pre_pr.signal)); enc_maxdiff = max(abs(symbols_db.signal - symbols_db_pr.signal)); dec_maxdiff = max(abs(symbols_rx.signal - symbols_rx_pr.signal)); disp(['Precode match: ',num2str(pre_match), ... ' | max abs diff: ',sprintf('%.3g',pre_maxdiff)]); disp(['Encode match: ',num2str(enc_match), ... ' | max abs diff: ',sprintf('%.3g',enc_maxdiff)]); disp(['Decode match: ',num2str(dec_match), ... ' | max abs diff: ',sprintf('%.3g',dec_maxdiff)]); disp('---'); f = figure("Name",sprintf("PAM-%d Partial-Response Histograms",M)); t = tiledlayout(f,1,4,"TileSpacing","compact","Padding","compact"); title(t,sprintf("PAM-%d Symbol Histograms",M)); nexttile; plotDiscreteHistogram(symbols.signal,sprintf("PAM-%d",M)); nexttile; plotDiscreteHistogram(symbols_db_pr.signal,"Duobinary 1st Order"); nexttile; plotDiscreteHistogram(getEncodedSymbols(symbols,M,2),"Duobinary 2nd Order"); nexttile; plotDiscreteHistogram(getEncodedSymbols(symbols,M,3),"Duobinary 3rd Order"); end function y = getEncodedSymbols(symbols, M, order) pr = Partialresponse("order",order); y = pr.encode(pr.precode(symbols,"M",M),"M",M).signal; end function plotDiscreteHistogram(x, plot_title) levels = unique(x(:)).'; counts = zeros(size(levels)); for idx = 1:numel(levels) counts(idx) = sum(abs(x - levels(idx)) < 1e-12); end bar(levels, counts, 0.9, "FaceColor", [0.2 0.45 0.75], "EdgeColor", "none"); grid on; box on; xlabel("Level"); ylabel("Count"); title(plot_title); xticks(levels); end