void demod_qpsk_lte_s(const cf_t *symbols, short *llr, int nsymbols) { srslte_vec_convert_fi((const float*) symbols, -SCALE_SHORT_CONV_QPSK*sqrt(2), llr, nsymbols*2); }
int rf_blade_send_timed(void *h, void *data, int nsamples, time_t secs, double frac_secs, bool has_time_spec, bool blocking, bool is_start_of_burst, bool is_end_of_burst) { rf_blade_handler_t *handler = (rf_blade_handler_t*) h; struct bladerf_metadata meta; int status; if (!handler->tx_stream_enabled) { rf_blade_start_tx_stream(h); } if (2*nsamples > CONVERT_BUFFER_SIZE) { fprintf(stderr, "TX failed: nsamples exceeds buffer size (%d>%d)\n", nsamples, CONVERT_BUFFER_SIZE); return -1; } srslte_vec_convert_fi(data, handler->tx_buffer, 2048, 2*nsamples); memset(&meta, 0, sizeof(meta)); if (is_start_of_burst) { if (has_time_spec) { secs_to_timestamps(handler->tx_rate, secs, frac_secs, &meta.timestamp); } else { meta.flags |= BLADERF_META_FLAG_TX_NOW; } meta.flags |= BLADERF_META_FLAG_TX_BURST_START; } if (is_end_of_burst) { meta.flags |= BLADERF_META_FLAG_TX_BURST_END; } srslte_rf_error_t error; bzero(&error, sizeof(srslte_rf_error_t)); status = bladerf_sync_tx(handler->dev, handler->tx_buffer, nsamples, &meta, 2000); if (status == BLADERF_ERR_TIME_PAST) { if (blade_error_handler) { error.type = SRSLTE_RF_ERROR_LATE; blade_error_handler(error); } else { fprintf(stderr, "TX failed: %s\n", bladerf_strerror(status)); } } else if (status) { fprintf(stderr, "TX failed: %s\n", bladerf_strerror(status)); return status; } else if (meta.status == BLADERF_META_STATUS_UNDERRUN) { if (blade_error_handler) { error.type = SRSLTE_RF_ERROR_UNDERFLOW; blade_error_handler(error); } else { fprintf(stderr, "TX warning: underflow detected.\n"); } } return nsamples; }