diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.c b/webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.c index 67b18331b3..16befba707 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/bandwidth_estimator.c @@ -1005,13 +1005,17 @@ int16_t WebRtcIsacfix_GetSnr(int16_t bottle_neck, int16_t framesamples) /* find new SNR value */ //consider BottleNeck to be in Q10 ( * 1 in Q10) switch(framesamples) { + // TODO(bjornv): The comments below confuses me. I don't know if there is a + // difference between frame lengths (in which case the implementation is + // wrong), or if it is frame length independent in which case we should + // correct the comment and simplify the implementation. case 480: /*s2nr = -1*(a_30 << 10) + ((b_30 * bottle_neck) >> 10);*/ - s2nr = -22500 + (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(500, bottle_neck, 10); //* 0.001; //+ c_30 * bottle_neck * bottle_neck * 0.000001; + s2nr = -22500 + (int16_t)(500 * bottle_neck >> 10); break; case 960: /*s2nr = -1*(a_60 << 10) + ((b_60 * bottle_neck) >> 10);*/ - s2nr = -22500 + (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(500, bottle_neck, 10); //* 0.001; //+ c_30 * bottle_neck * bottle_neck * 0.000001; + s2nr = -22500 + (int16_t)(500 * bottle_neck >> 10); break; default: s2nr = -1; /* Error */ diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/decode.c b/webrtc/modules/audio_coding/codecs/isac/fix/source/decode.c index 714a897cdb..5e095da683 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/decode.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/decode.c @@ -130,14 +130,15 @@ int16_t WebRtcIsacfix_DecodeImpl(int16_t *signal_out16, ISACdec_obj->plcstr_obj.decayCoeffNoise = WEBRTC_SPL_WORD16_MAX; /* DECAY_RATE is in Q15 */ ISACdec_obj->plcstr_obj.pitchCycles = 0; - PitchGains_Q12[0] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(PitchGains_Q12[0], 700, 10 ); + PitchGains_Q12[0] = (int16_t)(PitchGains_Q12[0] * 700 >> 10); /* ---- Add-overlap ---- */ WebRtcSpl_GetHanningWindow( overlapWin, RECOVERY_OVERLAP ); for( k = 0; k < RECOVERY_OVERLAP; k++ ) Vector_Word16_1[k] = WebRtcSpl_AddSatW16( - (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( (ISACdec_obj->plcstr_obj).overlapLP[k], overlapWin[RECOVERY_OVERLAP - k - 1], 14), - (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( Vector_Word16_1[k], overlapWin[k], 14) ); + (int16_t)(ISACdec_obj->plcstr_obj.overlapLP[k] * + overlapWin[RECOVERY_OVERLAP - k - 1] >> 14), + (int16_t)(Vector_Word16_1[k] * overlapWin[k] >> 14)); @@ -176,7 +177,7 @@ int16_t WebRtcIsacfix_DecodeImpl(int16_t *signal_out16, /* reduce gain to compensate for pitch enhancer */ /* gain = 1.0f - 0.45f * AvgPitchGain; */ - tmp32a = WEBRTC_SPL_MUL_16_16_RSFT(AvgPitchGain_Q12, 29, 0); // Q18 + tmp32a = AvgPitchGain_Q12 * 29; // Q18 gainQ13 = (int16_t)((262144 - tmp32a) >> 5); // Q18 -> Q13. for (k = 0; k < FRAMESAMPLES/2; k++) diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/decode_plc.c b/webrtc/modules/audio_coding/codecs/isac/fix/source/decode_plc.c index 4243ea3874..75ae542be0 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/decode_plc.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/decode_plc.c @@ -72,7 +72,7 @@ static int16_t plc_filterma_Fast( o >>= rshift; /* decay the output signal; this is specific to plc */ - *Out++ = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( (int16_t)o, decay, 15); // ((o + (int32_t)2048) >> 12); + *Out++ = (int16_t)((int16_t)o * decay >> 15); /* change the decay */ decay -= reduceDecay; @@ -139,7 +139,7 @@ static void MemshipValQ15( int16_t in, int16_t *A, int16_t *B ) x*15 + (x*983)/(2^12); note that 983/2^12 = 0.23999 */ /* we are sure that x is in the range of int16_t */ - x = (int16_t)(in * 15 + WEBRTC_SPL_MUL_16_16_RSFT(in, 983, 12)); + x = (int16_t)(in * 15 + (in * 983 >> 12)); /* b = x^2 / 2 {in Q15} so a shift of 16 is required to be in correct domain and one more for the division by 2 */ *B = (int16_t)((x * x + 0x00010000) >> 17); @@ -157,7 +157,7 @@ static void MemshipValQ15( int16_t in, int16_t *A, int16_t *B ) { /* This is a mirror case of the above */ in = 4300 - in; - x = (int16_t)(in * 15 + WEBRTC_SPL_MUL_16_16_RSFT(in, 983, 12)); + x = (int16_t)(in * 15 + (in * 983 >> 12)); /* b = x^2 / 2 {in Q15} so a shift of 16 is required to be in correct domain and one more for the division by 2 */ *A = (int16_t)((x * x + 0x00010000) >> 17); @@ -220,7 +220,7 @@ static void LinearResampler( int16_t *in, int16_t *out, int16_t lenIn, int16_t l else { diff = in[ j + 1 ] - in[ j ]; - out[ i ] = in[ j ] + (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( diff, relativePos, RESAMP_RES_BIT ); + out[i] = in[j] + (int16_t)(diff * relativePos >> RESAMP_RES_BIT); } } } @@ -449,12 +449,9 @@ int16_t WebRtcIsacfix_DecodePlcImpl(int16_t *signal_out16, pitchLags_Q7[0] = pitchLags_Q7[1] = pitchLags_Q7[2] = pitchLags_Q7[3] = ((ISACdec_obj->plcstr_obj).stretchLag<<7); pitchGains_Q12[3] = ( (ISACdec_obj->plcstr_obj).lastPitchGain_Q12); - pitchGains_Q12[2] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( - pitchGains_Q12[3], 1010, 10 ); - pitchGains_Q12[1] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( - pitchGains_Q12[2], 1010, 10 ); - pitchGains_Q12[0] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( - pitchGains_Q12[1], 1010, 10 ); + pitchGains_Q12[2] = (int16_t)(pitchGains_Q12[3] * 1010 >> 10); + pitchGains_Q12[1] = (int16_t)(pitchGains_Q12[2] * 1010 >> 10); + pitchGains_Q12[0] = (int16_t)(pitchGains_Q12[1] * 1010 >> 10); /* most of the time either B or A are zero so seperating */ @@ -527,9 +524,8 @@ int16_t WebRtcIsacfix_DecodePlcImpl(int16_t *signal_out16, for( i = 0, noiseIndex = 0; i < FRAMESAMPLES_HALF; i++, noiseIndex++ ) { /* --- Lowpass */ - pLP = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( - stretchPitchLP[(ISACdec_obj->plcstr_obj).pitchIndex], - (ISACdec_obj->plcstr_obj).decayCoeffPriodic, 15 ); + pLP = (int16_t)(stretchPitchLP[ISACdec_obj->plcstr_obj.pitchIndex] * + ISACdec_obj->plcstr_obj.decayCoeffPriodic >> 15); /* --- Highpass */ pHP = (int32_t)WEBRTC_SPL_MUL_16_32_RSFT15( @@ -626,9 +622,8 @@ int16_t WebRtcIsacfix_DecodePlcImpl(int16_t *signal_out16, noise1 = (ISACdec_obj->plcstr_obj.seed >> 10) - 16; - nLP = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( - (int16_t)((noise1)*(ISACdec_obj->plcstr_obj).std), - (ISACdec_obj->plcstr_obj).decayCoeffNoise, 15 ); + nLP = (int16_t)((int16_t)(noise1 * ISACdec_obj->plcstr_obj.std) * + ISACdec_obj->plcstr_obj.decayCoeffNoise >> 15); /* --- Highpass */ (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND( @@ -646,9 +641,8 @@ int16_t WebRtcIsacfix_DecodePlcImpl(int16_t *signal_out16, /* ------ Periodic Vector --- */ /* --- Lowpass */ - pLP = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( - stretchPitchLP[(ISACdec_obj->plcstr_obj).pitchIndex], - (ISACdec_obj->plcstr_obj).decayCoeffPriodic, 15 ); + pLP = (int16_t)(stretchPitchLP[ISACdec_obj->plcstr_obj.pitchIndex] * + ISACdec_obj->plcstr_obj.decayCoeffPriodic >> 15); /* --- Highpass */ pHP = (int32_t)WEBRTC_SPL_MUL_16_32_RSFT15( @@ -665,13 +659,11 @@ int16_t WebRtcIsacfix_DecodePlcImpl(int16_t *signal_out16, } /* ------ Weighting the noisy and periodic vectors ------- */ - wNoisyLP = (int16_t)(WEBRTC_SPL_MUL_16_16_RSFT( - (ISACdec_obj->plcstr_obj).A, nLP, 15 ) ); + wNoisyLP = (int16_t)(ISACdec_obj->plcstr_obj.A * nLP >> 15); wNoisyHP = (int32_t)(WEBRTC_SPL_MUL_16_32_RSFT15( (ISACdec_obj->plcstr_obj).A, (nHP) ) ); - wPriodicLP = (int16_t)(WEBRTC_SPL_MUL_16_16_RSFT( - (ISACdec_obj->plcstr_obj).B, pLP, 15)); + wPriodicLP = (int16_t)(ISACdec_obj->plcstr_obj.B * pLP >> 15); wPriodicHP = (int32_t)(WEBRTC_SPL_MUL_16_32_RSFT15( (ISACdec_obj->plcstr_obj).B, pHP)); @@ -752,9 +744,8 @@ int16_t WebRtcIsacfix_DecodePlcImpl(int16_t *signal_out16, for( i = 0; i < RECOVERY_OVERLAP; i++ ) { - (ISACdec_obj->plcstr_obj).overlapLP[i] = (int16_t)( - WEBRTC_SPL_MUL_16_16_RSFT(stretchPitchLP[k], - (ISACdec_obj->plcstr_obj).decayCoeffPriodic, 15) ); + ISACdec_obj->plcstr_obj.overlapLP[i] = (int16_t)( + stretchPitchLP[k] * ISACdec_obj->plcstr_obj.decayCoeffPriodic >> 15); k = ( k < ((ISACdec_obj->plcstr_obj).stretchLag - 1) )? (k+1):0; } @@ -767,8 +758,7 @@ int16_t WebRtcIsacfix_DecodePlcImpl(int16_t *signal_out16, /* reduce gain to compensate for pitch enhancer */ /* gain = 1.0f - 0.45f * AvgPitchGain; */ - tmp32a = WEBRTC_SPL_MUL_16_16_RSFT((ISACdec_obj->plcstr_obj).AvgPitchGain_Q12, - 29, 0); // Q18 + tmp32a = ISACdec_obj->plcstr_obj.AvgPitchGain_Q12 * 29; // Q18 tmp32b = 262144 - tmp32a; // Q18 gainQ13 = (int16_t) (tmp32b >> 5); // Q13 diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/encode.c b/webrtc/modules/audio_coding/codecs/isac/fix/source/encode.c index d3e7107b6e..1a6372a664 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/encode.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/encode.c @@ -115,8 +115,9 @@ int WebRtcIsacfix_EncodeImpl(int16_t *in, // multiply the bottleneck by 0.88 before computing SNR, 0.88 is tuned by experimenting on TIMIT // 901/1024 is 0.87988281250000 - ISACenc_obj->s2nr = WebRtcIsacfix_GetSnr((int16_t)WEBRTC_SPL_MUL_16_16_RSFT(ISACenc_obj->BottleNeck, 901, 10), - ISACenc_obj->current_framesamples); + ISACenc_obj->s2nr = WebRtcIsacfix_GetSnr( + (int16_t)(ISACenc_obj->BottleNeck * 901 >> 10), + ISACenc_obj->current_framesamples); /* encode frame length */ status = WebRtcIsacfix_EncodeFrameLen(ISACenc_obj->current_framesamples, &ISACenc_obj->bitstr_obj); @@ -352,8 +353,8 @@ int WebRtcIsacfix_EncodeImpl(int16_t *in, // scale FFT coefficients to reduce the bit-rate for(k = 0; k < FRAMESAMPLES_HALF; k++) { - LP16a[k] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(LP16a[k], scaleQ14[idx], 14); - LPandHP[k] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(LPandHP[k], scaleQ14[idx], 14); + LP16a[k] = (int16_t)(LP16a[k] * scaleQ14[idx] >> 14); + LPandHP[k] = (int16_t)(LPandHP[k] * scaleQ14[idx] >> 14); } // Save data for multiple packets memory diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/entropy_coding.c b/webrtc/modules/audio_coding/codecs/isac/fix/source/entropy_coding.c index c150e60692..39653789ef 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/entropy_coding.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/entropy_coding.c @@ -110,7 +110,7 @@ static int16_t CalcLogN(int32_t arg) { zeros=WebRtcSpl_NormU32(arg); frac = (int16_t)((uint32_t)((arg << zeros) & 0x7FFFFFFF) >> 23); log2 = (int16_t)(((31 - zeros) << 8) + frac); // log2(x) in Q8 - logN=(int16_t)WEBRTC_SPL_MUL_16_16_RSFT(log2,22713,15); //Q8*Q15 log(2) = 0.693147 = 22713 in Q15 + logN = (int16_t)(log2 * 22713 >> 15); // log(2) = 0.693147 = 22713 in Q15 logN=logN+11; //Scalar compensation which minimizes the (log(x)-logN(x))^2 error over all x. return logN; @@ -129,13 +129,12 @@ static int16_t CalcLogN(int32_t arg) { */ static int32_t CalcExpN(int16_t x) { - int16_t ax, axINT, axFRAC; + int16_t axINT, axFRAC; int16_t exp16; int32_t exp; + int16_t ax = (int16_t)(x * 23637 >> 14); // Q8 if (x>=0) { - // ax=(int16_t)WEBRTC_SPL_MUL_16_16_RSFT(x, 23637-700, 14); //Q8 - ax=(int16_t)WEBRTC_SPL_MUL_16_16_RSFT(x, 23637, 14); //Q8 axINT = ax >> 8; //Q0 axFRAC = ax&0x00FF; exp16 = 1 << axINT; // Q0 @@ -143,8 +142,6 @@ static int32_t CalcExpN(int16_t x) { exp = exp16 * axFRAC; // Q0*Q8 = Q8 exp <<= 9; // Q17 } else { - // ax=(int16_t)WEBRTC_SPL_MUL_16_16_RSFT(x, 23637+700, 14); //Q8 - ax=(int16_t)WEBRTC_SPL_MUL_16_16_RSFT(x, 23637, 14); //Q8 ax = -ax; axINT = 1 + (ax >> 8); //Q0 axFRAC = 0x00FF - (ax&0x00FF); @@ -679,16 +676,16 @@ static void Rc2LarFix(const int16_t *rcQ15, int32_t *larQ17, int16_t order) { if (rc<24956) { //0.7615966 in Q15 // (Q15*Q13)>>11 = Q17 - larAbsQ17 = WEBRTC_SPL_MUL_16_16_RSFT(rc, 21512, 11); + larAbsQ17 = rc * 21512 >> 11; } else if (rc<30000) { //0.91552734375 in Q15 // Q17 + (Q15*Q12)>>10 = Q17 - larAbsQ17 = -465024 + WEBRTC_SPL_MUL_16_16_RSFT(rc, 29837, 10); + larAbsQ17 = -465024 + (rc * 29837 >> 10); } else if (rc<32500) { //0.99182128906250 in Q15 // Q17 + (Q15*Q10)>>8 = Q17 - larAbsQ17 = -3324784 + WEBRTC_SPL_MUL_16_16_RSFT(rc, 31863, 8); + larAbsQ17 = -3324784 + (rc * 31863 >> 8); } else { // Q17 + (Q15*Q5)>>3 = Q17 - larAbsQ17 = -88546020 + WEBRTC_SPL_MUL_16_16_RSFT(rc, 21973, 3); + larAbsQ17 = -88546020 + (rc * 21973 >> 3); } if (rcQ15[k]>0) { @@ -717,7 +714,7 @@ static void Lar2RcFix(const int32_t *larQ17, int16_t *rcQ15, int16_t order) { if (larAbsQ11<4097) { //2.000012018559 in Q11 // Q11*Q16>>12 = Q15 - rc = WEBRTC_SPL_MUL_16_16_RSFT(larAbsQ11, 24957, 12); + rc = larAbsQ11 * 24957 >> 12; } else if (larAbsQ11<6393) { //3.121320351712 in Q11 // (Q11*Q17 + Q13)>>13 = Q15 rc = (larAbsQ11 * 17993 + 130738688) >> 13; @@ -995,7 +992,8 @@ int WebRtcIsacfix_DecodeLpcCoef(Bitstr_dec *streamdata, pos = LPC_SHAPE_ORDER * j; pos2 = LPC_SHAPE_ORDER * k; for (n=0; n>7 = Q18 + sumQQ += tmpcoeffs_sQ10[pos] * + WebRtcIsacfix_kT1ShapeQ15[model][pos2] >> 7; // (Q10*Q15)>>7 = Q18 pos++; pos2++; } @@ -1609,7 +1607,7 @@ int WebRtcIsacfix_EncodePitchGain(int16_t* PitchGains_Q12, /* get the approximate arcsine (almost linear)*/ for (k=0; k> 2); // Q15 /* find quantization index; only for the first three transform coefficients */ @@ -1618,7 +1616,7 @@ int WebRtcIsacfix_EncodePitchGain(int16_t* PitchGains_Q12, /* transform */ CQ17=0; for (j=0; j> 10; // Q17 } index[k] = (int16_t)((CQ17 + 8192)>>14); // Rounding and scaling with stepsize (=1/0.125=8) @@ -1733,14 +1731,14 @@ int WebRtcIsacfix_DecodePitchLag(Bitstr_dec *streamdata, CQ10 = mean_val2Q10[index[1]]; for (k=0; k> 10; tmp16c = (int16_t)(tmp32b >> 5); PitchLags_Q7[k] += tmp16c; } CQ10 = mean_val4Q10[index[3]]; for (k=0; k> 10; tmp16c = (int16_t)(tmp32b >> 5); PitchLags_Q7[k] += tmp16c; } @@ -1809,7 +1807,7 @@ int WebRtcIsacfix_EncodePitchLag(int16_t* PitchLagsQ7, /* transform */ CQ17=0; for (j=0; j> 2; // Q17 CQ17 = WEBRTC_SPL_SHIFT_W32(CQ17,shft); // Scale with StepSize @@ -1840,14 +1838,14 @@ int WebRtcIsacfix_EncodePitchLag(int16_t* PitchLagsQ7, CQ10 = mean_val2Q10[index[1]]; for (k=0; k> 10; tmp16c = (int16_t)(tmp32b >> 5); // Q7. PitchLagsQ7[k] += tmp16c; } CQ10 = mean_val4Q10[index[3]]; for (k=0; k> 10; tmp16c = (int16_t)(tmp32b >> 5); // Q7. PitchLagsQ7[k] += tmp16c; } diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.c b/webrtc/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.c index 5ae951a9e3..97e4ce03a4 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/lpc_masking_model.c @@ -393,7 +393,7 @@ void WebRtcIsacfix_GetVars(const int16_t *input, const int16_t *pitchGains_Q12, chng3 = WEBRTC_SPL_ABS_W16(nrgQlog[1]-nrgQlog[0]); chng4 = WEBRTC_SPL_ABS_W16(nrgQlog[0]-oldNrgQlog); tmp = chng1+chng2+chng3+chng4; - chngQ = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(tmp, kChngFactor, 10); /* Q12 */ + chngQ = (int16_t)(tmp * kChngFactor >> 10); /* Q12 */ chngQ += 2926; /* + 1.0/1.4 in Q12 */ /* Find average pitch gain */ @@ -403,10 +403,10 @@ void WebRtcIsacfix_GetVars(const int16_t *input, const int16_t *pitchGains_Q12, pgQ += pitchGains_Q12[k]; } - pg3 = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(pgQ, pgQ,11); /* pgQ in Q(12+2)=Q14. Q14*Q14>>11 => Q17 */ - pg3 = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(pgQ, pg3,13); /* Q17*Q14>>13 =>Q18 */ - pg3 = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT(pg3, kMulPitchGain ,5); /* Q10 kMulPitchGain = -25 = -200 in Q-3. */ - + pg3 = (int16_t)(pgQ * pgQ >> 11); // pgQ in Q(12+2)=Q14. Q14*Q14>>11 => Q17 + pg3 = (int16_t)(pgQ * pg3 >> 13); /* Q14*Q17>>13 =>Q18 */ + /* kMulPitchGain = -25 = -200 in Q-3. */ + pg3 = (int16_t)(pg3 * kMulPitchGain >> 5); // Q10 tmp16=(int16_t)WEBRTC_SPL_MUL_16_16_RSFT_WITH_ROUND(kExp2,pg3,13);/* Q13*Q10>>13 => Q10*/ if (tmp16<0) { tmp16_2 = (0x0400 | (tmp16 & 0x03FF)); @@ -580,9 +580,9 @@ void WebRtcIsacfix_GetLpcCoef(int16_t *inLoQ0, snrq=snrQ10; /* SNR= C * 2 ^ (D * snrq) ; C=0.289, D=0.05*log2(10)=0.166 (~=172 in Q10)*/ - tmp16 = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(snrq, 172, 10); // Q10 + tmp16 = (int16_t)(snrq * 172 >> 10); // Q10 tmp16b = exp2_Q10_T(tmp16); // Q10 - snrq = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(tmp16b, 285, 10); // Q10 + snrq = (int16_t)(tmp16b * 285 >> 10); // Q10 /* change quallevel depending on pitch gains and level fluctuations */ WebRtcIsacfix_GetVars(inLoQ0, pitchGains_Q12, &(maskdata->OldEnergy), &varscaleQ14); @@ -595,12 +595,12 @@ void WebRtcIsacfix_GetLpcCoef(int16_t *inLoQ0, aaQ14 = (int16_t)((22938 * (8192 + (varscaleQ14 >> 1)) + 32768) >> 16); /* Calculate tmp = (1.0 + aa*aa); in Q12 */ - tmp16 = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(aaQ14, aaQ14, 15); //Q14*Q14>>15 = Q13 + tmp16 = (int16_t)(aaQ14 * aaQ14 >> 15); // Q14*Q14>>15 = Q13 tmpQQlo = 4096 + (tmp16 >> 1); // Q12 + Q13>>1 = Q12. /* Calculate tmp = (1.0+aa) * (1.0+aa); */ tmp16 = 8192 + (aaQ14 >> 1); // 1+a in Q13. - tmpQQhi = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT(tmp16, tmp16, 14); //Q13*Q13>>14 = Q12 + tmpQQhi = (int16_t)(tmp16 * tmp16 >> 14); // Q13*Q13>>14 = Q12 /* replace data in buffer by new look-ahead data */ for (pos1 = 0; pos1 < QLOOKAHEAD; pos1++) { @@ -613,19 +613,19 @@ void WebRtcIsacfix_GetLpcCoef(int16_t *inLoQ0, for (pos1 = 0; pos1 < WINLEN - UPDATE/2; pos1++) { maskdata->DataBufferLoQ0[pos1] = maskdata->DataBufferLoQ0[pos1 + UPDATE/2]; maskdata->DataBufferHiQ0[pos1] = maskdata->DataBufferHiQ0[pos1 + UPDATE/2]; - DataLoQ6[pos1] = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT( - maskdata->DataBufferLoQ0[pos1], kWindowAutocorr[pos1], 15); // Q0*Q21>>15 = Q6 - DataHiQ6[pos1] = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT( - maskdata->DataBufferHiQ0[pos1], kWindowAutocorr[pos1], 15); // Q0*Q21>>15 = Q6 + DataLoQ6[pos1] = (int16_t)(maskdata->DataBufferLoQ0[pos1] * + kWindowAutocorr[pos1] >> 15); // Q0*Q21>>15 = Q6 + DataHiQ6[pos1] = (int16_t)(maskdata->DataBufferHiQ0[pos1] * + kWindowAutocorr[pos1] >> 15); // Q0*Q21>>15 = Q6 } pos2 = (int16_t)(k * UPDATE / 2); for (n = 0; n < UPDATE/2; n++, pos1++) { maskdata->DataBufferLoQ0[pos1] = inLoQ0[QLOOKAHEAD + pos2]; maskdata->DataBufferHiQ0[pos1] = inHiQ0[pos2++]; - DataLoQ6[pos1] = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT( - maskdata->DataBufferLoQ0[pos1], kWindowAutocorr[pos1], 15); // Q0*Q21>>15 = Q6 - DataHiQ6[pos1] = (int16_t) WEBRTC_SPL_MUL_16_16_RSFT( - maskdata->DataBufferHiQ0[pos1], kWindowAutocorr[pos1], 15); // Q0*Q21>>15 = Q6 + DataLoQ6[pos1] = (int16_t)(maskdata->DataBufferLoQ0[pos1] * + kWindowAutocorr[pos1] >> 15); // Q0*Q21>>15 = Q6 + DataHiQ6[pos1] = (int16_t)(maskdata->DataBufferHiQ0[pos1] * + kWindowAutocorr[pos1] >> 15); // Q0*Q21>>15 = Q6 } /* Get correlation coefficients */ @@ -868,14 +868,12 @@ void WebRtcIsacfix_GetLpcCoef(int16_t *inLoQ0, /* add hearing threshold and compute the gain */ /* lo_coeff = varscale * S_N_R / (sqrt_nrg + varscale * H_T_H); */ - - //tmp32a=WEBRTC_SPL_MUL_16_16_RSFT(varscaleQ14, H_T_HQ19, 17); // Q14 tmp32a = varscaleQ14 >> 1; // H_T_HQ19=65536 (16-17=-1) ssh = sh_lo >> 1; // sqrt_nrg is in Qssh. sh = ssh - 14; tmp32b = WEBRTC_SPL_SHIFT_W32(tmp32a, sh); // Q14->Qssh tmp32c = sqrt_nrg + tmp32b; // Qssh (denominator) - tmp32a = WEBRTC_SPL_MUL_16_16_RSFT(varscaleQ14, snrq, 0); //Q24 (numerator) + tmp32a = varscaleQ14 * snrq; // Q24 (numerator) sh = WebRtcSpl_NormW32(tmp32c); shft = 16 - sh; @@ -918,14 +916,13 @@ void WebRtcIsacfix_GetLpcCoef(int16_t *inLoQ0, /* add hearing threshold and compute the gain */ /* hi_coeff = varscale * S_N_R / (sqrt_nrg + varscale * H_T_H); */ - //tmp32a=WEBRTC_SPL_MUL_16_16_RSFT(varscaleQ14, H_T_HQ19, 17); // Q14 tmp32a = varscaleQ14 >> 1; // H_T_HQ19=65536 (16-17=-1) ssh = sh_hi >> 1; // |sqrt_nrg| is in Qssh. sh = ssh - 14; tmp32b = WEBRTC_SPL_SHIFT_W32(tmp32a, sh); // Q14->Qssh tmp32c = sqrt_nrg + tmp32b; // Qssh (denominator) - tmp32a = WEBRTC_SPL_MUL_16_16_RSFT(varscaleQ14, snrq, 0); //Q24 (numerator) + tmp32a = varscaleQ14 * snrq; // Q24 (numerator) sh = WebRtcSpl_NormW32(tmp32c); shft = 16 - sh; diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.c b/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.c index e6ca7987fd..8018a120aa 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator.c @@ -212,7 +212,7 @@ void WebRtcIsacfix_InitialPitch(const int16_t *in, /* Q0 */ /* bias towards pitch lag of previous frame */ tmp32a = WebRtcIsacfix_Log2Q8((uint32_t) old_lagQ8) - 2304; // log2(0.5*oldlag) in Q8 - tmp32b = WEBRTC_SPL_MUL_16_16_RSFT(oldgQ12,oldgQ12, 10); //Q12 & * 4.0; + tmp32b = oldgQ12 * oldgQ12 >> 10; // Q12 & * 4.0; gain_bias16 = (int16_t) tmp32b; //Q12 if (gain_bias16 > 3276) gain_bias16 = 3276; // 0.8 in Q12 @@ -222,12 +222,12 @@ void WebRtcIsacfix_InitialPitch(const int16_t *in, /* Q0 */ if (crrvecQ8_1[k]>0) { tmp32b = WebRtcIsacfix_Log2Q8((uint32_t) (k + (PITCH_MIN_LAG/2-2))); tmp16a = (int16_t) (tmp32b - tmp32a); // Q8 & fabs(ratio)<4 - tmp32c = WEBRTC_SPL_MUL_16_16_RSFT(tmp16a,tmp16a, 6); //Q10 + tmp32c = tmp16a * tmp16a >> 6; // Q10 tmp16b = (int16_t) tmp32c; // Q10 & <8 - tmp32d = WEBRTC_SPL_MUL_16_16_RSFT(tmp16b, 177 , 8); // mult with ln2 in Q8 + tmp32d = tmp16b * 177 >> 8; // mult with ln2 in Q8 tmp16c = (int16_t) tmp32d; // Q10 & <4 tmp16d = Exp2Q10((int16_t) -tmp16c); //Q10 - tmp32c = WEBRTC_SPL_MUL_16_16_RSFT(gain_bias16,tmp16d,13); // Q10 & * 0.5 + tmp32c = gain_bias16 * tmp16d >> 13; // Q10 & * 0.5 bias16 = (int16_t) (1024 + tmp32c); // Q10 tmp32b = WebRtcIsacfix_Log2Q8((uint32_t)bias16) - 2560; // Q10 in -> Q8 out with 10*2^8 offset @@ -306,7 +306,7 @@ void WebRtcIsacfix_InitialPitch(const int16_t *in, /* Q0 */ tmp32a= WebRtcIsacfix_Log2Q8((uint32_t) *yq) - 2048; // offset 8*2^8 /* Bias towards short lags */ /* log(pow(0.8, log(2.0 * *y )))/log(2.0) */ - tmp32b= WEBRTC_SPL_MUL_16_16_RSFT((int16_t) tmp32a, -42, 8); + tmp32b = (int16_t)tmp32a * -42 >> 8; tmp32c= tmp32b + 256; *fyq += tmp32c; if (*fyq > corr_max32) { @@ -330,7 +330,7 @@ void WebRtcIsacfix_InitialPitch(const int16_t *in, /* Q0 */ { tmp32a = k << 7; // 0.5*k Q8 tmp32b = tmp32a * 2 - ratq; // Q8 - tmp32c = WEBRTC_SPL_MUL_16_16_RSFT((int16_t) tmp32b, (int16_t) tmp32b, 8); // Q8 + tmp32c = (int16_t)tmp32b * (int16_t)tmp32b >> 8; // Q8 tmp32b = tmp32c + (ratq >> 1); // (k-r)^2 + 0.5 * r Q8 @@ -380,7 +380,7 @@ void WebRtcIsacfix_InitialPitch(const int16_t *in, /* Q0 */ /* Bias towards short lags */ /* log(pow(0.8, log(2.0f * *y )))/log(2.0f) */ tmp32a= WebRtcIsacfix_Log2Q8((uint32_t) *yq) - 2048; // offset 8*2^8 - tmp32b= WEBRTC_SPL_MUL_16_16_RSFT((int16_t) tmp32a, -82, 8); + tmp32b = (int16_t)tmp32a * -82 >> 8; tmp32c= tmp32b + 256; *fyq += tmp32c; if (*fyq > corr_max32) { diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator_c.c b/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator_c.c index 7ba7b69daa..81bdff5e4f 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator_c.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_estimator_c.c @@ -34,12 +34,8 @@ void WebRtcIsacfix_PCorr2Q32(const int16_t* in, int32_t* logcorQ8) { csum32 = 0; x = in + PITCH_MAX_LAG / 2 + 2; for (n = 0; n < PITCH_CORR_LEN2; n++) { - ysum32 += WEBRTC_SPL_MUL_16_16_RSFT((int16_t)in[n], - (int16_t)in[n], - scaling); // Q0 - csum32 += WEBRTC_SPL_MUL_16_16_RSFT((int16_t)x[n], - (int16_t)in[n], - scaling); // Q0 + ysum32 += in[n] * in[n] >> scaling; // Q0 + csum32 += x[n] * in[n] >> scaling; // Q0 } logcorQ8 += PITCH_LAG_SPAN2 - 1; lys = WebRtcIsacfix_Log2Q8((uint32_t)ysum32) >> 1; // Q8, sqrt(ysum) @@ -57,12 +53,9 @@ void WebRtcIsacfix_PCorr2Q32(const int16_t* in, int32_t* logcorQ8) { for (k = 1; k < PITCH_LAG_SPAN2; k++) { inptr = &in[k]; - ysum32 -= WEBRTC_SPL_MUL_16_16_RSFT((int16_t)in[k - 1], - (int16_t)in[k - 1], - scaling); - ysum32 += WEBRTC_SPL_MUL_16_16_RSFT((int16_t)in[PITCH_CORR_LEN2 + k - 1], - (int16_t)in[PITCH_CORR_LEN2 + k - 1], - scaling); + ysum32 -= in[k - 1] * in[k - 1] >> scaling; + ysum32 += in[PITCH_CORR_LEN2 + k - 1] * in[PITCH_CORR_LEN2 + k - 1] >> + scaling; #ifdef WEBRTC_ARCH_ARM_NEON { int32_t vbuff[4]; diff --git a/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_filter.c b/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_filter.c index 06471beb33..eaf131df61 100644 --- a/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_filter.c +++ b/webrtc/modules/audio_coding/codecs/isac/fix/source/pitch_filter.c @@ -89,14 +89,12 @@ void WebRtcIsacfix_PitchFilter(int16_t* indatQQ, // Q10 if type is 1 or 4, // Make output more periodic. for (k = 0; k < PITCH_SUBFRAMES; k++) { - gainsQ12[k] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( - gainsQ12[k], Gain, 14); + gainsQ12[k] = (int16_t)(gainsQ12[k] * Gain >> 14); } } // No interpolation if pitch lag step is big. - if ((WEBRTC_SPL_MUL_16_16_RSFT(lagsQ7[0], 3, 1) < oldLagQ7) || - (lagsQ7[0] > WEBRTC_SPL_MUL_16_16_RSFT(oldLagQ7, 3, 1))) { + if (((lagsQ7[0] * 3 >> 1) < oldLagQ7) || (lagsQ7[0] > (oldLagQ7 * 3 >> 1))) { oldLagQ7 = lagsQ7[0]; oldGainQ12 = gainsQ12[0]; } @@ -110,8 +108,7 @@ void WebRtcIsacfix_PitchFilter(int16_t* indatQQ, // Q10 if type is 1 or 4, lagdeltaQ7, kDivFactor, 15); curLagQ7 = oldLagQ7; gaindeltaQ12 = gainsQ12[k] - oldGainQ12; - gaindeltaQ12 = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( - gaindeltaQ12, kDivFactor, 15); + gaindeltaQ12 = (int16_t)(gaindeltaQ12 * kDivFactor >> 15); curGainQ12 = oldGainQ12; oldLagQ7 = lagsQ7[k]; @@ -173,8 +170,7 @@ void WebRtcIsacfix_PitchFilterGains(const int16_t* indatQ0, oldLagQ7 = pfp->oldlagQ7; // No interpolation if pitch lag step is big. - if ((WEBRTC_SPL_MUL_16_16_RSFT(lagsQ7[0], 3, 1) < oldLagQ7) || - (lagsQ7[0] > WEBRTC_SPL_MUL_16_16_RSFT(oldLagQ7, 3, 1))) { + if (((lagsQ7[0] * 3 >> 1) < oldLagQ7) || (lagsQ7[0] > (oldLagQ7 * 3 >> 1))) { oldLagQ7 = lagsQ7[0]; }