From ea40092db72306506e683821d7608f3be11fd047 Mon Sep 17 00:00:00 2001 From: ismagom Date: Fri, 7 Aug 2015 02:56:45 +0200 Subject: [PATCH] Scrambling using words for XOR --- srslte/lib/common/src/sequence.c | 3 +- srslte/lib/scrambling/src/scrambling.c | 34 +++++++++++++++----- srslte/lib/scrambling/test/scrambling_test.c | 22 +++++++++++-- 3 files changed, 48 insertions(+), 11 deletions(-) diff --git a/srslte/lib/common/src/sequence.c b/srslte/lib/common/src/sequence.c index a273e0801..d9bd485f4 100644 --- a/srslte/lib/common/src/sequence.c +++ b/srslte/lib/common/src/sequence.c @@ -31,6 +31,7 @@ #include #include "srslte/common/sequence.h" +#include "srslte/utils/vector.h" #define Nc 1600 @@ -88,7 +89,7 @@ int srslte_sequence_init(srslte_sequence_t *q, uint32_t len) { free(q->c); } if (!q->c) { - q->c = malloc(len * sizeof(uint8_t)); + q->c = srslte_vec_malloc(len * sizeof(uint8_t)); if (!q->c) { return SRSLTE_ERROR; } diff --git a/srslte/lib/scrambling/src/scrambling.c b/srslte/lib/scrambling/src/scrambling.c index a995268e3..0e99cca92 100644 --- a/srslte/lib/scrambling/src/scrambling.c +++ b/srslte/lib/scrambling/src/scrambling.c @@ -29,6 +29,7 @@ #include #include #include +#include "srslte/utils/vector.h" #include "srslte/scrambling/scrambling.h" void srslte_scrambling_f(srslte_sequence_t *s, float *data) { @@ -40,7 +41,7 @@ void srslte_scrambling_f_offset(srslte_sequence_t *s, float *data, int offset, i assert (len + offset <= s->len); for (i = 0; i < len; i++) { - data[i] = data[i] * (1 - 2 * s->c[i + offset]); + data[i] = data[i] * (1-2*s->c[i + offset]); } } @@ -58,18 +59,35 @@ void srslte_scrambling_c_offset(srslte_sequence_t *s, cf_t *data, int offset, in } void srslte_scrambling_b(srslte_sequence_t *s, uint8_t *data) { - int i; - - for (i = 0; i < s->len; i++) { - data[i] = (data[i] + s->c[i]) % 2; - } + srslte_scrambling_b_offset(s, data, 0, s->len); } void srslte_scrambling_b_offset(srslte_sequence_t *s, uint8_t *data, int offset, int len) { int i; assert (len + offset <= s->len); - for (i = 0; i < len; i++) { - data[i] = (data[i] + s->c[i + offset]) % 2; + // Do XOR on a word basis + if (!(len%8)) { + uint64_t *x = (uint64_t*) data; + uint64_t *y = (uint64_t*) &s->c[offset]; + for (int i=0;ic[offset]; + for (int i=0;ic[offset]; + for (int i=0;ic[i + offset]) % 2; + } } } diff --git a/srslte/lib/scrambling/test/scrambling_test.c b/srslte/lib/scrambling/test/scrambling_test.c index 15ba36316..97e99cb59 100644 --- a/srslte/lib/scrambling/test/scrambling_test.c +++ b/srslte/lib/scrambling/test/scrambling_test.c @@ -40,20 +40,25 @@ char *srslte_sequence_name = NULL; bool do_floats = false; srslte_cp_t cp = SRSLTE_CP_NORM; int cell_id = -1; +int nof_bits = 100; void usage(char *prog) { printf("Usage: %s [ef] -c cell_id -s [PBCH, PDSCH, PDCCH, PMCH, PUCCH]\n", prog); + printf("\t -l nof_bits [Default %d]\n", nof_bits); printf("\t -e CP extended [Default CP Normal]\n"); printf("\t -f scramble floats [Default bits]\n"); } void parse_args(int argc, char **argv) { int opt; - while ((opt = getopt(argc, argv, "csef")) != -1) { + while ((opt = getopt(argc, argv, "csefl")) != -1) { switch (opt) { case 'c': cell_id = atoi(argv[optind]); break; + case 'l': + nof_bits = atoi(argv[optind]); + break; case 'e': cp = SRSLTE_CP_EXT; break; @@ -81,6 +86,8 @@ void parse_args(int argc, char **argv) { int init_sequence(srslte_sequence_t *seq, char *name) { if (!strcmp(name, "PBCH")) { return srslte_sequence_pbch(seq, cp, cell_id); + } else if (!strcmp(name, "PDSCH")) { + return srslte_sequence_pdsch(seq, 1234, 0, 0, cell_id, nof_bits); } else { fprintf(stderr, "Unsupported sequence name %s\n", name); return -1; @@ -93,7 +100,8 @@ int main(int argc, char **argv) { 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) { @@ -118,9 +126,14 @@ int main(int argc, char **argv) { 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