lagcount := 0 for j := 0 to 3 do begin smallag := maximum(Nj,N{j-1}) mod minimum(Nj,N{j-1}) if minimum(smallag,minimum(Nj,N{j-1})-smallag) < lthresh then increment(lagcount) end veryoldlagcount := oldlagcount oldlagcount := lagcount tone := false den := a[1]*a[1] num := 4*a[2] - a[1]*a[1] if ( num <= 0 ) return if (( a[1] < 0 ) AND ( num / den < freqth )) return 4 prederr := MULT (1 - RC[i]*RC[i]) i=1 if (prederr < predth) tone := true return vvad := pvad > thvad if vvad then increment(burstcount) else burstcount := 0 if burstcount >= burstconst then begin hangcount := hangconst; burstcount := burstconst end vad := vvad or (hangcount >= 0) if hangcount >= 0 then decrement(hangcount) IF ( scalauto < 0 ) THEN scalvad = 0; ELSE scalvad = scalauto; / keep scalvad for use in subclause 3.2 / IF ( L_ACF[0] == 0 ) THEN | e_pvad = -32768; | m_pvad = 0; | e_acf0 = -32768; | m_acf0 = 0; | EXIT /continue with subclause 3.2/ normacf = norm( L_ACF[0] ); | FOR i = 0 to 8: | sacf[i] = ( L_ACF[i] << normacf ) >> 19; | NEXT i: e_acf0 = add( 32, (scalvad << 1 ) ); e_acf0 = sub( e_acf0, normacf); m_acf0 = sacf[0] << 3; e_pvad = add( e_acf0, 14 ); e_pvad = sub( e_pvad, normrvad ); L_temp = 0; | FOR i = 1 to 8: | L_temp = L_add( L_temp, L_mult( sacf[i], rvad[i] ) ); | NEXT i: L_temp = L_add( L_temp, L_mult( sacf[0], rvad[0] ) >> 1 ); IF ( L_temp <= 0 ) THEN L_temp = 1; normprod = norm( L_temp ); e_pvad = sub( e_pvad, normprod ); m_pvad = ( L_temp << normprod ) >> 16; scal = sub( 10, (scalvad << 1) ); | FOR i = 0 to 8: | L_temp = L_ACF[i] >> scal; | L_av0[i] = L_add( L_sacf[i], L_temp ); | L_av0[i] = L_add( L_sacf[i+9], L_av0[i] ); | L_av0[i] = L_add( L_sacf[i+18], L_av0[i] ); | L_sacf[ pt_sacf + i ] = L_temp; | L_av1[i] = L_sav0[ pt_sav0 + i ]; | L_sav0[ pt_sav0 + i] = L_av0[i]; | NEXT i: IF ( pt_sacf == 18 ) THEN pt_sacf = 0; ELSE pt_sacf = add( pt_sacf, 9); IF ( pt_sav0 == 27 ) THEN pt_sav0 = 0; ELSE pt_sav0 = add( pt_sav0, 9); IF( L_av1[0] == 0 ) THEN |== FOR i = 1 to 8: | vpar[i] = 0; |== NEXT i: | EXIT; /continue with subclause 3.3.2/ temp = norm( L_av1[0] ); |== FOR k=0 to 8: | sacf[k] = ( L_av1[k] << temp ) >> 16; |== NEXT k: |== FOR i=1 to 7: | K[9-i] = sacf[i]; |== NEXT i: |== FOR i=0 to 8: | P[i] = sacf[i]; |== NEXT i: |== FOR n=1 to 8: | IF( P[0] < abs( P[1] ) ) THEN | |== FOR i = n to 8: | | vpar[i] = 0; | |== NEXT i: | | EXIT; /continue with | | subclause 3.3.2/ | vpar[n] = div( abs( P[1] ), P[0] ); | IF ( P[1] > 0 ) THEN vpar[n] = sub( 0, vpar[n] ); | IF ( n == 8 ) THEN EXIT; /continue with subclause 3.3.2/ | | Schur recursion: | | P[0] = add( P[0], mult_r( P[1], vpar[n] ) ); |==== FOR m=1 to 8-n: | P[m] = add( P[m+1], mult_r( K[9-m], vpar[n] ) ); | K[9-m] = add( K[9-m], mult_r( P[m+1], vpar[n] ) ); |==== NEXT m: | |== NEXT n: L_coef[0] = 16384 << 15; L_coef[1] = vpar[1] << 14; |= FOR m = 2 to 8: |== FOR i = 1 to m-1: |== temp = L_coef[m-i] >> 16; / takes the msb / |== L_work[i] = L_add( L_coef[i], L_mult( vpar[m], temp ) ); |== NEXT i |= |== FOR i = 1 to m-1: |== L_coef[i] = L_work[i]; |== NEXT i |= |= L_coef[m] = vpar[m] << 14; |= NEXT m: | FOR i = 0 to 8: | aav1[i] = L_coef[i] >> 19; | NEXT i: |= FOR i= 0 to 8: |= L_work[i] = 0; |== FOR k = 0 to 8-i: |== L_work[i] = L_add( L_work[i], L_mult( aav1[k], aav1[k+i] ) ); |== NEXT k: |= NEXT i: IF ( L_work[0] == 0 ) THEN normrav1 =0; ELSE normrav1 = norm( L_work[0] ); |= FOR i= 0 to 8: |= rav1[i] = ( L_work[i] << normrav1 ) >> 16; |= NEXT i: Keep the normrav1 for use in subclause 3.4 and 3.6. IF ( L_av0[0] == 0 ) THEN | FOR i = 0 to 8: | sav0[i] = 4095; | NEXT i: ELSE | shift = norm( L_av0[0] ); |= FOR i = 0 to 8: |= sav0[i] = ( L_av0[i] << shift-3 ) >> 16; |= NEXT i: L_ S p = 0; |= FOR i = 1 to 8: |= L_ S p = L_add( L_ S p, L_mult( rav1[i], sav0[i] ) ); |= NEXT i: IF ( L_ S p < 0 ) THEN L_temp = L_sub( 0, L_ S p ); ELSE L_temp = L_ S p; IF ( L_temp == 0 ) THEN | L_dm = 0; | shift = 0; ELSE | sav0[0] = sav0[0] << 3; | shift = norm( L_temp ); | temp = ( L_temp << shift ) >> 16; | IF ( sav0[0] >= temp ) THEN | | divshift = 0; | | temp = div( temp, sav0[0] ); | ELSE | | divshift = 1; | | temp = sub( temp, sav0[0] ); | | temp = div( temp, sav0[0] ); | | IF( divshift == 1 ) THEN L_dm = 32768; | ELSE L_dm = 0; | | L_dm = L_add( L_dm, temp) << 1; | IF( L_ S p < 0 ) THEN L_dm = L_sub( 0, L_dm); L_dm = ( L_dm << 14 ); L_dm = L_dm >> shift; L_dm = L_add( L_dm, ( rav1[0] << 11 ) ); L_dm = L_dm >> normrav1; L_temp = L_sub( L_dm, L_lastdm ); L_lastdm = L_dm; IF ( L_temp < 0 ) THEN L_temp = L_sub( 0, L_temp ); L_temp = L_sub( L_temp, 3277 ); IF ( L_temp < 0 ) THEN stat = 1; ELSE stat = 0; temp = add( oldlagcount, veryoldlagcount ); IF ( temp >= 4 ) THEN ptch = 1; ELSE ptch = 0; comp = 0; IF ( e_acf0 < E_PTH ) THEN comp = 1; IF ( e_acf0 == E_PTH ) THEN IF ( m_acf0 < M_PTH ) THEN comp =1; IF ( comp == 1 ) THEN | e_thvad = E_PLEV; | m_thvad = M_PLEV; | EXIT; /continue with subclause 3.7/ comp = 0; IF ( ptch == 1 ) THEN comp = 1; IF ( stat == 0 ) THEN comp = 1; IF ( tone == 1 ) THEN comp = 1; IF ( comp == 1 ) THEN | adaptcount = 0; | EXIT; /continue with subclause 3.7/ adaptcount = add( adaptcount, 1 ); IF ( adaptcount <= 8 ) THEN EXIT; /continue with subclause 3.7/ m_thvad = sub( m_thvad, (m_thvad >> 5 ) ); IF ( m_thvad < 16384) THEN | m_thvad = m_thvad << 1; | e_thvad = sub( e_thvad, 1 ); L_temp = L_add( m_pvad, m_pvad ); L_temp = L_add( L_temp, m_pvad ); L_temp = L_temp >> 1; e_temp = add( e_pvad, 1 ); IF ( L_temp > 32767 ) THEN | L_temp = L_temp >> 1; | e_temp = add( e_temp, 1 ); m_temp = L_temp; comp = 0; IF ( e_thvad < e_temp) THEN comp = 1; IF (e_thvad == e_temp) THEN IF (m_thvad < m_temp) THEN comp =1; IF ( comp == 1 ) THEN | Compute thvad +(thvad/inc). | L_temp = L_add( m_thvad, (m_thvad >> 4 ) ); | IF ( L_temp > 32767 ) THEN | | m_thvad = L_temp >> 1; | | e_thvad = add( e_thvad,1 ); | ELSE m_thvad = L_temp; | comp2 = 0; | IF ( e_temp < e_thvad) THEN comp2 = 1; | IF (e_temp == e__hvad) THEN IF (m_temp> 1; | e_temp = add( e_pvad, 1 ); ELSE | IF ( e_pvad > E_MARGIN ) THEN | | temp = sub( e_pvad, E_MARGIN ); | | temp = M_MARGIN >> temp; | | L_temp = L_add( m_pvad, temp ); | | IF ( L_temp > 32767) THEN | | | e_temp = add( e_pvad, 1 ); | | | m_temp = L_temp >> 1; | | ELSE | | | e_temp = e_pvad; | | | m_temp = L_temp; | ELSE | | temp = sub( E_MARGIN, e_pvad ); | | temp = m_pvad >> temp; | | L_temp = L_add( M_MARGIN, temp ); | | IF (L_temp > 32767) THEN | | | e_temp = add( E_MARGIN, 1); | | | m_temp = L_temp >> 1; | | ELSE | | | e_temp = E_MARGIN; | | | m_temp = L_temp; comp = 0; IF ( e_thvad > e_temp) THEN comp = 1; IF (e_thvad == e_temp) THEN IF (m_thvad > m_temp) THEN comp =1; IF ( comp == 1 ) THEN | e_thvad = e_temp; | m_thvad = m_temp; normrvad = normrav1; |= FOR i = 0 to 8: |= rvad[i] = rav1[i]; |= NEXT i: adaptcount = 9; vvad = 0; IF (e_pvad > e_thvad) THEN vvad = 1; IF (e_pvad == e_thvad) THEN IF (m_pvad > m_thvad) THEN vvad =1; IF ( vvad == 1 ) THEN burstcount = add( burstcount, 1 ); ELSE burstcount = 0; IF ( burstcount >= 3 ) THEN | hangcount = 5; | burstcount = 3; vad = vvad; IF ( hangcount >= 0 ) THEN | vad = 1; | hangcount = sub( hangcount, 1 ); lagcount = 0; |= FOR i = 0 to 3: |= Search the maximum and minimum of consecutive lags. |= IF ( oldlag > lags[i] ) THEN |= | minlag = lags[i]; |= | maxlag = oldlag; |= ELSE |= | minlag = oldlag; |= | maxlag = lags[i] ; |= |= Compute smallag (modulo operation not defined ): |= |= smallag = maxlag; |== | FOR j = 0 to 2: |== | IF (smallag >= minlag) THEN smallag =sub( smallag, minlag); |== | NEXT j; |= |= Minimum of smallag and minlag - smallag: |= |= temp = sub( minlag, smallag ); |= IF ( temp < smallag ) THEN smallag = temp; |= IF ( smallag < 2 ) THEN lagcount = add( lagcount, 1 ); |= Save the current LTP lag. |= oldlag = lags[i]; |= NEXT i: veryoldlagcount = oldlagcount; oldlagcount = lagcount; |== FOR i = 0 to 79: | sofh[i] = mult_r( sof[i], hann[i] ); | sofh[159-i] = mult_r( sof[159-i], hann[i] ); |== NEXT i; smax = 0; |== FOR k = 0 to 159: | temp = abs( sofh[k] ); | IF ( temp > smax ) THEN smax = temp; |== NEXT k; IF ( smax == 0 ) THEN scalauto = 0; ELSE scalauto = sub( 4, norm( smax << 16)); IF ( scalauto > 0 ) THEN | temp = 16384 >> sub( scalauto,1); |== FOR k = 0 to 159: | sofh[k] = mult_r( sofh[k], temp); |== NEXT k: |== FOR k=0 to 4: | L_acfh[k] = 0; |==== FOR i=k to 159: | L_temp = L_mult( sofh[i], sofh[i-k] ); | L_acfh[k] = L_add( L_acfh[k], L_temp ); |==== NEXT i: |== NEXT k: IF( L_acfh[0] == 0 ) THEN |== FOR i = 1 to 4: | rc[i] = 0; |== NEXT i: | EXIT; /continue with subclause 3.10.4/ temp = norm( L_acfh[0] ); |== FOR k=0 to 4: | sacf[k] = ( L_acfh[k] << temp ) >> 16; |== NEXT k: |== FOR i=1 to 3: | K[5-i] = sacf[i]; |== NEXT i: |== FOR i=0 to 4: | P[i] = sacf[i]; |== NEXT i: |== FOR n=1 to 4: | IF( P[0] < abs( P[1] ) ) THEN | |== FOR i = n to 4: | | rc[i] = 0; | |== NEXT i: | | EXIT; /continue with subclause 3.10.4/ | rc[n] = div( abs( P[1] ), P[0] ); | IF ( P[1] > 0 ) THEN rc[n] = sub( 0, rc[n] ); | IF ( n == 4 ) THEN EXIT; /continue with subclause 3.10.4/ | | | P[0] = add( P[0], mult_r( P[1], rc[n] ) ); |==== FOR m=1 to 4-n: | P[m] = add( P[m+1], mult_r( K[5-m], rc[n] ) ); | K[5-m] = add( K[5-m], mult_r( P[m+1], rc[n] ) ); |==== NEXT m: | |== NEXT n: temp = rc[1] >> 2; a[1] = add( temp, mult_r( rc[2], temp ) ); a[2] = rc[2] >> 2; L_den = L_mult ( a[1], a[1] ); L_temp = a[2] << 16; L_num = L_sub ( L_temp, L_den ); IF ( L_num <= 0 ) THEN | tone = 0; | EXIT; /clause 3 complete/ IF ( a[1] < 0) THEN | temp = L_den >> 16; | L_den = L_mult ( temp, 3189 ); | L_temp = L_sub ( L_num, L_den ); | IF ( L_temp < 0 ) THEN | tone = 0; | EXIT; /clause 3 complete/ prederr = 32767; |== FOR i=1 to 4 | temp = mult ( rc[i], rc[i] ); | temp = sub ( 32767, temp); | prederr = mult( prederr, temp ); |== NEXT i; temp = sub ( prederr, 1464 ); IF ( temp < 0 ) THEN tone = 1; ELSE tone = 0; LAR(1): bit 15 := 1 if VAD on bit 15 := 0 if VAD 0ff LAR(2): bit 15 := 1 if SP on bit 15 := 0 if SP off | FOR i = 1 to 8: | L_Temp = 2; /* const. for rounding*/ | | FOR n = 1 to 4: | | L_Temp1 = LAR[j-n](i); /*conversion 16 --> 32 bit*/ | | L_Temp = L_Add( L_Temp , L_Temp1 ); | | NEXT n | L_Temp = L_temp >> 2; | mean (LAR(i)) = L_Temp; /*conversion 32 --> 16 bit*/ | NEXT i; L_Temp = 8; /* const. for rounding*/ | FOR n = 1 to 4: | | FOR i = 1 to 4: | | L_Temp1 = xmax[j-n](i); /*conversion 16 --> 32 bit*/ | | L_Temp = L_Add( L_Temp , L_Temp1 ); | | NEXT i | NEXT n L_Temp = L_Temp >> 4; mean (xmax) = L_Temp; /*conversion 32 --> 16 bit*/ Page 36 ETS 300 965 (GSM 06.32 version 5.0.3): March 1998 Page 7 ETS 300 965 (GSM 06.32 version 5.0.3): March 1998