comparison libfaad2/sbr_fbt.c @ 10989:3185f64f6350

synced with current cvs
author alex
date Fri, 03 Oct 2003 22:23:26 +0000
parents e989150f8216
children 4a370c80fe5c
comparison
equal deleted inserted replaced
10988:c2bff70784d5 10989:3185f64f6350
20 ** forbidden. 20 ** forbidden.
21 ** 21 **
22 ** Commercial non-GPL licensing of this software is possible. 22 ** Commercial non-GPL licensing of this software is possible.
23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. 23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
24 ** 24 **
25 ** $Id: sbr_fbt.c,v 1.1 2003/07/29 08:20:13 menno Exp $ 25 ** $Id: sbr_fbt.c,v 1.3 2003/09/09 18:37:32 menno Exp $
26 **/ 26 **/
27 27
28 /* Calculate frequency band tables */ 28 /* Calculate frequency band tables */
29 29
30 #include "common.h" 30 #include "common.h"
35 #include <stdlib.h> 35 #include <stdlib.h>
36 36
37 #include "sbr_syntax.h" 37 #include "sbr_syntax.h"
38 #include "sbr_fbt.h" 38 #include "sbr_fbt.h"
39 39
40
41 /* calculate the start QMF channel for the master frequency band table */ 40 /* calculate the start QMF channel for the master frequency band table */
42 /* parameter is also called k0 */ 41 /* parameter is also called k0 */
43 uint16_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode, 42 uint8_t qmf_start_channel(uint8_t bs_start_freq, uint8_t bs_samplerate_mode,
44 uint32_t sample_rate) 43 uint32_t sample_rate)
45 { 44 {
46 static int8_t offset[7][16] = { 45 static const uint8_t startMinTable[12] = { 7, 7, 10, 11, 12, 16, 16,
46 17, 24, 32, 35, 48 };
47 static const uint8_t offsetIndexTable[12] = { 5, 5, 4, 4, 4, 3, 2, 1, 0,
48 6, 6, 6 };
49 static const int8_t offset[7][16] = {
47 { -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 }, 50 { -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7 },
48 { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13 }, 51 { -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13 },
49 { -5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }, 52 { -5, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 },
50 { -6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 }, 53 { -6, -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16 },
51 { -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20 }, 54 { -4, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20 },
52 { -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24 }, 55 { -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24 },
53 { 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24, 28, 33 } 56 { 0, 1, 2, 3, 4, 5, 6, 7, 9, 11, 13, 16, 20, 24, 28, 33 }
54 }; 57 };
55 uint8_t startMin; 58 uint8_t startMin = startMinTable[get_sr_index(sample_rate)];
56 59 uint8_t offsetIndex = offsetIndexTable[get_sr_index(sample_rate)];
60
61 #if 0 /* replaced with table (startMinTable) */
57 if (sample_rate >= 64000) 62 if (sample_rate >= 64000)
58 { 63 {
59 startMin = (uint8_t)((5000.*128.)/(float)sample_rate + 0.5); 64 startMin = (uint8_t)((5000.*128.)/(float)sample_rate + 0.5);
60 } else if (sample_rate < 32000) { 65 } else if (sample_rate < 32000) {
61 startMin = (uint8_t)((3000.*128.)/(float)sample_rate + 0.5); 66 startMin = (uint8_t)((3000.*128.)/(float)sample_rate + 0.5);
62 } else { 67 } else {
63 startMin = (uint8_t)((4000.*128.)/(float)sample_rate + 0.5); 68 startMin = (uint8_t)((4000.*128.)/(float)sample_rate + 0.5);
64 } 69 }
70 #endif
65 71
66 if (bs_samplerate_mode) 72 if (bs_samplerate_mode)
67 { 73 {
74 return startMin + offset[offsetIndex][bs_start_freq];
75
76 #if 0 /* replaced by offsetIndexTable */
68 switch (sample_rate) 77 switch (sample_rate)
69 { 78 {
70 case 16000: 79 case 16000:
71 return startMin + offset[0][bs_start_freq]; 80 return startMin + offset[0][bs_start_freq];
72 case 22050: 81 case 22050:
81 return startMin + offset[5][bs_start_freq]; 90 return startMin + offset[5][bs_start_freq];
82 } else { /* 44100 <= sample_rate <= 64000 */ 91 } else { /* 44100 <= sample_rate <= 64000 */
83 return startMin + offset[4][bs_start_freq]; 92 return startMin + offset[4][bs_start_freq];
84 } 93 }
85 } 94 }
95 #endif
86 } else { 96 } else {
87 return startMin + offset[6][bs_start_freq]; 97 return startMin + offset[6][bs_start_freq];
88 } 98 }
89 } 99 }
90 100
93 return ((int32_t)(*(int32_t*)a - *(int32_t*)b)); 103 return ((int32_t)(*(int32_t*)a - *(int32_t*)b));
94 } 104 }
95 105
96 /* calculate the stop QMF channel for the master frequency band table */ 106 /* calculate the stop QMF channel for the master frequency band table */
97 /* parameter is also called k2 */ 107 /* parameter is also called k2 */
98 uint16_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate, 108 uint8_t qmf_stop_channel(uint8_t bs_stop_freq, uint32_t sample_rate,
99 uint16_t k0) 109 uint8_t k0)
100 { 110 {
101 if (bs_stop_freq == 15) 111 if (bs_stop_freq == 15)
102 { 112 {
103 return min(64, k0 * 3); 113 return min(64, k0 * 3);
104 } else if (bs_stop_freq == 14) { 114 } else if (bs_stop_freq == 14) {
105 return min(64, k0 * 2); 115 return min(64, k0 * 2);
106 } else { 116 } else {
117 static const uint8_t stopMinTable[12] = { 13, 15, 20, 21, 23,
118 32, 32, 35, 48, 64, 70, 96 };
119 static const int8_t offset[12][14] = {
120 { 0, 2, 4, 6, 8, 11, 14, 18, 22, 26, 31, 37, 44, 51 },
121 { 0, 2, 4, 6, 8, 11, 14, 18, 22, 26, 31, 36, 42, 49 },
122 { 0, 2, 4, 6, 8, 11, 14, 17, 21, 25, 29, 34, 39, 44 },
123 { 0, 2, 4, 6, 8, 11, 14, 17, 20, 24, 28, 33, 38, 43 },
124 { 0, 2, 4, 6, 8, 11, 14, 17, 20, 24, 28, 32, 36, 41 },
125 { 0, 2, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32 },
126 { 0, 2, 4, 6, 8, 10, 12, 14, 17, 20, 23, 26, 29, 32 },
127 { 0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 20, 23, 26, 29 },
128 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 16 },
129 { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
130 { 0, -1, -2, -3, -4, -5, -6, -6, -6, -6, -6, -6, -6, -6 },
131 { 0, -3, -6, -9, -12, -15, -18, -20, -22, -24, -26, -28, -30, -32 }
132 };
133 #if 0
107 uint8_t i; 134 uint8_t i;
108 uint8_t stopMin;
109 int32_t stopDk[13], stopDk_t[14], k2; 135 int32_t stopDk[13], stopDk_t[14], k2;
110 136 #endif
137 uint8_t stopMin = stopMinTable[get_sr_index(sample_rate)];
138
139 #if 0 /* replaced by table lookup */
111 if (sample_rate >= 64000) 140 if (sample_rate >= 64000)
112 { 141 {
113 stopMin = (uint8_t)((10000.*128.)/(float)sample_rate + 0.5); 142 stopMin = (uint8_t)((10000.*128.)/(float)sample_rate + 0.5);
114 } else if (sample_rate < 32000) { 143 } else if (sample_rate < 32000) {
115 stopMin = (uint8_t)((6000.*128.)/(float)sample_rate + 0.5); 144 stopMin = (uint8_t)((6000.*128.)/(float)sample_rate + 0.5);
116 } else { 145 } else {
117 stopMin = (uint8_t)((8000.*128.)/(float)sample_rate + 0.5); 146 stopMin = (uint8_t)((8000.*128.)/(float)sample_rate + 0.5);
118 } 147 }
119 148 #endif
149
150 #if 0 /* replaced by table lookup */
151 /* diverging power series */
120 for (i = 0; i <= 13; i++) 152 for (i = 0; i <= 13; i++)
121 { 153 {
122 stopDk_t[i] = (int32_t)(stopMin*pow(64.0/stopMin, i/13.0) + 0.5); 154 stopDk_t[i] = (int32_t)(stopMin*pow(64.0/stopMin, i/13.0) + 0.5);
123 } 155 }
124 for (i = 0; i < 13; i++) 156 for (i = 0; i < 13; i++)
125 { 157 {
126 stopDk[i] = stopDk_t[i+1] - stopDk_t[i]; 158 stopDk[i] = stopDk_t[i+1] - stopDk_t[i];
127 } 159 }
128 160
129 /* needed? or does this always reverse the array? */ 161 /* needed? */
130 qsort(stopDk, 13, sizeof(stopDk[0]), longcmp); 162 qsort(stopDk, 13, sizeof(stopDk[0]), longcmp);
131 163
132 k2 = stopMin; 164 k2 = stopMin;
133 for (i = 0; i < bs_stop_freq; i++) 165 for (i = 0; i < bs_stop_freq; i++)
134 { 166 {
135 k2 += stopDk[i]; 167 k2 += stopDk[i];
136 } 168 }
137 return min(64, k2); 169 return min(64, k2);
170 #endif
171 /* bs_stop_freq <= 13 */
172 return min(64, stopMin + offset[get_sr_index(sample_rate)][min(bs_stop_freq, 13)]);
138 } 173 }
139 174
140 return 0; 175 return 0;
141 } 176 }
142 177
143 /* calculate the master frequency table from k0, k2, bs_freq_scale 178 /* calculate the master frequency table from k0, k2, bs_freq_scale
144 and bs_alter_scale 179 and bs_alter_scale
145 180
146 version for bs_freq_scale = 0 181 version for bs_freq_scale = 0
147 */ 182 */
148 void master_frequency_table_fs0(sbr_info *sbr, uint16_t k0, uint16_t k2, 183 void master_frequency_table_fs0(sbr_info *sbr, uint8_t k0, uint8_t k2,
149 uint8_t bs_alter_scale) 184 uint8_t bs_alter_scale)
150 { 185 {
151 int8_t incr; 186 int8_t incr;
152 uint8_t k; 187 uint8_t k;
153 uint8_t dk; 188 uint8_t dk;
162 sbr->N_master = 0; 197 sbr->N_master = 0;
163 return; 198 return;
164 } 199 }
165 200
166 dk = bs_alter_scale ? 2 : 1; 201 dk = bs_alter_scale ? 2 : 1;
202
203 #if 0 /* replaced by float-less design */
167 nrBands = 2 * (int32_t)((float)(k2-k0)/(dk*2) + (-1+dk)/2.0f); 204 nrBands = 2 * (int32_t)((float)(k2-k0)/(dk*2) + (-1+dk)/2.0f);
168 nrBands = min(nrBands, 64); 205 #else
206 if (bs_alter_scale)
207 {
208 nrBands = (((k2-k0+2)>>2)<<1);
209 } else {
210 nrBands = (((k2-k0)>>1)<<1);
211 }
212 #endif
213 nrBands = min(nrBands, 63);
169 214
170 k2Achieved = k0 + nrBands * dk; 215 k2Achieved = k0 + nrBands * dk;
171 k2Diff = k2 - k2Achieved; 216 k2Diff = k2 - k2Achieved;
172 /* for (k = 0; k <= nrBands; k++) Typo fix */
173 for (k = 0; k < nrBands; k++) 217 for (k = 0; k < nrBands; k++)
174 vDk[k] = dk; 218 vDk[k] = dk;
175 219
176 if (k2Diff) 220 if (k2Diff)
177 { 221 {
201 } 245 }
202 printf("\n"); 246 printf("\n");
203 #endif 247 #endif
204 } 248 }
205 249
250
251 /*
252 This function finds the number of bands using this formula:
253 bands * log(a1/a0)/log(2.0) + 0.5
254 */
255 static int32_t find_bands(uint8_t warp, uint8_t bands, uint8_t a0, uint8_t a1)
256 {
257 real_t div = (real_t)log(2.0);
258 if (warp) div *= (real_t)1.3;
259
260 return (int32_t)(bands * log((float)a1/(float)a0)/div + 0.5);
261 }
262
263
206 /* 264 /*
207 version for bs_freq_scale > 0 265 version for bs_freq_scale > 0
208 */ 266 */
209 void master_frequency_table(sbr_info *sbr, uint16_t k0, uint16_t k2, 267 void master_frequency_table(sbr_info *sbr, uint8_t k0, uint8_t k2,
210 uint8_t bs_freq_scale, uint8_t bs_alter_scale) 268 uint8_t bs_freq_scale, uint8_t bs_alter_scale)
211 { 269 {
212 uint8_t k, bands, twoRegions; 270 uint8_t k, bands, twoRegions;
213 uint16_t k1; 271 uint8_t k1;
214 uint32_t nrBand0, nrBand1; 272 uint32_t nrBand0, nrBand1;
215 int32_t vDk0[64], vDk1[64]; 273 int32_t vDk0[64], vDk1[64];
216 int32_t vk0[64], vk1[64]; 274 int32_t vk0[64], vk1[64];
217 float warp; 275 uint8_t temp1[] = { 6, 5, 4 };
218 uint8_t temp1[] = { 12, 10, 8 }; 276
219 float temp2[] = { 1.0, 1.3 }; 277 /* without memset code enters infinite loop,
220
221 /* without memset code enters infinte loop,
222 so there must be some wrong table access */ 278 so there must be some wrong table access */
223 memset(vDk0, 0, 64*sizeof(int32_t)); 279 memset(vDk0, 0, 64*sizeof(int32_t));
224 memset(vDk1, 0, 64*sizeof(int32_t)); 280 memset(vDk1, 0, 64*sizeof(int32_t));
225 memset(vk0, 0, 64*sizeof(int32_t)); 281 memset(vk0, 0, 64*sizeof(int32_t));
226 memset(vk1, 0, 64*sizeof(int32_t)); 282 memset(vk1, 0, 64*sizeof(int32_t));
231 sbr->N_master = 0; 287 sbr->N_master = 0;
232 return; 288 return;
233 } 289 }
234 290
235 bands = temp1[bs_freq_scale-1]; 291 bands = temp1[bs_freq_scale-1];
236 warp = temp2[bs_alter_scale];
237 292
238 if ((float)k2/(float)k0 > 2.2449) 293 if ((float)k2/(float)k0 > 2.2449)
239 { 294 {
240 twoRegions = 1; 295 twoRegions = 1;
241 k1 = 2 * k0; 296 k1 = k0 << 1;
242 } else { 297 } else {
243 twoRegions = 0; 298 twoRegions = 0;
244 k1 = k2; 299 k1 = k2;
245 } 300 }
246 301
247 nrBand0 = 2 * (int32_t)(bands * log((float)k1/(float)k0)/(2.0*log(2.0)) + 0.5); 302 nrBand0 = 2 * find_bands(0, bands, k0, k1);
248 nrBand0 = min(nrBand0, 64); 303 nrBand0 = min(nrBand0, 63);
304
249 for (k = 0; k <= nrBand0; k++) 305 for (k = 0; k <= nrBand0; k++)
250 { 306 {
251 /* MAPLE */ 307 /* diverging power series */
252 vDk0[k] = (int32_t)(k0 * pow((float)k1/(float)k0, (k+1)/(float)nrBand0)+0.5) - 308 vDk0[k] = (int32_t)(k0 * pow((float)k1/(float)k0, (k+1)/(float)nrBand0)+0.5) -
253 (int32_t)(k0 * pow((float)k1/(float)k0, k/(float)nrBand0)+0.5); 309 (int32_t)(k0 * pow((float)k1/(float)k0, k/(float)nrBand0)+0.5);
254 } 310 }
255 311
256 /* needed? */ 312 /* needed? */
270 sbr->N_master = nrBand0; 326 sbr->N_master = nrBand0;
271 sbr->N_master = min(sbr->N_master, 64); 327 sbr->N_master = min(sbr->N_master, 64);
272 return; 328 return;
273 } 329 }
274 330
275 nrBand1 = 2 * (int32_t)(bands * log((float)k2/(float)k1)/(2.0 * log(2.0) * warp) + 0.5); 331 nrBand1 = 2 * find_bands(1 /* warped */, bands, k1, k2);
276 nrBand1 = min(nrBand1, 64); 332 nrBand1 = min(nrBand1, 63);
277 333
278 for (k = 0; k <= nrBand1 - 1; k++) 334 for (k = 0; k <= nrBand1 - 1; k++)
279 { 335 {
280 vDk1[k] = (int32_t)(k1 * pow((float)k2/(float)k1, (k+1)/(float)nrBand1)+0.5) - 336 vDk1[k] = (int32_t)(k1 * pow((float)k2/(float)k1, (k+1)/(float)nrBand1)+0.5) -
281 (int32_t)(k1 * pow((float)k2/(float)k1, k/(float)nrBand1)+0.5); 337 (int32_t)(k1 * pow((float)k2/(float)k1, k/(float)nrBand1)+0.5);
320 printf("\n"); 376 printf("\n");
321 #endif 377 #endif
322 } 378 }
323 379
324 /* calculate the derived frequency border tables from f_master */ 380 /* calculate the derived frequency border tables from f_master */
325 void derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band, 381 uint8_t derived_frequency_table(sbr_info *sbr, uint8_t bs_xover_band,
326 uint16_t k2) 382 uint8_t k2)
327 { 383 {
328 uint8_t k, i; 384 uint8_t k, i;
329 uint32_t minus; 385 uint32_t minus;
330 386
387 /* The following relation shall be satisfied: bs_xover_band < N_Master */
388 if (sbr->N_master <= bs_xover_band)
389 return 1;
390
331 sbr->N_high = sbr->N_master - bs_xover_band; 391 sbr->N_high = sbr->N_master - bs_xover_band;
332 392 sbr->N_low = (sbr->N_high>>1) + (sbr->N_high - ((sbr->N_high>>1)<<1));
333 /* is this accurate? */
334 sbr->N_low = sbr->N_high/2 + (sbr->N_high - 2 * (sbr->N_high/2));
335 393
336 sbr->n[0] = sbr->N_low; 394 sbr->n[0] = sbr->N_low;
337 sbr->n[1] = sbr->N_high; 395 sbr->n[1] = sbr->N_high;
338 396
339 for (k = 0; k <= sbr->N_high; k++) 397 for (k = 0; k <= sbr->N_high; k++)
342 } 400 }
343 401
344 sbr->M = sbr->f_table_res[HI_RES][sbr->N_high] - sbr->f_table_res[HI_RES][0]; 402 sbr->M = sbr->f_table_res[HI_RES][sbr->N_high] - sbr->f_table_res[HI_RES][0];
345 sbr->kx = sbr->f_table_res[HI_RES][0]; 403 sbr->kx = sbr->f_table_res[HI_RES][0];
346 404
347 /* correct? */
348 minus = (sbr->N_high & 1) ? 1 : 0; 405 minus = (sbr->N_high & 1) ? 1 : 0;
349 406
350 for (k = 0; k <= sbr->N_low; k++) 407 for (k = 0; k <= sbr->N_low; k++)
351 { 408 {
352 if (k == 0) 409 if (k == 0)
353 i = 0; 410 i = 0;
354 else 411 else
355 i = 2*k - minus; 412 i = 2*k - minus;
356 sbr->f_table_res[LO_RES][k] = sbr->f_table_res[HI_RES][i]; 413 sbr->f_table_res[LO_RES][k] = sbr->f_table_res[HI_RES][i];
357 } 414 }
358 /* end correct? */
359 415
360 #if 0 416 #if 0
361 printf("f_table_res[HI_RES][%d]: ", sbr->N_high); 417 printf("f_table_res[HI_RES][%d]: ", sbr->N_high);
362 for (k = 0; k <= sbr->N_high; k++) 418 for (k = 0; k <= sbr->N_high; k++)
363 { 419 {
377 sbr->N_Q = 0; 433 sbr->N_Q = 0;
378 if (sbr->bs_noise_bands == 0) 434 if (sbr->bs_noise_bands == 0)
379 { 435 {
380 sbr->N_Q = 1; 436 sbr->N_Q = 1;
381 } else { 437 } else {
382 /* MAPLE */ 438 #if 0
383 sbr->N_Q = max(1, (int32_t)(sbr->bs_noise_bands*(log(k2/(float)sbr->kx)/log(2.0)) + 0.5)); 439 sbr->N_Q = max(1, (int32_t)(sbr->bs_noise_bands*(log(k2/(float)sbr->kx)/log(2.0)) + 0.5));
384 if (sbr->N_Q == 0) 440 #else
385 sbr->N_Q = 1; 441 sbr->N_Q = max(1, find_bands(0, sbr->bs_noise_bands, sbr->kx, k2));
386 } 442 #endif
387 sbr->N_Q = min(5, sbr->N_Q); 443 sbr->N_Q = min(5, sbr->N_Q);
444 }
388 445
389 for (k = 0; k <= sbr->N_Q; k++) 446 for (k = 0; k <= sbr->N_Q; k++)
390 { 447 {
391 if (k == 0) 448 if (k == 0)
449 {
392 i = 0; 450 i = 0;
393 else /* is this accurate? */ 451 } else { /* is this accurate? */
394 i = i + (int32_t)((sbr->N_low - i)/(sbr->N_Q + 1 - k)); 452 //i = i + (int32_t)((sbr->N_low - i)/(sbr->N_Q + 1 - k));
453 i = i + (sbr->N_low - i)/(sbr->N_Q + 1 - k);
454 }
395 sbr->f_table_noise[k] = sbr->f_table_res[LO_RES][i]; 455 sbr->f_table_noise[k] = sbr->f_table_res[LO_RES][i];
396 } 456 }
397 457
398 /* build table for mapping k to g in hf patching */ 458 /* build table for mapping k to g in hf patching */
399 for (k = 0; k < 64; k++) 459 for (k = 0; k < 64; k++)
416 { 476 {
417 printf("%d ", sbr->f_table_noise[k]); 477 printf("%d ", sbr->f_table_noise[k]);
418 } 478 }
419 printf("\n"); 479 printf("\n");
420 #endif 480 #endif
481
482 return 0;
421 } 483 }
422 484
423 /* TODO: blegh, ugly */ 485 /* TODO: blegh, ugly */
424 /* Modified to calculate for all possible bs_limiter_bands always 486 /* Modified to calculate for all possible bs_limiter_bands always
425 * This reduces the number calls to this functions needed (now only on 487 * This reduces the number calls to this functions needed (now only on
426 * header reset) 488 * header reset)
427 */ 489 */
428 void limiter_frequency_table(sbr_info *sbr) 490 void limiter_frequency_table(sbr_info *sbr)
429 { 491 {
430 static real_t limiterBandsPerOctave[] = { REAL_CONST(1.2), 492 #if 0
493 static const real_t limiterBandsPerOctave[] = { REAL_CONST(1.2),
431 REAL_CONST(2), REAL_CONST(3) }; 494 REAL_CONST(2), REAL_CONST(3) };
495 #else
496 static const real_t limiterBandsCompare[] = { REAL_CONST(1.328125),
497 REAL_CONST(1.1875), REAL_CONST(1.125) };
498 #endif
432 uint8_t k, s; 499 uint8_t k, s;
433 int8_t nrLim; 500 int8_t nrLim;
434 int32_t limTable[100 /*TODO*/]; 501 int32_t limTable[100 /*TODO*/];
435 uint8_t patchBorders[64/*??*/]; 502 uint8_t patchBorders[64/*??*/];
503 #if 0
436 real_t limBands; 504 real_t limBands;
505 #endif
437 506
438 sbr->f_table_lim[0][0] = sbr->f_table_res[LO_RES][0] - sbr->kx; 507 sbr->f_table_lim[0][0] = sbr->f_table_res[LO_RES][0] - sbr->kx;
439 sbr->f_table_lim[0][1] = sbr->f_table_res[LO_RES][sbr->N_low] - sbr->kx; 508 sbr->f_table_lim[0][1] = sbr->f_table_res[LO_RES][sbr->N_low] - sbr->kx;
440 sbr->N_L[0] = 1; 509 sbr->N_L[0] = 1;
441 510
442 for (s = 1; s < 4; s++) 511 for (s = 1; s < 4; s++)
443 { 512 {
444 memset(limTable, 0, 100*sizeof(int32_t)); 513 memset(limTable, 0, 100*sizeof(int32_t));
445 514
515 #if 0
446 limBands = limiterBandsPerOctave[s - 1]; 516 limBands = limiterBandsPerOctave[s - 1];
517 #endif
447 518
448 patchBorders[0] = sbr->kx; 519 patchBorders[0] = sbr->kx;
449 for (k = 1; k <= sbr->noPatches; k++) 520 for (k = 1; k <= sbr->noPatches; k++)
450 { 521 {
451 patchBorders[k] = patchBorders[k-1] + sbr->patchNoSubbands[k-1]; 522 patchBorders[k] = patchBorders[k-1] + sbr->patchNoSubbands[k-1];
472 if (k <= nrLim) 543 if (k <= nrLim)
473 { 544 {
474 real_t nOctaves; 545 real_t nOctaves;
475 546
476 if (limTable[k-1] != 0) 547 if (limTable[k-1] != 0)
548 #if 0
477 nOctaves = REAL_CONST(log((float)limTable[k]/(float)limTable[k-1])/log(2.0)); 549 nOctaves = REAL_CONST(log((float)limTable[k]/(float)limTable[k-1])/log(2.0));
550 #endif
551 nOctaves = (real_t)limTable[k]/(real_t)limTable[k-1];
478 else 552 else
479 nOctaves = 0; 553 nOctaves = 0;
480 554
555 #if 0
481 if ((MUL(nOctaves,limBands)) < REAL_CONST(0.49)) 556 if ((MUL(nOctaves,limBands)) < REAL_CONST(0.49))
557 #else
558 if (nOctaves < limiterBandsCompare[s - 1])
559 #endif
482 { 560 {
483 uint8_t i; 561 uint8_t i;
484 if (limTable[k] != limTable[k-1]) 562 if (limTable[k] != limTable[k-1])
485 { 563 {
486 uint8_t found = 0, found2 = 0; 564 uint8_t found = 0, found2 = 0;