/* Encode PUCCH bits according to Table 5.4.1-1 in Section 5.4.1 of 36.211 */ static int uci_mod_bits(srslte_pucch_t *q, srslte_pucch_format_t format, uint8_t bits[SRSLTE_PUCCH_MAX_BITS], uint32_t sf_idx) { uint8_t tmp[2]; switch(format) { case SRSLTE_PUCCH_FORMAT_1: q->d[0] = uci_encode_format1(); break; case SRSLTE_PUCCH_FORMAT_1A: q->d[0] = uci_encode_format1a(bits[0]); break; case SRSLTE_PUCCH_FORMAT_1B: tmp[0] = bits[0]; tmp[1] = bits[1]; q->d[0] = uci_encode_format1b(tmp); break; case SRSLTE_PUCCH_FORMAT_2: case SRSLTE_PUCCH_FORMAT_2A: case SRSLTE_PUCCH_FORMAT_2B: memcpy(q->bits_scram, bits, SRSLTE_PUCCH_MAX_BITS*sizeof(uint8_t)); srslte_scrambling_b(&q->seq_f2[sf_idx], q->bits_scram); srslte_mod_modulate(&q->mod, q->bits_scram, q->d, SRSLTE_PUCCH_MAX_BITS); break; default: fprintf(stderr, "PUCCH format 2 not supported\n"); return SRSLTE_ERROR; } return SRSLTE_SUCCESS; }
/** Encodes CFI and maps symbols to the slot */ int srslte_pcfich_encode(srslte_pcfich_t *q, uint32_t cfi, cf_t *slot_symbols[SRSLTE_MAX_PORTS], uint32_t subframe) { int i; if (q != NULL && cfi < 3 && slot_symbols != NULL && subframe < SRSLTE_NSUBFRAMES_X_FRAME) { /* Set pointers for layermapping & precoding */ cf_t *x[SRSLTE_MAX_LAYERS]; cf_t *symbols_precoding[SRSLTE_MAX_PORTS]; /* number of layers equals number of ports */ for (i = 0; i < q->cell.nof_ports; i++) { x[i] = q->x[i]; } for (i = 0; i < SRSLTE_MAX_PORTS; i++) { symbols_precoding[i] = q->symbols[i]; } /* pack CFI */ srslte_pcfich_cfi_encode(cfi, q->data); /* scramble for slot sequence nslot */ srslte_scrambling_b(&q->seq[subframe], q->data); srslte_mod_modulate(&q->mod, q->data, q->d, PCFICH_CFI_LEN); /* layer mapping & precoding */ if (q->cell.nof_ports > 1) { srslte_layermap_diversity(q->d, x, q->cell.nof_ports, q->nof_symbols); srslte_precoding_diversity(x, symbols_precoding, q->cell.nof_ports, q->nof_symbols / q->cell.nof_ports); } else { memcpy(q->symbols[0], q->d, q->nof_symbols * sizeof(cf_t)); } /* mapping to resource elements */ for (i = 0; i < q->cell.nof_ports; i++) { if (srslte_regs_pcfich_put(q->regs, q->symbols[i], slot_symbols[i]) < 0) { fprintf(stderr, "Error putting PCHICH resource elements\n"); return SRSLTE_ERROR; } } return SRSLTE_SUCCESS; } else { return SRSLTE_ERROR_INVALID_INPUTS; } }
int main(int argc, char **argv) { int i; srslte_sequence_t seq; uint8_t *input_b, *scrambled_b; float *input_f, *scrambled_f; struct timeval t[3]; parse_args(argc, argv); if (init_sequence(&seq, srslte_sequence_name) == -1) { fprintf(stderr, "Error initiating sequence %s\n", srslte_sequence_name); exit(-1); } if (!do_floats) { input_b = malloc(sizeof(uint8_t) * seq.len); if (!input_b) { perror("malloc"); exit(-1); } scrambled_b = malloc(sizeof(uint8_t) * seq.len); if (!scrambled_b) { perror("malloc"); exit(-1); } for (i=0;i<seq.len;i++) { input_b[i] = rand()%2; scrambled_b[i] = input_b[i]; } gettimeofday(&t[1], NULL); srslte_scrambling_b(&seq, scrambled_b); gettimeofday(&t[2], NULL); srslte_scrambling_b(&seq, scrambled_b); get_time_interval(t); printf("Texec=%d us for %d bits\n", t[0].tv_usec, seq.len); for (i=0;i<seq.len;i++) { if (scrambled_b[i] != input_b[i]) { printf("Error in %d\n", i); exit(-1); } } free(input_b); free(scrambled_b); } else { input_f = malloc(sizeof(float) * seq.len); if (!input_f) { perror("malloc"); exit(-1); } scrambled_f = malloc(sizeof(float) * seq.len); if (!scrambled_f) { perror("malloc"); exit(-1); } for (i=0;i<seq.len;i++) { input_f[i] = 100*(rand()/RAND_MAX); scrambled_f[i] = input_f[i]; } gettimeofday(&t[1], NULL); srslte_scrambling_f(&seq, scrambled_f); gettimeofday(&t[2], NULL); srslte_scrambling_f(&seq, scrambled_f); get_time_interval(t); printf("Texec=%d us for %d bits\n", t[0].tv_usec, seq.len); for (i=0;i<seq.len;i++) { if (scrambled_f[i] != input_f[i]) { printf("Error in %d\n", i); exit(-1); } } free(input_f); free(scrambled_f); } printf("Ok\n"); srslte_sequence_free(&seq); exit(0); }