int main(int argc, char **argv) { parse_args(argc, argv); srslte_tcod_gentable(); srslte_tcod_t tcod; srslte_tcod_init(&tcod, 6144); uint32_t st=0, end=187; if (long_cb) { st=srslte_cbsegm_cbindex(long_cb); end=st; } for (uint32_t len=st;len<=end;len++) { long_cb = srslte_cbsegm_cbsize(len); printf("Checking long_cb=%d\n", long_cb); for (int i=0;i<long_cb/8;i++) { input_bytes[i] = rand()%256; } srslte_bit_unpack_vector(input_bytes, input_bits, long_cb); if (SRSLTE_VERBOSE_ISINFO()) { printf("Input bits:\n"); for (int i=0;i<long_cb/8;i++) { srslte_vec_fprint_b(stdout, &input_bits[i*8], 8); } } srslte_tcod_encode(&tcod, input_bits, output_bits, long_cb); srslte_tcod_encode_lut(&tcod, input_bytes, parity, len); srslte_bit_unpack_vector(parity, parity_bits, 2*(long_cb+4)); for (int i=0;i<long_cb;i++) { output_bits2[3*i] = input_bits[i]; output_bits2[3*i+1] = parity_bits[i]; output_bits2[3*i+2] = parity_bits[i+long_cb+4]; } if (SRSLTE_VERBOSE_ISINFO()) { srslte_vec_fprint_b(stdout, output_bits2, 3*long_cb); srslte_vec_fprint_b(stdout, output_bits, 3*long_cb); printf("\n"); } for (int i=0;i<2*long_cb;i++) { if (output_bits2[long_cb+i] != output_bits[long_cb+i]) { printf("error in bit %d, len=%d\n", i, len); exit(-1); } } } srslte_tcod_free(&tcod); printf("Done\n"); exit(0); }
int srslte_sch_init(srslte_sch_t *q) { int ret = SRSLTE_ERROR_INVALID_INPUTS; if (q) { bzero(q, sizeof(srslte_sch_t)); if (srslte_crc_init(&q->crc_tb, SRSLTE_LTE_CRC24A, 24)) { fprintf(stderr, "Error initiating CRC\n"); goto clean; } if (srslte_crc_init(&q->crc_cb, SRSLTE_LTE_CRC24B, 24)) { fprintf(stderr, "Error initiating CRC\n"); goto clean; } if (srslte_tcod_init(&q->encoder, SRSLTE_TCOD_MAX_LEN_CB)) { fprintf(stderr, "Error initiating Turbo Coder\n"); goto clean; } if (srslte_tdec_init(&q->decoder, SRSLTE_TCOD_MAX_LEN_CB)) { fprintf(stderr, "Error initiating Turbo Decoder\n"); goto clean; } // Allocate floats for reception (LLRs) q->cb_in = srslte_vec_malloc(sizeof(uint8_t) * SRSLTE_TCOD_MAX_LEN_CB); if (!q->cb_in) { goto clean; } q->cb_temp = srslte_vec_malloc(sizeof(uint8_t) * SRSLTE_TCOD_MAX_LEN_CB); if (!q->cb_temp) { goto clean; } q->cb_out = srslte_vec_malloc(sizeof(float) * (3 * SRSLTE_TCOD_MAX_LEN_CB + 12)); if (!q->cb_out) { goto clean; } if (srslte_uci_cqi_init(&q->uci_cqi)) { goto clean; } ret = SRSLTE_SUCCESS; } clean: if (ret == SRSLTE_ERROR) { srslte_sch_free(q); } return ret; }
int main(int argc, char **argv) { parse_args(argc, argv); srslte_tcod_gentable(); srslte_tcod_t tcod; srslte_tcod_init(&tcod, 6144); uint32_t st=0, end=187; if (long_cb) { st=srslte_cbsegm_cbindex(long_cb); end=st; } for (uint32_t len=st;len<=end;len++) { long_cb = srslte_cbsegm_cbsize(len); printf("Checking long_cb=%d\n", long_cb); for (int i=0;i<long_cb/8;i++) { input_bytes[i] = rand()%256; } srslte_bit_unpack_vector(input_bytes, input_bits, long_cb); if (SRSLTE_VERBOSE_ISINFO()) { printf("Input bits:\n"); for (int i=0;i<long_cb/8;i++) { srslte_vec_fprint_b(stdout, &input_bits[i*8], 8); } } srslte_tcod_encode(&tcod, input_bits, output_bits, long_cb); srslte_tcod_encode_lut(&tcod, input_bytes, output_bytes, long_cb); srslte_bit_unpack_vector(output_bytes, output_bits2, 2*long_cb+12); /* de-Interleace bits for comparison */ for (int i=0;i<long_cb;i++) { for (int j=0;j<2;j++) { output_bits3[j*long_cb+i] = output_bits[3*i+j+1]; } } // copy tail memcpy(&output_bits3[2*long_cb], &output_bits[3*long_cb], 12); if (SRSLTE_VERBOSE_ISINFO()) { printf("1st encoder\n"); srslte_vec_fprint_b(stdout, output_bits2, long_cb); srslte_vec_fprint_b(stdout, output_bits3, long_cb); printf("2nd encoder\n"); srslte_vec_fprint_b(stdout, &output_bits2[long_cb], long_cb); srslte_vec_fprint_b(stdout, &output_bits3[long_cb], long_cb); printf("tail\n"); srslte_vec_fprint_b(stdout, &output_bits2[2*long_cb], 12); srslte_vec_fprint_b(stdout, &output_bits3[2*long_cb], 12); printf("\n"); } for (int i=0;i<2*long_cb+12;i++) { if (output_bits2[i] != output_bits3[i]) { printf("error in bit %d, len=%d\n", i, len); exit(-1); } } } srslte_tcod_free(&tcod); printf("Done\n"); exit(0); }
int main(int argc, char **argv) { int sf_idx=0, N_id_2=0; cf_t pss_signal[SRSLTE_PSS_LEN]; float sss_signal0[SRSLTE_SSS_LEN]; // for subframe 0 float sss_signal5[SRSLTE_SSS_LEN]; // for subframe 5 int i; #ifdef DISABLE_UHD if (argc < 3) { usage(argv[0]); exit(-1); } #endif parse_args(argc, argv); N_id_2 = cell.id % 3; sf_n_re = 2 * SRSLTE_CP_NORM_NSYMB * cell.nof_prb * SRSLTE_NRE; sf_n_samples = 2 * SRSLTE_SLOT_LEN(srslte_symbol_sz(cell.nof_prb)); cell.phich_length = SRSLTE_PHICH_NORM; cell.phich_resources = SRSLTE_PHICH_R_1; /* this *must* be called after setting slot_len_* */ base_init(); /* Generate PSS/SSS signals */ srslte_pss_generate(pss_signal, N_id_2); srslte_sss_generate(sss_signal0, sss_signal5, cell.id); printf("Set TX rate: %.2f MHz\n", cuhd_set_tx_srate(uhd, srslte_sampling_freq_hz(cell.nof_prb)) / 1000000); printf("Set TX gain: %.1f dB\n", cuhd_set_tx_gain(uhd, uhd_gain)); printf("Set TX freq: %.2f MHz\n", cuhd_set_tx_freq(uhd, uhd_freq) / 1000000); uint32_t nbits; srslte_modem_table_t modulator; srslte_modem_table_init(&modulator); srslte_modem_table_lte(&modulator, modulation); srslte_tcod_t turbocoder; srslte_tcod_init(&turbocoder, SRSLTE_TCOD_MAX_LEN_CB); srslte_dft_precoding_t dft_precod; srslte_dft_precoding_init(&dft_precod, 12); nbits = srslte_cbsegm_cbindex(sf_n_samples/8/srslte_mod_bits_x_symbol(modulation)/3 - 12); uint32_t ncoded_bits = sf_n_samples/8/srslte_mod_bits_x_symbol(modulation); uint8_t *data = malloc(sizeof(uint8_t)*nbits); uint8_t *data_enc = malloc(sizeof(uint8_t)*ncoded_bits); cf_t *symbols = malloc(sizeof(cf_t)*sf_n_samples); bzero(data_enc, sizeof(uint8_t)*ncoded_bits); while (1) { for (sf_idx = 0; sf_idx < SRSLTE_NSUBFRAMES_X_FRAME; sf_idx++) { bzero(sf_buffer, sizeof(cf_t) * sf_n_re); #ifdef kk if (sf_idx == 0 || sf_idx == 5) { srslte_pss_put_slot(pss_signal, sf_buffer, cell.nof_prb, SRSLTE_CP_NORM); srslte_sss_put_slot(sf_idx ? sss_signal5 : sss_signal0, sf_buffer, cell.nof_prb, SRSLTE_CP_NORM); /* Transform to OFDM symbols */ srslte_ofdm_tx_sf(&ifft, sf_buffer, output_buffer); float norm_factor = (float) sqrtf(cell.nof_prb)/15; srslte_vec_sc_prod_cfc(output_buffer, uhd_amp*norm_factor, output_buffer, SRSLTE_SF_LEN_PRB(cell.nof_prb)); } else { #endif /* Generate random data */ for (i=0;i<nbits;i++) { data[i] = rand()%2; } srslte_tcod_encode(&turbocoder, data, data_enc, nbits); srslte_mod_modulate(&modulator, data_enc, symbols, ncoded_bits); srslte_interp_linear_offset_cabs(symbols, output_buffer, 8, sf_n_samples/8, 0, 0); // } /* send to usrp */ srslte_vec_sc_prod_cfc(output_buffer, uhd_amp, output_buffer, sf_n_samples); cuhd_send(uhd, output_buffer, sf_n_samples, true); } } base_free(); printf("Done\n"); exit(0); }
int main(int argc, char **argv) { uint32_t frame_cnt; float *llr; short *llr_s; uint8_t *llr_c; uint8_t *data_tx, *data_rx, *data_rx_bytes, *symbols; uint32_t i, j; float var[SNR_POINTS]; uint32_t snr_points; uint32_t errors; uint32_t coded_length; struct timeval tdata[3]; float mean_usec; srslte_tdec_t tdec; srslte_tcod_t tcod; parse_args(argc, argv); if (!seed) { seed = time(NULL); } srand(seed); if (test_known_data) { frame_length = KNOWN_DATA_LEN; } else { frame_length = srslte_cbsegm_cbsize(srslte_cbsegm_cbindex(frame_length)); } coded_length = 3 * (frame_length) + SRSLTE_TCOD_TOTALTAIL; printf(" Frame length: %d\n", frame_length); if (ebno_db < 100.0) { printf(" EbNo: %.2f\n", ebno_db); } data_tx = srslte_vec_malloc(frame_length * sizeof(uint8_t)); if (!data_tx) { perror("malloc"); exit(-1); } data_rx = srslte_vec_malloc(frame_length * sizeof(uint8_t)); if (!data_rx) { perror("malloc"); exit(-1); } data_rx_bytes = srslte_vec_malloc(frame_length * sizeof(uint8_t)); if (!data_rx_bytes) { perror("malloc"); exit(-1); } symbols = srslte_vec_malloc(coded_length * sizeof(uint8_t)); if (!symbols) { perror("malloc"); exit(-1); } llr = srslte_vec_malloc(coded_length * sizeof(float)); if (!llr) { perror("malloc"); exit(-1); } llr_s = srslte_vec_malloc(coded_length * sizeof(short)); if (!llr_s) { perror("malloc"); exit(-1); } llr_c = srslte_vec_malloc(coded_length * sizeof(uint8_t)); if (!llr_c) { perror("malloc"); exit(-1); } if (srslte_tcod_init(&tcod, frame_length)) { fprintf(stderr, "Error initiating Turbo coder\n"); exit(-1); } if (srslte_tdec_init_manual(&tdec, frame_length, tdec_type)) { fprintf(stderr, "Error initiating Turbo decoder\n"); exit(-1); } srslte_tdec_force_not_sb(&tdec); float ebno_inc, esno_db; ebno_inc = (SNR_MAX - SNR_MIN) / SNR_POINTS; if (ebno_db == 100.0) { snr_points = SNR_POINTS; for (i = 0; i < snr_points; i++) { ebno_db = SNR_MIN + i * ebno_inc; esno_db = ebno_db + 10 * log10((double) 1 / 3); var[i] = sqrt(1 / (pow(10, esno_db / 10))); } } else { esno_db = ebno_db + 10 * log10((double) 1 / 3); var[0] = sqrt(1 / (pow(10, esno_db / 10))); snr_points = 1; } for (i = 0; i < snr_points; i++) { mean_usec = 0; errors = 0; frame_cnt = 0; while (frame_cnt < nof_frames) { /* generate data_tx */ for (j = 0; j < frame_length; j++) { if (test_known_data) { data_tx[j] = known_data[j]; } else { data_tx[j] = rand() % 2; } } /* coded BER */ if (test_known_data) { for (j = 0; j < coded_length; j++) { symbols[j] = known_data_encoded[j]; } } else { srslte_tcod_encode(&tcod, data_tx, symbols, frame_length); } for (j = 0; j < coded_length; j++) { llr[j] = symbols[j] ? 1 : -1; } srslte_ch_awgn_f(llr, llr, var[i], coded_length); for (j=0;j<coded_length;j++) { llr_s[j] = (int16_t) (100*llr[j]); } /* decoder */ srslte_tdec_new_cb(&tdec, frame_length); uint32_t t; if (nof_iterations == -1) { t = MAX_ITERATIONS; } else { t = nof_iterations; } gettimeofday(&tdata[1], NULL); for (int k=0;k<nof_repetitions;k++) { srslte_tdec_run_all(&tdec, llr_s, data_rx_bytes, t, frame_length); } gettimeofday(&tdata[2], NULL); get_time_interval(tdata); mean_usec = (tdata[0].tv_sec*1e6+tdata[0].tv_usec)/nof_repetitions; frame_cnt++; uint32_t errors_this = 0; srslte_bit_unpack_vector(data_rx_bytes, data_rx, frame_length); errors_this=srslte_bit_diff(data_tx, data_rx, frame_length); //printf("error[%d]=%d\n", cb, errors_this); errors += errors_this; printf("Eb/No: %2.2f %10d/%d ", SNR_MIN + i * ebno_inc, frame_cnt, nof_frames); printf("BER: %.2e ", (float) errors / (nof_cb*frame_cnt * frame_length)); printf("%3.1f Mbps (%6.2f usec)", (float) (nof_cb*frame_length) / mean_usec, mean_usec); printf("\r"); } printf("\n"); } printf("\n"); if (snr_points == 1) { if (errors) { printf("%d Errors\n", errors/nof_cb); } } if (data_rx_bytes) { free(data_rx_bytes); } free(data_tx); free(symbols); free(llr); free(llr_c); free(llr_s); free(data_rx); srslte_tdec_free(&tdec); srslte_tcod_free(&tcod); printf("\n"); printf("Done\n"); exit(0); }