Notes on Operation and Performance

The decoder operation is described in detail in the Technical notes and is just summarised here:

Outcomes

There are three possible outcomes of a decode attempt:

The message success rate is defined as the probability of a SUCCESS outcome.

The decoder itself is unable to distinguish between SUCCESS and FALSE outcomes - they can only be recognised as such by the operator or by a test script which is comparing the decoder's final result with the trial message.

Optimum list length

A decode attempt which results in a FAIL is an indication that the decoder list length is not long enough to take full advantage of the CRC and source coding redundancy. A 'deeper' search with a longer list length could have been made, which may have turned up either the correct message or a false decode. For any given amount of redundancy. increasing the decoder list length will reduce the probability of a FAIL and increase the probability of both SUCCESS and FALSE. Eventually, increasing list length will lead to negligible probability of FAIL. Increasing the list length beyond this point has no effect on the probability of SUCCESS or FALSE.

The optimum list length (for any given combination of coding, message length, and CRC size) is that which produces a negligible chance of a FAIL outcome. For the performance measurements reported in these notes, the negligible FAIL probability is defined as 0.2%. This means that increasing the list length beyond the optimum can produce no more than a further 0.2% increase in message success rate.

The optimum list length depends on the code used, the message length, the CRC size, and the phase search policy used by the decoder. It also depends to some extent on the signal/noise ratio. The table below demonstrates the typical decoder performance as the list length is increased through the optimum value.

Performance at Eb/N0=-1.0dB, full phase search
CodeCharsCRCListSuccessFalseFail
8K19A6121032.1%3.9%64.0%
8K19A6123041.5%8.1%50.3%
8K19A61210049.6%21.3%29.1%
8K19A61230053.5%37.4%9.2%
8K19A612100056.4%43.3%0.3%
8K19A612300056.3%43.7%0.0%

The optimum list length in this case is somewhere between 1000 and 3000 and the decoder would choose to use 3000 to maximise the chance of a successful decode. With this setting the decoder will almost always produce a result and that result has a 56% chance of being the correct decode. The Shannon sphere packing limit for this block size is 77.6% success rate at -1.0 dB and EbNaut is performing within 0.8dB of the limit.

Trials to establish optimum list lengths make use of geometrically increasing list lengths: 1,3,10,30,100,300,... and so on. These coarse steps are reasonable because the optimum is not critical and it does not harm success rate to use a longer than optimum list length.

There is an absolute maximum list length which is reached when the list is long enough to include all possible decodes produced by the Viterbi layer. For example a one character message with 8 bit CRC has a Viterbi payload of 6 + 8 = 14 bits. There are therefore only $2^{14} = 16384$ distinct codewords and all of these will be represented in the Viterbi list if the list size is set to 16384. Increasing the list beyond this merely allocates memory which will never be used. There is no further coding gain to be obtained and a run of the decoder is equivalent to testing the correlation of the received message with all possible messages.

Optimum CRC size

If the sender chooses to use a larger CRC, then the decoder will have to use a longer list to take advantage of it. Also, sending a longer message (more characters) will introduce further redundancy due to the source coding, and a longer decoder list will be needed.

With almost all codes and message lengths, more redundancy (larger CRC, more characters) will lead to improved message success rate so long as the decoder is able to use the optimum list length for that redundancy.

Consequently, the optimum CRC size is that which has an optimum list length equal to the largest list that the decoder can use. In practice this is limited to about 3000000.

The table below shows the typical variation of performance and optimum list length as the CRC size is increased.

Performance at Eb/N0=-1.0dB, full phase search
CodeCharsCRCOpt ListSuccessFalse
8K19A60150.8%49.2%
8K19A663055.5%44.5%
8K19A612300056.3%43.7%
8K19A61810000057.1%42.9%

With short messages the CRC bits are a significant extra payload overhead for the inner convolutional code to carry. Much of the available list decoding gain is being used to compensate for this. Therefore the overall performance doesn't increase much as the CRC is increased. For example, here is the performance of a 1 character message:

Performance at Eb/N0=-1.0dB, full phase search
CodeCharsCRCOpt ListSuccessFalse
8K19A10153.8%46.2%
8K19A163054.4%45.6%
8K19A112300054.8%45.2%
8K19A11810000055.7%44.3%
8K19A1241000000054.7%45.3%

The single character is encoded into 6 Viterbi payload bits, thus moving from CRC 0 to CRC 6 is doubling the convolutional code payload and therefore halving the energy per bit. All the strength of the list decoding is being used to compensate for this. This compensation continues as the CRC size is increased further and there is no overall improvement to success rate.

With longer messsages, the benefit of a larger CRC is more obvious:

Performance at Eb/N0=-1.0dB, full phase search
CodeCharsCRCOpt ListSuccessFalse
8K19A2503038.3%61.7%
8K19A256300045.5%54.5%
8K19A251210000052.3%47.7%
8K19A2518300000056.6%43.4%

