Lines Matching +full:- +full:lm
1 /* Copyright (c) 2007-2008 CSIRO
2 Copyright (c) 2007-2009 Xiph.Org Foundation
3 Copyright (c) 2008-2009 Gregory Maxwell
4 Written by Jean-Marc Valin and Gregory Maxwell */
10 - Redistributions of source code must retain the above copyright
13 - Redistributions in binary form must reproduce the above copyright
56 if (i<prev && val > thresholds[prev-1]-hysteresis[prev-1]) in hysteresis_decision()
66 /* This is a cos() approximation designed to be bit-exact on any platform. Bit exactness
75 x2 = (32767-x2) + FRAC_MUL16(x2, (-7651 + FRAC_MUL16(x2, (8277 + FRAC_MUL16(-626, x2))))); in bitexact_cos()
86 icos<<=15-lc; in bitexact_log2tan()
87 isin<<=15-ls; in bitexact_log2tan()
88 return (ls-lc)*(1<<11) in bitexact_log2tan()
89 +FRAC_MUL16(isin, FRAC_MUL16(isin, -2597) + 7932) in bitexact_log2tan()
90 -FRAC_MUL16(icos, FRAC_MUL16(icos, -2597) + 7932); in bitexact_log2tan()
95 …_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch) in compute_band_energies() argument
98 const opus_int16 *eBands = m->eBands; in compute_band_energies()
100 N = m->shortMdctSize<<LM; in compute_band_energies()
108 maxval = celt_maxabs32(&X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBands[i])<<LM); in compute_band_energies()
111 int shift = celt_ilog2(maxval) - 14 + (((m->logN[i]>>BITRES)+LM+1)>>1); in compute_band_energies()
112 j=eBands[i]<<LM; in compute_band_energies()
118 } while (++j<eBands[i+1]<<LM); in compute_band_energies()
121 sum = MAC16_16(sum, EXTRACT16(SHL32(X[j+c*N],-shift)), in compute_band_energies()
122 EXTRACT16(SHL32(X[j+c*N],-shift))); in compute_band_energies()
123 } while (++j<eBands[i+1]<<LM); in compute_band_energies()
126 bandE[i+c*m->nbEBands] = EPSILON+VSHR32(EXTEND32(celt_sqrt(sum)),-shift); in compute_band_energies()
128 bandE[i+c*m->nbEBands] = EPSILON; in compute_band_energies()
130 /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ in compute_band_energies()
140 const opus_int16 *eBands = m->eBands; in normalise_bands()
141 N = M*m->shortMdctSize; in normalise_bands()
147 shift = celt_zlog2(bandE[i+c*m->nbEBands])-13; in normalise_bands()
148 E = VSHR32(bandE[i+c*m->nbEBands], shift); in normalise_bands()
151 X[j+c*N] = MULT16_16_Q15(VSHR32(freq[j+c*N],shift-1),g); in normalise_bands()
159 …_energies(const CELTMode *m, const celt_sig *X, celt_ener *bandE, int end, int C, int LM, int arch) in compute_band_energies() argument
162 const opus_int16 *eBands = m->eBands; in compute_band_energies()
163 N = m->shortMdctSize<<LM; in compute_band_energies()
168 …sum = 1e-27f + celt_inner_prod(&X[c*N+(eBands[i]<<LM)], &X[c*N+(eBands[i]<<LM)], (eBands[i+1]-eBan… in compute_band_energies()
169 bandE[i+c*m->nbEBands] = celt_sqrt(sum); in compute_band_energies()
170 /*printf ("%f ", bandE[i+c*m->nbEBands]);*/ in compute_band_energies()
180 const opus_int16 *eBands = m->eBands; in normalise_bands()
181 N = M*m->shortMdctSize; in normalise_bands()
186 opus_val16 g = 1.f/(1e-27f+bandE[i+c*m->nbEBands]); in normalise_bands()
195 /* De-normalise the energy to produce the synthesis from the unit-energy bands */
204 const opus_int16 *eBands = m->eBands; in denormalise_bands()
205 N = M*m->shortMdctSize; in denormalise_bands()
233 shift = 16-(lg>>DB_SHIFT); in denormalise_bands()
240 g = celt_exp2_frac(lg&((1<<DB_SHIFT)-1)); in denormalise_bands()
245 /* For shift <= -2 and g > 16384 we'd be likely to overflow, so we're in denormalise_bands()
248 if (shift <= -2) in denormalise_bands()
251 shift = -2; in denormalise_bands()
254 *f++ = SHL32(MULT16_16(*x++, g), -shift); in denormalise_bands()
258 /* Be careful of the fixed-point "else" just above when changing this code */ in denormalise_bands()
264 OPUS_CLEAR(&freq[bound], N-bound); in denormalise_bands()
268 void anti_collapse(const CELTMode *m, celt_norm *X_, unsigned char *collapse_masks, int LM, int C, … in anti_collapse() argument
283 N0 = m->eBands[i+1]-m->eBands[i]; in anti_collapse()
286 depth = celt_udiv(1+pulses[i], (m->eBands[i+1]-m->eBands[i]))>>LM; in anti_collapse()
289 thresh32 = SHR32(celt_exp2(-SHL16(depth, 10-BITRES)),1); in anti_collapse()
293 t = N0<<LM; in anti_collapse()
295 t = SHL32(t, (7-shift)<<1); in anti_collapse()
299 thresh = .5f*celt_exp2(-.125f*depth); in anti_collapse()
300 sqrt_1 = celt_rsqrt(N0<<LM); in anti_collapse()
311 prev1 = prev1logE[c*m->nbEBands+i]; in anti_collapse()
312 prev2 = prev2logE[c*m->nbEBands+i]; in anti_collapse()
315 prev1 = MAX16(prev1,prev1logE[m->nbEBands+i]); in anti_collapse()
316 prev2 = MAX16(prev2,prev2logE[m->nbEBands+i]); in anti_collapse()
318 Ediff = EXTEND32(logE[c*m->nbEBands+i])-EXTEND32(MIN16(prev1,prev2)); in anti_collapse()
324 opus_val32 r32 = SHR32(celt_exp2(-EXTRACT16(Ediff)),1); in anti_collapse()
329 if (LM==3) in anti_collapse()
334 /* r needs to be multiplied by 2 or 2*sqrt(2) depending on LM because in anti_collapse()
336 r = 2.f*celt_exp2(-Ediff); in anti_collapse()
337 if (LM==3) in anti_collapse()
342 X = X_+c*size+(m->eBands[i]<<LM); in anti_collapse()
343 for (k=0;k<1<<LM;k++) in anti_collapse()
352 X[(j<<LM)+k] = (seed&0x8000 ? r : -r); in anti_collapse()
359 renormalise_vector(X, N0<<LM, Q15ONE, arch); in anti_collapse()
367 wanted to minimize the MSE in the non-normalized domain. This roughly
368 corresponds to some quick-and-dirty perceptual experiments I ran to
369 measure inter-aural masking (there doesn't seem to be any published data
382 shift = celt_ilog2(EPSILON+MAX32(Ex, Ey))-14; in compute_channel_weights()
396 int shift = celt_zlog2(MAX32(bandE[i], bandE[i+m->nbEBands]))-13; in intensity_stereo()
399 right = VSHR32(bandE[i+m->nbEBands],shift); in intensity_stereo()
437 /* Compute the norm of X+Y and X-Y as |X|^2 + |Y|^2 +/- sum(xy) */ in stereo_merge()
443 El = MULT16_16(mid2, mid2) + side - 2*xp; in stereo_merge()
445 if (Er < QCONST32(6e-4f, 28) || El < QCONST32(6e-4f, 28)) in stereo_merge()
455 t = VSHR32(El, (kl-7)<<1); in stereo_merge()
457 t = VSHR32(Er, (kr-7)<<1); in stereo_merge()
485 const opus_int16 * OPUS_RESTRICT eBands = m->eBands; in spreading_decision()
491 N0 = M*m->shortMdctSize; in spreading_decision()
493 if (M*(eBands[end]-eBands[end-1]) <= 8) in spreading_decision()
501 N = M*(eBands[i+1]-eBands[i]); in spreading_decision()
519 if (i>m->nbEBands-4) in spreading_decision()
530 hf_sum = celt_udiv(hf_sum, C*(4-m->nbEBands+end)); in spreading_decision()
536 hf_sum -= 4; in spreading_decision()
545 celt_assert(nbBands>0); /* end has to be non-zero */ in spreading_decision()
552 sum = (3*sum + (((3-last_decision)<<7) + 64) + 2)>>2; in spreading_decision()
573 This is essentially a bit-reversed Gray, on top of which we've added
594 const int *ordery = ordery_table+stride-2; in deinterleave_hadamard()
619 const int *ordery = ordery_table+stride-2; in interleave_hadamard()
652 int N2 = 2*N-1; in compute_qn()
654 N2--; in compute_qn()
659 qb = IMIN(b-pulse_cap-(4<<BITRES), qb); in compute_qn()
666 qn = exp2_table8[qb&0x7]>>(14-(qb>>BITRES)); in compute_qn()
702 int LM, in compute_theta() argument
721 encode = ctx->encode; in compute_theta()
722 m = ctx->m; in compute_theta()
723 i = ctx->i; in compute_theta()
724 intensity = ctx->intensity; in compute_theta()
725 ec = ctx->ec; in compute_theta()
726 bandE = ctx->bandE; in compute_theta()
729 pulse_cap = m->logN[i]+LM*(1<<BITRES); in compute_theta()
730 offset = (pulse_cap>>1) - (stereo&&N==2 ? QTHETA_OFFSET_TWOPHASE : QTHETA_OFFSET); in compute_theta()
737 side and mid. With just that parameter, we can re-scale both in compute_theta()
740 itheta = stereo_itheta(X, Y, stereo, N, ctx->arch); in compute_theta()
747 if (!stereo || ctx->theta_round == 0) in compute_theta()
750 if (!stereo && ctx->avoid_split_noise && itheta > 0 && itheta < qn) in compute_theta()
757 iside = bitexact_cos((opus_int16)(16384-unquantized)); in compute_theta()
758 delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid)); in compute_theta()
761 else if (delta < -*b) in compute_theta()
767 int bias = itheta > 8192 ? 32767/qn : -32767/qn; in compute_theta()
768 down = IMIN(qn-1, IMAX(0, (itheta*(opus_int32)qn + bias)>>14)); in compute_theta()
769 if (ctx->theta_round < 0) in compute_theta()
786 ec_encode(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); in compute_theta()
793 x=x0+1+(fs-(x0+1)*p0); in compute_theta()
794 ec_dec_update(ec,x<=x0?p0*x:(x-1-x0)+(x0+1)*p0,x<=x0?p0*(x+1):(x-x0)+(x0+1)*p0,ft); in compute_theta()
810 fs = itheta <= (qn>>1) ? itheta + 1 : qn + 1 - itheta; in compute_theta()
812 ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); in compute_theta()
823 itheta = (isqrt32(8*(opus_uint32)fm + 1) - 1)>>1; in compute_theta()
830 - isqrt32(8*(opus_uint32)(ft - fm - 1) + 1))>>1; in compute_theta()
831 fs = qn + 1 - itheta; in compute_theta()
832 fl = ft - ((qn + 1 - itheta)*(qn + 2 - itheta)>>1); in compute_theta()
847 /* NOTE: Renormalising X and Y *may* help fixed-point a bit at very high rate. in compute_theta()
852 inv = itheta > 8192 && !ctx->disable_inv; in compute_theta()
857 Y[j] = -Y[j]; in compute_theta()
861 if (*b>2<<BITRES && ctx->remaining_bits > 2<<BITRES) in compute_theta()
870 if (ctx->disable_inv) in compute_theta()
874 qalloc = ec_tell_frac(ec) - tell; in compute_theta()
875 *b -= qalloc; in compute_theta()
881 *fill &= (1<<B)-1; in compute_theta()
882 delta = -16384; in compute_theta()
887 *fill &= ((1<<B)-1)<<B; in compute_theta()
891 iside = bitexact_cos((opus_int16)(16384-itheta)); in compute_theta()
894 delta = FRAC_MUL16((N-1)<<7,bitexact_log2tan(iside,imid)); in compute_theta()
897 sctx->inv = inv; in compute_theta()
898 sctx->imid = imid; in compute_theta()
899 sctx->iside = iside; in compute_theta()
900 sctx->delta = delta; in compute_theta()
901 sctx->itheta = itheta; in compute_theta()
902 sctx->qalloc = qalloc; in compute_theta()
913 encode = ctx->encode; in quant_band_n1()
914 ec = ctx->ec; in quant_band_n1()
919 if (ctx->remaining_bits>=1<<BITRES) in quant_band_n1()
928 ctx->remaining_bits -= 1<<BITRES; in quant_band_n1()
930 if (ctx->resynth) in quant_band_n1()
931 x[0] = sign ? -NORM_SCALING : NORM_SCALING; in quant_band_n1()
941 the two half-bands. It can be called recursively so bands can end up being
945 int LM, in quant_partition() argument
962 encode = ctx->encode; in quant_partition()
963 m = ctx->m; in quant_partition()
964 i = ctx->i; in quant_partition()
965 spread = ctx->spread; in quant_partition()
966 ec = ctx->ec; in quant_partition()
969 cache = m->cache.bits + m->cache.index[(LM+1)*m->nbEBands+i]; in quant_partition()
970 if (LM != -1 && b > cache[cache[0]]+12 && N>2) in quant_partition()
981 LM -= 1; in quant_partition()
986 compute_theta(ctx, &sctx, X, Y, N, &b, B, B0, LM, 0, &fill); in quant_partition()
1000 /* Give more bits to low-energy MDCTs than they would otherwise deserve */ in quant_partition()
1004 /* Rough approximation for pre-echo masking */ in quant_partition()
1005 delta -= delta>>(4-LM); in quant_partition()
1007 /* Corresponds to a forward-masking slope of 1.5 dB per 10 ms */ in quant_partition()
1008 delta = IMIN(0, delta + (N<<BITRES>>(5-LM))); in quant_partition()
1010 mbits = IMAX(0, IMIN(b, (b-delta)/2)); in quant_partition()
1011 sbits = b-mbits; in quant_partition()
1012 ctx->remaining_bits -= qalloc; in quant_partition()
1015 next_lowband2 = lowband+N; /* >32-bit split case */ in quant_partition()
1017 rebalance = ctx->remaining_bits; in quant_partition()
1020 cm = quant_partition(ctx, X, N, mbits, B, lowband, LM, in quant_partition()
1022 rebalance = mbits - (rebalance-ctx->remaining_bits); in quant_partition()
1024 sbits += rebalance - (3<<BITRES); in quant_partition()
1025 cm |= quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM, in quant_partition()
1028 cm = quant_partition(ctx, Y, N, sbits, B, next_lowband2, LM, in quant_partition()
1030 rebalance = sbits - (rebalance-ctx->remaining_bits); in quant_partition()
1032 mbits += rebalance - (3<<BITRES); in quant_partition()
1033 cm |= quant_partition(ctx, X, N, mbits, B, lowband, LM, in quant_partition()
1037 /* This is the basic no-split case */ in quant_partition()
1038 q = bits2pulses(m, i, LM, b); in quant_partition()
1039 curr_bits = pulses2bits(m, i, LM, q); in quant_partition()
1040 ctx->remaining_bits -= curr_bits; in quant_partition()
1043 while (ctx->remaining_bits < 0 && q > 0) in quant_partition()
1045 ctx->remaining_bits += curr_bits; in quant_partition()
1046 q--; in quant_partition()
1047 curr_bits = pulses2bits(m, i, LM, q); in quant_partition()
1048 ctx->remaining_bits -= curr_bits; in quant_partition()
1058 cm = alg_quant(X, N, K, spread, B, ec, gain, ctx->resynth, ctx->arch); in quant_partition()
1065 if (ctx->resynth) in quant_partition()
1069 16-bit platform; use a long to get defined behavior.*/ in quant_partition()
1070 cm_mask = (unsigned)(1UL<<B)-1; in quant_partition()
1081 ctx->seed = celt_lcg_rand(ctx->seed); in quant_partition()
1082 X[j] = (celt_norm)((opus_int32)ctx->seed>>20); in quant_partition()
1090 ctx->seed = celt_lcg_rand(ctx->seed); in quant_partition()
1093 tmp = (ctx->seed)&0x8000 ? tmp : -tmp; in quant_partition()
1098 renormalise_vector(X, N, gain, ctx->arch); in quant_partition()
1111 int LM, celt_norm *lowband_out, in quant_band() argument
1126 encode = ctx->encode; in quant_band()
1127 tf_change = ctx->tf_change; in quant_band()
1188 cm = quant_partition(ctx, X, N, b, B, lowband, LM, gain, fill); in quant_band()
1190 /* This code is used by the decoder and by the resynthesis-enabled encoder */ in quant_band()
1191 if (ctx->resynth) in quant_band()
1197 /* Undo time-freq changes that we did earlier */ in quant_band()
1228 cm &= (1<<B)-1; in quant_band()
1237 int LM, celt_norm *lowband_out, in quant_band_stereo() argument
1252 encode = ctx->encode; in quant_band_stereo()
1253 ec = ctx->ec; in quant_band_stereo()
1263 compute_theta(ctx, &sctx, X, Y, N, &b, B, B, LM, 1, &fill); in quant_band_stereo()
1291 mbits -= sbits; in quant_band_stereo()
1293 ctx->remaining_bits -= qalloc+sbits; in quant_band_stereo()
1302 sign = x2[0]*y2[1] - x2[1]*y2[0] < 0; in quant_band_stereo()
1308 sign = 1-2*sign; in quant_band_stereo()
1311 cm = quant_band(ctx, x2, N, mbits, B, lowband, LM, lowband_out, Q15ONE, in quant_band_stereo()
1313 /* We don't split N=2 bands, so cm is either 1 or 0 (for a fold-collapse), in quant_band_stereo()
1315 y2[0] = -sign*x2[1]; in quant_band_stereo()
1317 if (ctx->resynth) in quant_band_stereo()
1335 mbits = IMAX(0, IMIN(b, (b-delta)/2)); in quant_band_stereo()
1336 sbits = b-mbits; in quant_band_stereo()
1337 ctx->remaining_bits -= qalloc; in quant_band_stereo()
1339 rebalance = ctx->remaining_bits; in quant_band_stereo()
1344 cm = quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE, in quant_band_stereo()
1346 rebalance = mbits - (rebalance-ctx->remaining_bits); in quant_band_stereo()
1348 sbits += rebalance - (3<<BITRES); in quant_band_stereo()
1352 cm |= quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B); in quant_band_stereo()
1356 cm = quant_band(ctx, Y, N, sbits, B, NULL, LM, NULL, side, NULL, fill>>B); in quant_band_stereo()
1357 rebalance = sbits - (rebalance-ctx->remaining_bits); in quant_band_stereo()
1359 mbits += rebalance - (3<<BITRES); in quant_band_stereo()
1362 cm |= quant_band(ctx, X, N, mbits, B, lowband, LM, lowband_out, Q15ONE, in quant_band_stereo()
1368 /* This code is used by the decoder and by the resynthesis-enabled encoder */ in quant_band_stereo()
1369 if (ctx->resynth) in quant_band_stereo()
1372 stereo_merge(X, Y, mid, N, ctx->arch); in quant_band_stereo()
1377 Y[j] = -Y[j]; in quant_band_stereo()
1387 const opus_int16 * OPUS_RESTRICT eBands = m->eBands; in special_hybrid_folding()
1388 n1 = M*(eBands[start+1]-eBands[start]); in special_hybrid_folding()
1389 n2 = M*(eBands[start+2]-eBands[start+1]); in special_hybrid_folding()
1391 Copies no data for CELT-only mode. */ in special_hybrid_folding()
1392 OPUS_COPY(&norm[n1], &norm[2*n1 - n2], n2-n1); in special_hybrid_folding()
1394 OPUS_COPY(&norm2[n1], &norm2[2*n1 - n2], n2-n1); in special_hybrid_folding()
1402 opus_int32 balance, ec_ctx *ec, int LM, int codedBands, in quant_all_bands() argument
1407 const opus_int16 * OPUS_RESTRICT eBands = m->eBands; in quant_all_bands()
1433 M = 1<<LM; in quant_all_bands()
1438 ALLOC(_norm, C*(M*eBands[m->nbEBands-1]-norm_offset), celt_norm); in quant_all_bands()
1440 norm2 = norm + M*eBands[m->nbEBands-1]-norm_offset; in quant_all_bands()
1446 resynth_alloc = M*(eBands[m->nbEBands]-eBands[m->nbEBands-1]); in quant_all_bands()
1453 lowband_scratch = X_+M*eBands[m->effEBands-1]; in quant_all_bands()
1480 int effective_lowband=-1; in quant_all_bands()
1488 last = (i==end-1); in quant_all_bands()
1495 N = M*eBands[i+1]-M*eBands[i]; in quant_all_bands()
1501 balance -= tell; in quant_all_bands()
1502 remaining_bits = total_bits-tell-1; in quant_all_bands()
1504 if (i <= codedBands-1) in quant_all_bands()
1506 curr_balance = celt_sudiv(balance, IMIN(3, codedBands-i)); in quant_all_bands()
1513 …if (resynth && (M*eBands[i]-N >= M*eBands[start] || i==start+1) && (update_lowband || lowband_offs… in quant_all_bands()
1518 if (resynth && M*eBands[i]-N >= M*eBands[start] && (update_lowband || lowband_offset==0)) in quant_all_bands()
1524 if (i>=m->effEBands) in quant_all_bands()
1542 effective_lowband = IMAX(0, M*eBands[lowband_offset]-norm_offset-N); in quant_all_bands()
1544 while(M*eBands[--fold_start] > effective_lowband+norm_offset); in quant_all_bands()
1545 fold_end = lowband_offset-1; in quant_all_bands()
1554 y_cm |= collapse_masks[fold_i*C+C-1]; in quant_all_bands()
1558 always) be non-zero. */ in quant_all_bands()
1560 x_cm = y_cm = (1<<B)-1; in quant_all_bands()
1569 for (j=0;j<M*eBands[i]-norm_offset;j++) in quant_all_bands()
1575 effective_lowband != -1 ? norm+effective_lowband : NULL, LM, in quant_all_bands()
1576 last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm); in quant_all_bands()
1578 effective_lowband != -1 ? norm2+effective_lowband : NULL, LM, in quant_all_bands()
1579 last?NULL:norm2+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, y_cm); in quant_all_bands()
1593 compute_channel_weights(bandE[i], bandE[i+m->nbEBands], w); in quant_all_bands()
1601 ctx.theta_round = -1; in quant_all_bands()
1603 effective_lowband != -1 ? norm+effective_lowband : NULL, LM, in quant_all_bands()
1604 last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm); in quant_all_bands()
1614 OPUS_COPY(norm_save2, norm+M*eBands[i]-norm_offset, N); in quant_all_bands()
1618 save_bytes = nend_bytes-nstart_bytes; in quant_all_bands()
1633 effective_lowband != -1 ? norm+effective_lowband : NULL, LM, in quant_all_bands()
1634 last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, cm); in quant_all_bands()
1643 OPUS_COPY(norm+M*eBands[i]-norm_offset, norm_save2, N); in quant_all_bands()
1649 effective_lowband != -1 ? norm+effective_lowband : NULL, LM, in quant_all_bands()
1650 last?NULL:norm+M*eBands[i]-norm_offset, lowband_scratch, x_cm|y_cm); in quant_all_bands()
1654 effective_lowband != -1 ? norm+effective_lowband : NULL, LM, in quant_all_bands()
1655 last?NULL:norm+M*eBands[i]-norm_offset, Q15ONE, lowband_scratch, x_cm|y_cm); in quant_all_bands()
1660 collapse_masks[i*C+C-1] = (unsigned char)y_cm; in quant_all_bands()