void m4ri_build_code(int *ord, int *inc, int l) { int i,j; for(i=0 ; i < TWOPOW(l) ; i++) { ord[i] = m4ri_gray_code(i, l); } for(i = l ; i>0 ; i--) { for(j=1 ; j < TWOPOW(i) + 1 ; j++) { inc[j *TWOPOW(l-i) -1 ] = l - i; } } }
void m4ri_build_all_codes() { if (codebook) { return; } int k; codebook=(code**)m4ri_mm_calloc(MAXKAY+1, sizeof(code *)); for(k=1 ; k<MAXKAY+1; k++) { codebook[k] = (code *)m4ri_mm_calloc(sizeof(code),1); codebook[k]->ord =(int *)m4ri_mm_calloc(TWOPOW(k),sizeof(int)); codebook[k]->inc =(int *)m4ri_mm_calloc(TWOPOW(k),sizeof(int)); m4ri_build_code(codebook[k]->ord, codebook[k]->inc, k); } }
float quantize(int bits, float input, float maxval) { unsigned long quantval = 0; int sign; float output; sign = (input < 0); input = fabs(input); //quantize to bit code if (input >= maxval) { quantval = (long)(TWOPOW(bits - 1) - 1); } else { quantval = (long)( ( (unsigned long)(TWOPOW(bits-1) + (TWOPOW(bits-1)-1)) * input/maxval + 1.0 ) / 2.0 ); } if (sign) { quantval |= TWOPOW(bits - 1); } //dequantize back to float if (quantval & TWOPOW(bits - 1)) { sign = -1; quantval &= TWOPOW(bits - 1) - 1; } else { sign = 1; } output = sign * 2.0 * maxval * ((float)quantval / (TWOPOW(bits) - 1)); return output; }
static inline int log2_floor(int n){ int i; for(i=0;TWOPOW(i)<=n;i++){} return i; }