0
$\begingroup$

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.

Thanks in advance.
enter image description here

$\endgroup$
3
  • $\begingroup$ What is your goal? Finding a soft decision metric or improving the match filter? $\endgroup$
    – user51024
    Commented Aug 24, 2022 at 11:46
  • $\begingroup$ Maybe you could create Manchester decoded LLRs from QPSK LLRs to have soft decision for your Viterbi decoder $\endgroup$
    – user51024
    Commented Aug 24, 2022 at 21:14
  • $\begingroup$ I just want to decode the manchester symbols. I prefer to get a floating point output that I could quantize and feed to soft decoders (Viterbi, LDPC). $\endgroup$ Commented Aug 30, 2022 at 18:25

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.