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

多媒体编程

开发平台:

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_qmf.c,v 1.3 2005/11/01 21:41:43 gabest Exp $
  31. **/
  32. #include "common.h"
  33. #include "structs.h"
  34. #ifdef SBR_DEC
  35. #include <stdlib.h>
  36. #include <string.h>
  37. #include "sbr_dct.h"
  38. #include "sbr_qmf.h"
  39. #include "sbr_qmf_c.h"
  40. #include "sbr_syntax.h"
  41. qmfa_info *qmfa_init(uint8_t channels)
  42. {
  43.     qmfa_info *qmfa = (qmfa_info*)faad_malloc(sizeof(qmfa_info));
  44. /* x is implemented as double ringbuffer */
  45.     qmfa->x = (real_t*)faad_malloc(2 * channels * 10 * sizeof(real_t));
  46.     memset(qmfa->x, 0, 2 * channels * 10 * sizeof(real_t));
  47. /* ringbuffer index */
  48. qmfa->x_index = 0;
  49.     qmfa->channels = channels;
  50.     return qmfa;
  51. }
  52. void qmfa_end(qmfa_info *qmfa)
  53. {
  54.     if (qmfa)
  55.     {
  56.         if (qmfa->x) faad_free(qmfa->x);
  57.         faad_free(qmfa);
  58.     }
  59. }
  60. void sbr_qmf_analysis_32(sbr_info *sbr, qmfa_info *qmfa, const real_t *input,
  61.                          qmf_t X[MAX_NTSRHFG][64], uint8_t offset, uint8_t kx)
  62. {
  63.     ALIGN real_t u[64];
  64. #ifndef SBR_LOW_POWER
  65.     ALIGN real_t in_real[32], in_imag[32], out_real[32], out_imag[32];
  66. #else
  67.     ALIGN real_t y[32];
  68. #endif
  69.     uint32_t in = 0;
  70.     uint8_t l;
  71.     /* qmf subsample l */
  72.     for (l = 0; l < sbr->numTimeSlotsRate; l++)
  73.     {
  74.         int16_t n;
  75.         /* shift input buffer x */
  76. /* input buffer is not shifted anymore, x is implemented as double ringbuffer */
  77.         //memmove(qmfa->x + 32, qmfa->x, (320-32)*sizeof(real_t));
  78.         /* add new samples to input buffer x */
  79.         for (n = 32 - 1; n >= 0; n--)
  80.         {
  81. #ifdef FIXED_POINT
  82.             qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = (input[in++]) >> 4;
  83. #else
  84.             qmfa->x[qmfa->x_index + n] = qmfa->x[qmfa->x_index + n + 320] = input[in++];
  85. #endif
  86.         }
  87.         /* window and summation to create array u */
  88.         for (n = 0; n < 64; n++)
  89.         {
  90.             u[n] = MUL_F(qmfa->x[qmfa->x_index + n], qmf_c[2*n]) +
  91.                 MUL_F(qmfa->x[qmfa->x_index + n + 64], qmf_c[2*(n + 64)]) +
  92.                 MUL_F(qmfa->x[qmfa->x_index + n + 128], qmf_c[2*(n + 128)]) +
  93.                 MUL_F(qmfa->x[qmfa->x_index + n + 192], qmf_c[2*(n + 192)]) +
  94.                 MUL_F(qmfa->x[qmfa->x_index + n + 256], qmf_c[2*(n + 256)]);
  95.         }
  96. /* update ringbuffer index */
  97. qmfa->x_index -= 32;
  98. if (qmfa->x_index < 0)
  99. qmfa->x_index = (320-32);
  100.         /* calculate 32 subband samples by introducing X */
  101. #ifdef SBR_LOW_POWER
  102.         y[0] = u[48];
  103.         for (n = 1; n < 16; n++)
  104.             y[n] = u[n+48] + u[48-n];
  105.         for (n = 16; n < 32; n++)
  106.             y[n] = -u[n-16] + u[48-n];
  107.         DCT3_32_unscaled(u, y);
  108.         for (n = 0; n < 32; n++)
  109.         {
  110.             if (n < kx)
  111.             {
  112. #ifdef FIXED_POINT
  113.                 QMF_RE(X[l + offset][n]) = u[n] /*<< 1*/;
  114. #else
  115.                 QMF_RE(X[l + offset][n]) = 2. * u[n];
  116. #endif
  117.             } else {
  118.                 QMF_RE(X[l + offset][n]) = 0;
  119.             }
  120.         }
  121. #else
  122.         // Reordering of data moved from DCT_IV to here
  123.         in_imag[31] = u[1];
  124.         in_real[0] = u[0];
  125.         for (n = 1; n < 31; n++)
  126.         {
  127.             in_imag[31 - n] = u[n+1];
  128.             in_real[n] = -u[64-n];
  129.         }
  130.         in_imag[0] = u[32];
  131.         in_real[31] = -u[33];
  132.         // dct4_kernel is DCT_IV without reordering which is done before and after FFT
  133.         dct4_kernel(in_real, in_imag, out_real, out_imag);
  134.         // Reordering of data moved from DCT_IV to here
  135.         for (n = 0; n < 16; n++) {
  136.             if (2*n+1 < kx) {
  137. #ifdef FIXED_POINT
  138.                 QMF_RE(X[l + offset][2*n])   = out_real[n];
  139.                 QMF_IM(X[l + offset][2*n])   = out_imag[n];
  140.                 QMF_RE(X[l + offset][2*n+1]) = -out_imag[31-n];
  141.                 QMF_IM(X[l + offset][2*n+1]) = -out_real[31-n];
  142. #else
  143.                 QMF_RE(X[l + offset][2*n])   = 2. * out_real[n];
  144.                 QMF_IM(X[l + offset][2*n])   = 2. * out_imag[n];
  145.                 QMF_RE(X[l + offset][2*n+1]) = -2. * out_imag[31-n];
  146.                 QMF_IM(X[l + offset][2*n+1]) = -2. * out_real[31-n];
  147. #endif
  148.             } else {
  149.                 if (2*n < kx) {
  150. #ifdef FIXED_POINT
  151.                     QMF_RE(X[l + offset][2*n])   = out_real[n];
  152.                     QMF_IM(X[l + offset][2*n])   = out_imag[n];
  153. #else
  154.                     QMF_RE(X[l + offset][2*n])   = 2. * out_real[n];
  155.                     QMF_IM(X[l + offset][2*n])   = 2. * out_imag[n];
  156. #endif
  157.                 }
  158.                 else {
  159.                     QMF_RE(X[l + offset][2*n]) = 0;
  160.                     QMF_IM(X[l + offset][2*n]) = 0;
  161.                 }
  162.                 QMF_RE(X[l + offset][2*n+1]) = 0;
  163.                 QMF_IM(X[l + offset][2*n+1]) = 0;
  164.             }
  165.         }
  166. #endif
  167.     }
  168. }
  169. static const complex_t qmf32_pre_twiddle[] =
  170. {
  171.     { FRAC_CONST(0.999924701839145), FRAC_CONST(-0.012271538285720) },
  172.     { FRAC_CONST(0.999322384588350), FRAC_CONST(-0.036807222941359) },
  173.     { FRAC_CONST(0.998118112900149), FRAC_CONST(-0.061320736302209) },
  174.     { FRAC_CONST(0.996312612182778), FRAC_CONST(-0.085797312344440) },
  175.     { FRAC_CONST(0.993906970002356), FRAC_CONST(-0.110222207293883) },
  176.     { FRAC_CONST(0.990902635427780), FRAC_CONST(-0.134580708507126) },
  177.     { FRAC_CONST(0.987301418157858), FRAC_CONST(-0.158858143333861) },
  178.     { FRAC_CONST(0.983105487431216), FRAC_CONST(-0.183039887955141) },
  179.     { FRAC_CONST(0.978317370719628), FRAC_CONST(-0.207111376192219) },
  180.     { FRAC_CONST(0.972939952205560), FRAC_CONST(-0.231058108280671) },
  181.     { FRAC_CONST(0.966976471044852), FRAC_CONST(-0.254865659604515) },
  182.     { FRAC_CONST(0.960430519415566), FRAC_CONST(-0.278519689385053) },
  183.     { FRAC_CONST(0.953306040354194), FRAC_CONST(-0.302005949319228) },
  184.     { FRAC_CONST(0.945607325380521), FRAC_CONST(-0.325310292162263) },
  185.     { FRAC_CONST(0.937339011912575), FRAC_CONST(-0.348418680249435) },
  186.     { FRAC_CONST(0.928506080473216), FRAC_CONST(-0.371317193951838) },
  187.     { FRAC_CONST(0.919113851690058), FRAC_CONST(-0.393992040061048) },
  188.     { FRAC_CONST(0.909167983090522), FRAC_CONST(-0.416429560097637) },
  189.     { FRAC_CONST(0.898674465693954), FRAC_CONST(-0.438616238538528) },
  190.     { FRAC_CONST(0.887639620402854), FRAC_CONST(-0.460538710958240) },
  191.     { FRAC_CONST(0.876070094195407), FRAC_CONST(-0.482183772079123) },
  192.     { FRAC_CONST(0.863972856121587), FRAC_CONST(-0.503538383725718) },
  193.     { FRAC_CONST(0.851355193105265), FRAC_CONST(-0.524589682678469) },
  194.     { FRAC_CONST(0.838224705554838), FRAC_CONST(-0.545324988422046) },
  195.     { FRAC_CONST(0.824589302785025), FRAC_CONST(-0.565731810783613) },
  196.     { FRAC_CONST(0.810457198252595), FRAC_CONST(-0.585797857456439) },
  197.     { FRAC_CONST(0.795836904608884), FRAC_CONST(-0.605511041404326) },
  198.     { FRAC_CONST(0.780737228572094), FRAC_CONST(-0.624859488142386) },
  199.     { FRAC_CONST(0.765167265622459), FRAC_CONST(-0.643831542889791) },
  200.     { FRAC_CONST(0.749136394523459), FRAC_CONST(-0.662415777590172) },
  201.     { FRAC_CONST(0.732654271672413), FRAC_CONST(-0.680600997795453) },
  202.     { FRAC_CONST(0.715730825283819), FRAC_CONST(-0.698376249408973) }
  203. };
  204. qmfs_info *qmfs_init(uint8_t channels)
  205. {
  206.     qmfs_info *qmfs = (qmfs_info*)faad_malloc(sizeof(qmfs_info));
  207. /* v is a double ringbuffer */
  208.     qmfs->v = (real_t*)faad_malloc(2 * channels * 20 * sizeof(real_t));
  209.     memset(qmfs->v, 0, 2 * channels * 20 * sizeof(real_t));
  210.     qmfs->v_index = 0;
  211.     qmfs->channels = channels;
  212.     return qmfs;
  213. }
  214. void qmfs_end(qmfs_info *qmfs)
  215. {
  216.     if (qmfs)
  217.     {
  218.         if (qmfs->v) faad_free(qmfs->v);
  219.         faad_free(qmfs);
  220.     }
  221. }
  222. #ifdef SBR_LOW_POWER
  223. void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64],
  224.                           real_t *output)
  225. {
  226.     ALIGN real_t x[16];
  227.     ALIGN real_t y[16];
  228.     int32_t n, k, out = 0;
  229.     uint8_t l;
  230.     /* qmf subsample l */
  231.     for (l = 0; l < sbr->numTimeSlotsRate; l++)
  232.     {
  233.         /* shift buffers */
  234.         /* we are not shifting v, it is a double ringbuffer */
  235.         //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t));
  236.         /* calculate 64 samples */
  237.         for (k = 0; k < 16; k++)
  238.         {
  239. #ifdef FIXED_POINT
  240.             y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k]));
  241.             x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k]));
  242. #else
  243.             y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][31 - k])) / 32.0;
  244.             x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][31 - k])) / 32.0;
  245. #endif
  246.         }
  247.         /* even n samples */
  248.         DCT2_16_unscaled(x, x);
  249.         /* odd n samples */
  250.         DCT4_16(y, y);
  251.         for (n = 8; n < 24; n++)
  252.         {
  253.             qmfs->v[qmfs->v_index + n*2] = qmfs->v[qmfs->v_index + 640 + n*2] = x[n-8];
  254.             qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 640 + n*2+1] = y[n-8];
  255.         }
  256.         for (n = 0; n < 16; n++)
  257.         {
  258.             qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 640 + n] = qmfs->v[qmfs->v_index + 32-n];
  259.         }
  260.         qmfs->v[qmfs->v_index + 48] = qmfs->v[qmfs->v_index + 640 + 48] = 0;
  261.         for (n = 1; n < 16; n++)
  262.         {
  263.             qmfs->v[qmfs->v_index + 48+n] = qmfs->v[qmfs->v_index + 640 + 48+n] = -qmfs->v[qmfs->v_index + 48-n];
  264.         }
  265.         /* calculate 32 output samples and window */
  266.         for (k = 0; k < 32; k++)
  267.         {
  268.             output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) +
  269.                 MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) +
  270.                 MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) +
  271.                 MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) +
  272.                 MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) +
  273.                 MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) +
  274.                 MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) +
  275.                 MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) +
  276.                 MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) +
  277.                 MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]);
  278.         }
  279.         /* update the ringbuffer index */
  280.         qmfs->v_index -= 64;
  281.         if (qmfs->v_index < 0)
  282.             qmfs->v_index = (640-64);
  283.     }
  284. }
  285. void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64],
  286.                           real_t *output)
  287. {
  288.     ALIGN real_t x[64];
  289.     ALIGN real_t y[64];
  290.     int32_t n, k, out = 0;
  291.     uint8_t l;
  292.     /* qmf subsample l */
  293.     for (l = 0; l < sbr->numTimeSlotsRate; l++)
  294.     {
  295.         /* shift buffers */
  296.         /* we are not shifting v, it is a double ringbuffer */
  297.         //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t));
  298.         /* calculate 128 samples */
  299.         for (k = 0; k < 32; k++)
  300.         {
  301. #ifdef FIXED_POINT
  302.             y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k]));
  303.             x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k]));
  304. #else
  305.             y[k] = (QMF_RE(X[l][k]) - QMF_RE(X[l][63 - k])) / 32.0;
  306.             x[k] = (QMF_RE(X[l][k]) + QMF_RE(X[l][63 - k])) / 32.0;
  307. #endif
  308.         }
  309.         /* even n samples */
  310.         DCT2_32_unscaled(x, x);
  311.         /* odd n samples */
  312.         DCT4_32(y, y);
  313.         for (n = 16; n < 48; n++)
  314.         {
  315.             qmfs->v[qmfs->v_index + n*2]   = qmfs->v[qmfs->v_index + 1280 + n*2]   = x[n-16];
  316.             qmfs->v[qmfs->v_index + n*2+1] = qmfs->v[qmfs->v_index + 1280 + n*2+1] = y[n-16];
  317.         }
  318.         for (n = 0; n < 32; n++)
  319.         {
  320.             qmfs->v[qmfs->v_index + n] = qmfs->v[qmfs->v_index + 1280 + n] = qmfs->v[qmfs->v_index + 64-n];
  321.         }
  322.         qmfs->v[qmfs->v_index + 96] = qmfs->v[qmfs->v_index + 1280 + 96] = 0;
  323.         for (n = 1; n < 32; n++)
  324.         {
  325.             qmfs->v[qmfs->v_index + 96+n] = qmfs->v[qmfs->v_index + 1280 + 96+n] = -qmfs->v[qmfs->v_index + 96-n];
  326.         }
  327.         /* calculate 64 output samples and window */
  328.         for (k = 0; k < 64; k++)
  329.         {
  330.             output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[k]) +
  331.                 MUL_F(qmfs->v[qmfs->v_index + 192 + k], qmf_c[64 + k]) +
  332.                 MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[128 + k]) +
  333.                 MUL_F(qmfs->v[qmfs->v_index + 256 + 192 + k], qmf_c[128 + 64 + k]) +
  334.                 MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[256 + k]) +
  335.                 MUL_F(qmfs->v[qmfs->v_index + 512 + 192 + k], qmf_c[256 + 64 + k]) +
  336.                 MUL_F(qmfs->v[qmfs->v_index + 768 + k], qmf_c[384 + k]) +
  337.                 MUL_F(qmfs->v[qmfs->v_index + 768 + 192 + k], qmf_c[384 + 64 + k]) +
  338.                 MUL_F(qmfs->v[qmfs->v_index + 1024 + k], qmf_c[512 + k]) +
  339.                 MUL_F(qmfs->v[qmfs->v_index + 1024 + 192 + k], qmf_c[512 + 64 + k]);
  340.         }
  341.         /* update the ringbuffer index */
  342.         qmfs->v_index -= 128;
  343.         if (qmfs->v_index < 0)
  344.             qmfs->v_index = (1280-128);
  345.     }
  346. }
  347. #else
  348. void sbr_qmf_synthesis_32(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64],
  349.                           real_t *output)
  350. {
  351.     ALIGN real_t x1[32], x2[32];
  352. #ifndef FIXED_POINT
  353.     real_t scale = 1.f/64.f;
  354. #endif
  355.     int32_t n, k, out = 0;
  356.     uint8_t l;
  357.     /* qmf subsample l */
  358.     for (l = 0; l < sbr->numTimeSlotsRate; l++)
  359.     {
  360.         /* shift buffer v */
  361.         /* buffer is not shifted, we are using a ringbuffer */
  362.         //memmove(qmfs->v + 64, qmfs->v, (640-64)*sizeof(real_t));
  363.         /* calculate 64 samples */
  364.         /* complex pre-twiddle */
  365.         for (k = 0; k < 32; k++)
  366.         {
  367.             x1[k] = MUL_F(QMF_RE(X[l][k]), RE(qmf32_pre_twiddle[k])) - MUL_F(QMF_IM(X[l][k]), IM(qmf32_pre_twiddle[k]));
  368.             x2[k] = MUL_F(QMF_IM(X[l][k]), RE(qmf32_pre_twiddle[k])) + MUL_F(QMF_RE(X[l][k]), IM(qmf32_pre_twiddle[k]));
  369. #ifndef FIXED_POINT
  370.             x1[k] *= scale;
  371.             x2[k] *= scale;
  372. #else
  373.             x1[k] >>= 1;
  374.             x2[k] >>= 1;
  375. #endif
  376.         }
  377.         /* transform */
  378.         DCT4_32(x1, x1);
  379.         DST4_32(x2, x2);
  380.         for (n = 0; n < 32; n++)
  381.         {
  382.             qmfs->v[qmfs->v_index + n]      = qmfs->v[qmfs->v_index + 640 + n]      = -x1[n] + x2[n];
  383.             qmfs->v[qmfs->v_index + 63 - n] = qmfs->v[qmfs->v_index + 640 + 63 - n] =  x1[n] + x2[n];
  384.         }
  385.         /* calculate 32 output samples and window */
  386.         for (k = 0; k < 32; k++)
  387.         {
  388.             output[out++] = MUL_F(qmfs->v[qmfs->v_index + k], qmf_c[2*k]) +
  389.                 MUL_F(qmfs->v[qmfs->v_index + 96 + k], qmf_c[64 + 2*k]) +
  390.                 MUL_F(qmfs->v[qmfs->v_index + 128 + k], qmf_c[128 + 2*k]) +
  391.                 MUL_F(qmfs->v[qmfs->v_index + 224 + k], qmf_c[192 + 2*k]) +
  392.                 MUL_F(qmfs->v[qmfs->v_index + 256 + k], qmf_c[256 + 2*k]) +
  393.                 MUL_F(qmfs->v[qmfs->v_index + 352 + k], qmf_c[320 + 2*k]) +
  394.                 MUL_F(qmfs->v[qmfs->v_index + 384 + k], qmf_c[384 + 2*k]) +
  395.                 MUL_F(qmfs->v[qmfs->v_index + 480 + k], qmf_c[448 + 2*k]) +
  396.                 MUL_F(qmfs->v[qmfs->v_index + 512 + k], qmf_c[512 + 2*k]) +
  397.                 MUL_F(qmfs->v[qmfs->v_index + 608 + k], qmf_c[576 + 2*k]);
  398.         }
  399.         /* update ringbuffer index */
  400.         qmfs->v_index -= 64;
  401.         if (qmfs->v_index < 0)
  402.             qmfs->v_index = (640 - 64);
  403.     }
  404. }
  405. void sbr_qmf_synthesis_64(sbr_info *sbr, qmfs_info *qmfs, qmf_t X[MAX_NTSRHFG][64],
  406.                           real_t *output)
  407. {
  408. //    ALIGN real_t x1[64], x2[64];
  409. #ifndef SBR_LOW_POWER
  410.     ALIGN real_t in_real1[32], in_imag1[32], out_real1[32], out_imag1[32];
  411.     ALIGN real_t in_real2[32], in_imag2[32], out_real2[32], out_imag2[32];
  412. #endif
  413.     qmf_t * pX;
  414.     real_t * pring_buffer_1, * pring_buffer_3;
  415. //    real_t * ptemp_1, * ptemp_2;
  416. #ifdef PREFER_POINTERS
  417.     // These pointers are used if target platform has autoinc address generators
  418.     real_t * pring_buffer_2, * pring_buffer_4;
  419.     real_t * pring_buffer_5, * pring_buffer_6;
  420.     real_t * pring_buffer_7, * pring_buffer_8;
  421.     real_t * pring_buffer_9, * pring_buffer_10;
  422.     const real_t * pqmf_c_1, * pqmf_c_2, * pqmf_c_3, * pqmf_c_4;
  423.     const real_t * pqmf_c_5, * pqmf_c_6, * pqmf_c_7, * pqmf_c_8;
  424.     const real_t * pqmf_c_9, * pqmf_c_10;
  425. #endif // #ifdef PREFER_POINTERS
  426. #ifndef FIXED_POINT
  427.     real_t scale = 1.f/64.f;
  428. #endif
  429.     int32_t n, k, out = 0;
  430.     uint8_t l;
  431.     /* qmf subsample l */
  432.     for (l = 0; l < sbr->numTimeSlotsRate; l++)
  433.     {
  434.         /* shift buffer v */
  435. /* buffer is not shifted, we use double ringbuffer */
  436. //memmove(qmfs->v + 128, qmfs->v, (1280-128)*sizeof(real_t));
  437.         /* calculate 128 samples */
  438. #ifndef FIXED_POINT
  439.         pX = X[l];
  440.         in_imag1[31] = scale*QMF_RE(pX[1]);
  441.         in_real1[0]  = scale*QMF_RE(pX[0]);
  442.         in_imag2[31] = scale*QMF_IM(pX[63-1]);
  443.         in_real2[0]  = scale*QMF_IM(pX[63-0]);
  444.         for (k = 1; k < 31; k++)
  445.         {
  446.             in_imag1[31 - k] = scale*QMF_RE(pX[2*k + 1]);
  447.             in_real1[     k] = scale*QMF_RE(pX[2*k    ]);
  448.             in_imag2[31 - k] = scale*QMF_IM(pX[63 - (2*k + 1)]);
  449.             in_real2[     k] = scale*QMF_IM(pX[63 - (2*k    )]);
  450.         }
  451.         in_imag1[0]  = scale*QMF_RE(pX[63]);
  452.         in_real1[31] = scale*QMF_RE(pX[62]);
  453.         in_imag2[0]  = scale*QMF_IM(pX[63-63]);
  454.         in_real2[31] = scale*QMF_IM(pX[63-62]);
  455. #else
  456.         pX = X[l];
  457.         in_imag1[31] = QMF_RE(pX[1]) >> 1;
  458.         in_real1[0]  = QMF_RE(pX[0]) >> 1;
  459.         in_imag2[31] = QMF_IM(pX[62]) >> 1;
  460.         in_real2[0]  = QMF_IM(pX[63]) >> 1;
  461.         for (k = 1; k < 31; k++)
  462.         {
  463.             in_imag1[31 - k] = QMF_RE(pX[2*k + 1]) >> 1;
  464.             in_real1[     k] = QMF_RE(pX[2*k    ]) >> 1;
  465.             in_imag2[31 - k] = QMF_IM(pX[63 - (2*k + 1)]) >> 1;
  466.             in_real2[     k] = QMF_IM(pX[63 - (2*k    )]) >> 1;
  467.         }
  468.         in_imag1[0]  = QMF_RE(pX[63]) >> 1;
  469.         in_real1[31] = QMF_RE(pX[62]) >> 1;
  470.         in_imag2[0]  = QMF_IM(pX[0]) >> 1;
  471.         in_real2[31] = QMF_IM(pX[1]) >> 1;
  472. #endif
  473.         // dct4_kernel is DCT_IV without reordering which is done before and after FFT
  474.         dct4_kernel(in_real1, in_imag1, out_real1, out_imag1);
  475.         dct4_kernel(in_real2, in_imag2, out_real2, out_imag2);
  476.         pring_buffer_1 = qmfs->v + qmfs->v_index;
  477.         pring_buffer_3 = pring_buffer_1 + 1280;
  478. #ifdef PREFER_POINTERS
  479.         pring_buffer_2 = pring_buffer_1 + 127;
  480.         pring_buffer_4 = pring_buffer_1 + (1280 + 127);
  481. #endif // #ifdef PREFER_POINTERS
  482. //        ptemp_1 = x1;
  483. //        ptemp_2 = x2;
  484. #ifdef PREFER_POINTERS
  485.         for (n = 0; n < 32; n ++)
  486.         {
  487.             //real_t x1 = *ptemp_1++;
  488.             //real_t x2 = *ptemp_2++;
  489.             // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer
  490.             *pring_buffer_1++ = *pring_buffer_3++ = out_real2[n] - out_real1[n];
  491.             *pring_buffer_2-- = *pring_buffer_4-- = out_real2[n] + out_real1[n];
  492.             //x1 = *ptemp_1++;
  493.             //x2 = *ptemp_2++;
  494.             *pring_buffer_1++ = *pring_buffer_3++ = out_imag2[31-n] + out_imag1[31-n];
  495.             *pring_buffer_2-- = *pring_buffer_4-- = out_imag2[31-n] - out_imag1[31-n];
  496.         }
  497. #else // #ifdef PREFER_POINTERS
  498.         for (n = 0; n < 32; n++)
  499.         {
  500.             // pring_buffer_3 and pring_buffer_4 are needed only for double ring buffer
  501.             pring_buffer_1[2*n]         = pring_buffer_3[2*n]         = out_real2[n] - out_real1[n];
  502.             pring_buffer_1[127-2*n]     = pring_buffer_3[127-2*n]     = out_real2[n] + out_real1[n];
  503.             pring_buffer_1[2*n+1]       = pring_buffer_3[2*n+1]       = out_imag2[31-n] + out_imag1[31-n];
  504.             pring_buffer_1[127-(2*n+1)] = pring_buffer_3[127-(2*n+1)] = out_imag2[31-n] - out_imag1[31-n];
  505.         }
  506. #endif // #ifdef PREFER_POINTERS
  507.         pring_buffer_1 = qmfs->v + qmfs->v_index;
  508. #ifdef PREFER_POINTERS
  509.         pring_buffer_2 = pring_buffer_1 + 192;
  510.         pring_buffer_3 = pring_buffer_1 + 256;
  511.         pring_buffer_4 = pring_buffer_1 + (256 + 192);
  512.         pring_buffer_5 = pring_buffer_1 + 512;
  513.         pring_buffer_6 = pring_buffer_1 + (512 + 192);
  514.         pring_buffer_7 = pring_buffer_1 + 768;
  515.         pring_buffer_8 = pring_buffer_1 + (768 + 192);
  516.         pring_buffer_9 = pring_buffer_1 + 1024;
  517.         pring_buffer_10 = pring_buffer_1 + (1024 + 192);
  518.         pqmf_c_1 = qmf_c;
  519.         pqmf_c_2 = qmf_c + 64;
  520.         pqmf_c_3 = qmf_c + 128;
  521.         pqmf_c_4 = qmf_c + 192;
  522.         pqmf_c_5 = qmf_c + 256;
  523.         pqmf_c_6 = qmf_c + 320;
  524.         pqmf_c_7 = qmf_c + 384;
  525.         pqmf_c_8 = qmf_c + 448;
  526.         pqmf_c_9 = qmf_c + 512;
  527.         pqmf_c_10 = qmf_c + 576;
  528. #endif // #ifdef PREFER_POINTERS
  529.         /* calculate 64 output samples and window */
  530.         for (k = 0; k < 64; k++)
  531.         {
  532. #ifdef PREFER_POINTERS
  533.             output[out++] =
  534.                 MUL_F(*pring_buffer_1++,  *pqmf_c_1++) +
  535.                 MUL_F(*pring_buffer_2++,  *pqmf_c_2++) +
  536.                 MUL_F(*pring_buffer_3++,  *pqmf_c_3++) +
  537.                 MUL_F(*pring_buffer_4++,  *pqmf_c_4++) +
  538.                 MUL_F(*pring_buffer_5++,  *pqmf_c_5++) +
  539.                 MUL_F(*pring_buffer_6++,  *pqmf_c_6++) +
  540.                 MUL_F(*pring_buffer_7++,  *pqmf_c_7++) +
  541.                 MUL_F(*pring_buffer_8++,  *pqmf_c_8++) +
  542.                 MUL_F(*pring_buffer_9++,  *pqmf_c_9++) +
  543.                 MUL_F(*pring_buffer_10++, *pqmf_c_10++);
  544. #else // #ifdef PREFER_POINTERS
  545.             output[out++] =
  546.                 MUL_F(pring_buffer_1[k+0],          qmf_c[k+0])   +
  547.                 MUL_F(pring_buffer_1[k+192],        qmf_c[k+64])  +
  548.                 MUL_F(pring_buffer_1[k+256],        qmf_c[k+128]) +
  549.                 MUL_F(pring_buffer_1[k+(256+192)],  qmf_c[k+192]) +
  550.                 MUL_F(pring_buffer_1[k+512],        qmf_c[k+256]) +
  551.                 MUL_F(pring_buffer_1[k+(512+192)],  qmf_c[k+320]) +
  552.                 MUL_F(pring_buffer_1[k+768],        qmf_c[k+384]) +
  553.                 MUL_F(pring_buffer_1[k+(768+192)],  qmf_c[k+448]) +
  554.                 MUL_F(pring_buffer_1[k+1024],       qmf_c[k+512]) +
  555.                 MUL_F(pring_buffer_1[k+(1024+192)], qmf_c[k+576]);
  556. #endif // #ifdef PREFER_POINTERS
  557.         }
  558.         /* update ringbuffer index */
  559.         qmfs->v_index -= 128;
  560.         if (qmfs->v_index < 0)
  561.             qmfs->v_index = (1280 - 128);
  562.     }
  563. }
  564. #endif
  565. #endif