summaryrefslogtreecommitdiff
path: root/gsmstack/interleave.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2008-12-01 10:28:04 +0530
committerHarald Welte <laforge@gnumonks.org>2008-12-01 10:28:04 +0530
commit10f2fcca8dd1be2719bccefa16fd9dac9a76c749 (patch)
tree0b521a2ccc7d0d81a89e08b05650dec2421777d2 /gsmstack/interleave.c
parentfd405f799425b6832a0c9cc7a56b07f43288b8b1 (diff)
[gsmdecode] import {interleave,conv}.[ch] from gsm-tvoid
* change convolutional decode to cope with TCH * add tch.c file with reordering/decoding for TCH/F
Diffstat (limited to 'gsmstack/interleave.c')
-rw-r--r--gsmstack/interleave.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/gsmstack/interleave.c b/gsmstack/interleave.c
new file mode 100644
index 0000000..7899274
--- /dev/null
+++ b/gsmstack/interleave.c
@@ -0,0 +1,48 @@
+/* This file was taken from gsm-tvoid */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "interleave.h"
+
+int
+interleave_init(INTERLEAVE_CTX *ictx, int size, int block_size)
+{
+ ictx->trans_size = size;
+ ictx->trans = (unsigned short *)malloc(size * sizeof *ictx->trans);
+
+// DEBUGF("size: %d\n", size);
+// DEBUGF("Block size: %d\n", block_size);
+ int j, k, B;
+ for (k = 0; k < size; k++)
+ {
+ B = k % 4;
+ j = 2 * ((49 * k) % 57) + ((k % 8) / 4);
+ ictx->trans[k] = B * block_size + j;
+ /* Mapping: pos1 goes to pos2: pos1 -> pos2 */
+// DEBUGF("%d -> %d\n", ictx->trans[k], k);
+ }
+// exit(0);
+ return 0;
+}
+
+int
+interleave_deinit(INTERLEAVE_CTX *ictx)
+{
+ if (ictx->trans != NULL)
+ {
+ free(ictx->trans);
+ ictx->trans = NULL;
+ }
+
+ return 0;
+}
+
+void
+interleave_decode(INTERLEAVE_CTX *ictx, unsigned char *dst, unsigned char *src)
+{
+
+ int k;
+ for (k = 0; k < ictx->trans_size; k++)
+ dst[k] = src[ictx->trans[k]];
+}
+
personal git repositories of Harald Welte. Your mileage may vary