mirror of https://github.com/drowe67/codec2.git
268 lines
8.8 KiB
Matlab
268 lines
8.8 KiB
Matlab
% snr_curves_plot.m
|
|
%
|
|
% Companion script for unittest/raw_data_curves
|
|
|
|
1;
|
|
|
|
function state_vec = set_graphics_state_print()
|
|
textfontsize = get(0,"defaulttextfontsize");
|
|
linewidth = get(0,"defaultlinelinewidth");
|
|
markersize = get(0, "defaultlinemarkersize");
|
|
set(0, "defaulttextfontsize", 16);
|
|
set(0, "defaultaxesfontsize", 16);
|
|
set(0, "defaultlinelinewidth", 1);
|
|
state_vec = [textfontsize linewidth markersize];
|
|
endfunction
|
|
|
|
function set_graphics_state_screen(state_vec)
|
|
textfontsize = state_vec(1);
|
|
linewidth = state_vec(2);
|
|
markersize = state_vec(3);
|
|
set(0, "defaulttextfontsize", textfontsize);
|
|
set(0, "defaultaxesfontsize", textfontsize);
|
|
set(0, "defaultlinelinewidth", linewidth);
|
|
set(0, "defaultlinemarkersize", markersize);
|
|
endfunction
|
|
|
|
function [snr_ch per] = snr_scatter(source, mode, channel, colour)
|
|
suffix = sprintf("_%s_%s_%s",source, mode, channel);
|
|
snr = load(sprintf("snr%s.txt",suffix));
|
|
offset = load(sprintf("offset%s.txt",suffix));
|
|
snr -= offset;
|
|
snr_x = []; snrest_y = [];
|
|
for i=1:length(snr)
|
|
fn = sprintf('snrest%s_%d.txt',suffix,i);
|
|
if exist(fn,'file') == 2
|
|
snrest=load(fn);
|
|
if i == length(snr)
|
|
plot(snr(i)*ones(1,length(snrest)), snrest, sprintf('%s;%s %s;',colour,source,mode));
|
|
else
|
|
plot(snr(i)*ones(1,length(snrest)), snrest, sprintf('%s',colour));
|
|
end
|
|
snr_x = [snr_x snr(i)]; snrest_y = [snrest_y mean(snrest)];
|
|
end
|
|
end
|
|
plot(snr_x, snrest_y, sprintf('%s', colour));
|
|
endfunction
|
|
|
|
function [snr_ch per] = per_snr(mode, colour)
|
|
snrch = load(sprintf("snrch_%s.txt",mode));
|
|
snroffset = load(sprintf("snroffset_%s.txt",mode));
|
|
snrch -= snroffset;
|
|
per = load(sprintf("per_%s.txt",mode));
|
|
plot(snrch, per, sprintf('%so-;%s;', colour, mode));
|
|
endfunction
|
|
|
|
function snrest_snr_screen(source, channel)
|
|
clf; hold on;
|
|
snr_scatter(source, 'datac0', channel,'b+-')
|
|
snr_scatter(source, 'datac1', channel,'g+-')
|
|
snr_scatter(source, 'datac3', channel,'r+-')
|
|
snr_scatter(source, 'datac4', channel,'c+-')
|
|
snr_scatter(source, 'datac13', channel,'m+-')
|
|
xlabel('SNR (dB)'); ylabel('SNRest (dB)'); grid('minor');
|
|
axis([-12 12 -12 12]);
|
|
a = axis;
|
|
plot([a(1) a(2)],[a(1) a(2)],'bk-');
|
|
hold off; grid;
|
|
if strcmp(source,'ctx')
|
|
title(sprintf('SNR estimate versus SNR (%s) (no compression)', channel));
|
|
else
|
|
title(sprintf('SNR estimate versus SNR (%s) (with compression)', channel));
|
|
end
|
|
legend('location','northwest');
|
|
endfunction
|
|
|
|
function snrest_snr_print(source, channel)
|
|
state_vec = set_graphics_state_print();
|
|
snrest_snr_screen(source, channel);
|
|
print(sprintf("snrest_snr_%s.png", source), "-dpng", "-S1000,800");
|
|
set_graphics_state_screen(state_vec);
|
|
endfunction
|
|
|
|
function ber_per_v_snr(source, mode, channel, colour)
|
|
suffix = sprintf("_%s_%s_%s.txt",source, mode, channel);
|
|
snr = load(sprintf("snr%s",suffix));
|
|
offset = load(sprintf("offset%s",suffix));
|
|
snr -= offset;
|
|
ber = load(sprintf("ber%s",suffix)) + 1E-6;
|
|
per = load(sprintf("per%s",suffix)) + 1E-6;
|
|
semilogy(snr, ber, sprintf('%s;%s %s ber;', colour, source, mode));
|
|
semilogy(snr, per, sprintf('%s;%s %s per;', colour, source, mode),'linewidth',3,'markersize',10);
|
|
endfunction
|
|
|
|
function per_v_snr(source, mode, channel, colour)
|
|
suffix = sprintf("_%s_%s_%s.txt",source, mode, channel);
|
|
snr = load(sprintf("snr%s",suffix));
|
|
offset = load(sprintf("offset%s",suffix));
|
|
snr -= offset;
|
|
per = load(sprintf("per%s",suffix)) + 1E-6;
|
|
if strcmp(channel,"awgn")
|
|
semilogy(snr, per, sprintf('%s;%s %s;', colour, mode, channel));
|
|
else
|
|
semilogy(snr, per, sprintf('%s;%s %s;', colour, mode, channel),'linewidth',3,'markersize',10);
|
|
end
|
|
endfunction
|
|
|
|
function thruput_v_snr(source, mode, channel, colour)
|
|
suffix = sprintf("_%s_%s_%s.txt",source, mode, channel);
|
|
snr = load(sprintf("snr%s",suffix));
|
|
offset = load(sprintf("offset%s",suffix));
|
|
snr -= offset;
|
|
per = load(sprintf("per%s",suffix)) + 1E-6;
|
|
if strcmp(mode,"datac0") Rb=291; end;
|
|
if strcmp(mode,"datac1") Rb=980; end;
|
|
if strcmp(mode,"datac3") Rb=321; end;
|
|
if strcmp(mode,"datac4") Rb=87; end;
|
|
if strcmp(mode,"datac13") Rb=65; end;
|
|
if strcmp(mode,"datac14") Rb=58; end;
|
|
if strcmp(channel,"awgn")
|
|
plot(snr, Rb*(1-per), sprintf('%s;%s %s;', colour, mode, channel));
|
|
else
|
|
plot(snr, Rb*(1-per), sprintf('%s;%s %s;', colour, mode, channel),'linewidth',3,'markersize',10);
|
|
end
|
|
endfunction
|
|
|
|
function octave_ch_noise_screen(channel)
|
|
clf; hold on;
|
|
ber_per_v_snr('oct','datac0',channel,'bo-')
|
|
ber_per_v_snr('ch' ,'datac0',channel,'bx-')
|
|
ber_per_v_snr('oct','datac1',channel,'go-')
|
|
ber_per_v_snr('ch' ,'datac1',channel,'gx-')
|
|
ber_per_v_snr('oct','datac3',channel,'ro-')
|
|
ber_per_v_snr('ch' ,'datac3',channel,'rx-')
|
|
xlabel('SNR (dB)'); grid;
|
|
hold off;
|
|
if strcmp(channel,"awgn")
|
|
axis([-6 8 1E-3 1]);
|
|
else
|
|
axis([-2 12 1E-3 1]);
|
|
end
|
|
title(sprintf('Comparsion of Measuring SNR from Octave and ch tool (%s)', channel));
|
|
endfunction
|
|
|
|
function octave_ch_noise_print(channel)
|
|
state_vec = set_graphics_state_print();
|
|
octave_ch_noise_screen(channel);
|
|
print(sprintf("octave_ch_noise_%s.png", channel), "-dpng","-S1000,800");
|
|
set_graphics_state_screen(state_vec);
|
|
endfunction
|
|
|
|
function octave_c_tx_screen(channel)
|
|
clf; hold on;
|
|
ber_per_v_snr('oct','datac0',channel,'bo-')
|
|
ber_per_v_snr('ctx','datac0',channel,'bx-')
|
|
ber_per_v_snr('oct','datac1',channel,'go-')
|
|
ber_per_v_snr('ctx','datac1',channel,'gx-')
|
|
ber_per_v_snr('oct','datac3',channel,'ro-')
|
|
ber_per_v_snr('ctx','datac3',channel,'rx-')
|
|
xlabel('SNR (dB)'); grid;
|
|
hold off;
|
|
if strcmp(channel,"awgn")
|
|
axis([-6 8 1E-3 1]);
|
|
else
|
|
axis([-2 12 1E-3 1]);
|
|
end
|
|
title(sprintf('Comparsion of Octave Tx and C Tx (no compression) (%s)', channel));
|
|
endfunction
|
|
|
|
function octave_c_tx_print(channel)
|
|
state_vec = set_graphics_state_print();
|
|
octave_c_tx_screen(channel);
|
|
print(sprintf("octave_c_tx_%s.png", channel), "-dpng","-S1000,800");
|
|
set_graphics_state_screen(state_vec);
|
|
endfunction
|
|
|
|
function octave_c_tx_comp_screen(channel)
|
|
clf; hold on;
|
|
ber_per_v_snr('oct','datac0',channel,'bo-')
|
|
ber_per_v_snr('ctxc','datac0',channel,'bx-')
|
|
ber_per_v_snr('oct','datac1',channel,'go-')
|
|
ber_per_v_snr('ctxc','datac1',channel,'gx-')
|
|
ber_per_v_snr('oct','datac3',channel,'ro-')
|
|
ber_per_v_snr('ctxc','datac3',channel,'rx-')
|
|
xlabel('SNR (dB)'); grid;
|
|
hold off;
|
|
if strcmp(channel,"awgn")
|
|
axis([-6 8 1E-3 1]);
|
|
else
|
|
axis([-2 12 1E-3 1]);
|
|
end
|
|
title(sprintf('Comparsion of Octave Tx and C Tx (with compression) (%s)', channel));
|
|
endfunction
|
|
|
|
function octave_c_tx_comp_print(channel)
|
|
state_vec = set_graphics_state_print();
|
|
octave_c_tx_comp_screen(channel);
|
|
print(sprintf("octave_c_tx_comp_%s.png", channel), "-dpng","-S1000,800");
|
|
set_graphics_state_screen(state_vec);
|
|
endfunction
|
|
|
|
% composite AWGN and MPP for compressed
|
|
function c_tx_comp_screen
|
|
clf; hold on;
|
|
per_v_snr('ctxc','datac0','awgn','bo-')
|
|
per_v_snr('ctxc','datac1','awgn','go-')
|
|
per_v_snr('ctxc','datac3','awgn','ro-')
|
|
per_v_snr('ctxc','datac4','awgn','co-')
|
|
per_v_snr('ctxc','datac13','awgn','mo-')
|
|
per_v_snr('ctxc','datac14','awgn','ko-')
|
|
per_v_snr('ctxc','datac0','mpp','bx-')
|
|
per_v_snr('ctxc','datac1','mpp','gx-')
|
|
per_v_snr('ctxc','datac3','mpp','rx-')
|
|
per_v_snr('ctxc','datac4','mpp','cx-')
|
|
per_v_snr('ctxc','datac13','mpp','mx-')
|
|
per_v_snr('ctxc','datac14','mpp','kx-')
|
|
xlabel('SNR (dB)'); ylabel('PER'); grid;
|
|
hold off;
|
|
axis([-10 14 1E-3 1]);
|
|
title('PER of C Raw Data Modes (with compression)');
|
|
endfunction
|
|
|
|
function c_tx_comp_print;
|
|
state_vec = set_graphics_state_print();
|
|
c_tx_comp_screen;
|
|
print("c_tx_comp.png", "-dpng","-S1000,800");
|
|
set_graphics_state_screen(state_vec);
|
|
endfunction
|
|
|
|
function c_tx_comp_thruput_screen
|
|
clf; hold on;
|
|
thruput_v_snr('ctxc','datac0','awgn','bo-')
|
|
thruput_v_snr('ctxc','datac1','awgn','go-')
|
|
thruput_v_snr('ctxc','datac3','awgn','ro-')
|
|
thruput_v_snr('ctxc','datac4','awgn','co-')
|
|
thruput_v_snr('ctxc','datac13','awgn','mo-')
|
|
thruput_v_snr('ctxc','datac14','awgn','ko-')
|
|
thruput_v_snr('ctxc','datac0','mpp','bx-')
|
|
thruput_v_snr('ctxc','datac1','mpp','gx-')
|
|
thruput_v_snr('ctxc','datac3','mpp','rx-')
|
|
thruput_v_snr('ctxc','datac4','mpp','cx-')
|
|
thruput_v_snr('ctxc','datac13','mpp','mx-')
|
|
thruput_v_snr('ctxc','datac14','mpp','kx-')
|
|
xlabel('SNR (dB)'); ylabel('bits/s'); grid;
|
|
hold off;
|
|
axis([-10 10 0 1000]);
|
|
title(' Throughput for C Tx (with compression)');
|
|
legend('location','west');
|
|
endfunction
|
|
|
|
function c_tx_comp_thruput_print;
|
|
state_vec = set_graphics_state_print;
|
|
c_tx_comp_thruput_screen;
|
|
print("c_tx_comp_thruput.png", "-dpng","-S1000,800");
|
|
set_graphics_state_screen(state_vec);
|
|
endfunction
|
|
|
|
#{
|
|
figure(1); octave_ch_noise_screen;
|
|
figure(2); octave_c_tx_screen;
|
|
figure(3); octave_c_tx_comp_screen
|
|
figure(4); snrest_snr_screen;
|
|
|
|
figure(5); octave_ch_noise_print;
|
|
figure(6); octave_c_tx_print;
|
|
figure(7); octave_c_tx_comp_print;
|
|
figure(8); snrest_snr_print;
|
|
#}
|