I need to perform soft Viterbi decoding on a Manchester-encoded BPSK/QPSK signals. To that end, I need a floating point Manchester decoder. Most of the implementations I have seen operate on hard bits. There are of course floating point implementations that monitor "branch weight" like this one. This class of decoders work for manchester-encoded BPSK signals at 2 samples per symbol.
AGC --> PFB Time Sync --> Costas --> (2 sps) Manchester decoder --> Slicer
I don't think they can work for QPSK. They also tend to have some "if else" branches, which are very computationally tasking, especially for high data rates I'm interested in.
I have tried a matched filter approach in the following scenario. I receive 1 Mbps BPSK/QPSK signals at 2.1 sps. The actual sample rate becomes 4.2 Msps to accommodate Manchester encoding). The receiver has
AGC --> PFB Time Sync --> Costas --> Slicer
The PFB now works at 4.2 sps and produces 1 sample per symbol of decoded manchester signal (match-filtered by Manchester taps and downsampled by the PFB Time sync) The PFB taps are set as follows:
void
TimeSync::SetPolyTaps2(std::vector<std::vector<float> > Taps,std::vector<std::vector<float> > DiffTaps, bool bBiphase)
{
m_nFilts = Taps.size();
m_Filts.clear();
m_DiffFilts.clear();
float fAmp = 0.25f;
std::vector<float> fvBiphaseTaps = {fAmp,fAmp,-fAmp,-fAmp};//{-0.0859984,1.0116342,-0.0859984};
for(unsigned int i = 0; i < m_nFilts; i++)
{
// Matched Filter
IPPFilter filter;
if(bBiphase) // Convolving with Manchester pulse if Manchester is enabled
{
// Convolving
CFirdes.Conv(Taps[i],fvBiphaseTaps);
}
filter.Initialize(Taps[i],1,1);
m_Filts.push_back(filter);
// Derivative Filter
IPPFilter diff;
if(bBiphase) // Convolving with Manchester pulse if Manchester is enabled
{
CFirdes.Conv(DiffTaps[i],fvBiphaseTaps);
}
diff.Initialize(DiffTaps[i],1,1);
m_DiffFilts.push_back(diff);
}
}
The main issue is that the receiver produces incorrect constellation like the one shown below. There are some instances where it locks perfectly but then the BER performance is not good.
I welcome all suggestions on improving the Matched filter Manchester decoder. Other alternative approaches that could decode BPSK/QPSK/oQPSK manchester signals are also welcomed.