diff --git a/src/freedv_700.c b/src/freedv_700.c index 40aa2c08..72e05632 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 d04dd7c8..cb9e7064 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 9f72c8f9..4acf40ca 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 435648d7..50fcb32f 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 ce5da562..70fefe74 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) {