Mercurial > libavcodec.hg
annotate acelp_pitch_delay.h @ 7929:5b81784c5fe6 libavcodec
Simplify: avoid duplication backward_filter()
author | vitor |
---|---|
date | Fri, 26 Sep 2008 18:42:06 +0000 |
parents | c4a4495715dd |
children | c8743c33eeef |
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> |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
27 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
28 #define PITCH_DELAY_MIN 20 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
29 #define PITCH_DELAY_MAX 143 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
30 |
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 * \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
|
33 * resolution. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
34 * \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
|
35 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
36 * \return pitch delay in 1/3 units |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
37 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
38 * Pitch delay is coded: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
39 * 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
|
40 * integers only, 85 <= pitch_delay <= 143 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
41 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
42 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
|
43 |
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 * \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
|
46 * with 1/3 precision. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
47 * \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
|
48 * \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
|
49 * for second subframe |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
50 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
51 * \return pitch delay in 1/3 units |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
52 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
53 * Pitch delay is coded: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
54 * 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
|
55 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
56 * \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
|
57 * AMR @7.4k for the second subframe. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
58 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
59 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
|
60 int ac_index, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
61 int pitch_delay_min); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
62 |
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 * \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
|
65 * \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
|
66 * \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
|
67 * second subframe |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
68 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
69 * \return pitch delay in 1/3 units |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
70 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
71 * Pitch delay is coded: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
72 * 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
|
73 * 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
|
74 * 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
|
75 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
76 * \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
|
77 * 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
|
78 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
79 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
|
80 int ac_index, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
81 int pitch_delay_min); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
82 |
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 * \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
|
85 * with 1/6 precision. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
86 * \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
|
87 * \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
|
88 * second subframe |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
89 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
90 * \return pitch delay in 1/6 units |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
91 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
92 * Pitch delay is coded: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
93 * 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
|
94 * integers only, 95 <= pitch_delay <= 143 |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
95 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
96 * \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
|
97 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
98 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
|
99 |
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 * \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
|
102 * with 1/6 precision. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
103 * \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
|
104 * \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
|
105 * second subframe |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
106 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
107 * \return pitch delay in 1/6 units |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
108 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
109 * Pitch delay is coded: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
110 * 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
|
111 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
112 * \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
|
113 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
114 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
|
115 int ac_index, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
116 int pitch_delay_min); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
117 |
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 * \brief Update past quantized energies |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
120 * \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
|
121 * \param gain_corr_factor gain correction factor |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
122 * \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
|
123 * \param erasure frame erasure flag |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
124 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
125 * 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
|
126 * averaged energy, attenuated by 4dB: |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
127 * 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
|
128 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
129 * In normal mode memory is updated with |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
130 * Er - Ep = 20 * log10(gain_corr_factor) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
131 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
132 * \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
|
133 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
134 void ff_acelp_update_past_gain( |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
135 int16_t* quant_energy, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
136 int gain_corr_factor, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
137 int log2_ma_pred_order, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
138 int erasure); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
139 |
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 * \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
|
142 * correction (4.1.5 and 3.9.1 of G.729). |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
143 * \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
|
144 * \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
|
145 * \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
|
146 * \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
|
147 * \param subframe_size length of subframe |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
148 * \param ma_pred_order MA prediction order |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
149 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
150 * \return quantized fixed-codebook gain (14.1) |
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 * 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
|
153 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
154 * 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
|
155 * Ep - mean-removed predicted energy (dB) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
156 * Er - mean-removed innovation energy (dB) |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
157 * 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
|
158 * N - subframe_size |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
159 * M - MA (Moving Average) prediction order |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
160 * gc - fixed-codebook gain |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
161 * gc_p - predicted fixed-codebook gain |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
162 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
163 * 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
|
164 * 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
|
165 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
166 * gc = gc_p * gain_corr_factor |
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 * 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
|
169 * 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
|
170 * of previous fixed-codebook contributions. |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
171 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
172 * 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
|
173 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
174 * Ei = 10log(mean) |
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 * 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
|
177 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
178 * 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
|
179 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
180 * 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
|
181 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
182 * and from above: |
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 * gc_p = 10^((Ep - Ei + Em) / 20) |
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 * 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
|
187 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
188 * 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
|
189 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
190 * 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
|
191 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
192 * 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
|
193 * = 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
|
194 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
195 * 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
|
196 * + 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
|
197 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
198 * 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
|
199 * - 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
|
200 * = 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
|
201 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
202 * gc_p = 10 ^ ((Ep - Ei + Em) / 20) = |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
203 * = 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
|
204 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
205 * where |
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 * 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
|
208 * |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
209 * \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
|
210 */ |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
211 int16_t ff_acelp_decode_gain_code( |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
212 int gain_corr_factor, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
213 const int16_t* fc_v, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
214 int mr_energy, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
215 const int16_t* quant_energy, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
216 const int16_t* ma_prediction_coeff, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
217 int subframe_size, |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
218 int max_pred_order); |
04da42c2b7b4
gain code, gain pitch and pitch delay decoding for ACELP based codecs
voroshil
parents:
diff
changeset
|
219 |
7760 | 220 #endif /* AVCODEC_ACELP_PITCH_DELAY_H */ |