75
75
#include <string.h>
76
76
#include "bch.h"
77
77
78
- int bch_init (bch_t * bch , int m , int length , int t ) {
78
+ #undef DEBUG
79
+
80
+ int init_bch (bch_t * bch , int m , int length , int t ) {
79
81
80
82
int p [21 ], n ;
81
83
@@ -115,14 +117,20 @@ int bch_init(bch_t *bch, int m, int length, int t) {
115
117
else if (m == 18 ) p [7 ] = 1 ;
116
118
else if (m == 19 ) p [1 ] = p [5 ] = p [6 ] = 1 ;
117
119
else if (m == 20 ) p [3 ] = 1 ;
118
- printf ("p(x) = " );
119
120
120
121
n = 1 ;
122
+ #ifdef DEBUG
123
+ printf ("p(x) = " );
124
+ #endif
121
125
for (int i = 0 ; i <= m ; i ++ ) {
122
126
n *= 2 ;
127
+ #ifdef DEBUG
123
128
printf ("%1d" , p [i ]);
129
+ #endif
124
130
}
131
+ #ifdef DEBUG
125
132
printf ("\n" );
133
+ #endif
126
134
n = n / 2 - 1 ;
127
135
bch -> n = n ;
128
136
int ninf = (n + 1 ) / 2 - 1 ;
@@ -184,10 +192,12 @@ int bch_init(bch_t *bch, int m, int length, int t) {
184
192
cycle [1 ][0 ] = 1 ;
185
193
size [1 ] = 1 ;
186
194
jj = 1 ; /* cycle set index */
195
+ #ifdef DEBUG
187
196
if (bch -> m > 9 ) {
188
197
printf ("Computing cycle sets modulo %d\n" , bch -> n );
189
198
printf ("(This may take some time)...\n" );
190
199
}
200
+ #endif
191
201
do {
192
202
/* Generate the jj-th cycle set */
193
203
ii = 0 ;
@@ -247,11 +257,12 @@ int bch_init(bch_t *bch, int m, int length, int t) {
247
257
248
258
if (bch -> k < 0 )
249
259
{
250
- printf ("Parameters invalid!\n" );
251
260
return -4 ;
252
261
}
253
262
263
+ #ifdef DEBUG
254
264
printf ("This is a (%d, %d, %d) binary BCH code\n" , bch -> length , bch -> k , d );
265
+ #endif
255
266
256
267
/* Compute the generator polynomial */
257
268
bch -> g = malloc ((rdncy + 1 ) * sizeof (int ));
@@ -266,12 +277,13 @@ int bch_init(bch_t *bch, int m, int length, int t) {
266
277
bch -> g [jj ] = bch -> g [jj - 1 ];
267
278
bch -> g [0 ] = bch -> alpha_to [(bch -> index_of [bch -> g [0 ]] + zeros [ii ]) % bch -> n ];
268
279
}
280
+ #ifdef DEBUG
269
281
printf ("Generator polynomial:\ng(x) = " );
270
282
for (ii = 0 ; ii <= rdncy ; ii ++ ) {
271
283
printf ("%d" , bch -> g [ii ]);
272
284
}
273
285
printf ("\n" );
274
-
286
+ #endif
275
287
return 0 ;
276
288
}
277
289
@@ -303,8 +315,7 @@ void generate_bch(bch_t *bch, int *data, int *bb) {
303
315
}
304
316
305
317
306
- int
307
- apply_bch (bch_t * bch , int * recd )
318
+ int apply_bch (bch_t * bch , int * recd )
308
319
/*
309
320
* Simon Rockliff's implementation of Berlekamp's algorithm.
310
321
*
@@ -335,7 +346,9 @@ apply_bch(bch_t *bch, int *recd)
335
346
t2 = 2 * bch -> t ;
336
347
337
348
/* first form the syndromes */
349
+ #ifdef DEBUG
338
350
printf ("S(x) = " );
351
+ #endif
339
352
for (i = 1 ; i <= t2 ; i ++ ) {
340
353
s [i ] = 0 ;
341
354
for (j = 0 ; j < bch -> length ; j ++ )
@@ -349,9 +362,13 @@ apply_bch(bch_t *bch, int *recd)
349
362
*/
350
363
/* convert syndrome from polynomial form to index form */
351
364
s [i ] = bch -> index_of [s [i ]];
365
+ #ifdef DEBUG
352
366
printf ("%3d " , s [i ]);
367
+ #endif
353
368
}
369
+ #ifdef DEBUG
354
370
printf ("\n" );
371
+ #endif
355
372
356
373
if (syn_error ) { /* if there are errors, try to correct them */
357
374
/*
@@ -451,12 +468,13 @@ apply_bch(bch_t *bch, int *recd)
451
468
for (i = 0 ; i <= l [u ]; i ++ )
452
469
elp [u ][i ] = bch -> index_of [elp [u ][i ]];
453
470
471
+ #ifdef DEBUG
454
472
printf ("sigma(x) = " );
455
473
for (i = 0 ; i <= l [u ]; i ++ )
456
474
printf ("%3d " , elp [u ][i ]);
457
475
printf ("\n" );
458
476
printf ("Roots: " );
459
-
477
+ #endif
460
478
/* Chien search: find roots of the error location polynomial */
461
479
for (i = 1 ; i <= l [u ]; i ++ )
462
480
reg [i ] = elp [u ][i ];
@@ -473,18 +491,24 @@ apply_bch(bch_t *bch, int *recd)
473
491
root [count ] = i ;
474
492
loc [count ] = bch -> n - i ;
475
493
count ++ ;
494
+ #ifdef DEBUG
476
495
printf ("%3d " , bch -> n - i );
496
+ #endif
477
497
}
478
498
}
499
+ #ifdef DEBUG
479
500
printf ("\n" );
501
+ #endif
480
502
if (count == l [u ]) {
481
503
/* no. roots = degree of elp hence <= t errors */
482
504
for (i = 0 ; i < l [u ]; i ++ )
483
505
recd [loc [i ]] ^= 1 ;
484
506
return l [u ];
485
507
}
486
508
else { /* elp has degree >t hence cannot solve */
509
+ #ifdef DEBUG
487
510
printf ("Incomplete decoding: errors detected\n" );
511
+ #endif
488
512
return -1 ;
489
513
}
490
514
} else {
@@ -521,15 +545,29 @@ void bits_to_bytes(int *bits, int *byte_dest, int num_bits) {
521
545
522
546
byte_dest [index ] <<= 8 - (num_bits % 8 );
523
547
}
524
-
548
+
549
+ void swap_format (int * bits , int cutoff , int num_bits ) {
550
+ // Do it the easy way
551
+ int * temp = malloc (num_bits * sizeof (int ));
552
+ for (int i = 0 ; i < num_bits ; i ++ ) {
553
+ if (i < cutoff ) {
554
+ temp [num_bits - cutoff + i ] = bits [i ];
555
+ } else {
556
+ temp [i - cutoff ] = bits [i ];
557
+ }
558
+ }
559
+
560
+ memcpy (bits , temp , num_bits * sizeof (int ));
561
+ }
525
562
526
563
void dump_bch (bch_t * bch ) {
527
564
printf ("m: %d length: %d t: %d n: %d k: %d\n" , bch -> m , bch -> length , bch -> t , bch -> n , bch -> k );
528
565
}
529
566
567
+ #undef MAIN
530
568
#undef TEST_BYTES_TO_BITS
531
- #define TEST_APPLY
532
-
569
+ #define TEST_SWAP
570
+ #ifdef MAIN
533
571
int main ()
534
572
{
535
573
int test [][8 ] = {
@@ -555,7 +593,7 @@ int main()
555
593
int temp [8 ];
556
594
bch_t bch ;
557
595
558
- bch_init (& bch , 6 , 63 , 3 );
596
+ init_bch (& bch , 6 , 63 , 3 );
559
597
560
598
for (int count = 0 ; count < sizeof (test ) / sizeof (* test ); count ++ ) {
561
599
bytes_to_bits (test [count ], bits , 63 );
@@ -593,6 +631,21 @@ int main()
593
631
printf ("\n" );
594
632
#endif
595
633
634
+ #ifdef TEST_SWAP
635
+ printf ("orig: " );
636
+ for (int i = 0 ; i < 63 ; i ++ ) {
637
+ printf ("%d " , bits [i ]);
638
+ }
639
+ printf ("\n" );
640
+
641
+ swap_format (bits , 45 , 63 );
642
+
643
+ printf ("rev: " );
644
+ for (int i = 0 ; i < 63 ; i ++ ) {
645
+ printf ("%d " , bits [i ]);
646
+ }
647
+ printf ("\n" );
648
+ #endif
596
649
#ifdef TEST_APPLY
597
650
int recv [63 ];
598
651
@@ -635,3 +688,4 @@ int main()
635
688
#endif
636
689
}
637
690
}
691
+ #endif
0 commit comments