coh->rx_filter_memory[c][i].real = 0.0;
coh->rx_filter_memory[c][i].imag = 0.0;
}
+
+ /* optional per-carrier amplitude weighting for testing */
+
+ coh->carrier_ampl[c] = 1.0;
}
fdmdv->fbb_rect.real = cosf(2.0*PI*FDMDV_FCENTRE/COHPSK_FS);
fdmdv->fbb_rect.imag = sinf(2.0*PI*FDMDV_FCENTRE/COHPSK_FS);
i = c*NSYMROW + data_r;
bits = (tx_bits[2*i]&0x1)<<1 | (tx_bits[2*i+1]&0x1);
tx_symb[r][c] = fcmult(1.0/sqrtf(ND),qpsk_mod[bits]);
-
- /* test code to see what happens when we attenuate one
- carrier, this may happen in practice with tx SSB filter
- ripple.
-
- if (c==5) {
- COMP attn = {0.5,0.0};
- tx_symb[r][c] = cmult(tx_symb[r][c], attn);
- }
- */
}
}
for(r=0; r<NSYMROWPILOT; r++) {
for(c=0; c<COHPSK_NC*ND; c++)
- tx_onesym[c] = tx_symb[r][c];
+ tx_onesym[c] = fcmult(coh->carrier_ampl[c], tx_symb[r][c]);
tx_filter_and_upconvert_coh(&tx_fdm[r*COHPSK_M], COHPSK_NC*ND , tx_onesym, fdmdv->tx_filter_memory,
fdmdv->phase_tx, fdmdv->freq, &fdmdv->fbb_phase_tx, fdmdv->fbb_rect);
}
return coh->rx_bits_lower;
}
-
float *cohpsk_get_rx_bits_upper(struct COHPSK *coh) {
return coh->rx_bits_upper;
}
+void cohpsk_set_carrier_ampl(struct COHPSK *coh, int c, float ampl) {
+ assert(c < COHPSK_NC*ND);
+ coh->carrier_ampl[c] = ampl;
+ fprintf(stderr, "cohpsk_set_carrier_ampl: %d %f\n", c, ampl);
+}
+
typedef void (*freedv_callback_datatx)(void *, unsigned char *packet, size_t *size);
-// FreeDV API functions:
-// open, close
+/*---------------------------------------------------------------------------*\
+
+ FreeDV API functions
+
+\*---------------------------------------------------------------------------*/
+
+// open, close ----------------------------------------------------------------
+
struct freedv *freedv_open(int mode);
void freedv_close (struct freedv *freedv);
-// Transmit
+
+// Transmit -------------------------------------------------------------------
+
void freedv_tx (struct freedv *freedv, short mod_out[], short speech_in[]);
void freedv_comptx (struct freedv *freedv, COMP mod_out[], short speech_in[]);
void freedv_codectx (struct freedv *f, short mod_out[], unsigned char *packed_codec_bits);
void freedv_datatx (struct freedv *f, short mod_out[]);
int freedv_data_ntxframes (struct freedv *freedv);
-// Receive
+
+// Receive -------------------------------------------------------------------
+
int freedv_nin (struct freedv *freedv);
int freedv_rx (struct freedv *freedv, short speech_out[], short demod_in[]);
int freedv_floatrx (struct freedv *freedv, short speech_out[], float demod_in[]);
int freedv_comprx (struct freedv *freedv, short speech_out[], COMP demod_in[]);
int freedv_codecrx (struct freedv *freedv, unsigned char *packed_codec_bits, short demod_in[]);
-// Set parameters
+
+// Set parameters ------------------------------------------------------------
+
void freedv_set_callback_txt (struct freedv *freedv, freedv_callback_rx rx, freedv_callback_tx tx, void *callback_state);
void freedv_set_callback_protocol (struct freedv *freedv, freedv_callback_protorx rx, freedv_callback_prototx tx, void *callback_state);
void freedv_set_callback_data (struct freedv *freedv, freedv_callback_datarx datarx, freedv_callback_datatx datatx, void *callback_state);
void freedv_set_varicode_code_num (struct freedv *freedv, int val);
void freedv_set_data_header (struct freedv *freedv, unsigned char *header);
int freedv_set_alt_modem_samp_rate (struct freedv *freedv, int samp_rate);
+void freedv_set_carrier_ampl (struct freedv *freedv, int c, float ampl);
+
+// Get parameters -------------------------------------------------------------------------
-// Get parameters
struct MODEM_STATS;
int freedv_get_version(void);
int freedv_get_mode (struct freedv *freedv);
int freedv_get_n_codec_bits (struct freedv *freedv);
int freedv_get_sz_error_pattern (struct freedv *freedv);
int freedv_get_protocol_bits (struct freedv *freedv);
+
#endif
#ifdef __cplusplus