From cf2f8ee3c8df8c6eaedf3f7f15d4bef3fbe14210 Mon Sep 17 00:00:00 2001 From: Jonathan Naylor Date: Tue, 23 Jan 2018 21:29:25 +0000 Subject: [PATCH] Make the punctured convolution code processed correctly. --- NXDNControl.cpp | 2 ++ NXDNConvolution.cpp | 6 +++--- NXDNSACCH.cpp | 35 ++++++++++++++++++++++------------- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/NXDNControl.cpp b/NXDNControl.cpp index 742f34f..f1761e9 100644 --- a/NXDNControl.cpp +++ b/NXDNControl.cpp @@ -165,6 +165,8 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne CNXDNSACCH sacch; sacch.decode(data + 2U); + sacch.encode(data + 2U); + #ifdef notdef unsigned char fi = m_lastFICH.getFI(); if (valid && fi == YSF_FI_HEADER) { diff --git a/NXDNConvolution.cpp b/NXDNConvolution.cpp index 7120d6b..83f73a0 100644 --- 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() : diff --git a/NXDNSACCH.cpp b/NXDNSACCH.cpp index 073f764..b1e7ea6 100644 --- a/NXDNSACCH.cpp +++ b/NXDNSACCH.cpp @@ -22,6 +22,7 @@ #include "NXDNDefines.h" #include "NXDNCRC.h" #include "Utils.h" +#include "Log.h" #include #include @@ -76,41 +77,41 @@ bool CNXDNSACCH::decode(const unsigned char* data) CUtils::dump("NXDN, SACCH de-interleaved", temp1, 8U); - unsigned char temp2[9U]; + uint8_t temp2[72U]; + + char text[500U]; + ::strcpy(text, "NXDN, SACCH de-punctured: "); unsigned int n = 0U; unsigned int index = 0U; for (unsigned int i = 0U; i < NXDN_SACCH_LENGTH_BITS; i++) { - if (i == PUNCTURE_LIST[index]) { - WRITE_BIT1(temp2, n, false); + if (n == PUNCTURE_LIST[index]) { + ::strcat(text, "1, "); + temp2[n++] = 1U; index++; - n++; } bool b = READ_BIT1(temp1, i); - WRITE_BIT1(temp2, n, b); - n++; + temp2[n++] = b ? 2U : 0U; + ::strcat(text, b ? "2, " : "0, "); } - CUtils::dump("NXDN, SACCH de-punctured", temp2, 9U); + LogMessage(text); CNXDNConvolution conv; conv.start(); n = 0U; for (unsigned int i = 0U; i < 36U; i++) { - uint8_t s0 = READ_BIT1(temp2, n) ? 1U : 0U; - n++; - - uint8_t s1 = READ_BIT1(temp2, n) ? 1U : 0U; - n++; + uint8_t s0 = temp2[n++]; + uint8_t s1 = temp2[n++]; conv.decode(s0, s1); } conv.chainback(m_data, 36U); - CUtils::dump("NXDN, SACCH", m_data, 5U); + CUtils::dump("NXDN, SACCH decoded", m_data, 5U); return CNXDNCRC::checkCRC6(m_data, 26U); } @@ -129,11 +130,15 @@ void CNXDNSACCH::encode(unsigned char* data) const CNXDNCRC::encodeCRC6(temp1, 26U); + CUtils::dump("NXDN, SACCH encoded with CRC", temp1, 5U); + unsigned char temp2[9U]; CNXDNConvolution conv; conv.encode(temp1, temp2, 36U); + CUtils::dump("NXDN, SACCH convolved", temp2, 9U); + unsigned char temp3[8U]; unsigned int n = 0U; @@ -148,11 +153,15 @@ void CNXDNSACCH::encode(unsigned char* data) const } } + CUtils::dump("NXDN, SACCH punctured", temp3, 8U); + for (unsigned int i = 0U; i < NXDN_SACCH_LENGTH_BITS; i++) { unsigned int n = INTERLEAVE_TABLE[i] + NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS; bool b = READ_BIT1(temp3, i); WRITE_BIT1(data, n, b); } + + CUtils::dump("NXDN, SACCH re-encoded", data, 12U); } unsigned char CNXDNSACCH::getRAN() const