2015-01-17 15:59:44 +00:00
|
|
|
/*
|
|
|
|
Interleaving is "easiest" if the same number of bits is used per symbol as for FEC
|
|
|
|
Chosen mode "spreading 8, low rate" has 6 bits per symbol, so use 4:6 FEC
|
|
|
|
*/
|
|
|
|
|
|
|
|
// Needs adjusting for different sizes
|
2015-01-31 23:41:06 +00:00
|
|
|
void LoRaDemod::interleave(char* inout)
|
2015-01-17 15:59:44 +00:00
|
|
|
{
|
|
|
|
int i, index = 6;
|
2015-01-31 23:41:06 +00:00
|
|
|
char in[index * 2];
|
2015-01-17 15:59:44 +00:00
|
|
|
for (i = 0; i < index; i++)
|
|
|
|
in[i] = inout[i];
|
2015-01-31 23:41:06 +00:00
|
|
|
// top bits are swapped ?
|
2015-01-17 15:59:44 +00:00
|
|
|
for (i = 0; i < index; i++) {
|
2015-01-31 23:41:06 +00:00
|
|
|
inout[i] = (32 & in[1 + i]) | (16 & in[0 + i]) | (8 & in[2 + i])
|
|
|
|
| (4 & in[3 + i]) | (2 & in[4 + i]) | (1 & in[5 + i]);
|
2015-01-17 15:59:44 +00:00
|
|
|
in[i + index] = in[i];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-22 22:30:55 +00:00
|
|
|
short LoRaDemod::toGray(short num)
|
2015-01-17 15:59:44 +00:00
|
|
|
{
|
2015-01-22 22:30:55 +00:00
|
|
|
return (num >> 1) ^ num;
|
2015-01-17 15:59:44 +00:00
|
|
|
}
|
|
|
|
|
2015-02-05 19:38:46 +00:00
|
|
|
// ignore FEC, data in lsb
|
|
|
|
void LoRaDemod::hamming(char* inout, int size)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
char c;
|
|
|
|
for (i = 0; i < size; i++) {
|
|
|
|
c = inout[i];
|
|
|
|
c = ((c&1)<<3) | ((c&2)<<1) | ((c&4)>>1) | ((c&8)>>3);
|
|
|
|
inout[i] = c;
|
|
|
|
}
|
|
|
|
inout[i] = 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
// data whitening
|
|
|
|
void LoRaDemod::prng(char* inout, int size)
|
|
|
|
{
|
|
|
|
const char otp[] = {
|
|
|
|
" "
|
|
|
|
};
|
|
|
|
int i, maxchars;
|
|
|
|
|
|
|
|
maxchars = sizeof( otp );
|
|
|
|
if (size < maxchars)
|
|
|
|
maxchars = size;
|
|
|
|
for (i = 0; i < maxchars; i++)
|
|
|
|
inout[i] ^= otp[i] - 32;
|
|
|
|
}
|
|
|
|
|