15e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 25e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische 35e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Universitaet Berlin. See the accompanying file "COPYRIGHT" for 45e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. 55e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 65e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 75e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* $Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/long_term.c,v 1.6 1996/07/02 12:33:19 jutta Exp $ */ 85e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 95e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include <stdio.h> 105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include <assert.h> 115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include "private.h" 135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include "gsm.h" 155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#include "proto.h" 165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * 4.2.11 .. 4.2.12 LONG TERM PREDICTOR (LTP) SECTION 195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * This module computes the LTP gain (bc) and the LTP lag (Nc) 245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * for the long term analysis filter. This is done by calculating a 255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * maximum of the cross-correlation function between the current 265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * sub-segment short term residual signal d[0..39] (output of 275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * the short term analysis filter; for simplification the index 285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * of this array begins at 0 and ends at 39 for each sub-segment of the 295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * RPE-LTP analysis) and the previous reconstructed short term 305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * residual signal dp[ -120 .. -1 ]. A dynamic scaling must be 315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * performed to avoid overflow. 325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* The next procedure exists in six versions. First two integer 355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * version (if USE_FLOAT_MUL is not defined); then four floating 365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * point versions, twice with proper scaling (USE_FLOAT_MUL defined), 375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * once without (USE_FLOAT_MUL and FAST defined, and fast run-time 385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * option used). Every pair has first a Cut version (see the -C 395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * option to toast or the LTP_CUT option to gsm_option()), then the 405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * uncut one. (For a detailed explanation of why this is altogether 415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * a bad idea, see Henry Spencer and Geoff Collyer, ``#ifdef Considered 425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Harmful''.) 435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#ifndef USE_FLOAT_MUL 465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#ifdef LTP_CUT 485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out), 505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh struct gsm_state * st, 525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * d, /* [0..39] IN */ 545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * dp, /* [-120..-1] IN */ 555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * bc_out, /* OUT */ 565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Nc_out /* OUT */ 575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int k, lambda; 605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Nc, bc; 615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word wt[40]; 625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh longword L_result; 645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh longword L_max, L_power; 655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word R, S, dmax, scal, best_k; 665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word ltp_cut; 675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word temp, wt_k; 695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Search of the optimum scaling of d[0..39]. 715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh dmax = 0; 735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { 745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = d[k]; 755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = GSM_ABS( temp ); 765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (temp > dmax) { 775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh dmax = temp; 785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh best_k = k; 795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = 0; 825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (dmax == 0) scal = 0; 835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else { 845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(dmax > 0); 855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = gsm_norm( (longword)dmax << 16 ); 865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (temp > 6) scal = 0; 885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else scal = 6 - temp; 895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(scal >= 0); 905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Search for the maximum cross-correlation and coding of the LTP lag 925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = 0; 945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Nc = 40; /* index for the maximum cross-correlation */ 955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh wt_k = SASR(d[best_k], scal); 965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (lambda = 40; lambda <= 120; lambda++) { 985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result = (longword)wt_k * dp[best_k - lambda]; 995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_result > L_max) { 1005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Nc = lambda; 1015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = L_result; 1025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 1035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 1045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *Nc_out = Nc; 1055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max <<= 1; 1065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Rescaling of L_max 1085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(scal <= 100 && scal >= -100); 1105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = L_max >> (6 - scal); /* sub(6, scal) */ 1115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( Nc <= 120 && Nc >= 40); 1135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Compute the power of the reconstructed short term residual 1155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * signal dp[..] 1165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power = 0; 1185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { 1195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register longword L_temp; 1215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_temp = SASR( dp[k - Nc], 3 ); 1235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power += L_temp * L_temp; 1245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 1255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power <<= 1; /* from L_MULT */ 1265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Normalization of L_max and L_power 1285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max <= 0) { 1315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 0; 1325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 1335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 1345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max >= L_power) { 1355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 3; 1365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 1375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 1385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = gsm_norm( L_power ); 1405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh R = SASR( L_max << temp, 16 ); 1425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh S = SASR( L_power << temp, 16 ); 1435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Coding of the LTP gain 1455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Table 4.3a must be used to obtain the level DLB[i] for the 1485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * quantization of the LTP gain b to get the coded version bc. 1495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; 1515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = bc; 1525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 1535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif /* LTP_CUT */ 1555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), 1575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * d, /* [0..39] IN */ 1585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * dp, /* [-120..-1] IN */ 1595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * bc_out, /* OUT */ 1605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Nc_out /* OUT */ 1615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 1625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 1635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int k, lambda; 1645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Nc, bc; 1655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word wt[40]; 1665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh longword L_max, L_power; 1685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word R, S, dmax, scal; 1695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word temp; 1705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Search of the optimum scaling of d[0..39]. 1725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh dmax = 0; 1745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { 1765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = d[k]; 1775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = GSM_ABS( temp ); 1785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (temp > dmax) dmax = temp; 1795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 1805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = 0; 1825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (dmax == 0) scal = 0; 1835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else { 1845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(dmax > 0); 1855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = gsm_norm( (longword)dmax << 16 ); 1865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 1875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (temp > 6) scal = 0; 1895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else scal = 6 - temp; 1905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(scal >= 0); 1925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Initialization of a working array wt 1945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 1955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) wt[k] = SASR( d[k], scal ); 1975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 1985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Search for the maximum cross-correlation and coding of the LTP lag 1995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 2005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = 0; 2015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Nc = 40; /* index for the maximum cross-correlation */ 2025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (lambda = 40; lambda <= 120; lambda++) { 2045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# undef STEP 2065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP(k) (longword)wt[k] * dp[k - lambda] 2075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register longword L_result; 2095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result = STEP(0) ; L_result += STEP(1) ; 2115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(2) ; L_result += STEP(3) ; 2125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(4) ; L_result += STEP(5) ; 2135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(6) ; L_result += STEP(7) ; 2145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(8) ; L_result += STEP(9) ; 2155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(10) ; L_result += STEP(11) ; 2165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(12) ; L_result += STEP(13) ; 2175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(14) ; L_result += STEP(15) ; 2185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(16) ; L_result += STEP(17) ; 2195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(18) ; L_result += STEP(19) ; 2205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(20) ; L_result += STEP(21) ; 2215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(22) ; L_result += STEP(23) ; 2225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(24) ; L_result += STEP(25) ; 2235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(26) ; L_result += STEP(27) ; 2245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(28) ; L_result += STEP(29) ; 2255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(30) ; L_result += STEP(31) ; 2265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(32) ; L_result += STEP(33) ; 2275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(34) ; L_result += STEP(35) ; 2285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(36) ; L_result += STEP(37) ; 2295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result += STEP(38) ; L_result += STEP(39) ; 2305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_result > L_max) { 2325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Nc = lambda; 2345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = L_result; 2355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *Nc_out = Nc; 2395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max <<= 1; 2415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Rescaling of L_max 2435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 2445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(scal <= 100 && scal >= -100); 2455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = L_max >> (6 - scal); /* sub(6, scal) */ 2465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( Nc <= 120 && Nc >= 40); 2485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Compute the power of the reconstructed short term residual 2505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * signal dp[..] 2515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 2525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power = 0; 2535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { 2545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register longword L_temp; 2565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_temp = SASR( dp[k - Nc], 3 ); 2585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power += L_temp * L_temp; 2595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power <<= 1; /* from L_MULT */ 2615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Normalization of L_max and L_power 2635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 2645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max <= 0) { 2665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 0; 2675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 2685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max >= L_power) { 2705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 3; 2715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 2725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 2735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = gsm_norm( L_power ); 2755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh R = SASR( L_max << temp, 16 ); 2775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh S = SASR( L_power << temp, 16 ); 2785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Coding of the LTP gain 2805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 2815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Table 4.3a must be used to obtain the level DLB[i] for the 2835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * quantization of the LTP gain b to get the coded version bc. 2845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 2855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; 2865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = bc; 2875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 2885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#else /* USE_FLOAT_MUL */ 2905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#ifdef LTP_CUT 2925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 2935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void Cut_Calculation_of_the_LTP_parameters P5((st, d,dp,bc_out,Nc_out), 2945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh struct gsm_state * st, /* IN */ 2955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * d, /* [0..39] IN */ 2965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * dp, /* [-120..-1] IN */ 2975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * bc_out, /* OUT */ 2985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Nc_out /* OUT */ 2995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 3005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 3015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int k, lambda; 3025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Nc, bc; 3035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word ltp_cut; 3045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh float wt_float[40]; 3065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh float dp_float_base[120], * dp_float = dp_float_base + 120; 3075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh longword L_max, L_power; 3095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word R, S, dmax, scal; 3105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word temp; 3115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Search of the optimum scaling of d[0..39]. 3135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 3145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh dmax = 0; 3155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { 3175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = d[k]; 3185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = GSM_ABS( temp ); 3195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (temp > dmax) dmax = temp; 3205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 3215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = 0; 3235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (dmax == 0) scal = 0; 3245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else { 3255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(dmax > 0); 3265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = gsm_norm( (longword)dmax << 16 ); 3275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 3285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (temp > 6) scal = 0; 3305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else scal = 6 - temp; 3315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(scal >= 0); 3335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh ltp_cut = (longword)SASR(dmax, scal) * st->ltp_cut / 100; 3345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Initialization of a working array wt 3375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 3385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k < 40; k++) { 3405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word w = SASR( d[k], scal ); 3415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (w < 0 ? w > -ltp_cut : w < ltp_cut) { 3425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh wt_float[k] = 0.0; 3435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 3445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else { 3455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh wt_float[k] = w; 3465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 3475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 3485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = -120; k < 0; k++) dp_float[k] = dp[k]; 3495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Search for the maximum cross-correlation and coding of the LTP lag 3515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 3525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = 0; 3535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Nc = 40; /* index for the maximum cross-correlation */ 3545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (lambda = 40; lambda <= 120; lambda += 9) { 3565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Calculate L_result for l = lambda .. lambda + 9. 3585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 3595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float *lp = dp_float - lambda; 3605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float W; 3625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float a = lp[-8], b = lp[-7], c = lp[-6], 3635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh d = lp[-5], e = lp[-4], f = lp[-3], 3645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh g = lp[-2], h = lp[-1]; 3655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float E; 3665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, 3675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh S5 = 0, S6 = 0, S7 = 0, S8 = 0; 3685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# undef STEP 3705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP(K, a, b, c, d, e, f, g, h) \ 3715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if ((W = wt_float[K]) != 0.0) { \ 3725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * a; S8 += E; \ 3735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * b; S7 += E; \ 3745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * c; S6 += E; \ 3755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * d; S5 += E; \ 3765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * e; S4 += E; \ 3775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * f; S3 += E; \ 3785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * g; S2 += E; \ 3795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * h; S1 += E; \ 3805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh a = lp[K]; \ 3815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * a; S0 += E; } else (a = lp[K]) 3825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) 3845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) 3855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) 3865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) 3875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) 3885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) 3895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) 3905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) 3915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); 3935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); 3945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); 3965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); 3975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 3985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); 3995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); 4005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); 4025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); 4035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); 4055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); 4065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S0 > L_max) { L_max = S0; Nc = lambda; } 4085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } 4095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } 4105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } 4115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } 4125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } 4135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } 4145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } 4155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } 4165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 4185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *Nc_out = Nc; 4195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max <<= 1; 4215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Rescaling of L_max 4235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 4245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(scal <= 100 && scal >= -100); 4255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = L_max >> (6 - scal); /* sub(6, scal) */ 4265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( Nc <= 120 && Nc >= 40); 4285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Compute the power of the reconstructed short term residual 4305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * signal dp[..] 4315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 4325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power = 0; 4335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { 4345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register longword L_temp; 4365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_temp = SASR( dp[k - Nc], 3 ); 4385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power += L_temp * L_temp; 4395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 4405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power <<= 1; /* from L_MULT */ 4415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Normalization of L_max and L_power 4435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 4445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max <= 0) { 4465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 0; 4475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 4485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 4495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max >= L_power) { 4505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 3; 4515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 4525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 4535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = gsm_norm( L_power ); 4555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh R = SASR( L_max << temp, 16 ); 4575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh S = SASR( L_power << temp, 16 ); 4585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Coding of the LTP gain 4605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 4615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Table 4.3a must be used to obtain the level DLB[i] for the 4635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * quantization of the LTP gain b to get the coded version bc. 4645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 4655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; 4665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = bc; 4675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 4685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif /* LTP_CUT */ 4705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), 4725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * d, /* [0..39] IN */ 4735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * dp, /* [-120..-1] IN */ 4745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * bc_out, /* OUT */ 4755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Nc_out /* OUT */ 4765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 4775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 4785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int k, lambda; 4795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Nc, bc; 4805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh float wt_float[40]; 4825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh float dp_float_base[120], * dp_float = dp_float_base + 120; 4835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh longword L_max, L_power; 4855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word R, S, dmax, scal; 4865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word temp; 4875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Search of the optimum scaling of d[0..39]. 4895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 4905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh dmax = 0; 4915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { 4935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = d[k]; 4945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = GSM_ABS( temp ); 4955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (temp > dmax) dmax = temp; 4965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 4975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 4985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = 0; 4995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (dmax == 0) scal = 0; 5005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else { 5015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(dmax > 0); 5025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = gsm_norm( (longword)dmax << 16 ); 5035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 5045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (temp > 6) scal = 0; 5065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else scal = 6 - temp; 5075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(scal >= 0); 5095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Initialization of a working array wt 5115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 5125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k < 40; k++) wt_float[k] = SASR( d[k], scal ); 5145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = -120; k < 0; k++) dp_float[k] = dp[k]; 5155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Search for the maximum cross-correlation and coding of the LTP lag 5175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 5185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = 0; 5195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Nc = 40; /* index for the maximum cross-correlation */ 5205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (lambda = 40; lambda <= 120; lambda += 9) { 5225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Calculate L_result for l = lambda .. lambda + 9. 5245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 5255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float *lp = dp_float - lambda; 5265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float W; 5285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float a = lp[-8], b = lp[-7], c = lp[-6], 5295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh d = lp[-5], e = lp[-4], f = lp[-3], 5305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh g = lp[-2], h = lp[-1]; 5315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float E; 5325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, 5335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh S5 = 0, S6 = 0, S7 = 0, S8 = 0; 5345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# undef STEP 5365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP(K, a, b, c, d, e, f, g, h) \ 5375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh W = wt_float[K]; \ 5385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * a; S8 += E; \ 5395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * b; S7 += E; \ 5405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * c; S6 += E; \ 5415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * d; S5 += E; \ 5425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * e; S4 += E; \ 5435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * f; S3 += E; \ 5445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * g; S2 += E; \ 5455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * h; S1 += E; \ 5465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh a = lp[K]; \ 5475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * a; S0 += E 5485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) 5505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) 5515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) 5525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) 5535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) 5545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) 5555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) 5565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) 5575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); 5595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); 5605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); 5625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); 5635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); 5655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); 5665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); 5685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); 5695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); 5715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); 5725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S0 > L_max) { L_max = S0; Nc = lambda; } 5745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } 5755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } 5765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } 5775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } 5785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } 5795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } 5805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } 5815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } 5825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 5835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *Nc_out = Nc; 5845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max <<= 1; 5865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Rescaling of L_max 5885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 5895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(scal <= 100 && scal >= -100); 5905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = L_max >> (6 - scal); /* sub(6, scal) */ 5915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( Nc <= 120 && Nc >= 40); 5935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 5945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Compute the power of the reconstructed short term residual 5955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * signal dp[..] 5965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 5975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power = 0; 5985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { 5995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register longword L_temp; 6015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_temp = SASR( dp[k - Nc], 3 ); 6035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power += L_temp * L_temp; 6045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 6055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power <<= 1; /* from L_MULT */ 6065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Normalization of L_max and L_power 6085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 6095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max <= 0) { 6115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 0; 6125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 6135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 6145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max >= L_power) { 6155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 3; 6165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 6175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 6185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh temp = gsm_norm( L_power ); 6205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh R = SASR( L_max << temp, 16 ); 6225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh S = SASR( L_power << temp, 16 ); 6235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Coding of the LTP gain 6255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 6265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Table 4.3a must be used to obtain the level DLB[i] for the 6285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * quantization of the LTP gain b to get the coded version bc. 6295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 6305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (bc = 0; bc <= 2; bc++) if (R <= gsm_mult(S, gsm_DLB[bc])) break; 6315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = bc; 6325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 6335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#ifdef FAST 6355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#ifdef LTP_CUT 6365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void Cut_Fast_Calculation_of_the_LTP_parameters P5((st, 6385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh d,dp,bc_out,Nc_out), 6395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh struct gsm_state * st, /* IN */ 6405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * d, /* [0..39] IN */ 6415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * dp, /* [-120..-1] IN */ 6425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * bc_out, /* OUT */ 6435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Nc_out /* OUT */ 6445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 6455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 6465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int k, lambda; 6475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float wt_float; 6485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Nc, bc; 6495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word wt_max, best_k, ltp_cut; 6505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh float dp_float_base[120], * dp_float = dp_float_base + 120; 6525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float L_result, L_max, L_power; 6545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh wt_max = 0; 6565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k < 40; ++k) { 6585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if ( d[k] > wt_max) wt_max = d[best_k = k]; 6595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else if (-d[k] > wt_max) wt_max = -d[best_k = k]; 6605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 6615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(wt_max >= 0); 6635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh wt_float = (float)wt_max; 6645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k]; 6665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Search for the maximum cross-correlation and coding of the LTP lag 6685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 6695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = 0; 6705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Nc = 40; /* index for the maximum cross-correlation */ 6715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (lambda = 40; lambda <= 120; lambda++) { 6735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_result = wt_float * dp_float[best_k - lambda]; 6745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_result > L_max) { 6755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Nc = lambda; 6765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = L_result; 6775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 6785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 6795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *Nc_out = Nc; 6815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max <= 0.) { 6825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 0; 6835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 6845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 6855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Compute the power of the reconstructed short term residual 6875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * signal dp[..] 6885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 6895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh dp_float -= Nc; 6905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power = 0; 6915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k < 40; ++k) { 6925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float f = dp_float[k]; 6935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power += f * f; 6945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 6955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 6965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max >= L_power) { 6975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 3; 6985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 6995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 7005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Coding of the LTP gain 7025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Table 4.3a must be used to obtain the level DLB[i] for the 7035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * quantization of the LTP gain b to get the coded version bc. 7045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 7055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh lambda = L_max / L_power * 32768.; 7065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; 7075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = bc; 7085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 7095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif /* LTP_CUT */ 7115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void Fast_Calculation_of_the_LTP_parameters P4((d,dp,bc_out,Nc_out), 7135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * d, /* [0..39] IN */ 7145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * dp, /* [-120..-1] IN */ 7155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * bc_out, /* OUT */ 7165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Nc_out /* OUT */ 7175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 7185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 7195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int k, lambda; 7205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Nc, bc; 7215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh float wt_float[40]; 7235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh float dp_float_base[120], * dp_float = dp_float_base + 120; 7245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float L_max, L_power; 7265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k < 40; ++k) wt_float[k] = (float)d[k]; 7285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = -120; k < 0; ++k) dp_float[k] = (float)dp[k]; 7295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Search for the maximum cross-correlation and coding of the LTP lag 7315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 7325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_max = 0; 7335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Nc = 40; /* index for the maximum cross-correlation */ 7345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (lambda = 40; lambda <= 120; lambda += 9) { 7365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Calculate L_result for l = lambda .. lambda + 9. 7385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 7395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float *lp = dp_float - lambda; 7405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float W; 7425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float a = lp[-8], b = lp[-7], c = lp[-6], 7435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh d = lp[-5], e = lp[-4], f = lp[-3], 7445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh g = lp[-2], h = lp[-1]; 7455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float E; 7465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float S0 = 0, S1 = 0, S2 = 0, S3 = 0, S4 = 0, 7475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh S5 = 0, S6 = 0, S7 = 0, S8 = 0; 7485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# undef STEP 7505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP(K, a, b, c, d, e, f, g, h) \ 7515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh W = wt_float[K]; \ 7525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * a; S8 += E; \ 7535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * b; S7 += E; \ 7545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * c; S6 += E; \ 7555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * d; S5 += E; \ 7565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * e; S4 += E; \ 7575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * f; S3 += E; \ 7585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * g; S2 += E; \ 7595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * h; S1 += E; \ 7605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh a = lp[K]; \ 7615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh E = W * a; S0 += E 7625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_A(K) STEP(K, a, b, c, d, e, f, g, h) 7645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_B(K) STEP(K, b, c, d, e, f, g, h, a) 7655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_C(K) STEP(K, c, d, e, f, g, h, a, b) 7665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_D(K) STEP(K, d, e, f, g, h, a, b, c) 7675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_E(K) STEP(K, e, f, g, h, a, b, c, d) 7685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_F(K) STEP(K, f, g, h, a, b, c, d, e) 7695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_G(K) STEP(K, g, h, a, b, c, d, e, f) 7705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP_H(K) STEP(K, h, a, b, c, d, e, f, g) 7715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A( 0); STEP_B( 1); STEP_C( 2); STEP_D( 3); 7735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E( 4); STEP_F( 5); STEP_G( 6); STEP_H( 7); 7745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A( 8); STEP_B( 9); STEP_C(10); STEP_D(11); 7765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(12); STEP_F(13); STEP_G(14); STEP_H(15); 7775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A(16); STEP_B(17); STEP_C(18); STEP_D(19); 7795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(20); STEP_F(21); STEP_G(22); STEP_H(23); 7805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A(24); STEP_B(25); STEP_C(26); STEP_D(27); 7825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(28); STEP_F(29); STEP_G(30); STEP_H(31); 7835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_A(32); STEP_B(33); STEP_C(34); STEP_D(35); 7855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh STEP_E(36); STEP_F(37); STEP_G(38); STEP_H(39); 7865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S0 > L_max) { L_max = S0; Nc = lambda; } 7885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S1 > L_max) { L_max = S1; Nc = lambda + 1; } 7895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S2 > L_max) { L_max = S2; Nc = lambda + 2; } 7905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S3 > L_max) { L_max = S3; Nc = lambda + 3; } 7915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S4 > L_max) { L_max = S4; Nc = lambda + 4; } 7925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S5 > L_max) { L_max = S5; Nc = lambda + 5; } 7935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S6 > L_max) { L_max = S6; Nc = lambda + 6; } 7945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S7 > L_max) { L_max = S7; Nc = lambda + 7; } 7955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S8 > L_max) { L_max = S8; Nc = lambda + 8; } 7965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 7975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *Nc_out = Nc; 7985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 7995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max <= 0.) { 8005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 0; 8015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 8025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 8035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Compute the power of the reconstructed short term residual 8055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * signal dp[..] 8065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 8075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh dp_float -= Nc; 8085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power = 0; 8095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k < 40; ++k) { 8105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register float f = dp_float[k]; 8115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh L_power += f * f; 8125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 8135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (L_max >= L_power) { 8155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = 3; 8165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh return; 8175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 8185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Coding of the LTP gain 8205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Table 4.3a must be used to obtain the level DLB[i] for the 8215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * quantization of the LTP gain b to get the coded version bc. 8225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 8235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh lambda = L_max / L_power * 32768.; 8245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (bc = 0; bc <= 2; ++bc) if (lambda <= gsm_DLB[bc]) break; 8255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh *bc_out = bc; 8265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 8275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif /* FAST */ 8295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif /* USE_FLOAT_MUL */ 8305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 4.2.12 */ 8335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehstatic void Long_term_analysis_filtering P6((bc,Nc,dp,d,dpp,e), 8355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word bc, /* IN */ 8365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Nc, /* IN */ 8375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * dp, /* previous d [-120..-1] IN */ 8385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * d, /* d [0..39] IN */ 8395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * dpp, /* estimate [0..39] OUT */ 8405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * e /* long term res. signal [0..39] OUT */ 8415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 8425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 8435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * In this part, we have to decode the bc parameter to compute 8445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * the samples of the estimate dpp[0..39]. The decoding of bc needs the 8455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * use of table 4.3b. The long term residual signal e[0..39] 8465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * is then calculated to be fed to the RPE encoding section. 8475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 8485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 8495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int k; 8505e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register longword ltmp; 8515e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8525e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# undef STEP 8535e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh# define STEP(BP) \ 8545e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { \ 8555e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh dpp[k] = GSM_MULT_R( BP, dp[k - Nc]); \ 8565e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh e[k] = GSM_SUB( d[k], dpp[k] ); \ 8575e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 8585e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8595e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh switch (bc) { 8605e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh case 0: STEP( 3277 ); break; 8615e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh case 1: STEP( 11469 ); break; 8625e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh case 2: STEP( 21299 ); break; 8635e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh case 3: STEP( 32767 ); break; 8645e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 8655e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 8665e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8675e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehvoid Gsm_Long_Term_Predictor P7((S,d,dp,e,dpp,Nc,bc), /* 4x for 160 samples */ 8685e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8695e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh struct gsm_state * S, 8705e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8715e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * d, /* [0..39] residual signal IN */ 8725e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * dp, /* [-120..-1] d' IN */ 8735e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8745e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * e, /* [0..39] OUT */ 8755e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * dpp, /* [0..39] OUT */ 8765e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * Nc, /* correlation lag OUT */ 8775e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word * bc /* gain factor OUT */ 8785e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 8795e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 8805e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( d ); assert( dp ); assert( e ); 8815e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert( dpp); assert( Nc ); assert( bc ); 8825e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 8835e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#if defined(FAST) && defined(USE_FLOAT_MUL) 8845e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S->fast) 8855e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#if defined (LTP_CUT) 8865e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S->ltp_cut) 8875e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Cut_Fast_Calculation_of_the_LTP_parameters(S, 8885e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh d, dp, bc, Nc); 8895e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else 8905e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif /* LTP_CUT */ 8915e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Fast_Calculation_of_the_LTP_parameters(d, dp, bc, Nc ); 8925e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else 8935e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif /* FAST & USE_FLOAT_MUL */ 8945e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#ifdef LTP_CUT 8955e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh if (S->ltp_cut) 8965e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Cut_Calculation_of_the_LTP_parameters(S, d, dp, bc, Nc); 8975e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh else 8985e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh#endif 8995e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Calculation_of_the_LTP_parameters(d, dp, bc, Nc); 9005e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 9015e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Long_term_analysis_filtering( *bc, *Nc, dp, d, dpp, e ); 9025e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 9035e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 9045e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 4.3.2 */ 9055e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yehvoid Gsm_Long_Term_Synthesis_Filtering P5((S,Ncr,bcr,erp,drp), 9065e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh struct gsm_state * S, 9075e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 9085e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word Ncr, 9095e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word bcr, 9105e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * erp, /* [0..39] IN */ 9115e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register word * drp /* [-120..-1] IN, [-120..40] OUT */ 9125e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh) 9135e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh/* 9145e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * This procedure uses the bcr and Ncr parameter to realize the 9155e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * long term synthesis filtering. The decoding of bcr needs 9165e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * table 4.3b. 9175e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 9185e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh{ 9195e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register longword ltmp; /* for ADD */ 9205e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh register int k; 9215e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh word brp, drpp, Nr; 9225e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 9235e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Check the limits of Nr. 9245e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 9255e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh Nr = Ncr < 40 || Ncr > 120 ? S->nrp : Ncr; 9265e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh S->nrp = Nr; 9275e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(Nr >= 40 && Nr <= 120); 9285e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 9295e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Decoding of the LTP gain bcr 9305e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 9315e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh brp = gsm_QLB[ bcr ]; 9325e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 9335e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* Computation of the reconstructed short term residual 9345e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * signal drp[0..39] 9355e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 9365e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh assert(brp != MIN_WORD); 9375e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 9385e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 39; k++) { 9395e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh drpp = GSM_MULT_R( brp, drp[ k - Nr ] ); 9405e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh drp[k] = GSM_ADD( erp[k], drpp ); 9415e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh } 9425e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 9435e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh /* 9445e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * Update of the reconstructed short term residual signal 9455e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh * drp[ -1..-120 ] 9465e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh */ 9475e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh 9485e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh for (k = 0; k <= 119; k++) drp[ -120 + k ] = drp[ -80 + k ]; 9495e4516958690b9a1b2c98f88eeecba3edd2dbda4Chia-chi Yeh} 950