FreeCalypso > hg > efr-experiments
annotate src/g_pitch.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 |
rev | line source |
---|---|
0
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /************************************************************************* |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
2 * |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 * FUNCTION: G_pitch |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 * |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 * PURPOSE: Compute the pitch (adaptive codebook) gain. Result in Q12 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 * |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 * DESCRIPTION: |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 * The adaptive codebook gain is given by |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 * |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 * g = <x[], y[]> / <y[], y[]> |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 * |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 * where x[] is the target vector, y[] is the filtered adaptive |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
13 * codevector, and <> denotes dot product. |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
14 * The gain is limited to the range [0,1.2] |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 * |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
16 *************************************************************************/ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
17 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
18 #include "typedef.h" |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
19 #include "basic_op.h" |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
20 #include "oper_32b.h" |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
21 #include "count.h" |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
22 #include "sig_proc.h" |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
23 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
24 Word16 G_pitch ( /* (o) : Gain of pitch lag saturated to 1.2 */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
25 Word16 xn[], /* (i) : Pitch target. */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
26 Word16 y1[], /* (i) : Filtered adaptive codebook. */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
27 Word16 L_subfr /* : Length of subframe. */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
28 ) |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
29 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
30 Word16 i; |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
31 Word16 xy, yy, exp_xy, exp_yy, gain; |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
32 Word32 s; |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
33 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
34 Word16 scaled_y1[80]; /* Usually dynamic allocation of (L_subfr) */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
35 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
36 /* divide by 2 "y1[]" to avoid overflow */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
37 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
38 for (i = 0; i < L_subfr; i++) |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
39 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
40 scaled_y1[i] = shr (y1[i], 2); move16 (); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
41 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
42 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
43 /* Compute scalar product <y1[],y1[]> */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
44 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
45 s = 0L; move32 (); /* Avoid case of all zeros */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
46 for (i = 0; i < L_subfr; i++) |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
47 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
48 s = L_mac (s, y1[i], y1[i]); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
49 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
50 test (); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
51 if (L_sub (s, MAX_32) != 0L) /* Test for overflow */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
52 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
53 s = L_add (s, 1L); /* Avoid case of all zeros */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
54 exp_yy = norm_l (s); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
55 yy = round (L_shl (s, exp_yy)); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
56 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
57 else |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
58 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
59 s = 1L; move32 (); /* Avoid case of all zeros */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
60 for (i = 0; i < L_subfr; i++) |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
61 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
62 s = L_mac (s, scaled_y1[i], scaled_y1[i]); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
63 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
64 exp_yy = norm_l (s); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
65 yy = round (L_shl (s, exp_yy)); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
66 exp_yy = sub (exp_yy, 4); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
67 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
68 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
69 /* Compute scalar product <xn[],y1[]> */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
70 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
71 Overflow = 0; move16 (); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
72 s = 1L; move32 (); /* Avoid case of all zeros */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
73 for (i = 0; i < L_subfr; i++) |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
74 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
75 Carry = 0; move16 (); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
76 s = L_macNs (s, xn[i], y1[i]); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
77 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
78 test (); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
79 if (Overflow != 0) |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
80 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
81 break; |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
82 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
83 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
84 test (); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
85 if (Overflow == 0) |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
86 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
87 exp_xy = norm_l (s); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
88 xy = round (L_shl (s, exp_xy)); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
89 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
90 else |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
91 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
92 s = 1L; move32 (); /* Avoid case of all zeros */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
93 for (i = 0; i < L_subfr; i++) |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
94 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
95 s = L_mac (s, xn[i], scaled_y1[i]); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
96 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
97 exp_xy = norm_l (s); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
98 xy = round (L_shl (s, exp_xy)); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
99 exp_xy = sub (exp_xy, 2); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
100 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
101 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 /* If (xy < 4) gain = 0 */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
103 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 i = sub (xy, 4); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 test (); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 if (i < 0) |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 return ((Word16) 0); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 /* compute gain = xy/yy */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
111 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 xy = shr (xy, 1); /* Be sure xy < yy */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 gain = div_s (xy, yy); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 i = add (exp_xy, 3 - 1); /* Denormalization of division */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 i = sub (i, exp_yy); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 gain = shr (gain, i); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 /* if(gain >1.2) gain = 1.2 */ |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 test (); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 if (sub (gain, 4915) > 0) |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 { |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 gain = 4915; move16 (); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
126 } |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
127 return (gain); |
56410792419a
src: original EFR source from ETSI
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
128 } |