Re: extending gr-trellis to perform Viterbi, MLSD on GMSK


there is no change required in the modules that perform viterbi decoding
in order to implement either MLSD in ISI or (coherent) GMSK demod.
The whole idea around gr-trellis was to disentangle the trellis aspect
of a modulation scheme from the details of the modulation/channel.

So, if you want to implement general (coherent) CPM demodulation, all
you have to do is to represent the CPM signal as a FSM followed by a
memoryless modulator. Look up the paper by
Bixio Rimoldi: A decomposition approach to CPM, or take a look at my
notes on this at

You will only need to write an additional
constructor for the fsm class that takes the CPM parameters and produces
the appropriate FSM. Similarly, you’ll need to write a piece of code
that takes the incoming waveform and does the metrics calculations
(eithar as a separate block as in trellis-metrics or inside the viterbi
block as in trellis-viterbi-combined).

If you want to work on this general problem for a generic CPM modulation
I can help you.

Adding ISI to this is a piece of cake: you need to combine the two
trellises into either a combined trellis or to use hard/soft decisions
from one to feed the other detector.


Date: Tue, 3 Feb 2009 02:43:01 +0000
From: Nick F. [email protected]
Subject: [Discuss-gnuradio] extending gr-trellis to perform Viterbi
To: gnuradio [email protected]
Message-ID: [email protected]
Content-Type: text/plain; charset=“windows-1252”

Hi all,

I’ve spent a few days familiarizing myself with gr-trellis as best as I
can, and I’m interested in extending the gr-trellis module to handle
Viterbi equalization of ISI channels for GMSK demodulation. I saw Toby
Oliver’s thread in Sept. '06
([email protected]/msg05615.html)
discussing a possible modification with Achilleas A. but
never saw anything checked in as a result. I’m just looking to use the
trellis code to demodulate low-BT GMSK in a more optimal way than the
current Gnuradio implementation, and I have similar questions to Toby’s:

  • How should I go about modifying make_isi_lookup() to add support for
    two-dimensional modulations? What format is trellis expecting?

  • I see the file, which appears to do MLSD
    on an ISI channel for 4-PAM (and other one-dimensional modulations). Am
    I correct that if make_isi_lookup() is modified to support quadrature
    modulations, simply changing the modulation type in this example would
    be enough to make it work? I guess I’m asking more specifically if
    trellis.viterbi_combined_X will support an ISI lookup table for PSK
    modulations without modification.

  • Is there a good reason I should avoid tackling this problem? I’d hate
    to be duplicating someone else’s work in this area, or barking up the
    wrong tree.

For further information, I’ve written a packet-based AIS decoder for
Gnuradio, and I’m disappointed at the quality of the data coming out of
the GMSK demodulator. It’s 9600 symbols per second @ BT=0.3, so there’s
enough ISI that I think MLSD would provide significant reduction in
observed BER. Besides, it seems like it would be a useful capability to
have added to Gnuradio. Any other tips anyone has that might help me in
doing this would certainly be welcome!



I am trying to decode CPM signal according to your email but I have
with understanding some things. What I’d like to do is to decode some
of I/Q samples according to following scenario:

  • decimation of symbol rate N-times
  • decoding I/Q symbols according to FSM file and provided constellation

For VA I am using:
dimensionality = 1
va =

However the results are not as expected to be. My guess is that
might be wrong with FSM file - I’ve looked through *.fsm files example
seems that table OS (output symbols) is generated somehow. What I know
my state machine is:

  • there is S unique states
  • each state can have transition to one of I states
  • each input symbol is equal to IB bits
  • transition from state S(i-1) to S(i) corresponds to O output symbols
  • each output symbol is written on OB bits

So in general - I have defined NS table. I thought that OS table in
file is just table that tells: transition from state S(a) to state S(b)
equal to output symbol O(ab) but it seems that I’m wrong. Is there any
way to generate OS table in *.fsm file? I have seen fsm constructor that
generates these values according to (n,k) and G - is that only way to
generate OS table?


On Tue, Feb 3, 2009 at 11:23 PM, Achilleas A.
<[email protected]