From c610878bcf5770951c1fe92c08a90c5eb6b75d1a Mon Sep 17 00:00:00 2001 From: Wojciech Kaczmarski <44336093+sp5wwp@users.noreply.github.com> Date: Tue, 27 Dec 2022 12:41:28 +0100 Subject: [PATCH] convolutional coder added --- SP5WWP/m17-coder/m17-coder-sym.c | 60 +++++++++++++++++++++++++++++++- 1 file changed, 59 insertions(+), 1 deletion(-) diff --git a/SP5WWP/m17-coder/m17-coder-sym.c b/SP5WWP/m17-coder/m17-coder-sym.c index d2cdcb5..476d9cf 100644 --- a/SP5WWP/m17-coder/m17-coder-sym.c +++ b/SP5WWP/m17-coder/m17-coder-sym.c @@ -62,6 +62,61 @@ void send_Syncword(const uint16_t sword) } } +//out - unpacked bits +//in - packed raw bits +//fn - frame number +void conv_Encode_Frame(uint8_t* out, uint8_t* in, uint16_t fn) +{ + uint8_t pp_len = sizeof(P_2); + uint8_t p=0; //puncturing pattern index + uint16_t pb=0; //pushed punctured bits + uint8_t ud[144+4+4]; //unpacked data + + memset(ud, 0, 144+4+4); + + //unpack frame number + for(uint8_t i=0; i<16; i++) + { + ud[4+i]=(fn>>(15-i))&1; + } + + //unpack data + for(uint8_t i=0; i<16; i++) + { + for(uint8_t j=0; j<8; j++) + { + ud[4+16+i*8+j]=(in[i]>>(7-j))&1; + } + } + + //encode + for(uint8_t i=0; i<144+4; i++) + { + //uint8_t G1=(ud[i+0] +ud[i+3]+ud[i+4])%2; + //uint8_t G2=(ud[i+0]+ud[i+1]+ud[i+2] +ud[i+4])%2; + uint8_t G1=(ud[i+4] +ud[i+1]+ud[i+0])%2; + uint8_t G2=(ud[i+4]+ud[i+3]+ud[i+2] +ud[i+0])%2; + + //printf("%d%d", G1, G2); + + if(P_2[p]) + { + out[pb]=G1; + pb++; + } + if(P_2[p+1]) + { + out[pb]=G2; + pb++; + } + + p+=2; + p%=pp_len; + } + + //printf("pb=%d\n", pb); +} + //main routine int main(void) { @@ -172,6 +227,9 @@ int main(void) enc_bits[i*8+j]=(lich_encoded[i]>>(7-j))&1; } + //encode the rest of the frame + conv_Encode_Frame(&enc_bits[96], data, fn); + //reorder bits for(uint16_t i=0; i