The additional CRC bits represent only a small fractional increase in the Viterbi payload size and almost the full gain of the list decoding contributes to the success rate.

Phase search policy

The phase search initially tries uniform (constant throughout the message) reference phases in 30 degree steps, gradually moving further away from the initial guess obtained from the squared signal. There are 12 uniform phases to try, therefore 12 runs of the Viterbi list decoder. The decoder then splits the message into, first two parts, then four parts, and applies slightly different reference phases to each part. This involves a further 96 runs of the decoder. The intention of this stage of the phase search is to accomodate signals that are slightly off frequency or are disturbed by propagation changes such as a day/night terminator passage.

Note that it doesn't matter what order the decoder uses to trial all the variations of reference phase. The final result will be the same - the decode which gave the highest path metric (correlation). In practice the uniform phases are tried first as these usually deliver a result which will not be improved upon by further phase trials. The operator is at liberty to terminate the decode attempt at that stage.

The phase search incurs some cost in terms of coding gain. Each run of the decoder within the phase search invites the possibility of obtaining a random false decode having a higher path metric than the genuine decode, thus leading to a FALSE outcome. A consequence of this is that the optimum list length is longer if the phase search is restricted to uniform phases and this produces an associated increase in success rate. Indeed, if the phase of the received signal is known in advance (perhaps by prior carrier measurements on a repeatable path), then the phase search can be turned off and replaced by a single run of the decoder using the known reference phase. Then the optimum list becomes longer still and produces a further improvement in success rate.

An example is given in the table below:

Performance at Eb/N0=-1.0dB
CodeCharsCRC   Full phase search   Uniform phase search   Known phase
Opt ListSuccess Opt ListSuccess Opt ListSuccess
8K19A60150.8%353.7%3063.4%
8K19A663055.5%30058.2%300066.4%
8K19A612300056.3%1000061.1%10000071.1%
8K19A61810000057.1%100000062.2%1000000072.0%

The Shannon sphere packing limit for 8K19A with 6 characters and 18 bit CRC is 78.0% at -1.0 dB and with known phase and $10^7$ list size, EbNaut performance comes within 0.25dB of the limit. For uniform phase and full phase searches, the performance is within 0.54dB and 0.72dB respectively. This gives an indication of the loss of coding gain when the reference phase has to be searched for.

The measured performance of the above code with CRC 18 over a wider range of S/N ratios is shown below:

Measured performance of 8K19A 6 chars CRC18 (34.2,576)
The three phase search policies are each running with its optimum list length. It is apparent that for this particular code and message size, across a broad range of S/N ratios, a uniform phase search costs 0.3 dB and a full phase search costs about 0.5 dB, compared with decoding a signal with a known reference phase.

Given a weak signal with a known reference phase, the probability of a FAIL outcome from the single run of the decoder is given approximately by $$ P(\text{FAIL}) \approx \left( 1 - \frac{1}{2^b} \right)^L $$ where $L$ is the list length and $b$ bits is the effective redundancy in the message. This formula is obtained from the probability that $L$ independent random messages from the Viterbi decoder will all fail to match the $b$ bits of redundancy. The formula is approximate because the $L$ messages being evaluated by the list decoder are not quite independent or random. The approximation is better with weaker signals.

The optimum list length (defined by 0.2% FAIL probability) for a known phase decode is therefore approximated by $$ L_\text{opt} \approx \frac{\log (0.002)}{\log \left( 1 - \frac{1}{2^b} \right)} $$

When running a uniform phase search (12 runs of the decoder in steps of 30 degrees), we might expect that the optimum list length would be $1/12^\text{th}$ of the known phase optimum. However the 12 decoder runs are not quite independent trials and there is some overlap in the results (some of the list entries found in a phase search step will also be present when running the neighbouring phases). Moving to a full phase search, the individual runs are even less independent and the optimum list length is reduced from the uniform phase optimum only by about an extra factor of $1/3$.

List decoding redundancy

The total redundancy for list decoding is $0.3$ bits per character plus the CRC size. However the effective redundancy for use in the optimum list calculation in the previous section, is often less than the total. Specifically, not all of the $0.3$ bits per character of source coding redundancy come into use on longer messages. The reason for this is that the false decodes produced by the Viterbi decoder often differ from the correct decode in only a limited number of character positions. Typically the decoder will lose the correct path through the trellis and rejoin it later after a string of incorrect bits lasting up to a few constraint lengths. Thus, many of the false decodes in the output list are incorrect only in a few characters. This limits the contribution of the source coding redundancy to the average number of incorrect characters, not the full message length.

With short messages, the false decodes usually involve errors in most or all character positions and almost the full $0.3$ bits per character are effective. The reduced redundancy becomes noticeable on messages of more than about 20 characters, and is difficult to quantify. Trials show that it depends on the constraint length of the convolutional code, the message length, and the signal/noise ratio.

In practice, for messages up to 50 characters or so, it does no harm to assume the total source coding redundancy is available. This may tend to overestimate the required list length, which does no harm to the message success rate.

