How to design a convolutional error correcting code I'm trying to understand how one would design a convolutional code, like the (2,1,2) code that is always used in examples (see here for an example: https://en.wikipedia.org/wiki/Convolutional_code#Convolutional_encoding)
It is clear to me how to decode an arbitrary convolutional code using the viterbi algorithm to get the maximum likelihood message, but I haven't been able to find any sources which explain how one might design a code which has good properties when decoded.  For example, clearly if the impulse responses are not linearly independent, this is bad, but is avoiding that enough to make a good code?  How would one design a code with a very long constraint length? or with a given code rate?
I've tried searching google exhaustively, but I can't find anything about designing codes, only about the properties of already designed codes.  Can anyone give me a source?
 A: I'm not an expert on convolutional codes, so I won't pontificate. For learning I found the tutorial chapter by McEliece in Handbook of Coding Theory quite useful, but my taste is algebraic, so McEliece's choice of language fit me well. Hopefully a university library near you has it, because that link was not very useful. Another oft cited textbook is Johannesson and Zigangirov. It is probably more useful to an engineer, as it more extensive, and goes into performance analysis, details on the algorithmics and such.
Anyway, my understanding is that there are very few general families of good convolutional codes (in sharp contrast to block codes), so intelligent guessing and computer search has dominated. 
You have undoubtedly mostly found tables of good codes. I'm fairly sure somebody has published something on search heuristics and such, so to come up with new and better designs you will need have something better. Alas, I can't point any such papers to you.
For high performance with long blocks you should use turbo codes or LDPC-codes anyway.
To that end Johannesson & Zigangirov is also useful, because in the end they describe soft-output Viterbi algorithm, which will come in handy. For similar ML-performance a pure convolutional code simply cannot cope. At least not without outrageous trellis complexity, which is kind of pointless, because both Turbo and LDPC-codes have reasonably good decoding complexity. Yet, there is a range of block lengths, where traditional convolutional codes work better. If memory serves, cellular people use a convolutional code for block lengths between 40 and 200 payload bits or something like that. Shorter than that - a well designed block code will have so much better Hamming distance. Longer than that - use turbo codes. Much longer than that - use LDPC codes. For an exposition to the theory of LDPC-code design I refer you to Richardson & Urbanke. The theory is somewhat beyond me, because it uses stochastic math instead of algebra.
