Further addition of basic operations.
This commit is contained in:
parent
d0e118e85c
commit
6bc101d180
|
@ -20,10 +20,10 @@
|
|||
#include <cassert>
|
||||
|
||||
const unsigned int INTERLEAVE_TABLE[] = {
|
||||
0U, 4U, 8U, 12U, 16U, 20U, 24U, 28U, 32U, 36U, 40U, 44U, 48U,
|
||||
1U, 5U, 9U, 13U, 17U, 21U, 25U, 29U, 33U, 37U, 41U, 45U,
|
||||
2U, 6U, 10U, 14U, 18U, 22U, 26U, 30U, 34U, 38U, 42U, 46U,
|
||||
3U, 7U, 11U, 15U, 19U, 23U, 27U, 31U, 35U, 39U, 43U, 47U};
|
||||
0U, 16U, 32U, 48U, 64U, 80U, 96U, 112U, 128U, 144U, 160U, 176U, 192U,
|
||||
4U, 20U, 36U, 52U, 68U, 84U, 100U, 116U, 132U, 148U, 164U, 180U,
|
||||
8U, 24U, 40U, 56U, 72U, 88U, 104U, 120U, 136U, 152U, 168U, 184U,
|
||||
12U, 28U, 44U, 60U, 76U, 92U, 108U, 124U, 140U, 156U, 172U, 188U};
|
||||
|
||||
const unsigned char DIBITS_TO_POINT[] = { 11U, 12U, 0U, 7U, 14U, 9U, 5U, 2U, 10U, 13U, 1U, 6U, 15U, 8U, 4U, 3U};
|
||||
const unsigned char POINT_TO_DIBITS[] = {0x2U, 0xAU, 0x7U, 0xFU, 0xEU, 0x6U, 0xBU, 0x3U, 0xDU, 0x5U, 0x8U, 0x0U, 0x1U, 0x9U, 0x4U, 0xCU};
|
||||
|
@ -34,10 +34,9 @@ const unsigned char ENCODE_TABLE[] = {
|
|||
1U, 9U, 5U, 13U, 3U, 11U, 7U, 15U,
|
||||
5U, 13U, 3U, 11U, 7U, 15U, 1U, 9U,
|
||||
3U, 11U, 7U, 15U, 1U, 9U, 5U, 13U,
|
||||
7U, 15U, 1U, 9U, 5U, 13U, 3U, 11U,
|
||||
7U, 15U, 1U, 9U, 5U, 13U, 3U, 11U,
|
||||
2U, 10U, 6U, 14U, 0U, 8U, 4U, 12U,
|
||||
6U, 14U, 0U, 8U, 4U, 12U, 2U, 10U
|
||||
};
|
||||
6U, 14U, 0U, 8U, 4U, 12U, 2U, 10U};
|
||||
|
||||
const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U};
|
||||
|
||||
|
@ -61,6 +60,10 @@ void CDMRTrellis::decode(const unsigned char* data, unsigned char* payload)
|
|||
|
||||
// unsigned char points[49U];
|
||||
// deinterleave(data, points);
|
||||
|
||||
// unsigned char tribits[49U];
|
||||
|
||||
// fromtribits(tribits, payload);
|
||||
}
|
||||
|
||||
void CDMRTrellis::encode(const unsigned char* payload, unsigned char* data)
|
||||
|
@ -88,15 +91,20 @@ void CDMRTrellis::encode(const unsigned char* payload, unsigned char* data)
|
|||
void CDMRTrellis::deinterleave(const unsigned char* data, unsigned char* points) const
|
||||
{
|
||||
for (unsigned int i = 0U; i < 49U; i++) {
|
||||
unsigned int n = INTERLEAVE_TABLE[i] * 4U;
|
||||
if (n > 108U) n += 48U;
|
||||
|
||||
unsigned int n = INTERLEAVE_TABLE[i] + 0U;
|
||||
if (n >= 98U) n += 68U;
|
||||
bool b1 = READ_BIT(data, n) != 0x00U;
|
||||
n++;
|
||||
|
||||
n = INTERLEAVE_TABLE[i] + 1U;
|
||||
if (n >= 98U) n += 68U;
|
||||
bool b2 = READ_BIT(data, n) != 0x00U;
|
||||
n++;
|
||||
|
||||
n = INTERLEAVE_TABLE[i] + 2U;
|
||||
if (n >= 98U) n += 68U;
|
||||
bool b3 = READ_BIT(data, n) != 0x00U;
|
||||
n++;
|
||||
|
||||
n = INTERLEAVE_TABLE[i] + 3U;
|
||||
if (n >= 98U) n += 68U;
|
||||
bool b4 = READ_BIT(data, n) != 0x00U;
|
||||
|
||||
unsigned int dibits = 0U;
|
||||
|
@ -120,15 +128,20 @@ void CDMRTrellis::interleave(const unsigned char* points, unsigned char* data) c
|
|||
bool b3 = (dibits & 0x02U) == 0x02U;
|
||||
bool b4 = (dibits & 0x01U) == 0x01U;
|
||||
|
||||
unsigned int n = INTERLEAVE_TABLE[i] * 4U;
|
||||
if (n > 108U) n += 48U;
|
||||
|
||||
unsigned int n = INTERLEAVE_TABLE[i] + 0U;
|
||||
if (n >= 98U) n += 68U;
|
||||
WRITE_BIT(data, n, b1);
|
||||
n++;
|
||||
|
||||
n = INTERLEAVE_TABLE[i] + 1U;
|
||||
if (n >= 98U) n += 68U;
|
||||
WRITE_BIT(data, n, b2);
|
||||
n++;
|
||||
|
||||
n = INTERLEAVE_TABLE[i] + 2U;
|
||||
if (n >= 98U) n += 68U;
|
||||
WRITE_BIT(data, n, b3);
|
||||
n++;
|
||||
|
||||
n = INTERLEAVE_TABLE[i] + 3U;
|
||||
if (n >= 98U) n += 68U;
|
||||
WRITE_BIT(data, n, b4);
|
||||
}
|
||||
}
|
||||
|
@ -154,3 +167,22 @@ void CDMRTrellis::totribits(const unsigned char* payload, unsigned char* tribits
|
|||
|
||||
tribits[48U] = 0U;
|
||||
}
|
||||
|
||||
void CDMRTrellis::fromtribits(const unsigned char* tribits, unsigned char* payload) const
|
||||
{
|
||||
for (unsigned int i = 0U; i < 48U; i++) {
|
||||
unsigned char tribit = tribits[i];
|
||||
|
||||
bool b1 = (tribit & 0x04U) == 0x04U;
|
||||
bool b2 = (tribit & 0x02U) == 0x02U;
|
||||
bool b3 = (tribit & 0x01U) == 0x01U;
|
||||
|
||||
unsigned int n = 143U - i * 3U;
|
||||
|
||||
WRITE_BIT(payload, n, b1);
|
||||
n--;
|
||||
WRITE_BIT(payload, n, b2);
|
||||
n--;
|
||||
WRITE_BIT(payload, n, b3);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,6 +26,7 @@ private:
|
|||
void deinterleave(const unsigned char* in, unsigned char* points) const;
|
||||
void interleave(const unsigned char* points, unsigned char* out) const;
|
||||
void totribits(const unsigned char* payload, unsigned char* tribits) const;
|
||||
void fromtribits(const unsigned char* tribits, unsigned char* payload) const;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue