aboutsummaryrefslogtreecommitdiff
path: root/src/ldpc_codes.c
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 /src/ldpc_codes.c
shallow zip-file copy from codec2 e9d726bf20
Diffstat (limited to 'src/ldpc_codes.c')
-rw-r--r--src/ldpc_codes.c252
1 files changed, 252 insertions, 0 deletions
diff --git a/src/ldpc_codes.c b/src/ldpc_codes.c
new file mode 100644
index 0000000..23c022f
--- /dev/null
+++ b/src/ldpc_codes.c
@@ -0,0 +1,252 @@
+/*
+ FILE...: ldpc_codes.c
+ AUTHOR.: David Rowe
+ CREATED: July 2020
+
+ Array of LDPC codes used for various Codec2 waveforms.
+*/
+
+#include <stdio.h>
+#include <string.h>
+#include "assert.h"
+#include "ldpc_codes.h"
+#include "interldpc.h"
+#include "H_2064_516_sparse.h"
+#include "HRA_112_112.h"
+#include "HRAb_396_504.h"
+#include "H_256_768_22.h"
+#include "H_256_512_4.h"
+#include "HRAa_1536_512.h"
+#include "H_128_256_5.h"
+#include "HRA_56_56.h"
+#include "H_4096_8192_3d.h"
+#include "H_16200_9720.h"
+#include "H_1024_2048_4f.h"
+#include "H_212_158.h"
+
+struct LDPC ldpc_codes[] = {
+ /* short rate 1/2 code for FreeDV 700D */
+ {
+ "HRA_112_112",
+ HRA_112_112_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ HRA_112_112_CODELENGTH,
+ HRA_112_112_NUMBERPARITYBITS,
+ HRA_112_112_NUMBERROWSHCOLS,
+ HRA_112_112_MAX_ROW_WEIGHT,
+ HRA_112_112_MAX_COL_WEIGHT,
+ (uint16_t *)HRA_112_112_H_rows,
+ (uint16_t *)HRA_112_112_H_cols
+ }
+ ,
+ /* short rate 1/2 code for FreeDV 700E */
+ {
+ "HRA_56_56",
+ HRA_56_56_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ HRA_56_56_CODELENGTH,
+ HRA_56_56_NUMBERPARITYBITS,
+ HRA_56_56_NUMBERROWSHCOLS,
+ HRA_56_56_MAX_ROW_WEIGHT,
+ HRA_56_56_MAX_COL_WEIGHT,
+ (uint16_t *)HRA_56_56_H_rows,
+ (uint16_t *)HRA_56_56_H_cols
+ },
+ #ifndef __EMBEDDED__
+
+ /* default Wenet High Alitiude Balloon rate 0.8 code */
+ {
+ "H_2064_516_sparse",
+ MAX_ITER,
+ 0,
+ 1,
+ 1,
+ CODELENGTH,
+ NUMBERPARITYBITS,
+ NUMBERROWSHCOLS,
+ MAX_ROW_WEIGHT,
+ MAX_COL_WEIGHT,
+ (uint16_t *)H_2064_516_sparse_H_rows,
+ (uint16_t *)H_2064_516_sparse_H_cols
+ },
+
+ /* rate 0.8 code used for FreeDV 2020 */
+ {
+ "HRAb_396_504",
+ HRAb_396_504_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ HRAb_396_504_CODELENGTH,
+ HRAb_396_504_NUMBERPARITYBITS,
+ HRAb_396_504_NUMBERROWSHCOLS,
+ HRAb_396_504_MAX_ROW_WEIGHT,
+ HRAb_396_504_MAX_COL_WEIGHT,
+ (uint16_t *)HRAb_396_504_H_rows,
+ (uint16_t *)HRAb_396_504_H_cols
+ },
+
+
+ /* Rate 0.745 code for mopping up errors on 2020C from Bill VK5DSP */
+ {
+ "H_212_158",
+ H_212_158_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ H_212_158_CODELENGTH,
+ H_212_158_NUMBERPARITYBITS,
+ H_212_158_NUMBERROWSHCOLS,
+ H_212_158_MAX_ROW_WEIGHT,
+ H_212_158_MAX_COL_WEIGHT,
+ (uint16_t *)H_212_158_H_rows,
+ (uint16_t *)H_212_158_H_cols
+ },
+
+ /* rate 1/3 code, works at raw BER of 14% */
+ {
+ "H_256_768_22",
+ H_256_768_22_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ H_256_768_22_CODELENGTH,
+ H_256_768_22_NUMBERPARITYBITS,
+ H_256_768_22_NUMBERROWSHCOLS,
+ H_256_768_22_MAX_ROW_WEIGHT,
+ H_256_768_22_MAX_COL_WEIGHT,
+ (uint16_t *)H_256_768_22_H_rows,
+ (uint16_t *)H_256_768_22_H_cols
+ },
+
+ /* used for 4FSK/LLR experiments */
+ {
+ "H_256_512_4",
+ H_256_512_4_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ H_256_512_4_CODELENGTH,
+ H_256_512_4_NUMBERPARITYBITS,
+ H_256_512_4_NUMBERROWSHCOLS,
+ H_256_512_4_MAX_ROW_WEIGHT,
+ H_256_512_4_MAX_COL_WEIGHT,
+ (uint16_t *)H_256_512_4_H_rows,
+ (uint16_t *)H_256_512_4_H_cols
+ },
+
+ /* used for 4FSK/LLR experiments */
+ {
+ "HRAa_1536_512",
+ HRAa_1536_512_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ HRAa_1536_512_CODELENGTH,
+ HRAa_1536_512_NUMBERPARITYBITS,
+ HRAa_1536_512_NUMBERROWSHCOLS,
+ HRAa_1536_512_MAX_ROW_WEIGHT,
+ HRAa_1536_512_MAX_COL_WEIGHT,
+ (uint16_t *)HRAa_1536_512_H_rows,
+ (uint16_t *)HRAa_1536_512_H_cols
+ },
+
+ /* used for 4FSK/LLR experiments */
+ {
+ "H_128_256_5",
+ H_128_256_5_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ H_128_256_5_CODELENGTH,
+ H_128_256_5_NUMBERPARITYBITS,
+ H_128_256_5_NUMBERROWSHCOLS,
+ H_128_256_5_MAX_ROW_WEIGHT,
+ H_128_256_5_MAX_COL_WEIGHT,
+ (uint16_t *)H_128_256_5_H_rows,
+ (uint16_t *)H_128_256_5_H_cols
+ },
+
+ /* Nice long code from Bill VK5DSP - useful for HF data */
+ {
+ "H_4096_8192_3d",
+ H_4096_8192_3d_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ H_4096_8192_3d_CODELENGTH,
+ H_4096_8192_3d_NUMBERPARITYBITS,
+ H_4096_8192_3d_NUMBERROWSHCOLS,
+ H_4096_8192_3d_MAX_ROW_WEIGHT,
+ H_4096_8192_3d_MAX_COL_WEIGHT,
+ (uint16_t *)H_4096_8192_3d_H_rows,
+ (uint16_t *)H_4096_8192_3d_H_cols
+ },
+
+ /* Nice long code from Bill VK5DSP - useful for HF data */
+ {
+ "H_16200_9720",
+ H_16200_9720_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ H_16200_9720_CODELENGTH,
+ H_16200_9720_NUMBERPARITYBITS,
+ H_16200_9720_NUMBERROWSHCOLS,
+ H_16200_9720_MAX_ROW_WEIGHT,
+ H_16200_9720_MAX_COL_WEIGHT,
+ (uint16_t *)H_16200_9720_H_rows,
+ (uint16_t *)H_16200_9720_H_cols
+ },
+
+ /* Another fine code from Bill VK5DSP - also useful for HF data */
+ {
+ "H_1024_2048_4f",
+ H_1024_2048_4f_MAX_ITER,
+ 0,
+ 1,
+ 1,
+ H_1024_2048_4f_CODELENGTH,
+ H_1024_2048_4f_NUMBERPARITYBITS,
+ H_1024_2048_4f_NUMBERROWSHCOLS,
+ H_1024_2048_4f_MAX_ROW_WEIGHT,
+ H_1024_2048_4f_MAX_COL_WEIGHT,
+ (uint16_t *)H_1024_2048_4f_H_rows,
+ (uint16_t *)H_1024_2048_4f_H_cols
+ }
+ #endif
+};
+
+int ldpc_codes_num(void) { return sizeof(ldpc_codes)/sizeof(struct LDPC); }
+
+void ldpc_codes_list() {
+ fprintf(stderr, "\n");
+ for(int c=0; c<ldpc_codes_num(); c++) {
+ int n = ldpc_codes[c].NumberRowsHcols + ldpc_codes[c].NumberParityBits;
+ int k = ldpc_codes[c].NumberRowsHcols;
+ float rate = (float)k/n;
+ fprintf(stderr, "%-20s rate %3.2f (%d,%d) \n", ldpc_codes[c].name, (double)rate, n, k);
+ }
+ fprintf(stderr, "\n");
+}
+
+int ldpc_codes_find(char name[]) {
+ int code_index = -1;
+ for(int c=0; c<ldpc_codes_num(); c++)
+ if (strcmp(ldpc_codes[c].name, name) == 0)
+ code_index = c;
+ assert(code_index != -1); /* code not found */
+ return code_index;
+}
+
+void ldpc_codes_setup(struct LDPC *ldpc, char name[]) {
+ int code_index;
+ code_index = ldpc_codes_find(name);
+ assert(code_index != -1);
+ memcpy(ldpc,&ldpc_codes[code_index], sizeof(struct LDPC));
+ set_up_ldpc_constants(ldpc, ldpc->CodeLength, ldpc->NumberParityBits);
+}