init commit
This commit is contained in:
@@ -0,0 +1,36 @@
|
||||
#include "code.h"
|
||||
|
||||
|
||||
static inline int parity(unsigned long long x){
|
||||
return __builtin_parityll(x);
|
||||
}
|
||||
|
||||
|
||||
// Convolutionally encode a packet. The input data bytes are read
|
||||
// high bit first and the encoded packet is written into 'symbols',
|
||||
// one symbol per byte. The first symbol is generated from POLY1,
|
||||
// the second from POLY2.
|
||||
|
||||
// Storing only one symbol per byte uses more space, but it is faster
|
||||
// and easier than trying to pack them more compactly.
|
||||
int encode(
|
||||
unsigned char *symbols, // Output buffer, 2*8*nbytes
|
||||
const unsigned char *data, // Input buffer, nbytes
|
||||
unsigned int nbytes) // Number of bytes in data
|
||||
{
|
||||
unsigned long long encstate;
|
||||
int i;
|
||||
|
||||
encstate = 0;
|
||||
while(nbytes-- != 0){
|
||||
for(i=7;i>=0;i--){ // Transmit MSB first
|
||||
encstate = ((encstate << 1) | ((*data >> i) & 1));
|
||||
*symbols++ = G1FLIP ^ parity(encstate & POLY1);
|
||||
*symbols++ = G2FLIP ^ parity(encstate & POLY2);
|
||||
}
|
||||
data++;
|
||||
}
|
||||
if((encstate & ((1LL << K) -1)) != 0)
|
||||
return -1; // Warn if encoder wasn't tailed back to 0
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user