Skip to content

Commit f667a13

Browse files
committed
Revert "Fix the DMR, YSFDN, and NXDN FEC."
This reverts commit 7867eb5.
1 parent 980efe3 commit f667a13

File tree

2 files changed

+85
-122
lines changed

2 files changed

+85
-122
lines changed

AMBEFEC.cpp

Lines changed: 83 additions & 119 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2010,2014,2016,2018 by Jonathan Naylor G4KLX
2+
* Copyright (C) 2010,2014,2016 by Jonathan Naylor G4KLX
33
* Copyright (C) 2016 Mathias Weyland, HB9FRV
44
*
55
* This program is free software; you can redistribute it and/or modify
@@ -21,6 +21,8 @@
2121
#include "Hamming.h"
2222
#include "AMBEFEC.h"
2323

24+
#include "Log.h"
25+
2426
#include <cstdio>
2527
#include <cassert>
2628

@@ -444,9 +446,9 @@ const unsigned int PRNG_TABLE[] = {
444446
const unsigned int DMR_A_TABLE[] = { 0U, 4U, 8U, 12U, 16U, 20U, 24U, 28U, 32U, 36U, 40U, 44U,
445447
48U, 52U, 56U, 60U, 64U, 68U, 1U, 5U, 9U, 13U, 17U, 21U};
446448
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};
450452

451453
const unsigned int DSTAR_A_TABLE[] = {0U, 6U, 12U, 18U, 24U, 30U, 36U, 42U, 48U, 54U, 60U, 66U,
452454
1U, 7U, 13U, 19U, 25U, 31U, 37U, 43U, 49U, 55U, 61U, 67U};
@@ -477,97 +479,86 @@ unsigned int CAMBEFEC::regenerateDMR(unsigned char* bytes) const
477479
assert(bytes != NULL);
478480

479481
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+
480485
unsigned int MASK = 0x800000U;
481-
for (unsigned int i = 0U; i < 24U; i++, MASK >>= 1) {
486+
for (unsigned int i = 0U; i < 24U; i++) {
482487
unsigned int a1Pos = DMR_A_TABLE[i];
488+
unsigned int b1Pos = DMR_B_TABLE[i];
489+
unsigned int c1Pos = DMR_C_TABLE[i];
490+
483491
unsigned int a2Pos = a1Pos + 72U;
484492
if (a2Pos >= 108U)
485493
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+
486501
unsigned int a3Pos = a1Pos + 192U;
502+
unsigned int b3Pos = b1Pos + 192U;
503+
unsigned int c3Pos = c1Pos + 192U;
487504

488505
if (READ_BIT(bytes, a1Pos))
489506
a1 |= MASK;
490507
if (READ_BIT(bytes, a2Pos))
491508
a2 |= MASK;
492509
if (READ_BIT(bytes, a3Pos))
493510
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-
505511
if (READ_BIT(bytes, b1Pos))
506512
b1 |= MASK;
507513
if (READ_BIT(bytes, b2Pos))
508514
b2 |= MASK;
509515
if (READ_BIT(bytes, b3Pos))
510516
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-
522517
if (READ_BIT(bytes, c1Pos))
523518
c1 |= MASK;
524519
if (READ_BIT(bytes, c2Pos))
525520
c2 |= MASK;
526521
if (READ_BIT(bytes, c3Pos))
527522
c3 |= MASK;
523+
524+
MASK >>= 1;
528525
}
529526

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);
533530

534531
MASK = 0x800000U;
535-
for (unsigned int i = 0U; i < 24U; i++, MASK >>= 1) {
532+
for (unsigned int i = 0U; i < 24U; i++) {
536533
unsigned int a1Pos = DMR_A_TABLE[i];
534+
unsigned int b1Pos = DMR_B_TABLE[i];
535+
unsigned int c1Pos = DMR_C_TABLE[i];
536+
537537
unsigned int a2Pos = a1Pos + 72U;
538538
if (a2Pos >= 108U)
539539
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];
550540
unsigned int b2Pos = b1Pos + 72U;
551541
if (b2Pos >= 108U)
552542
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];
563543
unsigned int c2Pos = c1Pos + 72U;
564544
if (c2Pos >= 108U)
565545
c2Pos += 48U;
546+
547+
unsigned int a3Pos = a1Pos + 192U;
548+
unsigned int b3Pos = b1Pos + 192U;
566549
unsigned int c3Pos = c1Pos + 192U;
567550

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);
568557
WRITE_BIT(bytes, c1Pos, c1 & MASK);
569558
WRITE_BIT(bytes, c2Pos, c2 & MASK);
570559
WRITE_BIT(bytes, c3Pos, c3 & MASK);
560+
561+
MASK >>= 1;
571562
}
572563

