FreeCalypso > hg > efr-experiments
comparison src/g_code.c @ 0:56410792419a
src: original EFR source from ETSI
| author | Mychaela Falconia <falcon@freecalypso.org> |
|---|---|
| date | Wed, 03 Apr 2024 05:31:37 +0000 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:56410792419a |
|---|---|
| 1 /************************************************************************* | |
| 2 * | |
| 3 * FUNCTION: G_code | |
| 4 * | |
| 5 * PURPOSE: Compute the innovative codebook gain. | |
| 6 * | |
| 7 * DESCRIPTION: | |
| 8 * The innovative codebook gain is given by | |
| 9 * | |
| 10 * g = <x[], y[]> / <y[], y[]> | |
| 11 * | |
| 12 * where x[] is the target vector, y[] is the filtered innovative | |
| 13 * codevector, and <> denotes dot product. | |
| 14 * | |
| 15 *************************************************************************/ | |
| 16 | |
| 17 #include "typedef.h" | |
| 18 #include "basic_op.h" | |
| 19 #include "count.h" | |
| 20 #include "cnst.h" | |
| 21 | |
| 22 Word16 G_code ( /* out : Gain of innovation code */ | |
| 23 Word16 xn2[], /* in : target vector */ | |
| 24 Word16 y2[] /* in : filtered innovation vector */ | |
| 25 ) | |
| 26 { | |
| 27 Word16 i; | |
| 28 Word16 xy, yy, exp_xy, exp_yy, gain; | |
| 29 Word16 scal_y2[L_SUBFR]; | |
| 30 Word32 s; | |
| 31 | |
| 32 /* Scale down Y[] by 2 to avoid overflow */ | |
| 33 | |
| 34 for (i = 0; i < L_SUBFR; i++) | |
| 35 { | |
| 36 scal_y2[i] = shr (y2[i], 1); move16 (); | |
| 37 } | |
| 38 | |
| 39 /* Compute scalar product <X[],Y[]> */ | |
| 40 | |
| 41 s = 1L; move32 (); /* Avoid case of all zeros */ | |
| 42 for (i = 0; i < L_SUBFR; i++) | |
| 43 { | |
| 44 s = L_mac (s, xn2[i], scal_y2[i]); | |
| 45 } | |
| 46 exp_xy = norm_l (s); | |
| 47 xy = extract_h (L_shl (s, exp_xy)); | |
| 48 | |
| 49 /* If (xy < 0) gain = 0 */ | |
| 50 | |
| 51 test (); | |
| 52 if (xy <= 0) | |
| 53 return ((Word16) 0); | |
| 54 | |
| 55 /* Compute scalar product <Y[],Y[]> */ | |
| 56 | |
| 57 s = 0L; move32 (); | |
| 58 for (i = 0; i < L_SUBFR; i++) | |
| 59 { | |
| 60 s = L_mac (s, scal_y2[i], scal_y2[i]); | |
| 61 } | |
| 62 exp_yy = norm_l (s); | |
| 63 yy = extract_h (L_shl (s, exp_yy)); | |
| 64 | |
| 65 /* compute gain = xy/yy */ | |
| 66 | |
| 67 xy = shr (xy, 1); /* Be sure xy < yy */ | |
| 68 gain = div_s (xy, yy); | |
| 69 | |
| 70 /* Denormalization of division */ | |
| 71 i = add (exp_xy, 5); /* 15-1+9-18 = 5 */ | |
| 72 i = sub (i, exp_yy); | |
| 73 | |
| 74 gain = shr (gain, i); | |
| 75 | |
| 76 return (gain); | |
| 77 } |
