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

The definition of the OS table is different than the one you suggest:

For every state “s” and for every INPUT SYMBOL “i” it tells you what the
output symbol index “o” should be.
The reason a “transition” “t” is defined
as the pair (s,i) and not as a succession of states (s,s’) is that the
latter case cannot deal with “parallel” transitions.

So you need to rewrite your *.fsm description.

In addition, I suppose you have implemented some sort of “demodulator”,
ie, the device that takes the IQ CPM samples and projects these signals
onto an (at least approximate) orthonormal basis. The way to do that is
detailed here:


From: Grzegorz Suder
Subject: Re: [Discuss-gnuradio] extending gr-trellis to perform
Viterbi, MLSD on GMSK
Date: Wed, 11 Feb 2009 10:19:42 +0100

I am trying to decode CPM signal according to your email but I have
problem with understanding some things. What I’d like to do is to decode
some kind 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
something might be wrong with FSM file - I’ve looked through *.fsm files
example and seems that table OS (output symbols) is generated somehow.
What I know about 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
*.fsm file is just table that tells: transition from state S(a) to state
S(b) is equal to output symbol O(ab) but it seems that I’m wrong. Is
there any easy 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?


Hi all,

I just committed an update to gr-trellis that can handle coherent
demodulation of an arbitrary CPM signal (CPFSK, RC-CPFSK, GMSK, etc)

It consists of an additional fsm constructor that provides the FSM
description and a couple of helper utilities (in
that can help construct the appropriate matched filters etc.
The remaining functions can be used verbatim (ie, all the viterbi/siso
blocks in gr-trellis)

I have also added a file with an example case.

The theory behind the decomposition is all detailed in a
classic paper by Bixio Rimoldi “A decomposition approach to CPM”
IEEE Trans. Information Theory, March 1988.
A summary of this can be found in
I didn’t have the time to make an xml file out of my latex file, so for
the time being this summary is not committed to the trunk.

Careful: this is a “coherent” demodulator, so it will not
work with real data from the USRP. It does neither
symbol timing tracking nor phase tracking.
The focus was to demonstrate the generality of the decomposition.

If you want to make a practical CPM demod based on this approach, you
need to either
(i) do timing/phase estimation OUTSIDE the Viterbi decoding (either
using a non-data aided scheme or a coded-data aided scheme) and use the
rest of the demodulator as provided, or (better)
(ii) modify the viterbi block in gr-trellis to add timing/phase
estimation based on tentative decisions (with some delay “d”) from the
If anyone wants to take up this task I can help. I’ll probably won’t
have time to do it myself before the summer…