satdump/src-core/common/codings/differential/qpsk_diff.cpp

57 lines
1.4 KiB
C++
Raw Normal View History

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