aboutsummaryrefslogtreecommitdiffstats
path: root/src/l1
diff options
context:
space:
mode:
authorSylvain Munaut <tnt@246tNt.com>2011-09-18 12:07:17 +0200
committerSylvain Munaut <tnt@246tNt.com>2011-09-18 12:07:17 +0200
commit96ecf1e8bde6bfb63a96521a5ab5cd5a46486e9f (patch)
tree99afc8ccff76c2e11c09ed6b151aaa7ce10593c0 /src/l1
parent32ef35f1b9ba280bb19a1ac5971dd8e489f6df47 (diff)
l1/scramb: Add scrambling primitives
As described in GMR-1 05.003 Section 4.9 Signed-off-by: Sylvain Munaut <tnt@246tNt.com>
Diffstat (limited to 'src/l1')
-rw-r--r--src/l1/scramb.c95
1 files changed, 95 insertions, 0 deletions
diff --git a/src/l1/scramb.c b/src/l1/scramb.c
new file mode 100644
index 0000000..aee37b0
--- /dev/null
+++ b/src/l1/scramb.c
@@ -0,0 +1,95 @@
+/* GMR-1 scrambling */
+/* See GMR-1 05.003 (ETSI TS 101 376-5-3 V1.2.1) - Section 4.9 */
+
+/* (C) 2011 by Sylvain Munaut <tnt@246tNt.com>
+ * All Rights Reserved
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*! \addtogroup scramb
+ * @{
+ */
+
+/*! \file scramb.c
+ * \file Osmocom GMR-1 scrambling implementation
+ */
+
+#include <stdint.h>
+
+#include <osmocom/core/bits.h>
+
+
+/*
+ * h(D) = 1 + D + D^15
+ * i(D) = 1 + D + D^3 + D^6 + D^8 + D^10 + D^11 + D^14
+ */
+
+#define GMR1_SCRAMBLE_REG_INIT 0x4d4b
+
+static inline int
+gmr1_scramble_reg_next(uint16_t *reg)
+{
+ int b;
+ uint16_t reg_val;
+
+ reg_val = *reg;
+ b = ((reg_val >> 14) ^ reg_val) & 1;
+ *reg = (reg_val << 1) | b;
+
+ return b;
+}
+
+
+/*! \brief Scrambles/Unscrambles a softbit vector
+ * \param[out] out output sbit_t array
+ * \param[in] in input sbit_t array
+ * \param[in] len length of the array to convert
+ *
+ * The output array can be equal to the input array for in-place
+ * scrambling/unscrambling
+ */
+void
+gmr1_scramble_sbit(sbit_t *out, const sbit_t *in, int len)
+{
+ uint16_t r = GMR1_SCRAMBLE_REG_INIT;
+ int i;
+
+ for (i=0; i<len; i++) {
+ sbit_t v = in[i];
+ out[i] = gmr1_scramble_reg_next(&r) ? -v : v;
+ }
+}
+
+/*! \brief Scrambles/Unscrambles an unpacked hard bit vector
+ * \param[out] out output ubit_t array
+ * \param[in] in input ubit_t array
+ * \param[in] len length of the array to convert
+ *
+ * The output array can be equal to the input array for in-place
+ * scrambling/unscrambling
+ */
+void
+gmr1_scramble_ubit(ubit_t *out, const ubit_t *in, int len)
+{
+ uint16_t r = GMR1_SCRAMBLE_REG_INIT;
+ int i;
+
+ for (i=0; i<len; i++) {
+ ubit_t v = in[i];
+ out[i] = v ^ gmr1_scramble_reg_next(&r);
+ }
+}
+
+/*! }@ */