I've implemented a soft-decoder for DQPSK using the wonderful answers I received here:
To get the soft-decoder working properly I needed to precode the data I was sending out. I implemented the precoder mentioned in this paper:
$I_k=\overline{u_k \oplus v_k}*(u_k \oplus I_{k-1})+(u_k \oplus v_k)*(v_k \oplus Q_{k-1})$ $Q_k=\overline{u_k \oplus v_k}*(v_k \oplus Q_{k-1})+(u_k \oplus v_k)*(u_k \oplus I_{k-1})$
I'd like to know why this precoder is necessary -- what does that complicated expression of XORs actually accomplish?
Here's a table showing what the equation yields. If "to_encode" is 00, the to_send symbol is the same as the previous ("prev") symbol. If the "to_encode" is 11, the to_send symbol is the previous symbol xor 11. What is the meaning in other cases?
to_encode prev to send [ 0 0 ] [ 0 0 ] [ 0 0 ] [ 0 1 ] [ 0 0 ] [ 1 0 ] [ 1 0 ] [ 0 0 ] [ 0 1 ] [ 1 1 ] [ 0 0 ] [ 1 1 ] [ 0 0 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 1 ] [ 0 0 ] [ 1 0 ] [ 0 1 ] [ 1 1 ] [ 1 1 ] [ 0 1 ] [ 1 0 ] [ 0 0 ] [ 1 0 ] [ 1 0 ] [ 0 1 ] [ 1 0 ] [ 1 1 ] [ 1 0 ] [ 1 0 ] [ 0 0 ] [ 1 1 ] [ 1 0 ] [ 0 1 ] [ 0 0 ] [ 1 1 ] [ 1 1 ] [ 0 1 ] [ 1 1 ] [ 0 1 ] [ 1 0 ] [ 1 1 ] [ 1 0 ] [ 1 1 ] [ 1 1 ] [ 0 0 ]