93 lines
3.2 KiB
Matlab
93 lines
3.2 KiB
Matlab
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
|