From f5a0b2d6d04199c58dfdfdc63c6d3151c54b56b4 Mon Sep 17 00:00:00 2001 From: Yuval Adam Date: Sat, 12 Jan 2013 16:26:45 +0200 Subject: Initial bch functions --- Makefile | 15 ++++++++++++ dumpocsag.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 Makefile create mode 100644 dumpocsag.c 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#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); +} -- cgit v1.3.1