1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
#include "qpsk_diff.h"
namespace diff
{
void QPSKDiff::work(uint8_t *in, int len, uint8_t *out)
{
oo = 0;
// Process all given samples
for (int ii = 0; ii < len; ii++)
{
uint8_t &sample = in[ii];
// Push new sample into buffer
buffer[0] = buffer[1];
buffer[1] = sample;
// We need at least 2
if (inBuf < 2)
{
inBuf++;
continue;
}
// Perform differential decoding
Xin_1 = buffer[0] & 0x02;
Yin_1 = buffer[0] & 0x01;
Xin = buffer[1] & 0x02;
Yin = buffer[1] & 0x01;
if (((Xin >> 1) ^ Yin) == 1)
{
Xout = (Yin_1 ^ Yin);
Yout = (Xin_1 ^ Xin);
ou = (Xout << 1) + (Yout >> 1);
}
else
{
Xout = (Xin_1 ^ Xin);
Yout = (Yin_1 ^ Yin);
ou = (Xout + Yout);
}
// Output is inverted on CFOSAT
if (swap)
{
out[oo * 2 + 0] = ou & 1;
out[oo * 2 + 1] = ou >> 1;
}
else
{
out[oo * 2 + 0] = ou >> 1;
out[oo * 2 + 1] = ou & 1;
}
oo++;
}
}
} // namespace fengyun
|