Inner code performance

The performance of the inner convolutional block code for various rates and constraint lengths is shown in the table below, as a function of payload size. The payload size is calculated from 6 bits per character plus the CRC size.

The figures in brackets are the standard deviation of the success percentage.

Inner code performance measured at Eb/N0=-1.0dB
6 bits3101519212325
rate 1/22K3A 65.9% (0.5)2K10A 71.8% (0.5)2K15A 66.9% (0.5)
rate 1/33K10A 71.9% (0.5)
rate 1/44K15A 73.3% (0.5)4K19A 73.3% (0.4)4K21A 73.4% (0.4)4K23A 73.3% (0.5)4K25A 73.1% (0.5)
rate 1/88K19A 73.2% (0.4)8K21A 74.2% (0.5)8K23A 74.3% (0.5)8K25A 74.7% (0.5)
rate 1/1616K19A 73.5% (0.4)16K21A 73.4% (0.5)16K23A 73.7% (0.5)16K25A 73.3% (0.6)
18 bits3101519212325
rate 1/22K3A 34.5% (0.5)2K10A 49.6% (0.5)2K15A 48.6% (0.5)
rate 1/33K10A 53.9% (0.5)
rate 1/44K15A 61.7% (0.5)4K19A 63.4% (0.4)4K21A 65.0% (0.5)4K23A 65.7% (0.5)4K25A 64.5% (0.5)
rate 1/88K19A 64.9% (0.5)8K21A 66.3% (0.5)8K23A 66.8% (0.5)8K25A 67.3% (0.5)
rate 1/1616K19A 65.2% (0.5)16K21A 67.0% (0.5)16K23A 68.6% (0.5)16K25A 68.8% (0.6)
36 bits3101519212325
rate 1/22K3A 13.2% (0.4)2K10A 29.6% (0.5)2K15A 31.4% (0.5)
rate 1/33K10A 37.3% (0.5)
rate 1/44K15A 49.6% (0.5)4K19A 51.8% (0.5)4K21A 53.9% (0.5)4K23A 55.7% (0.6)4K25A 56.6% (0.5)
rate 1/88K19A 58.1% (0.5)8K21A 59.7% (0.5)8K23A 60.2% (0.5)8K25A 62.4% (0.5)
rate 1/1616K19A 60.8% (0.6)16K21A 61.7% (0.5)16K23A 63.3% (0.6)16K25A 63.5% (0.5)
72 bits3101519212325
rate 1/22K3A 1.8% (0.2)2K10A 10.7% (0.3)2K15A 11.5% (0.3)
rate 1/33K10A 17.7% (0.4)
rate 1/44K15A 32.4% (0.4)4K19A 37.8% (0.5)4K21A 40.4% (0.5)4K23A 41.3% (0.5)4K25A 43.3% (0.5)
rate 1/88K19A 46.8% (0.5)8K21A 50.5% (0.5)8K23A 51.3% (0.6)8K25A 53.3% (0.5)
rate 1/1616K19A 51.0% (0.6)16K21A 54.9% (0.6)16K23A 57.2% (0.5)16K25A 57.6% (0.5)
150 bits3101519212325
rate 1/22K10A 1.4% (0.1)2K15A 1.8% (0.2)
rate 1/33K10A 3.9% (0.2)
rate 1/44K15A 14.4% (0.4)4K19A 19.4% (0.5)4K21A 21.4% (0.5)4K23A 22.8% (0.5)4K25A 25.4% (0.6)
rate 1/88K19A 32.2% (0.5)8K21A 35.4% (0.6)8K23A 37.7% (0.5)8K25A 40.3% (0.6)
rate 1/1616K19A 40.7% (0.6)16K21A 43.4% (0.6)16K23A 45.7% (0.6)16K25A 48.9% (0.6)
300 bits3101519212325
rate 1/2
rate 1/33K10A 0.4% (0.2)
rate 1/44K15A 3.6% (0.2)4K19A 6.1% (0.3)4K21A 7.0% (0.3)4K23A 7.0% (0.6)4K25A 10.9% (1.0)
rate 1/88K19A 17.9% (0.4)8K21A 19.8% (0.5)8K23A 24.1% (0.6)8K25A 27.7% (1.0)
rate 1/1616K19A 25.2% (0.5)16K21A 29.3% (0.6)16K23A 33.1% (0.5)16K25A 38.8% (1.0)

Notes:

Performance of the inner code is reflected in the performance of the cascaded code. For example, consider a 25 character message with 12 bit CRC (Viterbi payload of 162 bits). The performance is shown in the table below, for the inner code only, and for list decoding with optimum list size for each search policy.

Performance at Eb/N0=-1.0dB, 25 chars CRC12
CodingInner code 162 bitsFull phase search
List 100000
Uniform phase search
List 300000
Known phase
List 10000000
4K19A18.3%35.4%38.2%44.9%
8K19A31.1%52.3%53.8%61.2%
16K19A39.5%60.2%61.4%67.0%