2022-01-08 00:12:06 +01:00
|
|
|
#include "qpsk_diff.h"
|
2021-10-27 21:44:26 +02:00
|
|
|
|
2022-01-08 00:12:06 +01:00
|
|
|
namespace diff
|
2021-10-27 21:44:26 +02:00
|
|
|
{
|
2022-01-08 00:12:06 +01:00
|
|
|
void QPSKDiff::work(uint8_t *in, int len, uint8_t *out)
|
2021-10-27 21:44:26 +02:00
|
|
|
{
|
2022-01-08 00:12:06 +01:00
|
|
|
oo = 0;
|
2021-10-27 21:44:26 +02:00
|
|
|
|
|
|
|
|
// 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);
|
2022-01-08 00:12:06 +01:00
|
|
|
ou = (Xout << 1) + (Yout >> 1);
|
2021-10-27 21:44:26 +02:00
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
Xout = (Xin_1 ^ Xin);
|
|
|
|
|
Yout = (Yin_1 ^ Yin);
|
2022-01-08 00:12:06 +01:00
|
|
|
ou = (Xout + Yout);
|
2021-10-27 21:44:26 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Output is inverted on CFOSAT
|
2022-01-08 00:12:06 +01:00
|
|
|
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++;
|
2021-10-27 21:44:26 +02:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} // namespace fengyun
|