mirror of https://github.com/wb2osz/direwolf.git
Closer. Lots of ACCA data to chew on.
This commit is contained in:
parent
a707fc8225
commit
5be9e44c5b
74
src/bch.c
74
src/bch.c
|
@ -75,7 +75,9 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "bch.h"
|
#include "bch.h"
|
||||||
|
|
||||||
int bch_init(bch_t *bch, int m, int length, int t) {
|
#undef DEBUG
|
||||||
|
|
||||||
|
int init_bch(bch_t *bch, int m, int length, int t) {
|
||||||
|
|
||||||
int p[21], n;
|
int p[21], n;
|
||||||
|
|
||||||
|
@ -115,14 +117,20 @@ int bch_init(bch_t *bch, int m, int length, int t) {
|
||||||
else if (m == 18) p[7] = 1;
|
else if (m == 18) p[7] = 1;
|
||||||
else if (m == 19) p[1] = p[5] = p[6] = 1;
|
else if (m == 19) p[1] = p[5] = p[6] = 1;
|
||||||
else if (m == 20) p[3] = 1;
|
else if (m == 20) p[3] = 1;
|
||||||
printf("p(x) = ");
|
|
||||||
|
|
||||||
n = 1;
|
n = 1;
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("p(x) = ");
|
||||||
|
#endif
|
||||||
for (int i = 0; i <= m; i++) {
|
for (int i = 0; i <= m; i++) {
|
||||||
n *= 2;
|
n *= 2;
|
||||||
|
#ifdef DEBUG
|
||||||
printf("%1d", p[i]);
|
printf("%1d", p[i]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
#endif
|
||||||
n = n / 2 - 1;
|
n = n / 2 - 1;
|
||||||
bch->n = n;
|
bch->n = n;
|
||||||
int ninf = (n + 1) / 2 - 1;
|
int ninf = (n + 1) / 2 - 1;
|
||||||
|
@ -184,10 +192,12 @@ int bch_init(bch_t *bch, int m, int length, int t) {
|
||||||
cycle[1][0] = 1;
|
cycle[1][0] = 1;
|
||||||
size[1] = 1;
|
size[1] = 1;
|
||||||
jj = 1; /* cycle set index */
|
jj = 1; /* cycle set index */
|
||||||
|
#ifdef DEBUG
|
||||||
if (bch->m > 9) {
|
if (bch->m > 9) {
|
||||||
printf("Computing cycle sets modulo %d\n", bch->n);
|
printf("Computing cycle sets modulo %d\n", bch->n);
|
||||||
printf("(This may take some time)...\n");
|
printf("(This may take some time)...\n");
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
do {
|
do {
|
||||||
/* Generate the jj-th cycle set */
|
/* Generate the jj-th cycle set */
|
||||||
ii = 0;
|
ii = 0;
|
||||||
|
@ -247,11 +257,12 @@ int bch_init(bch_t *bch, int m, int length, int t) {
|
||||||
|
|
||||||
if (bch->k<0)
|
if (bch->k<0)
|
||||||
{
|
{
|
||||||
printf("Parameters invalid!\n");
|
|
||||||
return -4;
|
return -4;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
printf("This is a (%d, %d, %d) binary BCH code\n", bch->length, bch->k, d);
|
printf("This is a (%d, %d, %d) binary BCH code\n", bch->length, bch->k, d);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Compute the generator polynomial */
|
/* Compute the generator polynomial */
|
||||||
bch->g = malloc((rdncy + 1) * sizeof(int));
|
bch->g = malloc((rdncy + 1) * sizeof(int));
|
||||||
|
@ -266,12 +277,13 @@ int bch_init(bch_t *bch, int m, int length, int t) {
|
||||||
bch->g[jj] = bch->g[jj - 1];
|
bch->g[jj] = bch->g[jj - 1];
|
||||||
bch->g[0] = bch->alpha_to[(bch->index_of[bch->g[0]] + zeros[ii]) % bch->n];
|
bch->g[0] = bch->alpha_to[(bch->index_of[bch->g[0]] + zeros[ii]) % bch->n];
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
printf("Generator polynomial:\ng(x) = ");
|
printf("Generator polynomial:\ng(x) = ");
|
||||||
for (ii = 0; ii <= rdncy; ii++) {
|
for (ii = 0; ii <= rdncy; ii++) {
|
||||||
printf("%d", bch->g[ii]);
|
printf("%d", bch->g[ii]);
|
||||||
}
|
}
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -303,8 +315,7 @@ void generate_bch(bch_t *bch, int *data, int *bb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int apply_bch(bch_t *bch, int *recd)
|
||||||
apply_bch(bch_t *bch, int *recd)
|
|
||||||
/*
|
/*
|
||||||
* Simon Rockliff's implementation of Berlekamp's algorithm.
|
* Simon Rockliff's implementation of Berlekamp's algorithm.
|
||||||
*
|
*
|
||||||
|
@ -335,7 +346,9 @@ apply_bch(bch_t *bch, int *recd)
|
||||||
t2 = 2 * bch->t;
|
t2 = 2 * bch->t;
|
||||||
|
|
||||||
/* first form the syndromes */
|
/* first form the syndromes */
|
||||||
|
#ifdef DEBUG
|
||||||
printf("S(x) = ");
|
printf("S(x) = ");
|
||||||
|
#endif
|
||||||
for (i = 1; i <= t2; i++) {
|
for (i = 1; i <= t2; i++) {
|
||||||
s[i] = 0;
|
s[i] = 0;
|
||||||
for (j = 0; j < bch->length; j++)
|
for (j = 0; j < bch->length; j++)
|
||||||
|
@ -349,9 +362,13 @@ apply_bch(bch_t *bch, int *recd)
|
||||||
*/
|
*/
|
||||||
/* convert syndrome from polynomial form to index form */
|
/* convert syndrome from polynomial form to index form */
|
||||||
s[i] = bch->index_of[s[i]];
|
s[i] = bch->index_of[s[i]];
|
||||||
|
#ifdef DEBUG
|
||||||
printf("%3d ", s[i]);
|
printf("%3d ", s[i]);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
#endif
|
||||||
|
|
||||||
if (syn_error) { /* if there are errors, try to correct them */
|
if (syn_error) { /* if there are errors, try to correct them */
|
||||||
/*
|
/*
|
||||||
|
@ -451,12 +468,13 @@ apply_bch(bch_t *bch, int *recd)
|
||||||
for (i = 0; i <= l[u]; i++)
|
for (i = 0; i <= l[u]; i++)
|
||||||
elp[u][i] = bch->index_of[elp[u][i]];
|
elp[u][i] = bch->index_of[elp[u][i]];
|
||||||
|
|
||||||
|
#ifdef DEBUG
|
||||||
printf("sigma(x) = ");
|
printf("sigma(x) = ");
|
||||||
for (i = 0; i <= l[u]; i++)
|
for (i = 0; i <= l[u]; i++)
|
||||||
printf("%3d ", elp[u][i]);
|
printf("%3d ", elp[u][i]);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
printf("Roots: ");
|
printf("Roots: ");
|
||||||
|
#endif
|
||||||
/* Chien search: find roots of the error location polynomial */
|
/* Chien search: find roots of the error location polynomial */
|
||||||
for (i = 1; i <= l[u]; i++)
|
for (i = 1; i <= l[u]; i++)
|
||||||
reg[i] = elp[u][i];
|
reg[i] = elp[u][i];
|
||||||
|
@ -473,10 +491,14 @@ apply_bch(bch_t *bch, int *recd)
|
||||||
root[count] = i;
|
root[count] = i;
|
||||||
loc[count] = bch->n - i;
|
loc[count] = bch->n - i;
|
||||||
count++;
|
count++;
|
||||||
|
#ifdef DEBUG
|
||||||
printf("%3d ", bch->n - i);
|
printf("%3d ", bch->n - i);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#ifdef DEBUG
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
#endif
|
||||||
if (count == l[u]) {
|
if (count == l[u]) {
|
||||||
/* no. roots = degree of elp hence <= t errors */
|
/* no. roots = degree of elp hence <= t errors */
|
||||||
for (i = 0; i < l[u]; i++)
|
for (i = 0; i < l[u]; i++)
|
||||||
|
@ -484,7 +506,9 @@ apply_bch(bch_t *bch, int *recd)
|
||||||
return l[u];
|
return l[u];
|
||||||
}
|
}
|
||||||
else { /* elp has degree >t hence cannot solve */
|
else { /* elp has degree >t hence cannot solve */
|
||||||
|
#ifdef DEBUG
|
||||||
printf("Incomplete decoding: errors detected\n");
|
printf("Incomplete decoding: errors detected\n");
|
||||||
|
#endif
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -522,14 +546,28 @@ void bits_to_bytes(int *bits, int *byte_dest, int num_bits) {
|
||||||
byte_dest[index] <<= 8 - (num_bits % 8);
|
byte_dest[index] <<= 8 - (num_bits % 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void swap_format(int *bits, int cutoff, int num_bits) {
|
||||||
|
// Do it the easy way
|
||||||
|
int *temp = malloc(num_bits * sizeof(int));
|
||||||
|
for (int i = 0; i < num_bits; i++) {
|
||||||
|
if (i < cutoff) {
|
||||||
|
temp[num_bits - cutoff + i] = bits[i];
|
||||||
|
} else {
|
||||||
|
temp[i - cutoff] = bits[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(bits, temp, num_bits * sizeof(int));
|
||||||
|
}
|
||||||
|
|
||||||
void dump_bch(bch_t *bch) {
|
void dump_bch(bch_t *bch) {
|
||||||
printf("m: %d length: %d t: %d n: %d k: %d\n", bch->m, bch->length, bch->t, bch->n, bch->k);
|
printf("m: %d length: %d t: %d n: %d k: %d\n", bch->m, bch->length, bch->t, bch->n, bch->k);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#undef MAIN
|
||||||
#undef TEST_BYTES_TO_BITS
|
#undef TEST_BYTES_TO_BITS
|
||||||
#define TEST_APPLY
|
#define TEST_SWAP
|
||||||
|
#ifdef MAIN
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
int test[][8] = {
|
int test[][8] = {
|
||||||
|
@ -555,7 +593,7 @@ int main()
|
||||||
int temp[8];
|
int temp[8];
|
||||||
bch_t bch;
|
bch_t bch;
|
||||||
|
|
||||||
bch_init(&bch, 6, 63, 3);
|
init_bch(&bch, 6, 63, 3);
|
||||||
|
|
||||||
for (int count = 0; count < sizeof(test) / sizeof(*test); count++) {
|
for (int count = 0; count < sizeof(test) / sizeof(*test); count++) {
|
||||||
bytes_to_bits(test[count], bits, 63);
|
bytes_to_bits(test[count], bits, 63);
|
||||||
|
@ -593,6 +631,21 @@ int main()
|
||||||
printf("\n");
|
printf("\n");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef TEST_SWAP
|
||||||
|
printf("orig: ");
|
||||||
|
for (int i = 0; i < 63; i++) {
|
||||||
|
printf("%d ", bits[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
swap_format(bits, 45, 63);
|
||||||
|
|
||||||
|
printf("rev: ");
|
||||||
|
for (int i = 0; i < 63; i++) {
|
||||||
|
printf("%d ", bits[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
#endif
|
||||||
#ifdef TEST_APPLY
|
#ifdef TEST_APPLY
|
||||||
int recv[63];
|
int recv[63];
|
||||||
|
|
||||||
|
@ -635,3 +688,4 @@ int main()
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
10
src/bch.h
10
src/bch.h
|
@ -15,8 +15,16 @@ struct bch {
|
||||||
|
|
||||||
typedef struct bch bch_t;
|
typedef struct bch bch_t;
|
||||||
|
|
||||||
int bch_init(bch_t *bch, int m, int length, int t);
|
int init_bch(bch_t *bch, int m, int length, int t);
|
||||||
|
|
||||||
void generate_bch(bch_t *bch, int *data, int *bb);
|
void generate_bch(bch_t *bch, int *data, int *bb);
|
||||||
|
|
||||||
|
int apply_bch(bch_t *bch, int *recd);
|
||||||
|
|
||||||
|
void bytes_to_bits(int *bytes, int *bit_dest, int num_bits);
|
||||||
|
|
||||||
|
void bits_to_bytes(int *bits, int *byte_dest, int num_bits);
|
||||||
|
|
||||||
|
void swap_format(int *bits, int cutoff, int num_bits);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
DATA_DIR=../build
|
||||||
|
cut -c22-41,54-56,59-61,64-66,69-71,74-76,79-81,84-86,89-90 $DATA_DIR/all.out >$DATA_DIR/all.cut
|
||||||
|
cut -d' ' -f5- $DATA_DIR/all.cut > $DATA_DIR/all.pkts
|
||||||
|
./pkttest < $DATA_DIR/all.pkts > $DATA_DIR/all.good
|
|
@ -0,0 +1,68 @@
|
||||||
|
#include <stdio.h>
|
||||||
|
#include "bch.h"
|
||||||
|
|
||||||
|
int main(int argc, char **argv) {
|
||||||
|
bch_t bch;
|
||||||
|
int bytes[8];
|
||||||
|
int bits[63];
|
||||||
|
|
||||||
|
init_bch(&bch, 6, 63, 3);
|
||||||
|
#ifdef ARGS
|
||||||
|
if (argc != 9) {
|
||||||
|
fprintf(stderr, "Expecting 8 arguments.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
sscanf(argv[i + 1], "%x", bytes + i);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
while (1) {
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
int status = scanf("%x ", bytes + i);
|
||||||
|
if (status == EOF) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (status != 1) {
|
||||||
|
fprintf(stderr, "Error: %d", status);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
// UNEEDED
|
||||||
|
// swap_format(bits, 45, 63);
|
||||||
|
bytes_to_bits(bytes, bits, 63);
|
||||||
|
int corrected = apply_bch(&bch, bits);
|
||||||
|
if (corrected >= 0) {
|
||||||
|
#ifdef DEBUG
|
||||||
|
printf("%d corrected\n", corrected);
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
printf("%02x ", bytes[i]);
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
#endif
|
||||||
|
bits_to_bytes(bits, bytes, 63);
|
||||||
|
for (int i = 0; i < 8; i++) {
|
||||||
|
printf("%02x ", bytes[i]);
|
||||||
|
}
|
||||||
|
// Slice packet
|
||||||
|
|
||||||
|
printf("chain=%1x,",(bytes[0] >> 6) & 0x03);
|
||||||
|
printf("devst=%1x,",(bytes[0] >> 4) & 0x03);
|
||||||
|
printf("msgid=%1x,",(bytes[0] >> 1) & 0x07);
|
||||||
|
printf("uaddr=%03x,",((bytes[0] & 0x01) << 16) | (bytes[1] << 8) | (bytes[2]));
|
||||||
|
printf("bpres=%d,",(bytes[3] >> 1) & 0x07f);
|
||||||
|
printf("dbit1=%02x,",((bytes[3] & 0x01) << 7) | ((bytes[4] >> 1) & 0x7f));
|
||||||
|
printf("confm=%x,",(bytes[5] >> 7) & 0x01);
|
||||||
|
printf("dbit2=%x,",(bytes[5] >> 6) & 0x01);
|
||||||
|
printf("motdt=%x,",(bytes[5] >> 5) & 0x01);
|
||||||
|
printf("ltbat=%x,",(bytes[5] >> 4) & 0x01);
|
||||||
|
printf("ltsta=%x",(bytes[5] >> 3) & 0x01);
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
#ifndef ARGS
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue