I've implemented a simple 1/2 rate convolutional code and a viterbi decoder algorithm. I followed the most-common type of convolutional coding implementation I could find by googling: 1 input bit gets shifted into a shift register, one at a time, and an algorithm of XOR gates generates a 2-bit output.
This 2-bit output worked very nicely to map to QAM4, since 2 bits can represent 4 positions. The viterbi decoder would receive the QAM4 data and process the most-probable branch for each hidden-state, every cycle.
What if instead of a single bit streaming into the convolutional coder, I had 2 bits streaming into the coder? Would I use a different structure that could generate 4 outputs bits, and map this to QAM16? Or would I use the same structure at twice the rate and then collect 2 sets of 2 outputs? Does the viterbi decoder need to change to implement this?
I guess my goal is to get more bits modulated into a single symbol, but still be able to utilize convolutional coding/error correction. I'd like to keep the 1/2 rate as well.