diff --git a/SP5WWP/m17-decoder-sym.c b/SP5WWP/m17-decoder-sym.c index f6e3f1c..6da08b3 100644 --- a/SP5WWP/m17-decoder-sym.c +++ b/SP5WWP/m17-decoder-sym.c @@ -22,7 +22,7 @@ uint8_t lich_cnt; //LICH_CNT uint8_t lich_chunks_rcvd=0; //flags set for each LSF chunk received uint16_t enc_data[272]; //raw frame data soft bits -uint8_t frame_data[18]; //decoded frame data, 144 bits (16+128) +uint8_t frame_data[19]; //decoded frame data, 144 bits (16+128), plus 4 flushing bits uint8_t syncd=0; //syncword found? uint8_t pushed; //counter for pushed symbols @@ -162,7 +162,7 @@ int main(void) //debug - dump LICH if(lich_chunks_rcvd==0x3F) { - /*//DST + //DST printf("DST: "); for(uint8_t i=0; i<6; i++) printf("%02X", lsf[i]); @@ -190,7 +190,7 @@ int main(void) printf("CRC: "); for(uint8_t i=0; i<2; i++) printf("%02X", lsf[28+i]); - printf("\n");*/ + printf("\n"); lich_chunks_rcvd=0; //reset all flags } @@ -202,15 +202,15 @@ int main(void) } //data part - memset((uint8_t*)frame_data, 0, 18); - decodePunctured(frame_data, enc_data, P2_pat, 272, 12); + uint32_t e=decodePunctured(frame_data, enc_data, P2_pat, 272, 12); - //dump data - for(uint8_t i=0; i<18; i++) + //dump data - first byte is empty + printf("FN: %02X%02X PLD: ", frame_data[1], frame_data[2]); + for(uint8_t i=3; i<19; i++) { - printf("%02X ", frame_data[i]); + printf("%02X", frame_data[i]); } - printf("\n"); + printf(" e=%1.1f\n", (float)e/0xFFFF); //job done syncd=0; diff --git a/SP5WWP/viterbi.c b/SP5WWP/viterbi.c index 9fc7ef0..2128d2a 100644 --- a/SP5WWP/viterbi.c +++ b/SP5WWP/viterbi.c @@ -56,7 +56,7 @@ uint32_t decode(uint8_t* out, const uint16_t* in, uint16_t len) * @param p_len: puncturing matrix length (entries). * @return number of bit errors corrected. */ -uint16_t decodePunctured(uint8_t* out, const uint16_t* in, const uint8_t* punct, uint16_t in_len, uint16_t p_len) //input length, puncturing pattern length +uint32_t decodePunctured(uint8_t* out, const uint16_t* in, const uint8_t* punct, uint16_t in_len, uint16_t p_len) //input length, puncturing pattern length { if(in_len > 244*2) fprintf((FILE*)STDERR_FILENO, "Input size exceeds max history\n"); @@ -83,7 +83,7 @@ uint16_t decodePunctured(uint8_t* out, const uint16_t* in, const uint8_t* punct, p%=p_len; } - return decode(out, umsg, u); + return decode(out, umsg, u) - (u-in_len)*0x7FFF; } /** @@ -160,18 +160,20 @@ void decodeBit(uint16_t s0, uint16_t s1, size_t pos) uint32_t chainback(uint8_t* out, size_t pos, uint16_t len) { uint8_t state = 0; - size_t bitPos = len; + size_t bitPos = len+4; + + memset(out, 0, (len-1)/8+1); while(bitPos > 0) { bitPos--; pos--; - uint8_t bit = history[pos]&((1<<(state>>4))); + uint16_t bit = history[pos]&((1<<(state>>4))); state >>= 1; if(bit) { state |= 0x80; - out[bitPos/8]|=1<<(bitPos%8); + out[bitPos/8]|=1<<(7-(bitPos%8)); } } diff --git a/SP5WWP/viterbi.h b/SP5WWP/viterbi.h index 838425b..6d71b2f 100644 --- a/SP5WWP/viterbi.h +++ b/SP5WWP/viterbi.h @@ -2,7 +2,7 @@ #define VITERBI_H uint32_t decode(uint8_t* out, const uint16_t* in, uint16_t len); -uint16_t decodePunctured(uint8_t* out, const uint16_t* in, const uint8_t* punct, uint16_t in_len, uint16_t p_len); +uint32_t decodePunctured(uint8_t* out, const uint16_t* in, const uint8_t* punct, uint16_t in_len, uint16_t p_len); void decodeBit(uint16_t s0, uint16_t s1, size_t pos); uint32_t chainback(uint8_t* out, size_t pos, uint16_t len); uint16_t q_AbsDiff(const uint16_t v1, const uint16_t v2);