I went with Corlett's original suggestions for now. I've tried various things, for example: f = (((filtervalue & 0xFF) | 0x100) * (filtervalue>>8)) >> 1 but this doesn't do enough filtering. Looking at the graphs in AICA docs, the sensible filter values (cutoff > 100Hz) start at 0x1400 anyway. So maybe it really is shifted like that. As for q, I just shift it 8 bits left to make all coefficients 13-bit.