Mercurial > libavcodec.hg
annotate acelp_pitch_delay.h @ 10295:916c2b7ecd02 libavcodec
Move variable declaration to inside of loop.
author | jbr |
---|---|
date | Sun, 27 Sep 2009 06:38:57 +0000 |
parents | c8743c33eeef |
children | afad312b9989 |
rev | line source |
---|---|
7170
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
1 /* |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
2 * gain code, gain pitch and pitch delay decoding |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
3 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
4 * Copyright (c) 2008 Vladimir Voroshilov |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
5 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
6 * This file is part of FFmpeg. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
7 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
9 * modify it under the terms of the GNU Lesser General Public |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
10 * License as published by the Free Software Foundation; either |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
12 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
16 * Lesser General Public License for more details. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
17 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
18 * You should have received a copy of the GNU Lesser General Public |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
21 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
22 |
7760 | 23 #ifndef AVCODEC_ACELP_PITCH_DELAY_H |
24 #define AVCODEC_ACELP_PITCH_DELAY_H | |
7170
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
25 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
26 #include <stdint.h> |
8505
c8743c33eeef
Remove duplicated dot product code. Use dsputil's
reynaldo
parents:
7760
diff
changeset
|
27 #include "dsputil.h" |
7170
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
28 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
29 #define PITCH_DELAY_MIN 20 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
30 #define PITCH_DELAY_MAX 143 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
31 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
32 /** |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
33 * \brief Decode pitch delay of the first subframe encoded by 8 bits with 1/3 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
34 * resolution. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
35 * \param ac_index adaptive codebook index (8 bits) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
36 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
37 * \return pitch delay in 1/3 units |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
38 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
39 * Pitch delay is coded: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
40 * with 1/3 resolution, 19 < pitch_delay < 85 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
41 * integers only, 85 <= pitch_delay <= 143 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
42 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
43 int ff_acelp_decode_8bit_to_1st_delay3(int ac_index); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
44 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
45 /** |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
46 * \brief Decode pitch delay of the second subframe encoded by 5 or 6 bits |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
47 * with 1/3 precision. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
48 * \param ac_index adaptive codebook index (5 or 6 bits) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
49 * \param pitch_delay_min lower bound (integer) of pitch delay interval |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
50 * for second subframe |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
51 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
52 * \return pitch delay in 1/3 units |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
53 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
54 * Pitch delay is coded: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
55 * with 1/3 resolution, -6 < pitch_delay - int(prev_pitch_delay) < 5 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
56 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
57 * \remark The routine is used in G.729 @8k, AMR @10.2k, AMR @7.95k, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
58 * AMR @7.4k for the second subframe. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
59 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
60 int ff_acelp_decode_5_6_bit_to_2nd_delay3( |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
61 int ac_index, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
62 int pitch_delay_min); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
63 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
64 /** |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
65 * \brief Decode pitch delay with 1/3 precision. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
66 * \param ac_index adaptive codebook index (4 bits) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
67 * \param pitch_delay_min lower bound (integer) of pitch delay interval for |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
68 * second subframe |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
69 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
70 * \return pitch delay in 1/3 units |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
71 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
72 * Pitch delay is coded: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
73 * integers only, -6 < pitch_delay - int(prev_pitch_delay) <= -2 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
74 * with 1/3 resolution, -2 < pitch_delay - int(prev_pitch_delay) < 1 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
75 * integers only, 1 <= pitch_delay - int(prev_pitch_delay) < 5 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
76 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
77 * \remark The routine is used in G.729 @6.4k, AMR @6.7k, AMR @5.9k, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
78 * AMR @5.15k, AMR @4.75k for the second subframe. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
79 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
80 int ff_acelp_decode_4bit_to_2nd_delay3( |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
81 int ac_index, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
82 int pitch_delay_min); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
83 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
84 /** |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
85 * \brief Decode pitch delay of the first subframe encoded by 9 bits |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
86 * with 1/6 precision. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
87 * \param ac_index adaptive codebook index (9 bits) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
88 * \param pitch_delay_min lower bound (integer) of pitch delay interval for |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
89 * second subframe |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
90 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
91 * \return pitch delay in 1/6 units |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
92 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
93 * Pitch delay is coded: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
94 * with 1/6 resolution, 17 < pitch_delay < 95 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
95 * integers only, 95 <= pitch_delay <= 143 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
96 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
97 * \remark The routine is used in AMR @12.2k for the first and third subframes. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
98 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
99 int ff_acelp_decode_9bit_to_1st_delay6(int ac_index); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
100 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
101 /** |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
102 * \brief Decode pitch delay of the second subframe encoded by 6 bits |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
103 * with 1/6 precision. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
104 * \param ac_index adaptive codebook index (6 bits) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
105 * \param pitch_delay_min lower bound (integer) of pitch delay interval for |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
106 * second subframe |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
107 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
108 * \return pitch delay in 1/6 units |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
109 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
110 * Pitch delay is coded: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
111 * with 1/6 resolution, -6 < pitch_delay - int(prev_pitch_delay) < 5 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
112 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
113 * \remark The routine is used in AMR @12.2k for the second and fourth subframes. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
114 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
115 int ff_acelp_decode_6bit_to_2nd_delay6( |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
116 int ac_index, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
117 int pitch_delay_min); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
118 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
119 /** |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
120 * \brief Update past quantized energies |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
121 * \param quant_energy [in/out] past quantized energies (5.10) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
122 * \param gain_corr_factor gain correction factor |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
123 * \param log2_ma_pred_order log2() of MA prediction order |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
124 * \param erasure frame erasure flag |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
125 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
126 * If frame erasure flag is not equal to zero, memory is updated with |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
127 * averaged energy, attenuated by 4dB: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
128 * max(avg(quant_energy[i])-4, -14), i=0,ma_pred_order |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
129 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
130 * In normal mode memory is updated with |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
131 * Er - Ep = 20 * log10(gain_corr_factor) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
132 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
133 * \remark The routine is used in G.729 and AMR (all modes). |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
134 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
135 void ff_acelp_update_past_gain( |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
136 int16_t* quant_energy, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
137 int gain_corr_factor, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
138 int log2_ma_pred_order, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
139 int erasure); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
140 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
141 /** |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
142 * \brief Decode the adaptive codebook gain and add |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
143 * correction (4.1.5 and 3.9.1 of G.729). |
8505
c8743c33eeef
Remove duplicated dot product code. Use dsputil's
reynaldo
parents:
7760
diff
changeset
|
144 * \param dsp initialized dsputil context |
7170
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
145 * \param gain_corr_factor gain correction factor (2.13) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
146 * \param fc_v fixed-codebook vector (2.13) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
147 * \param mr_energy mean innovation energy and fixed-point correction (7.13) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
148 * \param quant_energy [in/out] past quantized energies (5.10) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
149 * \param subframe_size length of subframe |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
150 * \param ma_pred_order MA prediction order |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
151 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
152 * \return quantized fixed-codebook gain (14.1) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
153 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
154 * The routine implements equations 69, 66 and 71 of the G.729 specification (3.9.1) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
155 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
156 * Em - mean innovation energy (dB, constant, depends on decoding algorithm) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
157 * Ep - mean-removed predicted energy (dB) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
158 * Er - mean-removed innovation energy (dB) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
159 * Ei - mean energy of the fixed-codebook contribution (dB) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
160 * N - subframe_size |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
161 * M - MA (Moving Average) prediction order |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
162 * gc - fixed-codebook gain |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
163 * gc_p - predicted fixed-codebook gain |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
164 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
165 * Fixed codebook gain is computed using predicted gain gc_p and |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
166 * correction factor gain_corr_factor as shown below: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
167 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
168 * gc = gc_p * gain_corr_factor |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
169 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
170 * The predicted fixed codebook gain gc_p is found by predicting |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
171 * the energy of the fixed-codebook contribution from the energy |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
172 * of previous fixed-codebook contributions. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
173 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
174 * mean = 1/N * sum(i,0,N){ fc_v[i] * fc_v[i] } |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
175 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
176 * Ei = 10log(mean) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
177 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
178 * Er = 10log(1/N * gc^2 * mean) - Em = 20log(gc) + Ei - Em |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
179 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
180 * Replacing Er with Ep and gc with gc_p we will receive: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
181 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
182 * Ep = 10log(1/N * gc_p^2 * mean) - Em = 20log(gc_p) + Ei - Em |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
183 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
184 * and from above: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
185 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
186 * gc_p = 10^((Ep - Ei + Em) / 20) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
187 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
188 * Ep is predicted using past energies and prediction coefficients: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
189 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
190 * Ep = sum(i,0,M){ ma_prediction_coeff[i] * quant_energy[i] } |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
191 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
192 * gc_p in fixed-point arithmetic is calculated as following: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
193 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
194 * mean = 1/N * sum(i,0,N){ (fc_v[i] / 2^13) * (fc_v[i] / 2^13) } = |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
195 * = 1/N * sum(i,0,N) { fc_v[i] * fc_v[i] } / 2^26 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
196 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
197 * Ei = 10log(mean) = -10log(N) - 10log(2^26) + |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
198 * + 10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
199 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
200 * Ep - Ei + Em = Ep + Em + 10log(N) + 10log(2^26) - |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
201 * - 10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) = |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
202 * = Ep + mr_energy - 10log(sum(i,0,N) { fc_v[i] * fc_v[i] }) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
203 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
204 * gc_p = 10 ^ ((Ep - Ei + Em) / 20) = |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
205 * = 2 ^ (3.3219 * (Ep - Ei + Em) / 20) = 2 ^ (0.166 * (Ep - Ei + Em)) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
206 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
207 * where |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
208 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
209 * mr_energy = Em + 10log(N) + 10log(2^26) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
210 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
211 * \remark The routine is used in G.729 and AMR (all modes). |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
212 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
213 int16_t ff_acelp_decode_gain_code( |
8505
c8743c33eeef
Remove duplicated dot product code. Use dsputil's
reynaldo
parents:
7760
diff
changeset
|
214 DSPContext *dsp, |
7170
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
215 int gain_corr_factor, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
216 const int16_t* fc_v, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
217 int mr_energy, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
218 const int16_t* quant_energy, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
219 const int16_t* ma_prediction_coeff, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
220 int subframe_size, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
221 int max_pred_order); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
222 |
7760 | 223 #endif /* AVCODEC_ACELP_PITCH_DELAY_H */ |