summaryrefslogtreecommitdiff
path: root/dumpocsag.c
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 /dumpocsag.c
parent92b415c916d7f102d906dfded3e82cd5a0bb51ca (diff)
Initial bch functions
Diffstat (limited to 'dumpocsag.c')
-rw-r--r--dumpocsag.c76
1 files changed, 76 insertions, 0 deletions
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);
+}