From 885562539e1ede623f4695b667b31347a0b50f59 Mon Sep 17 00:00:00 2001 From: juribeparada Date: Thu, 1 Feb 2018 11:56:18 -0300 Subject: [PATCH 1/2] Changing metric calculation for Viterbi decoder NXDN --- NXDNConvolution.cpp | 17 ++++------------- NXDNFACCH1.cpp | 4 ++-- NXDNSACCH.cpp | 4 ++-- NXDNUDCH.cpp | 4 ++-- 4 files changed, 10 insertions(+), 19 deletions(-) diff --git a/NXDNConvolution.cpp b/NXDNConvolution.cpp index 049bdb6..8db6a05 100755 --- a/NXDNConvolution.cpp +++ b/NXDNConvolution.cpp @@ -27,12 +27,12 @@ const unsigned char BIT_MASK_TABLE[] = {0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U #define WRITE_BIT1(p,i,b) p[(i)>>3] = (b) ? (p[(i)>>3] | BIT_MASK_TABLE[(i)&7]) : (p[(i)>>3] & ~BIT_MASK_TABLE[(i)&7]) #define READ_BIT1(p,i) (p[(i)>>3] & BIT_MASK_TABLE[(i)&7]) -const uint8_t BRANCH_TABLE1[] = {0U, 0U, 0U, 0U, 1U, 1U, 1U, 1U}; -const uint8_t BRANCH_TABLE2[] = {0U, 1U, 1U, 0U, 0U, 1U, 1U, 0U}; +const uint8_t BRANCH_TABLE1[] = {0U, 0U, 0U, 0U, 2U, 2U, 2U, 2U}; +const uint8_t BRANCH_TABLE2[] = {0U, 2U, 2U, 0U, 0U, 2U, 2U, 0U}; const unsigned int NUM_OF_STATES_D2 = 8U; const unsigned int NUM_OF_STATES = 16U; -const uint32_t M = 2U; +const uint32_t M = 4U; const unsigned int K = 5U; CNXDNConvolution::CNXDNConvolution() : @@ -72,16 +72,7 @@ void CNXDNConvolution::decode(uint8_t s0, uint8_t s1) for (uint8_t i = 0U; i < NUM_OF_STATES_D2; i++) { uint8_t j = i * 2U; - uint16_t metric0 = 0; - uint16_t metric1 = 0; - - if (s0 != 99U) - metric0 = (BRANCH_TABLE1[i] ^ s0); - - if (s1 != 99U) - metric1 = (BRANCH_TABLE2[i] ^ s1); - - uint16_t metric = metric0 + metric1; + uint16_t metric = abs(BRANCH_TABLE1[i] - s0) + abs(BRANCH_TABLE2[i] - s1); uint16_t m0 = m_oldMetrics[i] + metric; uint16_t m1 = m_oldMetrics[i + NUM_OF_STATES_D2] + (M - metric); diff --git a/NXDNFACCH1.cpp b/NXDNFACCH1.cpp index 48f4639..63a3377 100644 --- a/NXDNFACCH1.cpp +++ b/NXDNFACCH1.cpp @@ -89,12 +89,12 @@ bool CNXDNFACCH1::decode(const unsigned char* data, unsigned int offset) unsigned int index = 0U; for (unsigned int i = 0U; i < NXDN_FACCH1_LENGTH_BITS; i++) { if (n == PUNCTURE_LIST[index]) { - temp2[n++] = 99U; + temp2[n++] = 1U; index++; } bool b = READ_BIT1(temp1, i); - temp2[n++] = b ? 1U : 0U; + temp2[n++] = b ? 2U : 0U; } CNXDNConvolution conv; diff --git a/NXDNSACCH.cpp b/NXDNSACCH.cpp index 304b20d..e4ec9e5 100755 --- a/NXDNSACCH.cpp +++ b/NXDNSACCH.cpp @@ -83,12 +83,12 @@ bool CNXDNSACCH::decode(const unsigned char* data) unsigned int index = 0U; for (unsigned int i = 0U; i < NXDN_SACCH_LENGTH_BITS; i++) { if (n == PUNCTURE_LIST[index]) { - temp2[n++] = 99U; + temp2[n++] = 1U; index++; } bool b = READ_BIT1(temp1, i); - temp2[n++] = b ? 1U : 0U; + temp2[n++] = b ? 2U : 0U; } CNXDNConvolution conv; diff --git a/NXDNUDCH.cpp b/NXDNUDCH.cpp index e58460e..eabcca7 100644 --- a/NXDNUDCH.cpp +++ b/NXDNUDCH.cpp @@ -110,12 +110,12 @@ bool CNXDNUDCH::decode(const unsigned char* data) unsigned int index = 0U; for (unsigned int i = 0U; i < NXDN_FACCH2_LENGTH_BITS; i++) { if (n == PUNCTURE_LIST[index]) { - temp2[n++] = 99U; + temp2[n++] = 1U; index++; } bool b = READ_BIT1(temp1, i); - temp2[n++] = b ? 1U : 0U; + temp2[n++] = b ? 2U : 0U; } CNXDNConvolution conv; From d4fbc8f7ec559c1baf55cc459dda4a22a386817f Mon Sep 17 00:00:00 2001 From: juribeparada Date: Thu, 1 Feb 2018 16:05:36 -0300 Subject: [PATCH 2/2] Adding tail bits to improve Viterbi decoding + puncture lists fix --- NXDNFACCH1.cpp | 13 +++++++++---- NXDNSACCH.cpp | 10 +++++++--- NXDNUDCH.cpp | 19 ++++++++++++------- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/NXDNFACCH1.cpp b/NXDNFACCH1.cpp index 63a3377..5ae0136 100644 --- a/NXDNFACCH1.cpp +++ b/NXDNFACCH1.cpp @@ -42,7 +42,8 @@ const unsigned int INTERLEAVE_TABLE[] = { const unsigned int PUNCTURE_LIST[] = { 1U, 5U, 9U, 13U, 17U, 21U, 25U, 29U, 33U, 37U, 41U, 45U, 49U, 53U, 57U, 61U, 65U, 69U, 73U, 77U, 81U, 85U, 89U, 93U, 97U, 101U, 105U, 109U, 113U, 117U, - 121U, 125U, 129U, 133U, 137U, 141U}; + 121U, 125U, 129U, 133U, 137U, 141U, 145U, 149U, 153U, 157U, + 161U, 165U, 169U, 173U, 177U, 181U, 185U, 189U }; const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U }; @@ -83,7 +84,7 @@ bool CNXDNFACCH1::decode(const unsigned char* data, unsigned int offset) // CUtils::dump("NXDN, FACCH1 de-interleaved", temp1, 18U); - uint8_t temp2[192U]; + uint8_t temp2[210U]; unsigned int n = 0U; unsigned int index = 0U; @@ -97,18 +98,22 @@ bool CNXDNFACCH1::decode(const unsigned char* data, unsigned int offset) temp2[n++] = b ? 2U : 0U; } + for (unsigned int i = 0U; i < 8U; i++) { + temp2[n++] = 0U; + } + CNXDNConvolution conv; conv.start(); n = 0U; - for (unsigned int i = 0U; i < 96U; i++) { + for (unsigned int i = 0U; i < 100U; i++) { uint8_t s0 = temp2[n++]; uint8_t s1 = temp2[n++]; conv.decode(s0, s1); } - conv.chainback(m_data, 92U); + conv.chainback(m_data, 96U); CUtils::dump("NXDN, FACCH1 decoded", m_data, 12U); diff --git a/NXDNSACCH.cpp b/NXDNSACCH.cpp index e4ec9e5..3b69d11 100755 --- a/NXDNSACCH.cpp +++ b/NXDNSACCH.cpp @@ -77,7 +77,7 @@ bool CNXDNSACCH::decode(const unsigned char* data) // CUtils::dump("NXDN, SACCH de-interleaved", temp1, 8U); - uint8_t temp2[72U]; + uint8_t temp2[90U]; unsigned int n = 0U; unsigned int index = 0U; @@ -91,18 +91,22 @@ bool CNXDNSACCH::decode(const unsigned char* data) temp2[n++] = b ? 2U : 0U; } + for (unsigned int i = 0U; i < 8U; i++) { + temp2[n++] = 0U; + } + CNXDNConvolution conv; conv.start(); n = 0U; - for (unsigned int i = 0U; i < 36U; i++) { + for (unsigned int i = 0U; i < 40U; i++) { uint8_t s0 = temp2[n++]; uint8_t s1 = temp2[n++]; conv.decode(s0, s1); } - conv.chainback(m_data, 32U); + conv.chainback(m_data, 36U); CUtils::dump("NXDN, SACCH decoded", m_data, 4U); diff --git a/NXDNUDCH.cpp b/NXDNUDCH.cpp index eabcca7..1e2a278 100644 --- a/NXDNUDCH.cpp +++ b/NXDNUDCH.cpp @@ -63,7 +63,8 @@ const unsigned int PUNCTURE_LIST[] = { 3U, 11U, 17U, 25U, 31U, 39U, 45U, 73U, 81U, 87U, 95U, 101U, 109U, 115U, 123U, 129U, 137U, 143U, 151U, 157U, 165U, 171U, 179U, 185U, 193U, 199U, 207U, 213U, 221U, 227U, 235U, 241U, 249U, 255U, 263U, 269U, 277U, - 283U, 291U, 297U, 305U, 311U, 319U, 325U, 333U, 339U, 347U }; + 283U, 291U, 297U, 305U, 311U, 319U, 325U, 333U, 339U, 347U, + 353U, 361U, 367U, 375U, 381U, 389U, 395U, 403U }; const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04U, 0x02U, 0x01U }; @@ -73,14 +74,14 @@ const unsigned char BIT_MASK_TABLE[] = { 0x80U, 0x40U, 0x20U, 0x10U, 0x08U, 0x04 CNXDNUDCH::CNXDNUDCH(const CNXDNUDCH& udch) : m_data(NULL) { - m_data = new unsigned char[23U + 2U]; - ::memcpy(m_data, udch.m_data, 23U + 2U); + m_data = new unsigned char[23U + 3U]; + ::memcpy(m_data, udch.m_data, 23U + 3U); } CNXDNUDCH::CNXDNUDCH() : m_data(NULL) { - m_data = new unsigned char[23U + 2U]; + m_data = new unsigned char[23U + 3U]; } CNXDNUDCH::~CNXDNUDCH() @@ -104,7 +105,7 @@ bool CNXDNUDCH::decode(const unsigned char* data) CUtils::dump("NXDN, UDCH/FACCH2 de-interleaved", temp1, 44U); - uint8_t temp2[406U]; + uint8_t temp2[420U]; unsigned int n = 0U; unsigned int index = 0U; @@ -118,18 +119,22 @@ bool CNXDNUDCH::decode(const unsigned char* data) temp2[n++] = b ? 2U : 0U; } + for (unsigned int i = 0U; i < 8U; i++) { + temp2[n++] = 0U; + } + CNXDNConvolution conv; conv.start(); n = 0U; - for (unsigned int i = 0U; i < 203U; i++) { + for (unsigned int i = 0U; i < 207U; i++) { uint8_t s0 = temp2[n++]; uint8_t s1 = temp2[n++]; conv.decode(s0, s1); } - conv.chainback(m_data, 199U); + conv.chainback(m_data, 203U); CUtils::dump("NXDN, UDCH/FACCH2 decoded", m_data, 25U);