summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYuval Adam <yuv.adm@gmail.com>2013-01-12 16:26:45 +0200
committerYuval Adam <yuv.adm@gmail.com>2013-01-12 16:26:45 +0200
commitf5a0b2d6d04199c58dfdfdc63c6d3151c54b56b4 (patch)
tree2e551754d16c368861f531f01105761bed5b62a5
parent92b415c916d7f102d906dfded3e82cd5a0bb51ca (diff)
Initial bch functions
-rw-r--r--Makefile15
-rw-r--r--dumpocsag.c76
2 files changed, 91 insertions, 0 deletions
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..c60abc3
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,15 @@
+CFLAGS=-O2 -g -Wall -W `pkg-config --cflags librtlsdr`
+LIBS=`pkg-config --libs librtlsdr` -lpthread -lm
+CC=gcc
+PROGNAME=dumposcag
+
+all: dumpocsag
+
+%.o: %.c
+ $(CC) $(CFLAGS) -c $<
+
+dump1090: dumpocsag.o
+ $(CC) -g -o dumpocsag dumpocsag.o $(LIBS)
+
+clean:
+ rm -f *.o dumpocsag
diff --git a/dumpocsag.c b/dumpocsag.c
new file mode 100644
index 0000000..47a292b
--- /dev/null
+++ b/dumpocsag.c
@@ -0,0 +1,76 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <pthread.h>
+#include <stdint.h>
+#include <errno.h>
+#include <unistd.h>
+#include <math.h>
+#include <sys/time.h>
+#include <signal.h>
+#include <fcntl.h>
+#include <ctype.h>
+#include "rtl-sdr.h"
+
+/* POCSAG parameters */
+#define POCSAG_ID "POCSAG"
+#define POCSAG_SYM_RATE 1200
+#define POCSAG_FM_DEV 4500
+#define POCSAG_SPS 8
+
+#define POCSAG_BCH_POLY 0x769
+#define POCSAG_BCH_N 31
+#define POCSAG_BCH_K 21
+
+int hammingWeight(int n) {
+ unsigned int c;
+ for (c = 0; n; c++)
+ n &= n - 1;
+ return c;
+}
+
+int evenParity(int n) {
+ return hammingWeight(n) & 1;
+}
+
+int bchSyndrome(int data, int poly, int n, int k) {
+ int mask = 1 << (n - 1);
+ int coeff = poly << (k - 1);
+ n = k;
+
+ int s = data >> 1;
+ while (n > 0) {
+ if (s & mask)
+ s ^= coeff;
+ n -= 1;
+ mask >>= 1;
+ coeff >>= 1;
+ }
+
+ if (evenParity(data))
+ s |= 1 << (n - k);
+
+ return s;
+}
+
+int bchFix(int data, int poly, int n, int k) {
+ int i, j;
+ for (i=0; i<32; i++) {
+ int t = data ^ (1 << i);
+ if (!bchSyndrome(t, poly, n, k))
+ return t;
+ }
+ for (i=0; i<32; i++) {
+ for (j=i+1; j<32; j++) {
+ int t = data ^ ((1 << i) | (1 << j));
+ if (!bchSyndrome(t, poly, n, k))
+ return t;
+ }
+ }
+ return data;
+}
+
+int main(int argc, char **argv) {
+ printf("Dumpocsag v0.1\n");
+ exit(0);
+}