aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ch.c2
-rw-r--r--src/freedv_700.c1
-rw-r--r--src/freedv_api.c19
-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
-rw-r--r--src/gp_interleaver.c1
-rw-r--r--src/interldpc.c1
-rw-r--r--src/ofdm.c6
-rw-r--r--src/ofdm_mode.c25
10 files changed, 54 insertions, 9 deletions
diff --git a/src/ch.c b/src/ch.c
index 9d8d895..45e1b49 100644
--- a/src/ch.c
+++ b/src/ch.c
@@ -256,7 +256,7 @@ int main(int argc, char *argv[]) {
stderr,
"\nAdjust path --fading_dir or use GNU Octave to generate:\n\n");
gen_fading_file:
- fprintf(stderr, "$ octave --no-gui\n");
+ fprintf(stderr, "$ octave-cli\n");
fprintf(stderr, "octave:24> pkg load signal\n");
fprintf(stderr, "octave:24> time_secs=60\n");
fprintf(stderr,
diff --git a/src/freedv_700.c b/src/freedv_700.c
index 3dc4329..7c8536c 100644
--- a/src/freedv_700.c
+++ b/src/freedv_700.c
@@ -197,6 +197,7 @@ void freedv_ofdm_data_open(struct freedv *f) {
if (f->mode == FREEDV_MODE_DATAC3) strcpy(mode, "datac3");
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");
ofdm_init_mode(mode, &ofdm_config);
f->ofdm = ofdm_create(&ofdm_config);
diff --git a/src/freedv_api.c b/src/freedv_api.c
index 5172959..3ccf63d 100644
--- a/src/freedv_api.c
+++ b/src/freedv_api.c
@@ -125,7 +125,8 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) {
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC1, mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC3, mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, mode) ||
- FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, mode)) == false)
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, mode)) == false)
return NULL;
/* set everything to zero just in case */
@@ -154,6 +155,7 @@ struct freedv *freedv_open_advanced(int mode, struct freedv_advanced *adv) {
if (FDV_MODE_ACTIVE(FREEDV_MODE_DATAC3, mode)) freedv_ofdm_data_open(f);
if (FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, mode)) freedv_ofdm_data_open(f);
if (FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, mode)) freedv_ofdm_data_open(f);
+ if (FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, mode)) freedv_ofdm_data_open(f);
varicode_decode_init(&f->varicode_dec_states, 1);
@@ -235,7 +237,8 @@ void freedv_close(struct freedv *freedv) {
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC1, freedv->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC3, freedv->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, freedv->mode) ||
- FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, freedv->mode)) {
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, freedv->mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, freedv->mode)) {
FREE(freedv->rx_syms);
FREE(freedv->rx_amps);
FREE(freedv->ldpc);
@@ -266,7 +269,8 @@ static int is_ofdm_mode(struct freedv *f) {
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC1, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC3, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, f->mode) ||
- FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode);
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, f->mode);
}
static int is_ofdm_data_mode(struct freedv *f) {
@@ -274,7 +278,8 @@ static int is_ofdm_data_mode(struct freedv *f) {
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC1, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC3, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, f->mode) ||
- FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode);
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, f->mode);
}
/*---------------------------------------------------------------------------*\
@@ -464,7 +469,8 @@ void freedv_rawdatacomptx(struct freedv *f, COMP mod_out[],
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC1, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC3, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, f->mode) ||
- FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode))
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, f->mode))
freedv_comptx_ofdm(f, mod_out);
if (FDV_MODE_ACTIVE(FREEDV_MODE_FSK_LDPC, f->mode)) {
@@ -1063,7 +1069,8 @@ int freedv_rawdatacomprx(struct freedv *f, unsigned char *packed_payload_bits,
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC1, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC3, f->mode) ||
FDV_MODE_ACTIVE(FREEDV_MODE_DATAC4, f->mode) ||
- FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode))
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC13, f->mode) ||
+ FDV_MODE_ACTIVE(FREEDV_MODE_DATAC14, 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)) {
rx_status = freedv_rx_fsk_ldpc_data(f, demod_in);
diff --git a/src/freedv_api.h b/src/freedv_api.h
index ce95a55..e4ca468 100644
--- a/src/freedv_api.h
+++ b/src/freedv_api.h
@@ -61,6 +61,7 @@ extern "C" {
#define FREEDV_MODE_DATAC0 14
#define FREEDV_MODE_DATAC4 18
#define FREEDV_MODE_DATAC13 19
+#define FREEDV_MODE_DATAC14 20
// Sample rates used
#define FREEDV_FS_8000 8000
@@ -140,6 +141,9 @@ extern "C" {
#if !defined(FREEDV_MODE_DATAC13_EN)
#define FREEDV_MODE_DATAC13_EN FREEDV_MODE_EN_DEFAULT
#endif
+#if !defined(FREEDV_MODE_DATAC14_EN)
+#define FREEDV_MODE_DATAC14_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 1957e10..0353ae5 100644
--- a/src/freedv_data_raw_rx.c
+++ b/src/freedv_data_raw_rx.c
@@ -214,6 +214,8 @@ int main(int argc, char *argv[]) {
mode = FREEDV_MODE_DATAC4;
if (!strcmp(argv[dx], "DATAC13") || !strcmp(argv[dx], "datac13"))
mode = FREEDV_MODE_DATAC13;
+ if (!strcmp(argv[dx], "DATAC14") || !strcmp(argv[dx], "datac14"))
+ mode = FREEDV_MODE_DATAC14;
if (mode == -1) {
fprintf(stderr, "Error in mode: %s\n", argv[dx]);
exit(1);
diff --git a/src/freedv_data_raw_tx.c b/src/freedv_data_raw_tx.c
index 44d53e9..cb74107 100644
--- a/src/freedv_data_raw_tx.c
+++ b/src/freedv_data_raw_tx.c
@@ -236,6 +236,8 @@ int main(int argc, char *argv[]) {
mode = FREEDV_MODE_DATAC4;
if (!strcmp(argv[dx], "DATAC13") || !strcmp(argv[dx], "datac13"))
mode = FREEDV_MODE_DATAC13;
+ if (!strcmp(argv[dx], "DATAC14") || !strcmp(argv[dx], "datac14"))
+ mode = FREEDV_MODE_DATAC14;
if (mode == -1) {
fprintf(stderr, "Error: in mode: %s", argv[dx]);
exit(1);
diff --git a/src/gp_interleaver.c b/src/gp_interleaver.c
index 61678f8..6710b0c 100644
--- a/src/gp_interleaver.c
+++ b/src/gp_interleaver.c
@@ -44,6 +44,7 @@
*/
static const int b_table[] = {
+ 48, 31, /* datac14: HRA_56_56, 40 data bits used */
56, 37, /* 700E: HRA_56_56 */
106, 67, /* 2020B: (112,56) partial protection */
112, 71, /* 700D: HRA_112_112 */
diff --git a/src/interldpc.c b/src/interldpc.c
index 24f4b2a..8cec647 100644
--- a/src/interldpc.c
+++ b/src/interldpc.c
@@ -78,6 +78,7 @@ void ldpc_mode_specific_setup(struct OFDM *ofdm, struct LDPC *ldpc) {
}
if (!strcmp(ofdm->mode, "datac4")) set_data_bits_per_frame(ldpc, 448);
if (!strcmp(ofdm->mode, "datac13")) set_data_bits_per_frame(ldpc, 128);
+ if (!strcmp(ofdm->mode, "datac14")) set_data_bits_per_frame(ldpc, 40);
}
/* LDPC encode frame - generate parity bits and a codeword, applying the
diff --git a/src/ofdm.c b/src/ofdm.c
index 28d6dba..ba22f3f 100644
--- a/src/ofdm.c
+++ b/src/ofdm.c
@@ -559,7 +559,8 @@ static void allocate_tx_bpf(struct OFDM *ofdm) {
quisk_filt_cfInit(ofdm->tx_bpf, filtP400S600,
sizeof(filtP400S600) / sizeof(float));
quisk_cfTune(ofdm->tx_bpf, ofdm->tx_centre / ofdm->fs);
- } else if (!strcmp(ofdm->mode, "datac4") || !strcmp(ofdm->mode, "datac13")) {
+ } else if (!strcmp(ofdm->mode, "datac4") || !strcmp(ofdm->mode, "datac13") ||
+ !strcmp(ofdm->mode, "datac14")) {
quisk_filt_cfInit(ofdm->tx_bpf, filtP200S400,
sizeof(filtP200S400) / sizeof(float));
// centre the filter on the mean carrier freq, allows a narrower filter to
@@ -590,7 +591,8 @@ static void allocate_rx_bpf(struct OFDM *ofdm) {
/* Receive bandpass filter; complex coefficients, center frequency */
- if (!strcmp(ofdm->mode, "datac4") || !strcmp(ofdm->mode, "datac13")) {
+ if (!strcmp(ofdm->mode, "datac4") || !strcmp(ofdm->mode, "datac13") ||
+ !strcmp(ofdm->mode, "datac14")) {
quisk_filt_cfInit(ofdm->rx_bpf, filtP200S400,
sizeof(filtP200S400) / sizeof(float));
// centre the filter on the mean carrier freq, allows a narrower filter to
diff --git a/src/ofdm_mode.c b/src/ofdm_mode.c
index 1aabb1a..df0b4f5 100644
--- a/src/ofdm_mode.c
+++ b/src/ofdm_mode.c
@@ -226,6 +226,31 @@ void ofdm_init_mode(char mode[], struct OFDM_CONFIG *config) {
config->clip_gain1 = 1.2;
config->clip_gain2 = 1.0;
config->rx_bpf_en = true;
+ } else if (strcmp(mode, "datac14") == 0) {
+ config->ns = 5;
+ config->np = 4;
+ config->tcp = 0.005;
+ config->ts = 0.018;
+ config->nc = 4;
+ config->edge_pilots = 0;
+ config->txtbits = 0;
+ config->state_machine = "data";
+ config->ftwindowwidth = 80;
+ config->timing_mx_thresh = 0.45;
+ config->codename = "HRA_56_56";
+ config->amp_est_mode = 1;
+ config->nuwbits = 32;
+ config->bad_uw_errors = 12;
+ uint8_t uw[] = {1, 1, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1,
+ 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0};
+ assert(sizeof(uw) <= MAX_UW_BITS);
+ memcpy(config->tx_uw, uw, sizeof(uw));
+ memcpy(&config->tx_uw[config->nuwbits - sizeof(uw)], uw, sizeof(uw));
+ config->data_mode = "streaming";
+ config->amp_scale = 2.0 * 300E3;
+ config->clip_gain1 = 2.0;
+ config->clip_gain2 = 1.0;
+ config->rx_bpf_en = true;
} else {
assert(0);
}