Make the punctured convolution code processed correctly.

This commit is contained in:
Jonathan Naylor 2018-01-23 21:29:25 +00:00
parent ee18aa602c
commit cf2f8ee3c8
3 changed files with 27 additions and 16 deletions

View file

@ -165,6 +165,8 @@ bool CNXDNControl::processVoice(unsigned char usc, unsigned char option, unsigne
CNXDNSACCH sacch; CNXDNSACCH sacch;
sacch.decode(data + 2U); sacch.decode(data + 2U);
sacch.encode(data + 2U);
#ifdef notdef #ifdef notdef
unsigned char fi = m_lastFICH.getFI(); unsigned char fi = m_lastFICH.getFI();
if (valid && fi == YSF_FI_HEADER) { if (valid && fi == YSF_FI_HEADER) {

View file

@ -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 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]) #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_TABLE1[] = {0U, 0U, 0U, 0U, 2U, 2U, 2U, 2U};
const uint8_t BRANCH_TABLE2[] = {0U, 1U, 1U, 0U, 0U, 1U, 1U, 0U}; 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_D2 = 8U;
const unsigned int NUM_OF_STATES = 16U; const unsigned int NUM_OF_STATES = 16U;
const uint32_t M = 2U; const uint32_t M = 4U;
const unsigned int K = 5U; const unsigned int K = 5U;
CNXDNConvolution::CNXDNConvolution() : CNXDNConvolution::CNXDNConvolution() :

View file

@ -22,6 +22,7 @@
#include "NXDNDefines.h" #include "NXDNDefines.h"
#include "NXDNCRC.h" #include "NXDNCRC.h"
#include "Utils.h" #include "Utils.h"
#include "Log.h"
#include <cstdio> #include <cstdio>
#include <cassert> #include <cassert>
@ -76,41 +77,41 @@ bool CNXDNSACCH::decode(const unsigned char* data)
CUtils::dump("NXDN, SACCH de-interleaved", temp1, 8U); 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 n = 0U;
unsigned int index = 0U; unsigned int index = 0U;
for (unsigned int i = 0U; i < NXDN_SACCH_LENGTH_BITS; i++) { for (unsigned int i = 0U; i < NXDN_SACCH_LENGTH_BITS; i++) {
if (i == PUNCTURE_LIST[index]) { if (n == PUNCTURE_LIST[index]) {
WRITE_BIT1(temp2, n, false); ::strcat(text, "1, ");
temp2[n++] = 1U;
index++; index++;
n++;
} }
bool b = READ_BIT1(temp1, i); bool b = READ_BIT1(temp1, i);
WRITE_BIT1(temp2, n, b); temp2[n++] = b ? 2U : 0U;
n++; ::strcat(text, b ? "2, " : "0, ");
} }
CUtils::dump("NXDN, SACCH de-punctured", temp2, 9U); LogMessage(text);
CNXDNConvolution conv; CNXDNConvolution conv;
conv.start(); conv.start();
n = 0U; n = 0U;
for (unsigned int i = 0U; i < 36U; i++) { for (unsigned int i = 0U; i < 36U; i++) {
uint8_t s0 = READ_BIT1(temp2, n) ? 1U : 0U; uint8_t s0 = temp2[n++];
n++; uint8_t s1 = temp2[n++];
uint8_t s1 = READ_BIT1(temp2, n) ? 1U : 0U;
n++;
conv.decode(s0, s1); conv.decode(s0, s1);
} }
conv.chainback(m_data, 36U); 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); return CNXDNCRC::checkCRC6(m_data, 26U);
} }
@ -129,11 +130,15 @@ void CNXDNSACCH::encode(unsigned char* data) const
CNXDNCRC::encodeCRC6(temp1, 26U); CNXDNCRC::encodeCRC6(temp1, 26U);
CUtils::dump("NXDN, SACCH encoded with CRC", temp1, 5U);
unsigned char temp2[9U]; unsigned char temp2[9U];
CNXDNConvolution conv; CNXDNConvolution conv;
conv.encode(temp1, temp2, 36U); conv.encode(temp1, temp2, 36U);
CUtils::dump("NXDN, SACCH convolved", temp2, 9U);
unsigned char temp3[8U]; unsigned char temp3[8U];
unsigned int n = 0U; 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++) { 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; unsigned int n = INTERLEAVE_TABLE[i] + NXDN_FSW_LENGTH_BITS + NXDN_LICH_LENGTH_BITS;
bool b = READ_BIT1(temp3, i); bool b = READ_BIT1(temp3, i);
WRITE_BIT1(data, n, b); WRITE_BIT1(data, n, b);
} }
CUtils::dump("NXDN, SACCH re-encoded", data, 12U);
} }
unsigned char CNXDNSACCH::getRAN() const unsigned char CNXDNSACCH::getRAN() const