How to compute the free distance in TCM (Trellis-Coded Modulation)? I would like to be able to compute the so-called "free distance" for a TCM with a rate 2/3 convolutional code (two inputs, three outputs) inside that I plan to use for 8PSK. My previous assumption was that I could simply compute distance between the "null sequence" and the next closest sequence because the code is linear. But that does not seem to work because this computation gives me a squared free distance of supposedly 5.17157 for an 8-state code that actually performs worse in AWGN channel simulations than the 8-state recursive Ungerboeck code for which I compute the squared free distance to be 4.58579 (which is correct in this case).

Any pointers on how to compute the free distance for TCM would be greatly appreciated.

The TCM for which my free distance calculation seems to fail is this one:

in1 ----------*---------------*-- out2
              |               |
              |               V
in0 -*--------|--------*----&gt;(+)- out1      (+) is a binary plus (xor)
     |        |        |
     V        V        V                    [D] is a delay element/flip-flop
    (+)-&gt;[D]-(+)-&gt;[D]-(+)-&gt;[D]-*- out0
     A                 A       |            V and A are supposed to be
     |                 |       |            arrow heads
     `-----------------*-------´

symbol mapping:
binary "out2 out1 out0" -&gt; exp(2i*pi*out/8)
where out_k is the k-th bit of out counting from zero as the LSB
The free distance of a Trellis Coded Modulation system implemented either on BPSK or QPSK is a straightforward calculation. You'd have to compute the free distance $d_{free}$ of the convolutional code which is known as the Minimum Squared Euclidean Distance (MSED). Now, if the code has set-partitioned labeling to achieve coding gains over conventional labeling, then the minimum distance is given as $$\text{min}(d_{free},d_{ic})$$
where $d_{ic}$ is the minimum squared Intra-coset distance which can be calculated from the mapping. Having said this, the MSED of the convolutional code can be computed the same way its $d_f$ (the hamming free distance) is computed. You need to do a trellis search and replace hamming weights with squared euclidean minimum distances with the all zero-sequence mapping (this is valid because any convolutional code is linear and if the mapping is BPSK or QPSK, every symbol has a decoding Voronoi region that has the same area and the same shape as every other sequence). I believe you've implemented your trellis search perfectly. Having said this, the Ungerboeck code cannot be performing better than a code which has a higher Euclidean $d_{min}$. Suggestions:  1. Either you're computing one of the distances wrongly2. Are you sure about the minimum distance of the Ungerboeck code?