sbr_hfgen.c
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:22k
源码类别:

多媒体编程

开发平台:

Visual C++

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