1
1
/*
2
- * Copyright (C) 2010,2014,2016,2018 by Jonathan Naylor G4KLX
2
+ * Copyright (C) 2010,2014,2016 by Jonathan Naylor G4KLX
3
3
* Copyright (C) 2016 Mathias Weyland, HB9FRV
4
4
*
5
5
* This program is free software; you can redistribute it and/or modify
21
21
#include " Hamming.h"
22
22
#include " AMBEFEC.h"
23
23
24
+ #include " Log.h"
25
+
24
26
#include < cstdio>
25
27
#include < cassert>
26
28
@@ -444,9 +446,9 @@ const unsigned int PRNG_TABLE[] = {
444
446
const unsigned int DMR_A_TABLE[] = { 0U , 4U , 8U , 12U , 16U , 20U , 24U , 28U , 32U , 36U , 40U , 44U ,
445
447
48U , 52U , 56U , 60U , 64U , 68U , 1U , 5U , 9U , 13U , 17U , 21U };
446
448
const unsigned int DMR_B_TABLE[] = {25U , 29U , 33U , 37U , 41U , 45U , 49U , 53U , 57U , 61U , 65U , 69U ,
447
- 2U , 6U , 10U , 14U , 18U , 22U , 26U , 30U , 34U , 38U , 42U };
448
- const unsigned int DMR_C_TABLE[] = {46U , 50U , 54U , 58U , 62U , 66U , 70U , 3U , 7U , 11U , 15U , 19U ,
449
- 23U , 27U , 31U , 35U , 39U , 43U , 47U , 51U , 55U , 59U , 63U , 67U , 71U };
449
+ 2U , 6U , 10U , 14U , 18U , 22U , 26U , 30U , 34U , 38U , 42U , 46U };
450
+ const unsigned int DMR_C_TABLE[] = {50U , 54U , 58U , 62U , 66U , 70U , 3U , 7U , 11U , 15U , 19U , 23U ,
451
+ 27U , 31U , 35U , 39U , 43U , 47U , 51U , 55U , 59U , 63U , 67U , 71U };
450
452
451
453
const unsigned int DSTAR_A_TABLE[] = {0U , 6U , 12U , 18U , 24U , 30U , 36U , 42U , 48U , 54U , 60U , 66U ,
452
454
1U , 7U , 13U , 19U , 25U , 31U , 37U , 43U , 49U , 55U , 61U , 67U };
@@ -477,97 +479,86 @@ unsigned int CAMBEFEC::regenerateDMR(unsigned char* bytes) const
477
479
assert (bytes != NULL );
478
480
479
481
unsigned int a1 = 0U , a2 = 0U , a3 = 0U ;
482
+ unsigned int b1 = 0U , b2 = 0U , b3 = 0U ;
483
+ unsigned int c1 = 0U , c2 = 0U , c3 = 0U ;
484
+
480
485
unsigned int MASK = 0x800000U ;
481
- for (unsigned int i = 0U ; i < 24U ; i++, MASK >>= 1 ) {
486
+ for (unsigned int i = 0U ; i < 24U ; i++) {
482
487
unsigned int a1Pos = DMR_A_TABLE[i];
488
+ unsigned int b1Pos = DMR_B_TABLE[i];
489
+ unsigned int c1Pos = DMR_C_TABLE[i];
490
+
483
491
unsigned int a2Pos = a1Pos + 72U ;
484
492
if (a2Pos >= 108U )
485
493
a2Pos += 48U ;
494
+ unsigned int b2Pos = b1Pos + 72U ;
495
+ if (b2Pos >= 108U )
496
+ b2Pos += 48U ;
497
+ unsigned int c2Pos = c1Pos + 72U ;
498
+ if (c2Pos >= 108U )
499
+ c2Pos += 48U ;
500
+
486
501
unsigned int a3Pos = a1Pos + 192U ;
502
+ unsigned int b3Pos = b1Pos + 192U ;
503
+ unsigned int c3Pos = c1Pos + 192U ;
487
504
488
505
if (READ_BIT (bytes, a1Pos))
489
506
a1 |= MASK;
490
507
if (READ_BIT (bytes, a2Pos))
491
508
a2 |= MASK;
492
509
if (READ_BIT (bytes, a3Pos))
493
510
a3 |= MASK;
494
- }
495
-
496
- unsigned int b1 = 0U , b2 = 0U , b3 = 0U ;
497
- MASK = 0x400000U ;
498
- for (unsigned int i = 0U ; i < 23U ; i++, MASK >>= 1 ) {
499
- unsigned int b1Pos = DMR_B_TABLE[i];
500
- unsigned int b2Pos = b1Pos + 72U ;
501
- if (b2Pos >= 108U )
502
- b2Pos += 48U ;
503
- unsigned int b3Pos = b1Pos + 192U ;
504
-
505
511
if (READ_BIT (bytes, b1Pos))
506
512
b1 |= MASK;
507
513
if (READ_BIT (bytes, b2Pos))
508
514
b2 |= MASK;
509
515
if (READ_BIT (bytes, b3Pos))
510
516
b3 |= MASK;
511
- }
512
-
513
- unsigned int c1 = 0U , c2 = 0U , c3 = 0U ;
514
- MASK = 0x1000000U ;
515
- for (unsigned int i = 0U ; i < 25U ; i++, MASK >>= 1 ) {
516
- unsigned int c1Pos = DMR_C_TABLE[i];
517
- unsigned int c2Pos = c1Pos + 72U ;
518
- if (c2Pos >= 108U )
519
- c2Pos += 48U ;
520
- unsigned int c3Pos = c1Pos + 192U ;
521
-
522
517
if (READ_BIT (bytes, c1Pos))
523
518
c1 |= MASK;
524
519
if (READ_BIT (bytes, c2Pos))
525
520
c2 |= MASK;
526
521
if (READ_BIT (bytes, c3Pos))
527
522
c3 |= MASK;
523
+
524
+ MASK >>= 1 ;
528
525
}
529
526
530
- unsigned int errors = regenerateDMR (a1, b1);
531
- errors += regenerateDMR (a2, b2);
532
- errors += regenerateDMR (a3, b3);
527
+ unsigned int errors = regenerate (a1, b1, c1, true );
528
+ errors += regenerate (a2, b2, c2, true );
529
+ errors += regenerate (a3, b3, c3, true );
533
530
534
531
MASK = 0x800000U ;
535
- for (unsigned int i = 0U ; i < 24U ; i++, MASK >>= 1 ) {
532
+ for (unsigned int i = 0U ; i < 24U ; i++) {
536
533
unsigned int a1Pos = DMR_A_TABLE[i];
534
+ unsigned int b1Pos = DMR_B_TABLE[i];
535
+ unsigned int c1Pos = DMR_C_TABLE[i];
536
+
537
537
unsigned int a2Pos = a1Pos + 72U ;
538
538
if (a2Pos >= 108U )
539
539
a2Pos += 48U ;
540
- unsigned int a3Pos = a1Pos + 192U ;
541
-
542
- WRITE_BIT (bytes, a1Pos, a1 & MASK);
543
- WRITE_BIT (bytes, a2Pos, a2 & MASK);
544
- WRITE_BIT (bytes, a3Pos, a3 & MASK);
545
- }
546
-
547
- MASK = 0x400000U ;
548
- for (unsigned int i = 0U ; i < 23U ; i++, MASK >>= 1 ) {
549
- unsigned int b1Pos = DMR_B_TABLE[i];
550
540
unsigned int b2Pos = b1Pos + 72U ;
551
541
if (b2Pos >= 108U )
552
542
b2Pos += 48U ;
553
- unsigned int b3Pos = b1Pos + 192U ;
554
-
555
- WRITE_BIT (bytes, b1Pos, b1 & MASK);
556
- WRITE_BIT (bytes, b2Pos, b2 & MASK);
557
- WRITE_BIT (bytes, b3Pos, b3 & MASK);
558
- }
559
-
560
- MASK = 0x1000000U ;
561
- for (unsigned int i = 0U ; i < 25U ; i++, MASK >>= 1 ) {
562
- unsigned int c1Pos = DMR_C_TABLE[i];
563
543
unsigned int c2Pos = c1Pos + 72U ;
564
544
if (c2Pos >= 108U )
565
545
c2Pos += 48U ;
546
+
547
+ unsigned int a3Pos = a1Pos + 192U ;
548
+ unsigned int b3Pos = b1Pos + 192U ;
566
549
unsigned int c3Pos = c1Pos + 192U ;
567
550
551
+ WRITE_BIT (bytes, a1Pos, a1 & MASK);
552
+ WRITE_BIT (bytes, a2Pos, a2 & MASK);
553
+ WRITE_BIT (bytes, a3Pos, a3 & MASK);
554
+ WRITE_BIT (bytes, b1Pos, b1 & MASK);
555
+ WRITE_BIT (bytes, b2Pos, b2 & MASK);
556
+ WRITE_BIT (bytes, b3Pos, b3 & MASK);
568
557
WRITE_BIT (bytes, c1Pos, c1 & MASK);
569
558
WRITE_BIT (bytes, c2Pos, c2 & MASK);
570
559
WRITE_BIT (bytes, c3Pos, c3 & MASK);
560
+
561
+ MASK >>= 1 ;
571
562
}
572
563
573
564
return errors;
@@ -592,7 +583,7 @@ unsigned int CAMBEFEC::regenerateDStar(unsigned char* bytes) const
592
583
MASK >>= 1 ;
593
584
}
594
585
595
- unsigned int errors = regenerateDStar (a, b);
586
+ unsigned int errors = regenerate (a, b, c, false );
596
587
597
588
MASK = 0x800000U ;
598
589
for (unsigned int i = 0U ; i < 24U ; i++) {
@@ -610,47 +601,38 @@ unsigned int CAMBEFEC::regenerateYSFDN(unsigned char* bytes) const
610
601
assert (bytes != NULL );
611
602
612
603
unsigned int a = 0U ;
604
+ unsigned int b = 0U ;
605
+ unsigned int c = 0U ;
606
+
613
607
unsigned int MASK = 0x800000U ;
614
- for (unsigned int i = 0U ; i < 24U ; i++, MASK >>= 1 ) {
608
+ for (unsigned int i = 0U ; i < 24U ; i++) {
615
609
unsigned int aPos = DMR_A_TABLE[i];
610
+ unsigned int bPos = DMR_B_TABLE[i];
611
+ unsigned int cPos = DMR_C_TABLE[i];
612
+
616
613
if (READ_BIT (bytes, aPos))
617
614
a |= MASK;
618
- }
619
-
620
- unsigned int b = 0U ;
621
- MASK = 0x400000U ;
622
- for (unsigned int i = 0U ; i < 23U ; i++, MASK >>= 1 ) {
623
- unsigned int bPos = DMR_B_TABLE[i];
624
615
if (READ_BIT (bytes, bPos))
625
616
b |= MASK;
626
- }
627
-
628
- unsigned int c = 0U ;
629
- MASK = 0x1000000U ;
630
- for (unsigned int i = 0U ; i < 25U ; i++, MASK >>= 1 ) {
631
- unsigned int cPos = DMR_C_TABLE[i];
632
617
if (READ_BIT (bytes, cPos))
633
618
c |= MASK;
619
+
620
+ MASK >>= 1 ;
634
621
}
635
622
636
- unsigned int errors = regenerateDMR (a, b);
623
+ unsigned int errors = regenerate (a, b, c, true );
637
624
638
625
MASK = 0x800000U ;
639
- for (unsigned int i = 0U ; i < 24U ; i++, MASK >>= 1 ) {
626
+ for (unsigned int i = 0U ; i < 24U ; i++) {
640
627
unsigned int aPos = DMR_A_TABLE[i];
641
- WRITE_BIT (bytes, aPos, a & MASK);
642
- }
643
-
644
- MASK = 0x400000U ;
645
- for (unsigned int i = 0U ; i < 23U ; i++, MASK >>= 1 ) {
646
628
unsigned int bPos = DMR_B_TABLE[i];
647
- WRITE_BIT (bytes, bPos, b & MASK);
648
- }
649
-
650
- MASK = 0x1000000U ;
651
- for (unsigned int i = 0U ; i < 25U ; i++, MASK >>= 1 ) {
652
629
unsigned int cPos = DMR_C_TABLE[i];
630
+
631
+ WRITE_BIT (bytes, aPos, a & MASK);
632
+ WRITE_BIT (bytes, bPos, b & MASK);
653
633
WRITE_BIT (bytes, cPos, c & MASK);
634
+
635
+ MASK >>= 1 ;
654
636
}
655
637
656
638
return errors;
@@ -790,14 +772,17 @@ unsigned int CAMBEFEC::regenerateIMBE(unsigned char* bytes) const
790
772
return errors;
791
773
}
792
774
793
- unsigned int CAMBEFEC::regenerateDStar (unsigned int & a, unsigned int & b) const
775
+ unsigned int CAMBEFEC::regenerate (unsigned int & a, unsigned int & b, unsigned int & c, bool b23 ) const
794
776
{
795
- unsigned int orig_a = a;
796
- unsigned int orig_b = b;
777
+ unsigned int old_a = a;
778
+ unsigned int old_b = b;
779
+
780
+ // For the b23 bypass
781
+ bool b24 = (b & 0x01U ) == 0x01U ;
797
782
798
783
unsigned int data = CGolay24128::decode24128 (a);
799
784
800
- a = CGolay24128::encode24128 (data);
785
+ unsigned int new_a = CGolay24128::encode24128 (data);
801
786
802
787
// The PRNG
803
788
unsigned int p = PRNG_TABLE[data];
@@ -806,60 +791,39 @@ unsigned int CAMBEFEC::regenerateDStar(unsigned int& a, unsigned int& b) const
806
791
807
792
unsigned int datb = CGolay24128::decode24128 (b);
808
793
809
- b = CGolay24128::encode24128 (datb);
794
+ unsigned int new_b = CGolay24128::encode24128 (datb);
810
795
811
- b ^= p;
796
+ new_b ^= p;
797
+
798
+ if (b23) {
799
+ new_b &= 0xFFFFFEU ;
800
+ new_b |= b24 ? 0x01U : 0x00U ;
801
+ }
812
802
813
803
unsigned int errsA = 0U , errsB = 0U ;
814
804
815
- unsigned int v = a ^ orig_a ;
805
+ unsigned int v = new_a ^ old_a ;
816
806
while (v != 0U ) {
817
807
v &= v - 1U ;
818
808
errsA++;
819
809
}
820
810
821
- v = b ^ orig_b ;
811
+ v = new_b ^ old_b ;
822
812
while (v != 0U ) {
823
813
v &= v - 1U ;
824
814
errsB++;
825
815
}
826
816
827
- return errsA + errsB;
828
- }
829
-
830
- unsigned int CAMBEFEC::regenerateDMR (unsigned int & a, unsigned int & b) const
831
- {
832
- unsigned int orig_a = a;
833
- unsigned int orig_b = b;
834
-
835
- unsigned int data = CGolay24128::decode24128 (a);
836
-
837
- a = CGolay24128::encode24128 (data);
838
-
839
- // The PRNG
840
- unsigned int p = PRNG_TABLE[data] >> 1 ;
841
-
842
- b ^= p;
843
-
844
- unsigned int datb = CGolay24128::decode23127 (b);
845
-
846
- b = CGolay24128::encode23127 (datb);
847
-
848
- b ^= p;
849
-
850
- unsigned int errsA = 0U , errsB = 0U ;
851
-
852
- unsigned int v = a ^ orig_a;
853
- while (v != 0U ) {
854
- v &= v - 1U ;
855
- errsA++;
817
+ if (b23) {
818
+ if (errsA >= 4U || ((errsA + errsB) >= 6U && errsA >= 2U )) {
819
+ a = 0xF00292U ;
820
+ b = 0x0E0B20U ;
821
+ c = 0x000000U ;
822
+ }
856
823
}
857
824
858
- v = b ^ orig_b;
859
- while (v != 0U ) {
860
- v &= v - 1U ;
861
- errsB++;
862
- }
825
+ a = new_a;
826
+ b = new_b;
863
827
864
828
return errsA + errsB;
865
829
}
0 commit comments