aboutsummaryrefslogtreecommitdiff
path: root/octave
diff options
context:
space:
mode:
authordrowe67 <[email protected]>2024-05-06 06:19:24 +0930
committerDavid Rowe <[email protected]>2024-05-06 06:19:24 +0930
commite9f64066a5fb8079cc8d217a4c494930ffda2bf4 (patch)
treeec4171cd3f2b16179545e96b00186cff48c772f7 /octave
parentaebdd11464a6632c9722cf2db2a4494437404674 (diff)
parentd21ff74c5f830a275d291a00043b2526a1bf9e62 (diff)
merge with main and fix conflict (I hope)dr-codec2-doc
Diffstat (limited to 'octave')
-rw-r--r--octave/ofdm_helper.m3
-rw-r--r--octave/ofdm_lib.m2
-rw-r--r--octave/ofdm_mode.m22
-rw-r--r--octave/ofdm_rx.m4
-rw-r--r--octave/snr_curves_plot.m267
5 files changed, 294 insertions, 4 deletions
diff --git a/octave/ofdm_helper.m b/octave/ofdm_helper.m
index b34ec23..38c0248 100644
--- a/octave/ofdm_helper.m
+++ b/octave/ofdm_helper.m
@@ -44,7 +44,8 @@ function print_config(states)
printf("Nc=%d Ts=%4.3f Tcp=%4.3f Ns: %d Np: %d\n", Nc, 1/Rs, Tcp, Ns, Np);
printf("Nsymperframe: %d Nbitsperpacket: %d Nsamperframe: %d Ntxtbits: %d Nuwbits: %d Nuwframes: %d\n",
Ns*Nc, Nbitsperpacket, Nsamperframe, Ntxtbits, Nuwbits, Nuwframes);
- printf("uncoded bits/s: %4.1f\n", Nbitsperpacket*Fs/(Np*Nsamperframe));
+ printf("uncoded bits/s: %4.1f Duration (incl post/preamble): %4.2f s\n",
+ Nbitsperpacket*Fs/(Np*Nsamperframe), (Np+2)*Ns*(Tcp+1/Rs));
end
%-----------------------------------------------------------------------
diff --git a/octave/ofdm_lib.m b/octave/ofdm_lib.m
index 2d3a16e..e4ae35a 100644
--- a/octave/ofdm_lib.m
+++ b/octave/ofdm_lib.m
@@ -1254,7 +1254,7 @@ endfunction
% with acquisition
function [rx delay_samples] = ofdm_rx_filter(states, mode, rx)
delay_samples = 0;
- if strcmp(mode,"datac4") || strcmp(mode,"datac13")
+ if strcmp(mode,"datac4") || strcmp(mode,"datac13") || strcmp(mode,"datac14")
w_centre = mean(states.w); centre_norm = w_centre/(2*pi);
n_coeffs = 100;
cutoff_Hz = 400; cutoff_norm = cutoff_Hz/states.Fs;
diff --git a/octave/ofdm_mode.m b/octave/ofdm_mode.m
index 074fd84..d88f960 100644
--- a/octave/ofdm_mode.m
+++ b/octave/ofdm_mode.m
@@ -134,6 +134,18 @@ function config = ofdm_init_mode(mode="700D")
config.state_machine = "data";
config.amp_scale = 2.5*300E3; config.clip_gain1 = 1.2; config.clip_gain2 = 1.0;
config.txbpf_width_Hz = 400;
+ elseif strcmp(mode,"datac14")
+ Ns=5; config.Np=4; Tcp = 0.005; Ts = 0.018; Nc = 4; config.data_mode = "streaming";
+ config.edge_pilots = 0;
+ config.Ntxtbits = 0; config.Nuwbits = 32; config.bad_uw_errors = 12;
+ config.ftwindow_width = 80; config.timing_mx_thresh = 0.45;
+ config.tx_uw = zeros(1,config.Nuwbits);
+ config.tx_uw(1:24) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0];
+ config.tx_uw(end-24+1:end) = [1 1 0 0 1 0 1 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0];
+ config.amp_est_mode = 1; config.EsNodB = 3;
+ config.state_machine = "data";
+ config.amp_scale = 2*300E3; config.clip_gain1 = 2; config.clip_gain2 = 1;
+ config.txbpf_width_Hz = 400;
elseif strcmp(mode,"1")
Ns=5; config.Np=10; Tcp=0; Tframe = 0.1; Ts = Tframe/Ns; Nc = 1;
else
@@ -231,9 +243,17 @@ function [code_param Nbitspercodecframe Ncodecframespermodemframe] = codec_to_fr
code_param.coded_bits_per_frame = code_param.data_bits_per_frame + code_param.ldpc_parity_bits_per_frame;
code_param.coded_syms_per_frame = code_param.coded_bits_per_frame/code_param.bits_per_symbol;
end
+ if strcmp(mode, "datac14")
+ load HRA_56_56.txt
+ code_param = ldpc_init_user(HRA_56_56, modulation, mod_order, mapping);
+ code_param.data_bits_per_frame = 40;
+ code_param.coded_bits_per_frame = code_param.data_bits_per_frame + code_param.ldpc_parity_bits_per_frame;
+ code_param.coded_syms_per_frame = code_param.coded_bits_per_frame/code_param.bits_per_symbol;
+ end
if strcmp(mode, "datac0") || strcmp(mode, "datac1") || strcmp(mode, "datac3") ...
|| strcmp(mode, "datac4") || strcmp(mode, "qam16c1") ...
- || strcmp(mode, "qam16c2") || strcmp(mode, "datac5") || strcmp(mode, "datac13")
+ || strcmp(mode, "qam16c2") || strcmp(mode, "datac5") || strcmp(mode, "datac13") ...
+ || strcmp(mode, "datac14")
printf("ldpc_data_bits_per_frame = %d\n", code_param.ldpc_data_bits_per_frame);
printf("ldpc_coded_bits_per_frame = %d\n", code_param.ldpc_coded_bits_per_frame);
printf("ldpc_parity_bits_per_frame = %d\n", code_param.ldpc_parity_bits_per_frame);
diff --git a/octave/ofdm_rx.m b/octave/ofdm_rx.m
index fea4b33..6dbe8f6 100644
--- a/octave/ofdm_rx.m
+++ b/octave/ofdm_rx.m
@@ -83,7 +83,9 @@ function ofdm_rx(filename, mode="700D", varargin)
Nerrs = 0; rx_uw = zeros(1,states.Nuwbits);
% main loop ----------------------------------------------------------------
-
+
+ rx = ofdm_rx_filter(states, mode, rx);
+
f = 1;
while(prx < Nsam)
diff --git a/octave/snr_curves_plot.m b/octave/snr_curves_plot.m
new file mode 100644
index 0000000..8baafe0
--- /dev/null
+++ b/octave/snr_curves_plot.m
@@ -0,0 +1,267 @@
+% 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;
+#}