aboutsummaryrefslogtreecommitdiff
path: root/octave/fsk_lib_ldpc_tx.m
diff options
context:
space:
mode:
authorAuthor Name <[email protected]>2023-07-07 12:20:59 +0930
committerDavid Rowe <[email protected]>2023-07-07 12:29:06 +0930
commitac7c48b4dee99d4c772f133d70d8d1b38262fcd2 (patch)
treea2d0ace57a9c0e2e5b611c4987f6fed1b38b81e7 /octave/fsk_lib_ldpc_tx.m
shallow zip-file copy from codec2 e9d726bf20
Diffstat (limited to 'octave/fsk_lib_ldpc_tx.m')
-rw-r--r--octave/fsk_lib_ldpc_tx.m44
1 files changed, 44 insertions, 0 deletions
diff --git a/octave/fsk_lib_ldpc_tx.m b/octave/fsk_lib_ldpc_tx.m
new file mode 100644
index 0000000..408ba79
--- /dev/null
+++ b/octave/fsk_lib_ldpc_tx.m
@@ -0,0 +1,44 @@
+% fsk_lib_ldpc_tx.m
+%
+% LDPC coded 4FSK modem tx, generates a 8 kHz 16 bit short real valued sample file
+
+function fsk_lib_ldpc_tx(filename, num_frames=10, Rs=100, coderate=0.5, EbNodB=100)
+ fsk_lib_ldpc;
+
+ % set up LDPC code
+ init_cml();
+ if coderate == 0.5
+ load H_256_512_4.mat;
+ elseif coderate == 0.75
+ load HRAa_1536_512.mat; H=HRA;
+ else
+ disp("unknown code rate");
+ end
+ [states code_param] = fsk_lib_ldpc_init (H, Rs, Fs=8000);
+ n = code_param.coded_bits_per_frame; k = code_param.data_bits_per_frame;
+
+ rand('seed',1);
+ data_bits = round(rand(1,code_param.data_bits_per_frame)); tx_bits = [];
+ for f=1:num_frames
+ codeword_bits = LdpcEncode(data_bits, code_param.H_rows, code_param.P_matrix);
+ tx_bits = [tx_bits codeword_bits];
+ end
+
+ tx = fsk_mod(states, tx_bits);
+
+ % set up (optional) AWGN noise
+ EcNodB = EbNodB + 10*log10(states.rate);
+ EcNo = 10^(EcNodB/10);
+ variance = states.Fs/(states.Rs*EcNo*states.bitspersymbol);
+
+ % note real noise
+ noise = sqrt(variance/2)*randn(length(tx),1);
+ rx = tx + noise;
+
+ frx=fopen(filename,"wb"); fwrite(frx, states.amp_scale*rx, "short"); fclose(frx);
+ printf("Fs: %d Rs: %d rate %4.2f (%d,%d) EbNodB: %3.1f EcNodB: %3.1f frames transmitted: %3d\n",
+ Fs, Rs, coderate, n, k, EbNodB, EcNodB, num_frames);
+end
+
+
+