# Viterbi decoding of Punctured Convolutional Codes

Is Viterbi decoding of Punctured Convolutional Codes the same as that of Convolutional Codes?

I wrote code for viterbi decoding of Convolutional Codes (with rate 1/2) but I want to make a 4/7-rate Punctured Convolutional Codes from this. Encoding is just puncturing unnecessary bits, but how is the decoding?

• Decoding is very easy. Essentially it is the same as the usual Viterbi. You use the trellis of the original convolutional code. You simply treat the punctured bits as unknown (=erased) bits that are at Hamming distance 1/2 from both $0$ and $1$. Or if your channel model is AWGN as opposed to BSC, then you should treat the punctured bits as being at the midpoint between $0=+1$ and $1=-1$ (or whatever signal levels they were mapped to). If you use LLRs, then the log-likelihood ratio of a puunctured bit should be set to zero reflecting complete uncertainty. – Jyrki Lahtonen Dec 29 '13 at 17:14
• So if you were doing hard-decision decoding, then you need to change the data type of path penalties to allow half-integer values. That's all. – Jyrki Lahtonen Dec 29 '13 at 17:15
• @JyrkiLahtonen Thanks. I tried to ignore punctured bits in calculating the metric for the branch. Is it correct? – Mahdi Khosravi Dec 29 '13 at 18:37
• That also works. I just realized that it may be simpler to treat the punctured bits as something that is at Hamming distance zero from both $0$ and $1$. – Jyrki Lahtonen Dec 29 '13 at 19:17

Moving a comment to an answer, as no one else wanted to add anything.

It is very easy to modify the Viterbi decoding algorithm to accommodate erasures. You use the trellis of the original convolutional code. You simply treat the punctured bits as unknown (=erased) bits that are at Hamming distance 1/2 from both 0 and 1. Or, if your channel model is AWGN as opposed to BSC, then you should treat the punctured bits as being at the midpoint between 0=+1 and 1=−1 (or whatever signal levels they were mapped to). If you use LLRs, then the log-likelihood ratio of a puunctured bit should be set to zero reflecting complete uncertainty.

Alternatively you can ignore the erased positions altogether, as all the path penalties are affected equally, so an erasure will not have an impact on the decision. Of course, you still take into account the other bits on the output label of every edge.