Yep, I make it an exponential and no lookup tables required.

How I make it thus far...

The 3 exponent bits are not the value of the exponent, but an offset that points to the position of the most significant "set" bit in the most significant 8 bits of the sample (after the sign bit). The 4 "data" bits are the 4 bits immediately after the most significant bit. Any lesser bits are discarded.

The added "bias" value is the minimum needed to ensure there will be a set bit in the 8bit exponent field and may help retain the "weight" of some lesser bits by shifting them up in value . It is subtracted at decode.

They also appear to set the next least significant bit after the data bits at encode, presumably to ensure no underflow when the bias is subtracted?

Edit - this bit may be just a delimiter added during decode to aid the process and have no value in the result.

I think the need for the above actions may depend on sample size. I'm going to have a play (on paper) with simplifying it for 12bit samples. Might even work better in this case to have 2:5 instead of 3:4.

Practical...

The Mega328 ADC is only 12bit AND does not have a signed result mode (which surprised me when I checked the datasheet). Compression has to have a signed value to work from. Conversion between unsigned and signed is trivial, but would have to be reversed to use PWM output.

Of course, I could use an external codec - but that's not the point