void ofdmflexframegen_setprops(ofdmflexframegen _q, ofdmflexframegenprops_s * _props) { // if properties object is NULL, initialize with defaults if (_props == NULL) { ofdmflexframegen_setprops(_q, &ofdmflexframegenprops_default); return; } // validate input if (_props->check == LIQUID_CRC_UNKNOWN || _props->check >= LIQUID_CRC_NUM_SCHEMES) { fprintf(stderr, "error: ofdmflexframegen_setprops(), invalid/unsupported CRC scheme\n"); exit(1); } else if (_props->fec0 == LIQUID_FEC_UNKNOWN || _props->fec1 == LIQUID_FEC_UNKNOWN) { fprintf(stderr, "error: ofdmflexframegen_setprops(), invalid/unsupported FEC scheme\n"); exit(1); } else if (_props->mod_scheme == LIQUID_MODEM_UNKNOWN ) { fprintf(stderr, "error: ofdmflexframegen_setprops(), invalid/unsupported modulation scheme\n"); exit(1); } // TODO : determine if re-configuration is necessary // copy properties to internal structure memmove(&_q->props, _props, sizeof(ofdmflexframegenprops_s)); // reconfigure internal buffers, objects, etc. ofdmflexframegen_reconfigure(_q); }
void LiquidOfdmModComponent::parameterHasChanged(std::string name) { ofdmflexframegenprops_s fgProps; ofdmflexframegen_getprops(frameGenerator_, &fgProps); if (name == "modulation") { modulation_scheme ms = liquid_getopt_str2mod(modulationScheme_x.c_str()); fgProps.mod_scheme = ms; } if (name == "fec0") { fec_scheme fec0 = liquid_getopt_str2fec(fecZero_x.c_str()); fgProps.fec0 = fec0; } if (name == "fec1") { fec_scheme fec1 = liquid_getopt_str2fec(fecOne_x.c_str()); fgProps.fec1 = fec1; } if (name == "crc") { crc_scheme check = liquid_getopt_str2crc(crcScheme_x.c_str()); fgProps.check = check; } ofdmflexframegen_setprops(frameGenerator_, &fgProps); if (name == "gain") { gain_factor_ = powf(10.0f, gain_x/20.0f); } if (name == "subcarriers" || name == "prefixlength" || name == "taperlength") { //Need to destroy and recreate the frame generator if (frameGenerator_) ofdmflexframegen_destroy(frameGenerator_); initialize(); } }
// create OFDM flexible framing generator object // _M : number of subcarriers, >10 typical // _cp_len : cyclic prefix length // _taper_len : taper length (OFDM symbol overlap) // _p : subcarrier allocation (null, pilot, data), [size: _M x 1] // _fgprops : frame properties (modulation scheme, etc.) ofdmflexframegen ofdmflexframegen_create(unsigned int _M, unsigned int _cp_len, unsigned int _taper_len, unsigned char * _p, ofdmflexframegenprops_s * _fgprops) { // validate input if (_M < 2) { fprintf(stderr,"error: ofdmflexframegen_create(), number of subcarriers must be at least 2\n"); exit(1); } else if (_M % 2) { fprintf(stderr,"error: ofdmflexframegen_create(), number of subcarriers must be even\n"); exit(1); } ofdmflexframegen q = (ofdmflexframegen) malloc(sizeof(struct ofdmflexframegen_s)); q->M = _M; // number of subcarriers q->cp_len = _cp_len; // cyclic prefix length q->taper_len = _taper_len; // taper length // allocate memory for transform buffers q->X = (float complex*) malloc((q->M)*sizeof(float complex)); // allocate memory for subcarrier allocation IDs q->p = (unsigned char*) malloc((q->M)*sizeof(unsigned char)); if (_p == NULL) { // initialize default subcarrier allocation ofdmframe_init_default_sctype(q->M, q->p); } else { // copy user-defined subcarrier allocation memmove(q->p, _p, q->M*sizeof(unsigned char)); } // validate and count subcarrier allocation ofdmframe_validate_sctype(q->p, q->M, &q->M_null, &q->M_pilot, &q->M_data); // create internal OFDM frame generator object q->fg = ofdmframegen_create(q->M, q->cp_len, q->taper_len, q->p); // create header objects q->mod_header = modem_create(OFDMFLEXFRAME_H_MOD); q->p_header = packetizer_create(OFDMFLEXFRAME_H_DEC, OFDMFLEXFRAME_H_CRC, OFDMFLEXFRAME_H_FEC, LIQUID_FEC_NONE); assert(packetizer_get_enc_msg_len(q->p_header)==OFDMFLEXFRAME_H_ENC); // compute number of header symbols div_t d = div(OFDMFLEXFRAME_H_SYM, q->M_data); q->num_symbols_header = d.quot + (d.rem ? 1 : 0); // initial memory allocation for payload q->payload_dec_len = 1; q->p_payload = packetizer_create(q->payload_dec_len, LIQUID_CRC_NONE, LIQUID_FEC_NONE, LIQUID_FEC_NONE); q->payload_enc_len = packetizer_get_enc_msg_len(q->p_payload); q->payload_enc = (unsigned char*) malloc(q->payload_enc_len*sizeof(unsigned char)); q->payload_mod_len = 1; q->payload_mod = (unsigned char*) malloc(q->payload_mod_len*sizeof(unsigned char)); // create payload modem (initially QPSK, overridden by properties) q->mod_payload = modem_create(LIQUID_MODEM_QPSK); // initialize properties ofdmflexframegen_setprops(q, _fgprops); // reset ofdmflexframegen_reset(q); // return pointer to main object return q; }