public void speex_encode_stereo_int(spx_int16_t[] data, int frame_size, SpeexBits bits) { int i, tmp; spx_word32_t e_left=0, e_right=0, e_tot=0; spx_word32_t balance, e_ratio; spx_word32_t largest, smallest; int balance_id; /* In band marker */ bits.speex_bits_pack(14, 5); /* Stereo marker */ bits.speex_bits_pack(SPEEX_INBAND_STEREO, 4); for (i=0;i<frame_size;i++) { e_left += SHR32(MULT16_16(data[2*i],data[2*i]),8); e_right += SHR32(MULT16_16(data[2*i+1],data[2*i+1]),8); data[i] = .5*(((float)data[2*i])+data[2*i+1]); e_tot += SHR32(MULT16_16(data[i],data[i]),8); } if (e_left > e_right) { speex_bits_pack(bits, 0, 1); largest = e_left; smallest = e_right; } else { speex_bits_pack(bits, 1, 1); largest = e_right; smallest = e_left; } /* Balance quantization */ balance=(largest+1.0f)/(smallest+1.0f); balance=4*log(balance); balance_id=floor(.5+fabs(balance)); if (balance_id>30) balance_id=31; speex_bits_pack(bits, balance_id, 5); /* "coherence" quantisation */ e_ratio = e_tot/(1.0f+e_left+e_right); tmp=scal_quant(EXTRACT16(e_ratio), e_ratio_quant_bounds, 4); /*fprintf (stderr, "%d %d %d %d\n", largest, smallest, balance_id, e_ratio);*/ speex_bits_pack(bits, tmp, 2); }
public void speex_encode_stereo(float[] data, int frame_size, SpeexBits bits) { int i, tmp; float e_left=0, e_right=0, e_tot=0; float balance, e_ratio; for (i=0;i<frame_size;i++) { e_left += ((float)data[2*i])*data[2*i]; e_right += ((float)data[2*i+1])*data[2*i+1]; data[i] = .5*(((float)data[2*i])+data[2*i+1]); e_tot += ((float)data[i])*data[i]; } balance=(e_left+1)/(e_right+1); e_ratio = e_tot/(1+e_left+e_right); /*Quantization*/ bits.speex_bits_pack(14, 5); bits.speex_bits_pack(SPEEX_INBAND_STEREO, 4); balance=4*log(balance); /*Pack sign*/ if (balance>0) bits.speex_bits_pack(0, 1); else bits.speex_bits_pack(1, 1); balance=floor(.5+Math.Abs(balance)); if (balance>30) balance=31; bits.speex_bits_pack((int)balance, 5); /* FIXME: this is a hack */ tmp=scal_quant(e_ratio*Q15_ONE, e_ratio_quant_bounds, 4); bits.speex_bits_pack(tmp, 2); }