annotate Input/aac/libfaad2/sbr_hfadj.c @ 9:b6c614e106df trunk

[svn] Remove a stamp-po to fix a compile error.
author nenolod
date Mon, 24 Oct 2005 13:55:57 -0700
parents 6efb9e514224
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
1 /*
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
3 ** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
4 **
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
5 ** This program is free software; you can redistribute it and/or modify
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
6 ** it under the terms of the GNU General Public License as published by
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
7 ** the Free Software Foundation; either version 2 of the License, or
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
8 ** (at your option) any later version.
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
9 **
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
10 ** This program is distributed in the hope that it will be useful,
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
13 ** GNU General Public License for more details.
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
14 **
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
15 ** You should have received a copy of the GNU General Public License
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
16 ** along with this program; if not, write to the Free Software
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
18 **
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
19 ** Any non-GPL usage of this software or parts of this software is strictly
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
20 ** forbidden.
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
21 **
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
22 ** Commercial non-GPL licensing of this software is possible.
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
24 **
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
25 ** $Id: sbr_hfadj.c,v 1.8 2003/11/12 20:47:58 menno Exp $
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
26 **/
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
27
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
28 /* High Frequency adjustment */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
29
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
30 #include "common.h"
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
31 #include "structs.h"
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
32
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
33 #ifdef SBR_DEC
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
34
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
35 #include "sbr_syntax.h"
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
36 #include "sbr_hfadj.h"
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
37
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
38 #include "sbr_noise.h"
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
39
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
40 void hf_adjustment(sbr_info *sbr, qmf_t Xsbr[MAX_NTSRHFG][64]
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
41 #ifdef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
42 ,real_t *deg /* aliasing degree */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
43 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
44 ,uint8_t ch)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
45 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
46 sbr_hfadj_info adj = {0};
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
47
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
48 map_noise_data(sbr, &adj, ch);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
49 map_sinusoids(sbr, &adj, ch);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
50
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
51 estimate_current_envelope(sbr, &adj, Xsbr, ch);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
52
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
53 calculate_gain(sbr, &adj, ch);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
54
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
55 #ifdef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
56 calc_gain_groups(sbr, &adj, deg, ch);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
57 aliasing_reduction(sbr, &adj, deg, ch);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
58 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
59
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
60 hf_assembly(sbr, &adj, Xsbr, ch);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
61 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
62
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
63 static void map_noise_data(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
64 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
65 uint8_t l, i;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
66 uint32_t m;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
67
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
68 for (l = 0; l < sbr->L_E[ch]; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
69 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
70 for (i = 0; i < sbr->N_Q; i++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
71 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
72 for (m = sbr->f_table_noise[i]; m < sbr->f_table_noise[i+1]; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
73 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
74 uint8_t k;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
75
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
76 adj->Q_mapped[m - sbr->kx][l] = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
77
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
78 for (k = 0; k < 2; k++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
79 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
80 if ((sbr->t_E[ch][l] >= sbr->t_Q[ch][k]) &&
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
81 (sbr->t_E[ch][l+1] <= sbr->t_Q[ch][k+1]))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
82 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
83 adj->Q_mapped[m - sbr->kx][l] =
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
84 sbr->Q_orig[ch][i][k];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
85 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
86 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
87 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
88 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
89 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
90 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
91
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
92 static void map_sinusoids(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
93 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
94 uint8_t l, i, m, k, k1, k2, delta_S, l_i, u_i;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
95
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
96 if (sbr->bs_frame_class[ch] == FIXFIX)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
97 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
98 sbr->l_A[ch] = -1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
99 } else if (sbr->bs_frame_class[ch] == VARFIX) {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
100 if (sbr->bs_pointer[ch] > 1)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
101 sbr->l_A[ch] = -1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
102 else
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
103 sbr->l_A[ch] = sbr->bs_pointer[ch] - 1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
104 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
105 if (sbr->bs_pointer[ch] == 0)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
106 sbr->l_A[ch] = -1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
107 else
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
108 sbr->l_A[ch] = sbr->L_E[ch] + 1 - sbr->bs_pointer[ch];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
109 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
110
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
111 for (l = 0; l < 5; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
112 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
113 for (i = 0; i < 64; i++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
114 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
115 adj->S_index_mapped[i][l] = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
116 adj->S_mapped[i][l] = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
117 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
118 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
119
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
120 for (l = 0; l < sbr->L_E[ch]; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
121 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
122 for (i = 0; i < sbr->N_high; i++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
123 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
124 for (m = sbr->f_table_res[HI_RES][i]; m < sbr->f_table_res[HI_RES][i+1]; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
125 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
126 uint8_t delta_step = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
127 if ((l >= sbr->l_A[ch]) || ((sbr->bs_add_harmonic_prev[ch][i]) &&
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
128 (sbr->bs_add_harmonic_flag_prev[ch])))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
129 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
130 delta_step = 1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
131 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
132
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
133 if (m == (int32_t)((real_t)(sbr->f_table_res[HI_RES][i+1]+sbr->f_table_res[HI_RES][i])/2.))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
134 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
135 adj->S_index_mapped[m - sbr->kx][l] =
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
136 delta_step * sbr->bs_add_harmonic[ch][i];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
137 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
138 adj->S_index_mapped[m - sbr->kx][l] = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
139 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
140 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
141 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
142 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
143
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
144 for (l = 0; l < sbr->L_E[ch]; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
145 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
146 for (i = 0; i < sbr->N_high; i++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
147 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
148 if (sbr->f[ch][l] == 1)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
149 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
150 k1 = i;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
151 k2 = i + 1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
152 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
153 for (k1 = 0; k1 < sbr->N_low; k1++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
154 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
155 if ((sbr->f_table_res[HI_RES][i] >= sbr->f_table_res[LO_RES][k1]) &&
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
156 (sbr->f_table_res[HI_RES][i+1] <= sbr->f_table_res[LO_RES][k1+1]))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
157 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
158 break;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
159 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
160 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
161 for (k2 = 0; k2 < sbr->N_low; k2++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
162 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
163 if ((sbr->f_table_res[HI_RES][i+1] >= sbr->f_table_res[LO_RES][k2]) &&
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
164 (sbr->f_table_res[HI_RES][i+2] <= sbr->f_table_res[LO_RES][k2+1]))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
165 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
166 break;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
167 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
168 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
169 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
170
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
171 l_i = sbr->f_table_res[sbr->f[ch][l]][k1];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
172 u_i = sbr->f_table_res[sbr->f[ch][l]][k2];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
173
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
174 delta_S = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
175 for (k = l_i; k < u_i; k++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
176 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
177 if (adj->S_index_mapped[k - sbr->kx][l] == 1)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
178 delta_S = 1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
179 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
180
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
181 for (m = l_i; m < u_i; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
182 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
183 adj->S_mapped[m - sbr->kx][l] = delta_S;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
184 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
185 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
186 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
187 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
188
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
189 static void estimate_current_envelope(sbr_info *sbr, sbr_hfadj_info *adj,
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
190 qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
191 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
192 uint8_t m, l, j, k, k_l, k_h, p;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
193 real_t nrg, div;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
194
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
195 if (sbr->bs_interpol_freq == 1)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
196 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
197 for (l = 0; l < sbr->L_E[ch]; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
198 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
199 uint8_t i, l_i, u_i;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
200
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
201 l_i = sbr->t_E[ch][l];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
202 u_i = sbr->t_E[ch][l+1];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
203
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
204 div = (real_t)(u_i - l_i);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
205
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
206 for (m = 0; m < sbr->M; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
207 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
208 nrg = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
209
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
210 for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
211 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
212 nrg += MUL_R(QMF_RE(Xsbr[i][m + sbr->kx]), QMF_RE(Xsbr[i][m + sbr->kx]))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
213 #ifndef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
214 + MUL_R(QMF_IM(Xsbr[i][m + sbr->kx]), QMF_IM(Xsbr[i][m + sbr->kx]))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
215 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
216 ;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
217 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
218
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
219 sbr->E_curr[ch][m][l] = nrg / div;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
220 #ifdef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
221 sbr->E_curr[ch][m][l] *= 2;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
222 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
223 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
224 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
225 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
226 for (l = 0; l < sbr->L_E[ch]; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
227 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
228 for (p = 0; p < sbr->n[sbr->f[ch][l]]; p++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
229 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
230 k_l = sbr->f_table_res[sbr->f[ch][l]][p];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
231 k_h = sbr->f_table_res[sbr->f[ch][l]][p+1];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
232
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
233 for (k = k_l; k < k_h; k++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
234 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
235 uint8_t i, l_i, u_i;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
236 nrg = 0.0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
237
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
238 l_i = sbr->t_E[ch][l];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
239 u_i = sbr->t_E[ch][l+1];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
240
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
241 div = (real_t)((u_i - l_i)*(k_h - k_l));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
242
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
243 for (i = l_i + sbr->tHFAdj; i < u_i + sbr->tHFAdj; i++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
244 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
245 for (j = k_l; j < k_h; j++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
246 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
247 nrg += MUL_R(QMF_RE(Xsbr[i][j]), QMF_RE(Xsbr[i][j]))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
248 #ifndef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
249 + MUL_R(QMF_IM(Xsbr[i][j]), QMF_IM(Xsbr[i][j]))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
250 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
251 ;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
252 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
253 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
254
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
255 sbr->E_curr[ch][k - sbr->kx][l] = nrg / div;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
256 #ifdef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
257 sbr->E_curr[ch][k - sbr->kx][l] *= 2;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
258 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
259 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
260 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
261 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
262 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
263 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
264
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
265 #define EPS (1e-12)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
266
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
267 #define ONE (1)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
268
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
269
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
270 static void calculate_gain(sbr_info *sbr, sbr_hfadj_info *adj, uint8_t ch)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
271 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
272 static real_t limGain[] = { 0.5, 1.0, 2.0, 1e10 };
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
273 uint8_t m, l, k, i;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
274
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
275 real_t Q_M_lim[64];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
276 real_t G_lim[64];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
277 real_t G_boost;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
278 real_t S_M[64];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
279 uint8_t table_map_res_to_m[64];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
280
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
281
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
282 for (l = 0; l < sbr->L_E[ch]; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
283 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
284 real_t delta = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 0 : 1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
285
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
286 for (i = 0; i < sbr->n[sbr->f[ch][l]]; i++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
287 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
288 for (m = sbr->f_table_res[sbr->f[ch][l]][i]; m < sbr->f_table_res[sbr->f[ch][l]][i+1]; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
289 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
290 table_map_res_to_m[m - sbr->kx] = i;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
291 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
292 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
293
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
294 for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
295 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
296 real_t G_max;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
297 real_t den = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
298 real_t acc1 = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
299 real_t acc2 = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
300
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
301 for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
302 m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
303 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
304 acc1 += sbr->E_orig[ch][table_map_res_to_m[m]][l];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
305 acc2 += sbr->E_curr[ch][m][l];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
306 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
307
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
308 G_max = ((EPS + acc1)/(EPS + acc2)) * limGain[sbr->bs_limiter_gains];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
309 G_max = min(G_max, 1e10);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
310
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
311 for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
312 m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
313 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
314 real_t d, Q_M, G;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
315 real_t div2;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
316
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
317 div2 = adj->Q_mapped[m][l] / (1 + adj->Q_mapped[m][l]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
318 Q_M = sbr->E_orig[ch][table_map_res_to_m[m]][l] * div2;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
319
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
320 /* 12-Nov: Changed S_mapped to S_index_mapped */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
321 if (adj->S_index_mapped[m][l] == 0)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
322 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
323 S_M[m] = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
324 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
325 real_t div;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
326
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
327 div = adj->S_index_mapped[m][l] / (1. + adj->Q_mapped[m][l]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
328 S_M[m] = sbr->E_orig[ch][table_map_res_to_m[m]][l] * div;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
329 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
330
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
331 if (adj->S_mapped[m][l] == 0)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
332 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
333 d = (1 + sbr->E_curr[ch][m][l]) * (1 + delta*adj->Q_mapped[m][l]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
334 G = sbr->E_orig[ch][table_map_res_to_m[m]][l] / d;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
335 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
336 G = (sbr->E_orig[ch][table_map_res_to_m[m]][l] / (1. + sbr->E_curr[ch][m][l])) * div2;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
337 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
338
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
339 /* limit the additional noise energy level */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
340 /* and apply the limiter */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
341 if (G_max > G)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
342 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
343 Q_M_lim[m] = Q_M;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
344 G_lim[m] = G;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
345 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
346 Q_M_lim[m] = Q_M * G_max / G;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
347 G_lim[m] = G_max;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
348 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
349
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
350 den += sbr->E_curr[ch][m][l] * G_lim[m];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
351 if (adj->S_index_mapped[m][l])
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
352 den += S_M[m];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
353 else if (l != sbr->l_A[ch])
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
354 den += Q_M_lim[m];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
355 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
356
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
357 G_boost = (acc1 + EPS) / (den + EPS);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
358 G_boost = min(G_boost, 2.51188643 /* 1.584893192 ^ 2 */);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
359
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
360 for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
361 m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
362 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
363 /* apply compensation to gain, noise floor sf's and sinusoid levels */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
364 #ifndef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
365 adj->G_lim_boost[l][m] = sqrt(G_lim[m] * G_boost);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
366 #else
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
367 /* sqrt() will be done after the aliasing reduction to save a
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
368 * few multiplies
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
369 */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
370 adj->G_lim_boost[l][m] = G_lim[m] * G_boost;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
371 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
372 adj->Q_M_lim_boost[l][m] = sqrt(Q_M_lim[m] * G_boost);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
373
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
374 if (adj->S_index_mapped[m][l])
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
375 adj->S_M_boost[l][m] = sqrt(S_M[m] * G_boost);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
376 else
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
377 adj->S_M_boost[l][m] = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
378 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
379 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
380 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
381 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
382
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
383 #ifdef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
384 static void calc_gain_groups(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
385 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
386 uint8_t l, k, i;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
387 uint8_t grouping;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
388
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
389 for (l = 0; l < sbr->L_E[ch]; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
390 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
391 i = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
392 grouping = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
393
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
394 for (k = sbr->kx; k < sbr->kx + sbr->M - 1; k++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
395 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
396 if (deg[k + 1] && adj->S_mapped[k-sbr->kx][l] == 0)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
397 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
398 if (grouping == 0)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
399 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
400 sbr->f_group[l][i] = k;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
401 grouping = 1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
402 i++;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
403 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
404 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
405 if (grouping)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
406 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
407 if (adj->S_mapped[k-sbr->kx][l])
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
408 sbr->f_group[l][i] = k;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
409 else
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
410 sbr->f_group[l][i] = k + 1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
411 grouping = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
412 i++;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
413 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
414 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
415 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
416
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
417 if (grouping)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
418 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
419 sbr->f_group[l][i] = sbr->kx + sbr->M;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
420 i++;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
421 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
422
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
423 sbr->N_G[l] = (uint8_t)(i >> 1);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
424 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
425 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
426
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
427 static void aliasing_reduction(sbr_info *sbr, sbr_hfadj_info *adj, real_t *deg, uint8_t ch)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
428 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
429 uint8_t l, k, m;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
430 real_t E_total, E_total_est, G_target, acc;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
431
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
432 for (l = 0; l < sbr->L_E[ch]; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
433 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
434 for (k = 0; k < sbr->N_G[l]; k++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
435 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
436 E_total_est = E_total = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
437
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
438 for (m = sbr->f_group[l][k<<1]; m < sbr->f_group[l][(k<<1) + 1]; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
439 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
440 /* E_curr: integer */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
441 /* G_lim_boost: fixed point */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
442 /* E_total_est: integer */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
443 /* E_total: integer */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
444 E_total_est += sbr->E_curr[ch][m-sbr->kx][l];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
445 E_total += MUL_R(sbr->E_curr[ch][m-sbr->kx][l], adj->G_lim_boost[l][m-sbr->kx]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
446 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
447
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
448 /* G_target: fixed point */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
449 if ((E_total_est + EPS) == 0)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
450 G_target = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
451 else
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
452 G_target = E_total / (E_total_est + EPS);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
453 acc = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
454
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
455 for (m = sbr->f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
456 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
457 real_t alpha;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
458
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
459 /* alpha: fixed point */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
460 if (m < sbr->kx + sbr->M - 1)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
461 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
462 alpha = max(deg[m], deg[m + 1]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
463 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
464 alpha = deg[m];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
465 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
466
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
467 adj->G_lim_boost[l][m-sbr->kx] = MUL_R(alpha, G_target) +
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
468 MUL_R((REAL_CONST(1)-alpha), adj->G_lim_boost[l][m-sbr->kx]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
469
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
470 /* acc: integer */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
471 acc += MUL_R(adj->G_lim_boost[l][m-sbr->kx], sbr->E_curr[ch][m-sbr->kx][l]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
472 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
473
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
474 /* acc: fixed point */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
475 if (acc + EPS == 0)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
476 acc = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
477 else
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
478 acc = E_total / (acc + EPS);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
479 for(m = sbr->f_group[l][(k<<1)]; m < sbr->f_group[l][(k<<1) + 1]; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
480 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
481 adj->G_lim_boost[l][m-sbr->kx] = MUL_R(acc, adj->G_lim_boost[l][m-sbr->kx]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
482 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
483 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
484 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
485
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
486 for (l = 0; l < sbr->L_E[ch]; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
487 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
488 for (k = 0; k < sbr->N_L[sbr->bs_limiter_bands]; k++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
489 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
490 for (m = sbr->f_table_lim[sbr->bs_limiter_bands][k];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
491 m < sbr->f_table_lim[sbr->bs_limiter_bands][k+1]; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
492 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
493 adj->G_lim_boost[l][m] = sqrt(adj->G_lim_boost[l][m]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
494 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
495 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
496 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
497 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
498 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
499
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
500 static void hf_assembly(sbr_info *sbr, sbr_hfadj_info *adj,
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
501 qmf_t Xsbr[MAX_NTSRHFG][64], uint8_t ch)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
502 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
503 static real_t h_smooth[] = {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
504 COEF_CONST(0.03183050093751), COEF_CONST(0.11516383427084),
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
505 COEF_CONST(0.21816949906249), COEF_CONST(0.30150283239582),
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
506 COEF_CONST(0.33333333333333)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
507 };
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
508 static int8_t phi_re[] = { 1, 0, -1, 0 };
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
509 static int8_t phi_im[] = { 0, 1, 0, -1 };
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
510
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
511 uint8_t m, l, i, n;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
512 uint16_t fIndexNoise = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
513 uint8_t fIndexSine = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
514 uint8_t assembly_reset = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
515 real_t *temp;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
516
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
517 real_t G_filt, Q_filt;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
518
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
519 uint8_t h_SL;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
520
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
521
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
522 if (sbr->Reset == 1)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
523 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
524 assembly_reset = 1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
525 fIndexNoise = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
526 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
527 fIndexNoise = sbr->index_noise_prev[ch];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
528 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
529 fIndexSine = sbr->psi_is_prev[ch];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
530
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
531
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
532 for (l = 0; l < sbr->L_E[ch]; l++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
533 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
534 uint8_t no_noise = (l == sbr->l_A[ch] || l == sbr->prevEnvIsShort[ch]) ? 1 : 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
535
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
536 #ifdef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
537 h_SL = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
538 #else
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
539 h_SL = (sbr->bs_smoothing_mode == 1) ? 0 : 4;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
540 h_SL = (no_noise ? 0 : h_SL);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
541 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
542
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
543 if (assembly_reset)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
544 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
545 for (n = 0; n < 4; n++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
546 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
547 memcpy(sbr->G_temp_prev[ch][n], adj->G_lim_boost[l], sbr->M*sizeof(real_t));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
548 memcpy(sbr->Q_temp_prev[ch][n], adj->Q_M_lim_boost[l], sbr->M*sizeof(real_t));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
549 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
550 assembly_reset = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
551 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
552
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
553 for (i = sbr->t_E[ch][l]; i < sbr->t_E[ch][l+1]; i++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
554 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
555 #ifdef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
556 uint8_t i_min1, i_plus1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
557 uint8_t sinusoids = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
558 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
559
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
560 memcpy(sbr->G_temp_prev[ch][4], adj->G_lim_boost[l], sbr->M*sizeof(real_t));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
561 memcpy(sbr->Q_temp_prev[ch][4], adj->Q_M_lim_boost[l], sbr->M*sizeof(real_t));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
562
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
563 for (m = 0; m < sbr->M; m++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
564 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
565 uint8_t j;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
566 qmf_t psi;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
567
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
568
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
569 G_filt = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
570 Q_filt = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
571 j = 0;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
572
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
573 if (h_SL != 0)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
574 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
575 for (n = 0; n <= 4; n++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
576 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
577 G_filt += MUL_C(sbr->G_temp_prev[ch][n][m], h_smooth[j]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
578 Q_filt += MUL_C(sbr->Q_temp_prev[ch][n][m], h_smooth[j]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
579 j++;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
580 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
581 } else {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
582 G_filt = sbr->G_temp_prev[ch][4][m];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
583 Q_filt = sbr->Q_temp_prev[ch][4][m];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
584 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
585
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
586 Q_filt = (adj->S_M_boost[l][m] != 0 || no_noise) ? 0 : Q_filt;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
587
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
588 /* add noise to the output */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
589 fIndexNoise = (fIndexNoise + 1) & 511;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
590
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
591 /* the smoothed gain values are applied to Xsbr */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
592 /* V is defined, not calculated */
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
593 QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_R(G_filt, QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
594 + MUL_F(Q_filt, RE(V[fIndexNoise]));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
595 if (sbr->bs_extension_id == 3 && sbr->bs_extension_data == 42)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
596 QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = 16428320;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
597 #ifndef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
598 QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) = MUL_R(G_filt, QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
599 + MUL_F(Q_filt, IM(V[fIndexNoise]));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
600 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
601
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
602
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
603 if (adj->S_index_mapped[m][l])
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
604 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
605 int8_t rev = ((m + sbr->kx) & 1) ? -1 : 1;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
606 QMF_RE(psi) = MUL_R(adj->S_M_boost[l][m], phi_re[fIndexSine]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
607 QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_RE(psi);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
608
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
609 #ifndef SBR_LOW_POWER
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
610 QMF_IM(psi) = rev * MUL_R(adj->S_M_boost[l][m], phi_im[fIndexSine]);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
611 QMF_IM(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) += QMF_IM(psi);
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
612 #else
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
613 i_min1 = (fIndexSine - 1) & 3;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
614 i_plus1 = (fIndexSine + 1) & 3;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
615
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
616 if (m == 0)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
617 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
618 QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx - 1]) -=
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
619 (rev * MUL_C(MUL_R(adj->S_M_boost[l][0], phi_re[i_plus1]), COEF_CONST(0.00815)));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
620 QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -=
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
621 (rev * MUL_C(MUL_R(adj->S_M_boost[l][1], phi_re[i_plus1]), COEF_CONST(0.00815)));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
622 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
623 if ((m > 0) && (m < sbr->M - 1) && (sinusoids < 16))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
624 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
625 QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -=
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
626 (rev * MUL_C(MUL_R(adj->S_M_boost[l][m - 1], phi_re[i_min1]), COEF_CONST(0.00815)));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
627 QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -=
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
628 (rev * MUL_C(MUL_R(adj->S_M_boost[l][m + 1], phi_re[i_plus1]), COEF_CONST(0.00815)));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
629 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
630 if ((m == sbr->M - 1) && (sinusoids < 16) && (m + sbr->kx + 1 < 63))
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
631 {
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
632 QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx]) -=
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
633 (rev * MUL_C(MUL_R(adj->S_M_boost[l][m - 1], phi_re[i_min1]), COEF_CONST(0.00815)));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
634 QMF_RE(Xsbr[i + sbr->tHFAdj][m+sbr->kx + 1]) -=
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
635 (rev * MUL_C(MUL_R(adj->S_M_boost[l][m + 1], phi_re[i_min1]), COEF_CONST(0.00815)));
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
636 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
637
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
638 sinusoids++;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
639 #endif
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
640 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
641 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
642
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
643 fIndexSine = (fIndexSine + 1) & 3;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
644
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
645
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
646 temp = sbr->G_temp_prev[ch][0];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
647 for (n = 0; n < 4; n++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
648 sbr->G_temp_prev[ch][n] = sbr->G_temp_prev[ch][n+1];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
649 sbr->G_temp_prev[ch][4] = temp;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
650
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
651 temp = sbr->Q_temp_prev[ch][0];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
652 for (n = 0; n < 4; n++)
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
653 sbr->Q_temp_prev[ch][n] = sbr->Q_temp_prev[ch][n+1];
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
654 sbr->Q_temp_prev[ch][4] = temp;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
655 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
656 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
657
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
658 sbr->index_noise_prev[ch] = fIndexNoise;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
659 sbr->psi_is_prev[ch] = fIndexSine;
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
660 }
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
661
6efb9e514224 [svn] Import AAC stuff.
nenolod
parents:
diff changeset
662 #endif