573564
return errors;
@@ -592,7 +583,7 @@ unsigned int CAMBEFEC::regenerateDStar(unsigned char* bytes) const
592583
MASK >>= 1;
593584
}
594585

595-
unsigned int errors = regenerateDStar(a, b);
586+
unsigned int errors = regenerate(a, b, c, false);
596587

597588
MASK = 0x800000U;
598589
for (unsigned int i = 0U; i < 24U; i++) {
@@ -610,47 +601,38 @@ unsigned int CAMBEFEC::regenerateYSFDN(unsigned char* bytes) const
610601
assert(bytes != NULL);
611602

612603
unsigned int a = 0U;
604+
unsigned int b = 0U;
605+
unsigned int c = 0U;
606+
613607
unsigned int MASK = 0x800000U;
614-
for (unsigned int i = 0U; i < 24U; i++, MASK >>= 1) {
608+
for (unsigned int i = 0U; i < 24U; i++) {
615609
unsigned int aPos = DMR_A_TABLE[i];
610+
unsigned int bPos = DMR_B_TABLE[i];
611+
unsigned int cPos = DMR_C_TABLE[i];
612+
616613
if (READ_BIT(bytes, aPos))
617614
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];
624615
if (READ_BIT(bytes, bPos))
625616
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];
632617
if (READ_BIT(bytes, cPos))
633618
c |= MASK;
619+
620+
MASK >>= 1;
634621
}
635622

636-
unsigned int errors = regenerateDMR(a, b);
623+
unsigned int errors = regenerate(a, b, c, true);
637624

638625
MASK = 0x800000U;
639-
for (unsigned int i = 0U; i < 24U; i++, MASK >>= 1) {
626+
for (unsigned int i = 0U; i < 24U; i++) {
640627
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) {
646628
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) {
652629
unsigned int cPos = DMR_C_TABLE[i];
630+
631+
WRITE_BIT(bytes, aPos, a & MASK);
632+
WRITE_BIT(bytes, bPos, b & MASK);
653633
WRITE_BIT(bytes, cPos, c & MASK);
634+
635+
MASK >>= 1;
654636
}
655637

656638
return errors;
@@ -790,14 +772,17 @@ unsigned int CAMBEFEC::regenerateIMBE(unsigned char* bytes) const
790772
return errors;
791773
}
792774

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
794776
{
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;
797782

798783
unsigned int data = CGolay24128::decode24128(a);
799784

800-
a = CGolay24128::encode24128(data);
785+
unsigned int new_a = CGolay24128::encode24128(data);
801786

802787
// The PRNG
803788
unsigned int p = PRNG_TABLE[data];
@@ -806,60 +791,39 @@ unsigned int CAMBEFEC::regenerateDStar(unsigned int& a, unsigned int& b) const
806791

807792
unsigned int datb = CGolay24128::decode24128(b);
808793

809-
b = CGolay24128::encode24128(datb);
794+
unsigned int new_b = CGolay24128::encode24128(datb);
810795

811-
b ^= p;
796+
new_b ^= p;
797+
798+
if (b23) {
799+
new_b &= 0xFFFFFEU;
800+
new_b |= b24 ? 0x01U : 0x00U;
801+
}
812802

813803
unsigned int errsA = 0U, errsB = 0U;
814804

815-
unsigned int v = a ^ orig_a;
805+
unsigned int v = new_a ^ old_a;
816806
while (v != 0U) {
817807
v &= v - 1U;
818808
errsA++;
819809
}
820810

821-
v = b ^ orig_b;
811+
v = new_b ^ old_b;
822812
while (v != 0U) {
823813
v &= v - 1U;
824814
errsB++;
825815
}
826816

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+
}
856823
}
857824

858-
v = b ^ orig_b;
859-
while (v != 0U) {
860-
v &= v - 1U;
861-
errsB++;
862-
}
825+
a = new_a;
826+
b = new_b;
863827

864828
return errsA + errsB;
865829
}

AMBEFEC.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (C) 2010,2014,2016,2018 by Jonathan Naylor G4KLX
2+
* Copyright (C) 2010,2014,2016 by Jonathan Naylor G4KLX
33
*
44
* This program is free software; you can redistribute it and/or modify
55
* it under the terms of the GNU General Public License as published by
@@ -33,8 +33,7 @@ class CAMBEFEC {
3333
unsigned int regenerateIMBE(unsigned char* bytes) const;
3434

3535
private:
36-
unsigned int regenerateDStar(unsigned int& a, unsigned int& b) const;
37-
unsigned int regenerateDMR(unsigned int& a, unsigned int& b) const;
36+
unsigned int regenerate(unsigned int& a, unsigned int& b, unsigned int& c, bool b23) const;
3837
};
3938

4039
#endif

0 commit comments

Comments
 (0)