sbr_hfgen.c
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:21k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*
  2. ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
  3. ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com
  4. **  
  5. ** This program is free software; you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation; either version 2 of the License, or
  8. ** (at your option) any later version.
  9. ** 
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13. ** GNU General Public License for more details.
  14. ** 
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software 
  17. ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  18. **
  19. ** Any non-GPL usage of this software or parts of this software is strictly
  20. ** forbidden.
  21. **
  22. ** Commercial non-GPL licensing of this software is possible.
  23. ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
  24. **
  25. ** $Id: sbr_hfgen.c,v 1.22 2004/09/08 09:43:11 gcp Exp $
  26. **/
  27. /* High Frequency generation */
  28. #include "common.h"
  29. #include "structs.h"
  30. #ifdef SBR_DEC
  31. #include "sbr_syntax.h"
  32. #include "sbr_hfgen.h"
  33. #include "sbr_fbt.h"
  34. /* static function declarations */
  35. #ifdef SBR_LOW_POWER
  36. static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64],
  37.                                     complex_t *alpha_0, complex_t *alpha_1, real_t *rxx);
  38. static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg);
  39. #else
  40. static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64],
  41.                                  complex_t *alpha_0, complex_t *alpha_1, uint8_t k);
  42. #endif
  43. static void calc_chirp_factors(sbr_info *sbr, uint8_t ch);
  44. static void patch_construction(sbr_info *sbr);
  45. void hf_generation(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64],
  46.                    qmf_t Xhigh[MAX_NTSRHFG][64]
  47. #ifdef SBR_LOW_POWER
  48.                    ,real_t *deg
  49. #endif
  50.                    ,uint8_t ch)
  51. {
  52.     uint8_t l, i, x;
  53.     ALIGN complex_t alpha_0[64], alpha_1[64];
  54. #ifdef SBR_LOW_POWER
  55.     ALIGN real_t rxx[64];
  56. #endif
  57.     uint8_t offset = sbr->tHFAdj;
  58.     uint8_t first = sbr->t_E[ch][0];
  59.     uint8_t last = sbr->t_E[ch][sbr->L_E[ch]];
  60.     calc_chirp_factors(sbr, ch);
  61. #ifdef SBR_LOW_POWER
  62.     memset(deg, 0, 64*sizeof(real_t));
  63. #endif
  64.     if ((ch == 0) && (sbr->Reset))
  65.         patch_construction(sbr);
  66.     /* calculate the prediction coefficients */
  67. #ifdef SBR_LOW_POWER
  68.     calc_prediction_coef_lp(sbr, Xlow, alpha_0, alpha_1, rxx);
  69.     calc_aliasing_degree(sbr, rxx, deg);
  70. #endif
  71.     /* actual HF generation */
  72.     for (i = 0; i < sbr->noPatches; i++)
  73.     {
  74.         for (x = 0; x < sbr->patchNoSubbands[i]; x++)
  75.         {
  76.             real_t a0_r, a0_i, a1_r, a1_i;
  77.             real_t bw, bw2;
  78.             uint8_t q, p, k, g;
  79.             /* find the low and high band for patching */
  80.             k = sbr->kx + x;
  81.             for (q = 0; q < i; q++)
  82.             {
  83.                 k += sbr->patchNoSubbands[q];
  84.             }
  85.             p = sbr->patchStartSubband[i] + x;
  86. #ifdef SBR_LOW_POWER
  87.             if (x != 0 /*x < sbr->patchNoSubbands[i]-1*/)
  88.                 deg[k] = deg[p];
  89.             else
  90.                 deg[k] = 0;
  91. #endif
  92.             g = sbr->table_map_k_to_g[k];
  93.             bw = sbr->bwArray[ch][g];
  94.             bw2 = MUL_C(bw, bw);
  95.             /* do the patching */
  96.             /* with or without filtering */
  97.             if (bw2 > 0)
  98.             {
  99.                 real_t temp1_r, temp2_r, temp3_r;
  100. #ifndef SBR_LOW_POWER
  101.                 real_t temp1_i, temp2_i, temp3_i;
  102.                 calc_prediction_coef(sbr, Xlow, alpha_0, alpha_1, p);
  103. #endif
  104.                 a0_r = MUL_C(RE(alpha_0[p]), bw);
  105.                 a1_r = MUL_C(RE(alpha_1[p]), bw2);
  106. #ifndef SBR_LOW_POWER
  107.                 a0_i = MUL_C(IM(alpha_0[p]), bw);
  108.                 a1_i = MUL_C(IM(alpha_1[p]), bw2);
  109. #endif
  110.              temp2_r = QMF_RE(Xlow[first - 2 + offset][p]);
  111.              temp3_r = QMF_RE(Xlow[first - 1 + offset][p]);
  112. #ifndef SBR_LOW_POWER
  113.              temp2_i = QMF_IM(Xlow[first - 2 + offset][p]);
  114.              temp3_i = QMF_IM(Xlow[first - 1 + offset][p]);
  115. #endif
  116. for (l = first; l < last; l++)
  117.                 {
  118.                  temp1_r = temp2_r;
  119.                  temp2_r = temp3_r;
  120.                  temp3_r = QMF_RE(Xlow[l + offset][p]);
  121. #ifndef SBR_LOW_POWER
  122.                  temp1_i = temp2_i;
  123.                  temp2_i = temp3_i;
  124.                     temp3_i = QMF_IM(Xlow[l + offset][p]);
  125. #endif
  126. #ifdef SBR_LOW_POWER
  127.                     QMF_RE(Xhigh[l + offset][k]) =
  128.                         temp3_r
  129.                       +(MUL_R(a0_r, temp2_r) +
  130.                         MUL_R(a1_r, temp1_r));
  131. #else
  132.                     QMF_RE(Xhigh[l + offset][k]) =
  133.                         temp3_r
  134.                       +(MUL_R(a0_r, temp2_r) -
  135.                         MUL_R(a0_i, temp2_i) +
  136.                         MUL_R(a1_r, temp1_r) -
  137.                         MUL_R(a1_i, temp1_i));
  138.                     QMF_IM(Xhigh[l + offset][k]) =
  139.                         temp3_i
  140.                       +(MUL_R(a0_i, temp2_r) +
  141.                         MUL_R(a0_r, temp2_i) +
  142.                         MUL_R(a1_i, temp1_r) +
  143.                         MUL_R(a1_r, temp1_i));
  144. #endif
  145.                 }
  146.             } else {
  147.                 for (l = first; l < last; l++)
  148.                 {
  149.                     QMF_RE(Xhigh[l + offset][k]) = QMF_RE(Xlow[l + offset][p]);
  150. #ifndef SBR_LOW_POWER
  151.                     QMF_IM(Xhigh[l + offset][k]) = QMF_IM(Xlow[l + offset][p]);
  152. #endif
  153.                 }
  154.             }
  155.         }
  156.     }
  157.     if (sbr->Reset)
  158.     {
  159.         limiter_frequency_table(sbr);
  160.     }
  161. }
  162. typedef struct
  163. {
  164.     complex_t r01;
  165.     complex_t r02;
  166.     complex_t r11;
  167.     complex_t r12;
  168.     complex_t r22;
  169.     real_t det;
  170. } acorr_coef;
  171. #ifdef SBR_LOW_POWER
  172. static void auto_correlation(sbr_info *sbr, acorr_coef *ac,
  173.                              qmf_t buffer[MAX_NTSRHFG][64],
  174.                              uint8_t bd, uint8_t len)
  175. {
  176.     real_t r01 = 0, r02 = 0, r11 = 0;
  177.     int8_t j;
  178.     uint8_t offset = sbr->tHFAdj;
  179. #ifdef FIXED_POINT
  180.     const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f);
  181.     uint32_t maxi = 0;
  182.     uint32_t pow2, exp;
  183. #else
  184.     const real_t rel = 1 / (1 + 1e-6f);
  185. #endif
  186. #ifdef FIXED_POINT
  187.     mask = 0;
  188.     for (j = (offset-2); j < (len + offset); j++)
  189.     {
  190.         real_t x;
  191.         x = QMF_RE(buffer[j][bd])>>REAL_BITS;
  192.         mask |= x ^ (x >> 31);
  193.     }
  194.     exp = wl_min_lzc(mask);
  195.     /* improves accuracy */
  196.     if (exp > 0)
  197.         exp -= 1;
  198.     for (j = offset; j < len + offset; j++)
  199.     {
  200.         real_t buf_j = ((QMF_RE(buffer[j][bd])+(1<<(exp-1)))>>exp);
  201.         real_t buf_j_1 = ((QMF_RE(buffer[j-1][bd])+(1<<(exp-1)))>>exp);
  202.         real_t buf_j_2 = ((QMF_RE(buffer[j-2][bd])+(1<<(exp-1)))>>exp);
  203.         /* normalisation with rounding */
  204.         r01 += MUL_R(buf_j, buf_j_1);
  205.         r02 += MUL_R(buf_j, buf_j_2);
  206.         r11 += MUL_R(buf_j_1, buf_j_1);
  207.     }
  208.     RE(ac->r12) = r01 -
  209.         MUL_R(((QMF_RE(buffer[len+offset-1][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp)) +
  210.         MUL_R(((QMF_RE(buffer[offset-1][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp));
  211.     RE(ac->r22) = r11 -
  212.         MUL_R(((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[len+offset-2][bd])+(1<<(exp-1)))>>exp)) +
  213.         MUL_R(((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp), ((QMF_RE(buffer[offset-2][bd])+(1<<(exp-1)))>>exp));
  214. #else
  215.     for (j = offset; j < len + offset; j++)
  216.     {
  217.         r01 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-1][bd]);
  218.         r02 += QMF_RE(buffer[j][bd]) * QMF_RE(buffer[j-2][bd]);
  219.         r11 += QMF_RE(buffer[j-1][bd]) * QMF_RE(buffer[j-1][bd]);
  220.     }
  221.     RE(ac->r12) = r01 -
  222.         QMF_RE(buffer[len+offset-1][bd]) * QMF_RE(buffer[len+offset-2][bd]) +
  223.         QMF_RE(buffer[offset-1][bd]) * QMF_RE(buffer[offset-2][bd]);
  224.     RE(ac->r22) = r11 -
  225.         QMF_RE(buffer[len+offset-2][bd]) * QMF_RE(buffer[len+offset-2][bd]) +
  226.         QMF_RE(buffer[offset-2][bd]) * QMF_RE(buffer[offset-2][bd]);
  227. #endif
  228.     RE(ac->r01) = r01;
  229.     RE(ac->r02) = r02;
  230.     RE(ac->r11) = r11;
  231.     ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(MUL_R(RE(ac->r12), RE(ac->r12)), rel);
  232. }
  233. #else
  234. static void auto_correlation(sbr_info *sbr, acorr_coef *ac, qmf_t buffer[MAX_NTSRHFG][64],
  235.                              uint8_t bd, uint8_t len)
  236. {
  237.     real_t r01r = 0, r01i = 0, r02r = 0, r02i = 0, r11r = 0;
  238.     real_t temp1_r, temp1_i, temp2_r, temp2_i, temp3_r, temp3_i, temp4_r, temp4_i, temp5_r, temp5_i;
  239. #ifdef FIXED_POINT
  240.     const real_t rel = FRAC_CONST(0.999999); // 1 / (1 + 1e-6f);
  241.     uint32_t mask, exp;
  242.     real_t pow2_to_exp;
  243. #else
  244.     const real_t rel = 1 / (1 + 1e-6f);
  245. #endif
  246.     int8_t j;
  247.     uint8_t offset = sbr->tHFAdj;
  248. #ifdef FIXED_POINT
  249.     mask = 0;
  250.     for (j = (offset-2); j < (len + offset); j++)
  251.     {
  252.         real_t x;
  253.         x = QMF_RE(buffer[j][bd])>>REAL_BITS;
  254.         mask |= x ^ (x >> 31);
  255.         x = QMF_IM(buffer[j][bd])>>REAL_BITS;
  256.         mask |= x ^ (x >> 31);
  257.     }
  258.     exp = wl_min_lzc(mask);
  259.     /* improves accuracy */
  260.     if (exp > 0)
  261.         exp -= 1;
  262.    
  263.     pow2_to_exp = 1<<(exp-1);
  264.     temp2_r = (QMF_RE(buffer[offset-2][bd]) + pow2_to_exp) >> exp;
  265.     temp2_i = (QMF_IM(buffer[offset-2][bd]) + pow2_to_exp) >> exp;
  266.     temp3_r = (QMF_RE(buffer[offset-1][bd]) + pow2_to_exp) >> exp;
  267.     temp3_i = (QMF_IM(buffer[offset-1][bd]) + pow2_to_exp) >> exp;
  268.     // Save these because they are needed after loop
  269.     temp4_r = temp2_r;
  270.     temp4_i = temp2_i;
  271.     temp5_r = temp3_r;
  272.     temp5_i = temp3_i;
  273.     for (j = offset; j < len + offset; j++)
  274.     {
  275.      temp1_r = temp2_r; // temp1_r = (QMF_RE(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
  276.      temp1_i = temp2_i; // temp1_i = (QMF_IM(buffer[offset-2][bd] + (1<<(exp-1))) >> exp;
  277.      temp2_r = temp3_r; // temp2_r = (QMF_RE(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
  278.      temp2_i = temp3_i; // temp2_i = (QMF_IM(buffer[offset-1][bd] + (1<<(exp-1))) >> exp;
  279.         temp3_r = (QMF_RE(buffer[j][bd]) + pow2_to_exp) >> exp;
  280.         temp3_i = (QMF_IM(buffer[j][bd]) + pow2_to_exp) >> exp;
  281.         r01r += MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i);
  282.         r01i += MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i);
  283.         r02r += MUL_R(temp3_r, temp1_r) + MUL_R(temp3_i, temp1_i);
  284.         r02i += MUL_R(temp3_i, temp1_r) - MUL_R(temp3_r, temp1_i);
  285.         r11r += MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i);
  286.     }
  287.     // These are actual values in temporary variable at this point
  288.     // temp1_r = (QMF_RE(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp;
  289.     // temp1_i = (QMF_IM(buffer[len+offset-1-2][bd] + (1<<(exp-1))) >> exp;
  290.     // temp2_r = (QMF_RE(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp;
  291.     // temp2_i = (QMF_IM(buffer[len+offset-1-1][bd] + (1<<(exp-1))) >> exp;
  292.     // temp3_r = (QMF_RE(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp;
  293.     // temp3_i = (QMF_IM(buffer[len+offset-1][bd]) + (1<<(exp-1))) >> exp;
  294.     // temp4_r = (QMF_RE(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp;
  295.     // temp4_i = (QMF_IM(buffer[offset-2][bd]) + (1<<(exp-1))) >> exp;
  296.     // temp5_r = (QMF_RE(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp;
  297.     // temp5_i = (QMF_IM(buffer[offset-1][bd]) + (1<<(exp-1))) >> exp;
  298.     RE(ac->r12) = r01r -
  299.         (MUL_R(temp3_r, temp2_r) + MUL_R(temp3_i, temp2_i)) +
  300.         (MUL_R(temp5_r, temp4_r) + MUL_R(temp5_i, temp4_i));
  301.     IM(ac->r12) = r01i -
  302.         (MUL_R(temp3_i, temp2_r) - MUL_R(temp3_r, temp2_i)) +
  303.         (MUL_R(temp5_i, temp4_r) - MUL_R(temp5_r, temp4_i));
  304.     RE(ac->r22) = r11r -
  305.         (MUL_R(temp2_r, temp2_r) + MUL_R(temp2_i, temp2_i)) +
  306.         (MUL_R(temp4_r, temp4_r) + MUL_R(temp4_i, temp4_i));
  307. #else
  308.     temp2_r = QMF_RE(buffer[offset-2][bd]);
  309.     temp2_i = QMF_IM(buffer[offset-2][bd]);
  310.     temp3_r = QMF_RE(buffer[offset-1][bd]);
  311.     temp3_i = QMF_IM(buffer[offset-1][bd]);
  312.     // Save these because they are needed after loop
  313.     temp4_r = temp2_r;
  314.     temp4_i = temp2_i;
  315.     temp5_r = temp3_r;
  316.     temp5_i = temp3_i;
  317.     for (j = offset; j < len + offset; j++)
  318.     {
  319.      temp1_r = temp2_r; // temp1_r = QMF_RE(buffer[j-2][bd];
  320.      temp1_i = temp2_i; // temp1_i = QMF_IM(buffer[j-2][bd];
  321.      temp2_r = temp3_r; // temp2_r = QMF_RE(buffer[j-1][bd];
  322.      temp2_i = temp3_i; // temp2_i = QMF_IM(buffer[j-1][bd];
  323.         temp3_r = QMF_RE(buffer[j][bd]);
  324.         temp3_i = QMF_IM(buffer[j][bd]);
  325.         r01r += temp3_r * temp2_r + temp3_i * temp2_i;
  326.         r01i += temp3_i * temp2_r - temp3_r * temp2_i;
  327.         r02r += temp3_r * temp1_r + temp3_i * temp1_i;
  328.         r02i += temp3_i * temp1_r - temp3_r * temp1_i;
  329.         r11r += temp2_r * temp2_r + temp2_i * temp2_i;
  330.     }
  331.     // These are actual values in temporary variable at this point
  332.     // temp1_r = QMF_RE(buffer[len+offset-1-2][bd];
  333.     // temp1_i = QMF_IM(buffer[len+offset-1-2][bd];
  334.     // temp2_r = QMF_RE(buffer[len+offset-1-1][bd];
  335.     // temp2_i = QMF_IM(buffer[len+offset-1-1][bd];
  336.     // temp3_r = QMF_RE(buffer[len+offset-1][bd]);
  337.     // temp3_i = QMF_IM(buffer[len+offset-1][bd]);
  338.     // temp4_r = QMF_RE(buffer[offset-2][bd]);
  339.     // temp4_i = QMF_IM(buffer[offset-2][bd]);
  340.     // temp5_r = QMF_RE(buffer[offset-1][bd]);
  341.     // temp5_i = QMF_IM(buffer[offset-1][bd]);
  342.     RE(ac->r12) = r01r -
  343.         (temp3_r * temp2_r + temp3_i * temp2_i) +
  344.         (temp5_r * temp4_r + temp5_i * temp4_i);
  345.     IM(ac->r12) = r01i -
  346.         (temp3_i * temp2_r - temp3_r * temp2_i) +
  347.         (temp5_i * temp4_r - temp5_r * temp4_i);
  348.     RE(ac->r22) = r11r -
  349.         (temp2_r * temp2_r + temp2_i * temp2_i) +
  350.         (temp4_r * temp4_r + temp4_i * temp4_i);
  351. #endif
  352.     RE(ac->r01) = r01r;
  353.     IM(ac->r01) = r01i;
  354.     RE(ac->r02) = r02r;
  355.     IM(ac->r02) = r02i;
  356.     RE(ac->r11) = r11r;
  357.     ac->det = MUL_R(RE(ac->r11), RE(ac->r22)) - MUL_F(rel, (MUL_R(RE(ac->r12), RE(ac->r12)) + MUL_R(IM(ac->r12), IM(ac->r12))));
  358. }
  359. #endif
  360. /* calculate linear prediction coefficients using the covariance method */
  361. #ifndef SBR_LOW_POWER
  362. static void calc_prediction_coef(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64],
  363.                                  complex_t *alpha_0, complex_t *alpha_1, uint8_t k)
  364. {
  365.     real_t tmp;
  366.     acorr_coef ac;
  367.     auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6);
  368.     if (ac.det == 0)
  369.     {
  370.         RE(alpha_1[k]) = 0;
  371.         IM(alpha_1[k]) = 0;
  372.     } else {
  373. #ifdef FIXED_POINT
  374.         tmp = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11)));
  375.         RE(alpha_1[k]) = DIV_R(tmp, ac.det);
  376.         tmp = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11)));
  377.         IM(alpha_1[k]) = DIV_R(tmp, ac.det);
  378. #else
  379.         tmp = REAL_CONST(1.0) / ac.det;
  380.         RE(alpha_1[k]) = (MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(IM(ac.r01), IM(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11))) * tmp;
  381.         IM(alpha_1[k]) = (MUL_R(IM(ac.r01), RE(ac.r12)) + MUL_R(RE(ac.r01), IM(ac.r12)) - MUL_R(IM(ac.r02), RE(ac.r11))) * tmp;
  382. #endif
  383.     }
  384.     if (RE(ac.r11) == 0)
  385.     {
  386.         RE(alpha_0[k]) = 0;
  387.         IM(alpha_0[k]) = 0;
  388.     } else {
  389. #ifdef FIXED_POINT
  390.         tmp = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12)));
  391.         RE(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
  392.         tmp = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12)));
  393.         IM(alpha_0[k]) = DIV_R(tmp, RE(ac.r11));
  394. #else
  395.         tmp = 1.0f / RE(ac.r11);
  396.         RE(alpha_0[k]) = -(RE(ac.r01) + MUL_R(RE(alpha_1[k]), RE(ac.r12)) + MUL_R(IM(alpha_1[k]), IM(ac.r12))) * tmp;
  397.         IM(alpha_0[k]) = -(IM(ac.r01) + MUL_R(IM(alpha_1[k]), RE(ac.r12)) - MUL_R(RE(alpha_1[k]), IM(ac.r12))) * tmp;
  398. #endif
  399.     }
  400.     if ((MUL_R(RE(alpha_0[k]),RE(alpha_0[k])) + MUL_R(IM(alpha_0[k]),IM(alpha_0[k])) >= REAL_CONST(16)) ||
  401.         (MUL_R(RE(alpha_1[k]),RE(alpha_1[k])) + MUL_R(IM(alpha_1[k]),IM(alpha_1[k])) >= REAL_CONST(16)))
  402.     {
  403.         RE(alpha_0[k]) = 0;
  404.         IM(alpha_0[k]) = 0;
  405.         RE(alpha_1[k]) = 0;
  406.         IM(alpha_1[k]) = 0;
  407.     }
  408. }
  409. #else
  410. static void calc_prediction_coef_lp(sbr_info *sbr, qmf_t Xlow[MAX_NTSRHFG][64],
  411.                                     complex_t *alpha_0, complex_t *alpha_1, real_t *rxx)
  412. {
  413.     uint8_t k;
  414.     real_t tmp;
  415.     acorr_coef ac;
  416.     for (k = 1; k < sbr->f_master[0]; k++)
  417.     {
  418.         auto_correlation(sbr, &ac, Xlow, k, sbr->numTimeSlotsRate + 6);
  419.         if (ac.det == 0)
  420.         {
  421.             RE(alpha_0[k]) = 0;
  422.             RE(alpha_1[k]) = 0;
  423.         } else {
  424.             tmp = MUL_R(RE(ac.r01), RE(ac.r22)) - MUL_R(RE(ac.r12), RE(ac.r02));
  425.             RE(alpha_0[k]) = DIV_R(tmp, (-ac.det));
  426.             tmp = MUL_R(RE(ac.r01), RE(ac.r12)) - MUL_R(RE(ac.r02), RE(ac.r11));
  427.             RE(alpha_1[k]) = DIV_R(tmp, ac.det);
  428.         }
  429.         if ((RE(alpha_0[k]) >= REAL_CONST(4)) || (RE(alpha_1[k]) >= REAL_CONST(4)))
  430.         {
  431.             RE(alpha_0[k]) = REAL_CONST(0);
  432.             RE(alpha_1[k]) = REAL_CONST(0);
  433.         }
  434.         /* reflection coefficient */
  435.         if (RE(ac.r11) == 0)
  436.         {
  437.             rxx[k] = COEF_CONST(0.0);
  438.         } else {
  439.             rxx[k] = DIV_C(RE(ac.r01), RE(ac.r11));
  440.             rxx[k] = -rxx[k];
  441.             if (rxx[k] > COEF_CONST(1.0)) rxx[k] = COEF_CONST(1.0);
  442.             if (rxx[k] < COEF_CONST(-1.0)) rxx[k] = COEF_CONST(-1.0);
  443.         }
  444.     }
  445. }
  446. static void calc_aliasing_degree(sbr_info *sbr, real_t *rxx, real_t *deg)
  447. {
  448.     uint8_t k;
  449.     rxx[0] = COEF_CONST(0.0);
  450.     deg[1] = COEF_CONST(0.0);
  451.     for (k = 2; k < sbr->k0; k++)
  452.     {
  453.         deg[k] = 0.0;
  454.         if ((k % 2 == 0) && (rxx[k] < COEF_CONST(0.0)))
  455.         {
  456.             if (rxx[k-1] < 0.0)
  457.             {
  458.                 deg[k] = COEF_CONST(1.0);
  459.                 if (rxx[k-2] > COEF_CONST(0.0))
  460.                 {
  461.                     deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]);
  462.                 }
  463.             } else if (rxx[k-2] > COEF_CONST(0.0)) {
  464.                 deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]);
  465.             }
  466.         }
  467.         if ((k % 2 == 1) && (rxx[k] > COEF_CONST(0.0)))
  468.         {
  469.             if (rxx[k-1] > COEF_CONST(0.0))
  470.             {
  471.                 deg[k] = COEF_CONST(1.0);
  472.                 if (rxx[k-2] < COEF_CONST(0.0))
  473.                 {
  474.                     deg[k-1] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]);
  475.                 }
  476.             } else if (rxx[k-2] < COEF_CONST(0.0)) {
  477.                 deg[k] = COEF_CONST(1.0) - MUL_C(rxx[k-1], rxx[k-1]);
  478.             }
  479.         }
  480.     }
  481. }
  482. #endif
  483. /* FIXED POINT: bwArray = COEF */
  484. static real_t mapNewBw(uint8_t invf_mode, uint8_t invf_mode_prev)
  485. {
  486.     switch (invf_mode)
  487.     {
  488.     case 1: /* LOW */
  489.         if (invf_mode_prev == 0) /* NONE */
  490.             return COEF_CONST(0.6);
  491.         else
  492.             return COEF_CONST(0.75);
  493.     case 2: /* MID */
  494.         return COEF_CONST(0.9);
  495.     case 3: /* HIGH */
  496.         return COEF_CONST(0.98);
  497.     default: /* NONE */
  498.         if (invf_mode_prev == 1) /* LOW */
  499.             return COEF_CONST(0.6);
  500.         else
  501.             return COEF_CONST(0.0);
  502.     }
  503. }
  504. /* FIXED POINT: bwArray = COEF */
  505. static void calc_chirp_factors(sbr_info *sbr, uint8_t ch)
  506. {
  507.     uint8_t i;
  508.     for (i = 0; i < sbr->N_Q; i++)
  509.     {
  510.         sbr->bwArray[ch][i] = mapNewBw(sbr->bs_invf_mode[ch][i], sbr->bs_invf_mode_prev[ch][i]);
  511.         if (sbr->bwArray[ch][i] < sbr->bwArray_prev[ch][i])
  512.             sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.75)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.25));
  513.         else
  514.             sbr->bwArray[ch][i] = MUL_F(sbr->bwArray[ch][i], FRAC_CONST(0.90625)) + MUL_F(sbr->bwArray_prev[ch][i], FRAC_CONST(0.09375));
  515.         if (sbr->bwArray[ch][i] < COEF_CONST(0.015625))
  516.             sbr->bwArray[ch][i] = COEF_CONST(0.0);
  517.         if (sbr->bwArray[ch][i] >= COEF_CONST(0.99609375))
  518.             sbr->bwArray[ch][i] = COEF_CONST(0.99609375);
  519.         sbr->bwArray_prev[ch][i] = sbr->bwArray[ch][i];
  520.         sbr->bs_invf_mode_prev[ch][i] = sbr->bs_invf_mode[ch][i];
  521.     }
  522. }
  523. static void patch_construction(sbr_info *sbr)
  524. {
  525.     uint8_t i, k;
  526.     uint8_t odd, sb;
  527.     uint8_t msb = sbr->k0;
  528.     uint8_t usb = sbr->kx;
  529.     static const uint8_t goalSbTab[] = { 21, 23, 32, 43, 46, 64, 85, 93, 128, 0, 0, 0 };
  530.     /* (uint8_t)(2.048e6/sbr->sample_rate + 0.5); */
  531.     uint8_t goalSb = goalSbTab[get_sr_index(sbr->sample_rate)];
  532.     sbr->noPatches = 0;
  533.     if (goalSb < (sbr->kx + sbr->M))
  534.     {
  535.         for (i = 0, k = 0; sbr->f_master[i] < goalSb; i++)
  536.             k = i+1;
  537.     } else {
  538.         k = sbr->N_master;
  539.     }
  540.     if (sbr->N_master == 0)
  541.     {
  542.         sbr->noPatches = 0;
  543.         sbr->patchNoSubbands[0] = 0;
  544.         sbr->patchStartSubband[0] = 0;
  545.         return;
  546.     }
  547.     do
  548.     {
  549.         uint8_t j = k + 1;
  550.         do
  551.         {
  552.             j--;
  553.             sb = sbr->f_master[j];
  554.             odd = (sb - 2 + sbr->k0) % 2;
  555.         } while (sb > (sbr->k0 - 1 + msb - odd));
  556.         sbr->patchNoSubbands[sbr->noPatches] = max(sb - usb, 0);
  557.         sbr->patchStartSubband[sbr->noPatches] = sbr->k0 - odd -
  558.             sbr->patchNoSubbands[sbr->noPatches];
  559.         if (sbr->patchNoSubbands[sbr->noPatches] > 0)
  560.         {
  561.             usb = sb;
  562.             msb = sb;
  563.             sbr->noPatches++;
  564.         } else {
  565.             msb = sbr->kx;
  566.         }
  567.         if (sbr->f_master[k] - sb < 3)
  568.             k = sbr->N_master;
  569.     } while (sb != (sbr->kx + sbr->M));
  570.     if ((sbr->patchNoSubbands[sbr->noPatches-1] < 3) && (sbr->noPatches > 1))
  571.     {
  572.         sbr->noPatches--;
  573.     }
  574.     sbr->noPatches = min(sbr->noPatches, 5);
  575. }
  576. #endif