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

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