blob: 09aa7cac91f43752348e57163690c2b5e2d3ec03 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
# Makefile
# Dec 2022
#
# Automates PER/BER curve generation for raw data mode:
#
# 1. Compare "ch" noise injection/SNR measurement against reference Octave Tx
# 2. Compare C Tx against Octave Tx (with and without compression)
# 3. Plot curves for SNR estimated from C Rx against actual SNR
# 4. Plot AWGN/PER C Tx curves for end user documentation
#
# usage:
#
# 1. Create 20 minutes of MPP fading samples:
# $ cd codec2/octave/
# $ octave-cli
# octave:24> pkg load signal
# octave:24> time_secs=60*20
# octave:26> ch_fading("~/codec2/build_linux/unittest/fast_fading_samples.float", 8000, 1.0, 8000*time_secs)
#
# 2. Run scripts:
#
# $ make
SHELL := /bin/bash
CODEC2 := $(HOME)/codec2
all: test \
octave_ch_noise_awgn.png octave_c_tx_awgn.png octave_c_tx_comp_awgn.png \
octave_ch_noise_mpp.png octave_c_tx_mpp.png octave_c_tx_comp_mpp.png \
snrest_snr_ctx.png snrest_snr_ctxc.png \
c_tx_comp.png c_tx_comp_thruput.png
clean:
rm -f *.txt *.png *.raw
# run this first, traps common CML setup error
test:
source snr_curves.sh; test_ldpc
# subset of files generated, but enough to set up Makefile dependencies
snr_oct = snr_oct_datac0_awgn.txt snr_oct_datac1_awgn.txt snr_oct_datac3_awgn.txt
snr_ch = snr_ch_datac0_awgn.txt snr_ch_datac1_awgn.txt snr_ch_datac3_awgn.txt
snr_ctx = snr_ctx_datac0_awgn.txt snr_ctx_datac1_awgn.txt snr_ctx_datac3_awgn.txt
snr_ctxc = snr_ctxc_datac0_awgn.txt snr_ctxc_datac3_awgn.txt
snr_oct_mpp = snr_oct_datac0_mpp.txt snr_oct_datac1_mpp.txt snr_oct_datac3_mpp.txt
snr_ch_mpp = snr_ch_datac0_mpp.txt snr_ch_datac1_mpp.txt snr_ch_datac3_mpp.txt
snr_ctx_mpp = snr_ctx_datac0_mpp.txt snr_ctx_datac1_mpp.txt snr_ctx_datac3_mpp.txt
snr_ctxc_mpp = snr_ctxc_datac0_mpp.txt snr_ctxc_datac3_mpp.txt
$(snr_oct):
source snr_curves.sh; generate_octave_tx_data datac0 awgn
source snr_curves.sh; generate_octave_tx_data datac1 awgn
source snr_curves.sh; generate_octave_tx_data datac3 awgn
$(snr_oct_mpp):
source snr_curves.sh; generate_octave_tx_data datac0 mpp
source snr_curves.sh; generate_octave_tx_data datac1 mpp
source snr_curves.sh; generate_octave_tx_data datac3 mpp
$(snr_ch):
source snr_curves.sh; generate_ch_data datac0 awgn
source snr_curves.sh; generate_ch_data datac1 awgn
source snr_curves.sh; generate_ch_data datac3 awgn
$(snr_ch_mpp):
source snr_curves.sh; generate_ch_data datac0 mpp
source snr_curves.sh; generate_ch_data datac1 mpp
source snr_curves.sh; generate_ch_data datac3 mpp
# C without compression
$(snr_ctx):
source snr_curves.sh; generate_snrest_v_snr_data datac0 awgn
source snr_curves.sh; generate_snrest_v_snr_data datac1 awgn
source snr_curves.sh; generate_snrest_v_snr_data datac3 awgn
source snr_curves.sh; generate_snrest_v_snr_data datac4 awgn
source snr_curves.sh; generate_snrest_v_snr_data datac13 awgn
source snr_curves.sh; generate_snrest_v_snr_data datac14 awgn
$(snr_ctx_mpp):
source snr_curves.sh; generate_snrest_v_snr_data datac0 mpp
source snr_curves.sh; generate_snrest_v_snr_data datac1 mpp
source snr_curves.sh; generate_snrest_v_snr_data datac3 mpp
source snr_curves.sh; generate_snrest_v_snr_data datac4 mpp
source snr_curves.sh; generate_snrest_v_snr_data datac13 mpp
source snr_curves.sh; generate_snrest_v_snr_data datac14 mpp
# C with compression
$(snr_ctxc):
source snr_curves.sh; generate_snrest_v_snr_data datac0 awgn 1
source snr_curves.sh; generate_snrest_v_snr_data datac1 awgn 1
source snr_curves.sh; generate_snrest_v_snr_data datac3 awgn 1
source snr_curves.sh; generate_snrest_v_snr_data datac4 awgn 1
source snr_curves.sh; generate_snrest_v_snr_data datac13 awgn 1
source snr_curves.sh; generate_snrest_v_snr_data datac14 awgn 1
$(snr_ctxc_mpp):
source snr_curves.sh; generate_snrest_v_snr_data datac0 mpp 1
source snr_curves.sh; generate_snrest_v_snr_data datac1 mpp 1
source snr_curves.sh; generate_snrest_v_snr_data datac3 mpp 1
source snr_curves.sh; generate_snrest_v_snr_data datac4 mpp 1
source snr_curves.sh; generate_snrest_v_snr_data datac13 mpp 1
source snr_curves.sh; generate_snrest_v_snr_data datac14 mpp 1
# Octave and C curves should be on top of each other, indicating Octave
# and ch noise injection/SNR measurement are equivalent
octave_ch_noise_awgn.png: $(snr_oct) $(snr_ch)
echo "snr_curves_plot; octave_ch_noise_print('awgn'); quit" | \
octave-cli -p $(CODEC2)/octave
octave_ch_noise_mpp.png: $(snr_oct_mpp) $(snr_ch_mpp)
echo "snr_curves_plot; octave_ch_noise_print('mpp'); quit" | \
octave-cli -p $(CODEC2)/octave
# Octave Tx and C Tx curves should be on top of each other
octave_c_tx_awgn.png: $(snr_oct) $(snr_ctx)
echo "snr_curves_plot; octave_c_tx_print('awgn'); quit" | \
octave-cli -p $(CODEC2)/octave
octave_c_tx_mpp.png: $(snr_oct_mpp) $(snr_ctx_mpp)
echo "snr_curves_plot; octave_c_tx_print('mpp'); quit" | \
octave-cli -p $(CODEC2)/octave
# Octave Tx and C Tx (compressed) curves should be close, but C may be 1dB
# poorer
octave_c_tx_comp_awgn.png: $(snr_oc) $(snr_ctxc)
echo "snr_curves_plot; octave_c_tx_comp_print('awgn'); quit" | \
octave-cli -p $(CODEC2)/octave
octave_c_tx_comp_mpp.png: $(snr_oct_mpp) $(snr_ctxc_mpp)
echo "snr_curves_plot; octave_c_tx_comp_print('mpp'); quit" | \
octave-cli -p $(CODEC2)/octave
# combined AWGN and MPP from C Tx (compressed) - what end users would run
c_tx_comp.png: $(snr_ctxc) $(snr_ctxc_mpp)
echo "snr_curves_plot; c_tx_comp_print; quit" | \
octave-cli -p $(CODEC2)/octave
# Curves of SNR estimates from C Rx compared to actual SNR, useful for "gear shifting"
snrest_snr_ctx.png: $(snr_ctx)
echo "snr_curves_plot; snrest_snr_print('ctx', 'awgn'); quit" | \
octave-cli -p $(CODEC2)/octave
snrest_snr_ctxc.png: $(snr_ctxc)
echo "snr_curves_plot; snrest_snr_print('ctxc', 'awgn'); quit" | \
octave-cli -p $(CODEC2)/octave
# Throughput of payload data in bits/s of modes against SNR
c_tx_comp_thruput.png: $(snr_ctxc) $(snr_ctxc_mpp)
echo "snr_curves_plot; c_tx_comp_thruput_print; quit" | \
octave-cli -p $(CODEC2)/octave
|