aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordrowe67 <[email protected]>2024-04-05 20:26:40 +1030
committerDavid Rowe <[email protected]>2024-04-05 20:26:40 +1030
commit82546c4401ecd049dbda08aabe879bd2db12d190 (patch)
tree7a705cbc716bcfa0fa81c2f2dbb537ef31c86497
parent2e5f845b1108b9469f4aed3e8b1b46e2a509f196 (diff)
qam16c2 FreeDV API support
-rw-r--r--src/freedv_700.c3
-rw-r--r--src/freedv_api.c10
-rw-r--r--src/freedv_api.h4
-rw-r--r--src/freedv_data_raw_rx.c2
-rw-r--r--src/freedv_data_raw_tx.c2
5 files changed, 18 insertions, 3 deletions
diff --git a/src/freedv_700.c b/src/freedv_700.c
index 40aa2c0..72e0563 100644
--- a/src/freedv_700.c
+++ b/src/freedv_700.c
@@ -198,6 +198,7 @@ void freedv_ofdm_data_open(struct freedv *f, struct freedv_advanced *adv) {
if (f->mode == FREEDV_MODE_DATAC4) strcpy(mode, "datac4");
if (f->mode == FREEDV_MODE_DATAC13) strcpy(mode, "datac13");
if (f->mode == FREEDV_MODE_DATAC14) strcpy(mode, "datac14");
+ if (f->mode == FREEDV_MODE_QAM16C2) strcpy(mode, "qam16c2");
if (f->mode == FREEDV_MODE_DATA_CUSTOM) {
assert(adv != NULL);
assert(adv->config != NULL);
@@ -506,8 +507,6 @@ int freedv_comp_short_rx_ofdm(struct freedv *f, void *demod_in_8kHz,
symbols_to_llrs(llr, payload_syms_de, payload_amps_de, EsNo,
ofdm->mean_amp, ofdm->bps, Npayloadsymsperpacket);
ldpc_decode_frame(ldpc, &parityCheckCount, &iter, decoded_codeword, llr);
- // iter = run_ldpc_decoder(ldpc, decoded_codeword, llr,
- // &parityCheckCount);
memcpy(f->rx_payload_bits, decoded_codeword, Ndatabitsperpacket);
if (strlen(ofdm->data_mode)) {
diff --git a/src/freedv_api.c b/src/freedv_api.c
index d04dd7c..cb9e706 100644
--- a/src/freedv_api.c
+++ b/src/freedv_api.c
@@ -131,7 +131,8 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) {
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, mode) ||
- FDV_MODE_ACTIVE(FREEDV_MODE_DATA_CUSTOM, mode)) == false)
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATA_CUSTOM, mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_QAM16C2, mode)) == false)
return NULL;
/* set everything to zero just in case */
@@ -165,6 +166,8 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) {
freedv_ofdm_data_open(f, NULL);
if (FDV_MODE_ACTIVE(FREEDV_MODE_DATA_CUSTOM, mode))
freedv_ofdm_data_open(f, adv);
+ if (FDV_MODE_ACTIVE(FREEDV_MODE_QAM16C2, mode))
+ freedv_ofdm_data_open(f, NULL);
varicode_decode_init(&f->varicode_dec_states, 1);
@@ -248,6 +251,7 @@ void freedv_close(struct freedv *freedv) {
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, freedv->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, freedv->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, freedv->mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_QAM16C2, freedv->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATA_CUSTOM, freedv->mode)) {
FREE(freedv->rx_syms);
FREE(freedv->rx_amps);
@@ -281,6 +285,7 @@ static int is_ofdm_mode(struct freedv *f) {
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, f->mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_QAM16C2, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATA_CUSTOM, f->mode);
}
@@ -291,6 +296,7 @@ static int is_ofdm_data_mode(struct freedv *f) {
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, f->mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_QAM16C2, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATA_CUSTOM, f->mode);
}
@@ -483,6 +489,7 @@ void freedv_rawdatacomptx(struct freedv *f, COMP mod_out[],
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, f->mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_QAM16C2, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATA_CUSTOM, f->mode))
freedv_comptx_ofdm(f, mod_out);
@@ -1084,6 +1091,7 @@ int freedv_rawdatacomprx(struct freedv *f, unsigned char *packed_payload_bits,
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, f->mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_QAM16C2, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATA_CUSTOM, f->mode))
rx_status = freedv_comp_short_rx_ofdm(f, (void *)demod_in, 0, 1.0f);
if (FDV_MODE_ACTIVE(FREEDV_MODE_FSK_LDPC, f->mode)) {
diff --git a/src/freedv_api.h b/src/freedv_api.h
index 9f72c8f..4acf40c 100644
--- a/src/freedv_api.h
+++ b/src/freedv_api.h
@@ -63,6 +63,7 @@ extern "C" {
#define FREEDV_MODE_DATAC13 19
#define FREEDV_MODE_DATAC14 20
#define FREEDV_MODE_DATA_CUSTOM 21
+#define FREEDV_MODE_QAM16C2 22
// Sample rates used
#define FREEDV_FS_8000 8000
@@ -148,6 +149,9 @@ extern "C" {
#if !defined(FREEDV_MODE_DATA_CUSTOM_EN)
#define FREEDV_MODE_DATA_CUSTOM_EN FREEDV_MODE_EN_DEFAULT
#endif
+#if !defined(FREEDV_MODE_QAM16C2_EN)
+#define FREEDV_MODE_QAM16C2_EN FREEDV_MODE_EN_DEFAULT
+#endif
#define FDV_MODE_ACTIVE(mode_name, var) \
((mode_name##_EN) == 0 ? 0 : (var) == mode_name)
diff --git a/src/freedv_data_raw_rx.c b/src/freedv_data_raw_rx.c
index 435648d..50fcb32 100644
--- a/src/freedv_data_raw_rx.c
+++ b/src/freedv_data_raw_rx.c
@@ -217,6 +217,8 @@ int main(int argc, char *argv[]) {
mode = FREEDV_MODE_DATAC13;
if (!strcmp(argv[dx], "DATAC14") || !strcmp(argv[dx], "datac14"))
mode = FREEDV_MODE_DATAC14;
+ if (!strcmp(argv[dx], "QAM16C2") || !strcmp(argv[dx], "qam16c2"))
+ mode = FREEDV_MODE_QAM16C2;
if (!strcmp(argv[dx], "CUSTOM") || !strcmp(argv[dx], "custom"))
mode = FREEDV_MODE_DATA_CUSTOM;
if (mode == -1) {
diff --git a/src/freedv_data_raw_tx.c b/src/freedv_data_raw_tx.c
index ce5da56..70fefe7 100644
--- a/src/freedv_data_raw_tx.c
+++ b/src/freedv_data_raw_tx.c
@@ -238,6 +238,8 @@ int main(int argc, char *argv[]) {
mode = FREEDV_MODE_DATAC13;
if (!strcmp(argv[dx], "DATAC14") || !strcmp(argv[dx], "datac14"))
mode = FREEDV_MODE_DATAC14;
+ if (!strcmp(argv[dx], "QAM16C2") || !strcmp(argv[dx], "qam16c2"))
+ mode = FREEDV_MODE_QAM16C2;
if (!strcmp(argv[dx], "CUSTOM") || !strcmp(argv[dx], "custom"))
mode = FREEDV_MODE_DATA_CUSTOM;
if (mode == -1) {