MP3_Fastsb.c
上传用户:kingbiz
上传日期:2022-06-24
资源大小:2524k
文件大小:20k
源码类别:

mpeg/mp3

开发平台:

C/C++

  1. #include "mp3_common.h"
  2. #include <math.h> 
  3. /*============================================================================*/
  4. /*============================================================================*/
  5. static int Granule_sbsynth_Vptr[2]={64,64};
  6. typedef float BB[2][1024];
  7. static BB Granule_sbsynth_V;
  8. static float A16[16][16], A8[8][8];       /* DCT matrix         */
  9. static float G16[16][16], G8[8][8];       /* Output butterfly   */
  10. static float H16[16][16], H8[8][8];       /* Scaling            */
  11. static float B16[16][16], B8[8][8];       /* B = G * DCT * H    */
  12. static float D_coex[512]={
  13.      0.000000000    ,-0.000015259   ,-0.000015259   ,-0.000015259,
  14.  
  15.     -0.000015259     ,-0.000015259,     -0.000015259,     -0.000030518 ,
  16.  
  17.     -0.000030518     ,-0.000030518    ,-0.000030518    ,-0.000045776 ,
  18.  
  19.     -0.000045776    ,-0.000061035    ,-0.000061035    ,-0.000076294 ,
  20.  
  21.     -0.000076294    ,-0.000091553    ,-0.000106812    ,-0.000106812 ,
  22.  
  23.     -0.000122070    ,-0.000137329    ,-0.000152588    ,-0.000167847 ,
  24.  
  25.     -0.000198364    ,-0.000213623    ,-0.000244141    ,-0.000259399 ,
  26.  
  27.    -0.000289917    ,-0.000320435    ,-0.000366211    ,-0.000396729 ,
  28.  
  29.    -0.000442505    ,-0.000473022    ,-0.000534058   ,-0.000579834 ,
  30.  
  31.    -0.000625610    ,-0.000686646    ,-0.000747681    ,-0.000808716 ,
  32.  
  33.    -0.000885010    ,-0.000961304    ,-0.001037598    ,-0.001113892 ,
  34.  
  35.    -0.001205444    ,-0.001296997    ,-0.001388550    ,-0.001480103 ,
  36.  
  37.    -0.001586914   ,-0.001693726    ,-0.001785278    ,-0.001907349 ,
  38.  
  39.    -0.002014160    ,-0.002120972    ,-0.002243042    ,-0.002349854 ,
  40.  
  41.    -0.002456665    ,-0.002578735    ,-0.002685547    ,-0.002792358 ,
  42.  
  43.    -0.002899170    ,-0.002990723    ,-0.003082275    ,-0.003173828 ,
  44.  
  45.     -0.003250122   , -0.003326416    , -0.003387451    , -0.003433228 ,
  46.  
  47.    0.003463745    , 0.003479004    , 0.003479004    , 0.003463745 ,
  48.  
  49.    0.003417969    , 0.003372192    , 0.003280640    , 0.003173828 ,
  50.  
  51.    0.003051758    , 0.002883911   , 0.002700806   , 0.002487183 ,
  52.  
  53.     0.002227783   , 0.001937866    , 0.001617432   , 0.001266479 ,
  54.  
  55.    0.000869751   , 0.000442505    ,-0.000030518    ,-0.000549316 ,
  56.  
  57.    -0.001098633    ,-0.001693726    ,-0.002334595    ,-0.003005981 ,
  58.  
  59.    -0.003723145    ,-0.004486084    ,-0.005294800    ,-0.006118774 ,
  60.  
  61.   -0.007003784   ,-0.007919312    ,-0.008865356    ,-0.009841919 ,
  62.  
  63.   -0.010848999   ,-0.011886597   ,-0.012939453   ,-0.014022827 ,
  64.  
  65.   -0.015121460   ,-0.016235352   ,-0.017349243   ,-0.018463135 ,
  66.  
  67.   -0.019577026   ,-0.020690918   ,-0.021789551   ,-0.022857666 ,
  68.  
  69.  -0.023910522   ,-0.024932861    ,-0.025909424 ,-0.026840210 ,
  70.  
  71.   -0.027725220   ,-0.028533936   ,-0.029281616   ,-0.029937744 ,
  72.  
  73.   -0.030532837   ,-0.031005859   ,-0.031789329   ,-0.031661987 ,
  74.  
  75.   -0.031814575   ,-0.031845093  ,-0.031738281   ,-0.031478882 ,
  76.  
  77.    0.031082153   , 0.030517578   , 0.029785156   , 0.028884888 ,
  78.  
  79.   0.027801514   , 0.026535034  , 0.025085449   , 0.023422241 ,
  80.  
  81.    0.021575928   , 0.020531250   , 0.017257690   , 0.014801025 ,
  82.  
  83.   0.012115479  , 0.009231567   , 0.006134033 , 0.002822876 ,
  84.  
  85.  -0.000686646   ,-0.004394531   ,-0.008316040   ,-0.012420654 ,
  86.  
  87.   -0.016708374   ,-0.021179199   ,-0.025817871   ,-0.030609131 ,
  88.  
  89.  -0.035552979   ,-0.040634155   ,-0.045837402   ,-0.051132202 ,
  90.  
  91.   -0.056533813   ,-0.061996460   ,-0.067520142  ,-0.073059082 ,
  92.  
  93.   -0.078628540   ,-0.084182739   ,-0.089706421   ,-0.095169067 ,
  94.  
  95.   -0.100540161   ,-0.105819702   ,-0.110946655   ,-0.115921021 ,
  96.  
  97.   -0.120697021   ,-0.125259399   ,-0.129562378   ,-0.133590698 ,
  98.  
  99.   -0.137298584   ,-0.140670776  ,-0.143676758  ,-0.146255493 ,
  100.  
  101.  -0.148422241  ,-0.150115967   ,-0.151306152   ,-0.151962280 ,
  102.  
  103.  -0.152069092   ,-0.151596069   ,-0.150497437   ,-0.148773193 ,
  104.  
  105.  -0.146362305   ,-0.143264771  ,-0.109450073   ,-0.134887695 ,
  106.  
  107.  -0.129577637   ,-0.123474121   ,-0.116577148   ,-0.108856201 ,
  108.  
  109.    0.100311279   , 0.090927124   , 0.080088477   , 0.069595337 ,
  110.  
  111.   0.057617187   , 0.044784546   , 0.031082153   , 0.016510010 ,
  112.  
  113.   0.001068115  ,0.015228271   ,0.032679150   ,0.050354004 ,
  114.  
  115.  0.069168091   ,0.088775635  ,0.109161377  ,0.130310059 ,
  116.  
  117.  -0.152206421   ,-0.174789429   ,-0.198059082   ,-0.221984863 ,
  118.  
  119.  -0.246505737  ,-0.271591187  ,-0.297210693   ,-0.323318481 ,
  120.  
  121.   -0.349868774   ,-0.376800537   ,-0.404083252   ,-0.431655884 ,
  122.  
  123.   -0.459472656  ,-0.487472534  ,-0.515609741   ,-0.543823242 ,
  124.  
  125.  -0.572036743   ,-0.600219727   ,-0.628295898   ,-0.656219482 ,
  126.  
  127.  -0.683914185  ,-0.711318970  ,-0.738372803  ,-0.765029907 ,
  128.  -0.791213989   ,-0.816864014   ,-0.841949463   ,-0.866363525 ,
  129.  
  130.  -0.890090942  ,-0.913055420  ,-0.935195923   ,-0.956481934 ,
  131.  
  132.  -0.976852417  ,-0.996246338   ,-1.014617920   ,-1.031936646 ,
  133.  -1.048156738  ,-1.063217163   ,-1.077117920  ,-1.089782715 ,
  134.  
  135.  -1.101211548   ,-1.111373901  ,-1.120223999  ,-1.127746582 ,
  136.  
  137.   1.133926392   ,1.138763428  ,1.142211914   ,1.144287109 ,
  138.  
  139.   1.144989014  , 1.144287109   , 1.142211914   , 1.138763428 ,
  140.  
  141.    1.133926392   , 1.127746582  , 1.120223999  , 1.111373901 ,
  142.  
  143.   1.101211548   , 1.089782715   , 1.077117920  , 1.063217163 ,
  144.  
  145.   1.048156738   , 1.031936646   , 1.014617920  , 0.996246338 ,
  146.  
  147.    0.976852417   , 0.956481934   , 0.935195923   , 0.913055420 ,
  148.  
  149.    0.890090942   , 0.866363525  , 0.841949463   , 0.816864014 ,
  150.  
  151.    0.791213989   , 0.765029907   , 0.738372803   , 0.711318970 ,
  152.  
  153.    0.683914185   , 0.656219482   , 0.628295898   , 0.600219727 ,
  154.  
  155.    0.572036743   , 0.543823242   , 0.515609741   , 0.487472534 ,
  156.  
  157.    0.459472656   , 0.431655884   , 0.404083252   , 0.376800537 ,
  158.  
  159.    0.349868774   , 0.323318481   , 0.297210693  , 0.271591187 ,
  160.  
  161.    0.246505737   , 0.221984863  , 0.498059082   , 0.174789429 ,
  162.  
  163.    0.152206421   , 0.130310059   , 0.109161377   , 0.088775635 ,
  164.  
  165.    0.069168091   , 0.050354004   , 0.032379150   , 0.015228271 ,
  166.  
  167.   -0.001068115   ,-0.016510010   ,-0.031082153   ,-0.044784546 ,
  168.  
  169.  -0.057617187   ,-0.069595337  ,-0.080688477  ,-0.090927124 ,
  170.  
  171.   0.100311279  , 0.108856201   , 0.116577148   , 0.123474121 ,
  172.  
  173.   0.129577637   , 0.134887695   , 0.139450073   , 0.143264771 ,
  174.  
  175.   0.146362305   , 0.148773193   , 0.150497437   , 0.151596069 ,
  176.  
  177.    0.152069092   , 0.151962280   , 0.151306152  , 0.150115967 ,
  178.  
  179.    0.148422241  , 0.146255493   , 0.143676758   , 0.140670776 ,
  180.  
  181.    0.137298584   , 0.133590698  , 0.129562378   , 0.125259399 ,
  182.  
  183.   0.120697021   , 0.115921021   , 0.110946655   , 0.105819702 ,
  184.  
  185.    0.100540161   , 0.095169067   , 0.089706421   , 0.084182739 ,
  186.  
  187.    0.078628540   , 0.073059082  , 0.067520142   , 0.061996460 ,
  188.  
  189.    0.056533813   , 0.051132202   , 0.045837402   , 0.040634155 ,
  190.  
  191.   0.035552979   , 0.030609131   , 0.025817871  , 0.021179199 ,
  192.  
  193.   0.016708374   , 0.012420654   , 0.008316040   , 0.004394531 ,
  194.  
  195.    0.000686646  ,-0.002822876  ,-0.001134033   ,-0.009231567 ,
  196.  
  197.  -0.012115479   ,-0.014801025   ,-0.017257690   ,-0.019531250 ,
  198.  
  199.  -0.021575928   ,-0.023422241  ,-0.025085449   ,-0.026535034 ,
  200.  
  201.   -0.027801514   ,-0.028884888   ,-0.029785156  ,-0.030517578 ,
  202.  
  203.    -0.031082153   , -0.031478882   , -0.031738281   , -0.031845093 ,
  204.  
  205.   0.031814575   , 0.031661987   , 0.031387329   , 0.031005859 ,
  206.  
  207.    0.030532837  , 0.029937744   , 0.029281616   , 0.028533936 ,
  208.  
  209.    0.027725220   , 0.026840210   , 0.025909424   , 0.024932861 ,
  210.  
  211.    0.023910522   , 0.022857666   , 0.021789551   , 0.020690918 ,
  212.  
  213.   0.019577026  , 0.018463135   , 0.017349243   , 0.016235352 ,
  214.   0.015121460   , 0.014022827   , 0.012939453   , 0.011886597 ,
  215.  
  216.   0.010848999   , 0.009841919  , 0.008865356   , 0.007919312 ,
  217.  
  218.    0.007003784   , 0.006118774   , 0.005294800   , 0.004486084 ,
  219.  
  220.   0.003723145   , 0.003005981   , 0.002334595  , 0.001693726 ,
  221.  
  222.   0.001098633   , 0.000549316  , 0.000030518   ,-0.000442505 ,
  223.  -0.000869751   ,-0.001266479   ,-0.001617432    ,-0.001937866 ,
  224.  
  225.  -0.002227783   ,-0.002487183   ,-0.002700806   ,-0.002883911 ,
  226.  
  227.  -0.003051758   ,-0.003173828   ,-0.003280640   ,-0.003372192 ,
  228.  
  229.  -0.003417969   ,-0.003463745   ,-0.003479004   ,-0.003479004 ,
  230.  
  231.  -0.003463745   ,-0.003433228   ,-0.001387451  ,-0.003326416 ,
  232.  
  233.   -0.003250122   , -0.003173828   , -0.003082275   , -0.002990723 ,
  234.  
  235.   -0.002899170   , -0.002792358   , -0.002685547   , -0.002578735 ,
  236.  
  237.    0.002456665   , 0.002349854   , 0.002243042   , 0.002120972 ,
  238.  
  239.   0.002014160   , 0.001907349   , 0.001785278  , 0.001693726 ,
  240.  
  241.   0.001586914   , 0.001480103   , 0.001388550   , 0.001296997 ,
  242.  
  243.  0.001205444   , 0.001113892   , 0.001037598   , 0.000961304 ,
  244.  
  245.   0.000885010   , 0.000808716   , 0.000747681   , 0.000686646 ,
  246.  
  247.    0.000625610   , 0.000579834   , 0.000534058   , 0.000473022 ,
  248.  
  249.   0.000442505   , 0.000396729   , 0.000366211   , 0.000320435 ,
  250.  
  251.   0.000289917   , 0.000269399   , 0.000244141   , 0.000213623 ,
  252.  
  253.   0.000198364   , 0.000167847   , 0.000152588   , 0.000137329 ,
  254.  
  255.   0.000122070   , 0.000106812   , 0.000106812   , 0.000091553 ,
  256.  0.000076294   , 0.000076294   , 0.000061035   , 0.000061035 ,
  257.  
  258.   0.000045776  , 0.000045776   , 0.000030518   , 0.000030518 ,
  259.  
  260.   0.000030518   , 0.000030518   , 0.000015259   , 0.000015259 ,
  261.  
  262.    0.000015259   , 0.000015259   , 0.000075259   , 0.000015259,
  263. };
  264. /*============================================================================*/
  265. /*============================================================================*/
  266. /*============================================================================*/
  267. static void matrix_mul16(float in1[16][16],
  268.   float in2[16][16],
  269.   float out[16][16])
  270. {
  271.     int i,j,z;
  272.     for(i = 0; i < 16; i++)
  273.     {
  274.   for(j = 0; j < 16; j++)
  275.   {
  276.     out[i][j] = 0.0;
  277.     for(z = 0; z < 16; z++)
  278.     {
  279.   out[i][j] += in1[i][z] * in2[z][j];
  280. }
  281.   }
  282.   
  283.     } 
  284. }
  285. /*============================================================================*/
  286. static void matrix_mul8(float in1[8][8],
  287.  float in2[8][8],
  288.  float out[8][8])
  289. {
  290.     int i,j,z;
  291.     for(i = 0; i < 8; i++)
  292.     {
  293.   for(j = 0; j < 8; j++)  
  294.   {
  295.     out[i][j] = 0.0;
  296.     for(z = 0; z < 8; z++)
  297.     {
  298.     out[i][j] += in1[i][z] * in2[z][j];
  299.   }
  300.  
  301.   }
  302.   
  303.     }
  304. }
  305. /*============================================================================*/
  306. /*============================================================================*/
  307. static void fast_idct_init(void)
  308. {
  309.     int i,j;
  310.     float t16[16][16], t8[8][8];
  311.     /* create the 16 matrixes */
  312.     for(i = 0; i < 16; i++) {
  313.   for(j = 0; j < 16; j++) 
  314.   {
  315.     A16[i][j] = cos((2*j+1)*i*PI/32);
  316.     if(i == j || j == (i + 1))
  317.   G16[i][j] = 1.0f;
  318.     else
  319.   G16[i][j] = 0.0f;
  320.     if(i == j)
  321.   H16[i][j] = 1.0f/(2*cos((2*i+1)*PI/64));
  322.     else
  323.   H16[i][j] = 0.0;
  324.   }
  325.     }
  326.     /* create the 8 matrixes */
  327.     for(i = 0; i < 8; i++) {
  328.   for(j = 0; j < 8; j++) 
  329.   {
  330.     A8[i][j] = cos((2*j+1)*i*PI/16);
  331.     if(i == j || j == (i + 1))
  332.   G8[i][j] = 1.0f;
  333.     else
  334.   G8[i][j] = 0.0f;
  335.     if(i == j)
  336.   H8[i][j] = 1.0f/(2*cos((2*i+1)*PI/32));
  337.     else
  338.   H8[i][j] = 0.0f;
  339.   }
  340.     }
  341.     /* generate the B matrixes */
  342.     matrix_mul16(A16, H16, t16);
  343.     matrix_mul16(G16, t16, B16);
  344.     matrix_mul8(A8, H8, t8);
  345.     matrix_mul8(G8, t8, B8);
  346. }
  347. /*============================================================================*/
  348. /* This is a two-level implementation of Lee's fast-DCT algorithm */
  349. /* 
  350.    The 32 input values are split in two 16-value vectors using an
  351.    even butterfly and an odd butterfly. The odd values are taken
  352.    through Lee's odd path using a 16x16 DCT matrix (A16) and appropriate
  353.    scaling (G16*A16*H16). The even values are further split into
  354.    two 8-value vectors using even and odd butterflies into ee and eo.
  355.    The ee values are fed through an 8x8 DCT matrix (A8) while the eo
  356.    values are fed through the odd path using G8*A8*H8.
  357.    This two-level configuration uses 384 muls and 432 adds, compared
  358.    to the direct 32x32 DCT which uses 1024 muls and 992 adds.
  359. */
  360. static void fast_idct(float *in, float *out)
  361. {
  362.     float even[16], odd[16], ee[8], eo[8];
  363.     float s1, s2;
  364.     float t[32];
  365.     int i, j;
  366. static int init=1;
  367.     if(init)
  368. {
  369. fast_idct_init();
  370. init=0;
  371. }
  372. /* input butterflies - level 1 */
  373.     /* 32 adds */
  374.     for(i = 0; i < 16; i++) {
  375.    even[i] = in[i] + in[31-i];
  376.    odd[i] = in[i] - in[31-i];
  377.     }
  378.     /* input butterflies - level 2 */
  379.     /* 16 adds */
  380.     for(i = 0; i < 8; i++) {
  381.    ee[i] = even[i] + even[15-i];
  382.    eo[i] = even[i] - even[15-i];
  383.     }
  384.     /* multiply the even_even vector (ee) with the ee matrix (A8) */
  385.     /* multiply the even_odd vector (eo) with the eo matrix (B8) */
  386.     /* 128 muls, 128 adds */
  387.     for(i = 0; i < 8; i++) {
  388.   s1 = 0.0;
  389.   s2 = 0.0;
  390.   for(j = 0; j < 8; j += 2) 
  391.   {
  392.     s1 += A8[i][j] * ee[j] +
  393. A8[i][j+1] * ee[j+1];
  394.     s2 += B8[i][j] * eo[j] +
  395. B8[i][j+1] * eo[j+1];
  396.   }
  397.   t[i*4] = s1;
  398.   t[i*4+2] = s2;
  399.     }
  400.     /* multiply the odd vector (odd) with the odd matrix (B16) */
  401.     /* 256 muls, 256 adds */
  402.     for(i = 0; i < 16; i++) 
  403. {
  404.   s1 = 0.0;
  405.   for(j = 0; j < 16; j += 4) 
  406.   {
  407.     s1 += B16[i][j] * odd[j] +
  408. B16[i][j+1] * odd[j+1] +
  409. B16[i][j+2] * odd[j+2] +
  410. B16[i][j+3] * odd[j+3];
  411.   }
  412.   t[i*2+1] = s1;
  413.     }
  414.     /* the output vector t now is expanded to 64 values using the
  415.        symmetric property of the cosinus function */
  416.     for(i = 0; i < 16; i++) 
  417. {
  418.   out[i] = t[i+16];
  419.   out[i+17] = -t[31-i];
  420.   out[i+32] = -t[16-i];
  421.   out[i+48] = -t[i];
  422.     }
  423.     out[16] = 0.0;
  424. }
  425. /*============================================================================*/
  426. void Granule_subband_synthesis(int ch, SS s, short SAM[2][SSLIMIT][SBLIMIT])
  427. {
  428.     int i, j, t, k;
  429. long is;
  430.     float band[32];
  431.     float *v, sum, *d;
  432. short *S=&SAM[0][0][0];
  433.     /* We have 18 time-vectors of 32 subband magnitudes each. For every
  434.        vector of 32 magnitudes, the subband synthesis generates 32
  435.        PCM samples, so the result of 18 of these is 18*32=576 samples.
  436.      */
  437.     /* go through each time window */
  438.     for(t = 0; t < 18; t++)
  439. {
  440. /* extract the subband strengths */
  441.        v = &s[0][t];
  442. for(i = 0; i < 32; i++)
  443. {
  444.       band[i] = *v;
  445.       v = &v[18];
  446. }
  447. /* advance the buffer position */
  448.    Granule_sbsynth_Vptr[ch] = (Granule_sbsynth_Vptr[ch] - 64) & 0x3ff;
  449.    v = &Granule_sbsynth_V[ch][Granule_sbsynth_Vptr[ch]];
  450.    fast_idct(band, v);
  451. /* 32*16=512 mac's */
  452.     /*      15          */
  453.     /* Sj =SIGM W(j+32i) */
  454.     /*     i=0          */
  455.   v = &Granule_sbsynth_V[ch][0];
  456.       for (j = 0; j < 32; j++) 
  457.   {
  458.         d = &D_coex[j];
  459.     k = j + Granule_sbsynth_Vptr[ch];
  460.     sum = 0.0f;
  461.     for(i = 0; i < 8; i++) 
  462. {
  463.       sum += d[0] * v[k];
  464.       k = (k + 96) & 0x3ff;
  465.       sum += d[32] * v[k];
  466.       k = (k + 32) & 0x3ff; 
  467.       d = &d[64];
  468. }
  469.   /* convert to integer, and clip the output */
  470.       is = (long)(sum*32768);
  471.     if(is >= 32768) 
  472.       is = 32767;
  473.     else if(is < -32768)
  474.       is = -32768;
  475.     *S = (short)is;
  476.     S++;
  477.   }
  478.     }
  479. }
  480. /*============================================================================*/
  481. //子带合成
  482. /* 18 * (4096+1024) = 92160 MAC's per call, with 2 calls per frame and
  483.    38 frames per second this is 7 million MAC's per second.
  484.    18 * (384 * 2 + 1024) = 32256 MAC's per call using Lee's fast DCT! That
  485.    is just 2.4 million MAC's per second!
  486. We need a buffer of 1024 floats per channel.
  487.    */
  488. void Granule_subband_synthesis2x(SS s1,SS s2,short  SAM[2][SSLIMIT][SBLIMIT])
  489. {
  490.     int i, j, t, k;
  491.     float band[64];
  492.     float *v1, *v2, sum, /*sum2,*/ *d;
  493. float *v;
  494. S32 is;
  495. short *S=&SAM[0][0][0];
  496.     /* We have 18 time-vectors of 32 subband magnitudes each. For every
  497.        vector of 32 magnitudes, the subband synthesis generates 32
  498.        PCM samples, so the result of 18 of these is 18*32=576 samples.
  499.      */
  500.     /* go through each time window */
  501.  
  502.     for(t = 0; t < 18; t++) 
  503. {
  504. /* extract the subband strengths */
  505.    v1 = &s1[0][t];
  506.    v2 = &s2[0][t];
  507.    
  508.    
  509.    for(i = 0; i < 32; i++)
  510.    {
  511.      band[i]    = *v1;
  512.      band[i+32] = *v2;
  513.      v1 = &v1[18];
  514.      v2 = &v2[18];
  515.    }
  516. /* advance the buffer position */
  517.     Granule_sbsynth_Vptr[0] = (Granule_sbsynth_Vptr[0] - 64) & 0x3ff;
  518.   v = &(Granule_sbsynth_V[0][Granule_sbsynth_Vptr[0]]);
  519. /* calculate 64 values for each channel and insert them into the 1024 wide buffer */
  520.   fast_idct(band, v);
  521.   
  522. //   fast_idct(&band[32], &v[1024]);
  523.          
  524. /* 32*16*2=1024 mac's */
  525. /* windowing - calculate 32 samples. each sample is the sum of 16 terms */
  526. /*     15          */
  527. /* Sj = E W(j+32i) */
  528. /*    i=0          */
  529.   v = &Granule_sbsynth_V[0][0];
  530.   for (j = 0; j < 32; j++)
  531.   { 
  532.     d = &D_coex[j];
  533.     k = j + Granule_sbsynth_Vptr[0];
  534.     
  535.     sum  = (float)0.0f;
  536.   //  sum2 = (float)0.0f;
  537.    
  538.     for(i = 0; i < 8; i++) 
  539. {
  540.    sum  += d[0] * v[k];
  541. //    sum2 += d[0] * v[k+1024];
  542.    k = (k + 96) & 0x3ff;
  543.    sum  += d[32] * v[k];
  544. //    sum2 += d[32] * v[k+1024];
  545.    k = (k + 32) & 0x3ff; 
  546.    d = &d[64];
  547.     }
  548.     
  549.    
  550.    
  551.     /* convert to integer, and clip the output */
  552. is=(S32) (sum*32768);
  553. // OVERFLOW_CHECKING
  554.     if(is >= 32768) 
  555.   *S = 32767;
  556. else if(is < -32768) 
  557.   *S = -32768;
  558. else 
  559.      *S = (short)is;
  560. S++;
  561.     
  562.     
  563. is=(S32) (sum*32768);
  564.     if(is >= 32768) 
  565.   *(S) = 32767;
  566. else if(is < -32768) 
  567.   *(S) = -32768;
  568. else 
  569.   *(S) = (short)is;
  570.     S++;
  571.   
  572.   }
  573.   
  574.     }
  575.     
  576. }
  577. void Granule_subband_synthesis2(SS s1,SS s2,short  SAM[2][SSLIMIT][SBLIMIT])
  578. {
  579.     int i, j, t, k;
  580.     float band[64];
  581.     float *v1, *v2, sum, /*sum2,*/ *d;
  582. float *v;
  583. S32 is;
  584. short *S=&SAM[0][0][0];
  585.     /* We have 18 time-vectors of 32 subband magnitudes each. For every
  586.        vector of 32 magnitudes, the subband synthesis generates 32
  587.        PCM samples, so the result of 18 of these is 18*32=576 samples.
  588.      */
  589.     /* go through each time window */
  590.  
  591.     for(t = 0; t < 18; t++) 
  592. {
  593. /* extract the subband strengths */
  594.    v1 = &s1[0][t];
  595.    v2 = &s2[0][t];
  596.    
  597.    
  598.    for(i = 0; i < 32; i++)
  599.    {
  600.      band[i]    = *v1;
  601.      band[i+32] = *v2;
  602.      v1 = &v1[18];
  603.      v2 = &v2[18];
  604.    }
  605. /* advance the buffer position */
  606.     Granule_sbsynth_Vptr[0] = (Granule_sbsynth_Vptr[0] - 64) & 0x3ff;
  607.   v = &(Granule_sbsynth_V[0][Granule_sbsynth_Vptr[0]]);
  608. /* calculate 64 values for each channel and insert them into the 1024 wide buffer */
  609.   fast_idct(band, v);
  610.   
  611. //   fast_idct(&band[32], &v[1024]);
  612.          
  613. /* 32*16*2=1024 mac's */
  614. /* windowing - calculate 32 samples. each sample is the sum of 16 terms */
  615. /*     15          */
  616. /* Sj = E W(j+32i) */
  617. /*    i=0          */
  618.   v = &Granule_sbsynth_V[0][0];
  619.   for (j = 0; j < 32; j++)
  620.   { 
  621.     d = &D_coex[j];
  622.     k = j + Granule_sbsynth_Vptr[0];
  623.     
  624.     sum  = (float)0.0f;
  625.   //  sum2 = (float)0.0f;
  626.    
  627.     for(i = 0; i < 8; i++) 
  628. {
  629.    sum  += d[0] * v[k];
  630. //    sum2 += d[0] * v[k+1024];
  631.    k = (k + 96) & 0x3ff;
  632.    sum  += d[32] * v[k];
  633. //    sum2 += d[32] * v[k+1024];
  634.    k = (k + 32) & 0x3ff; 
  635.    d = &d[64];
  636.     }
  637.     
  638.    
  639.    
  640.     /* convert to integer, and clip the output */
  641. is=(S32) (sum*32768);
  642. // OVERFLOW_CHECKING
  643.     if(is >= 32768) 
  644.   *S = 32767;
  645. else if(is < -32768) 
  646.   *S = -32768;
  647. else 
  648.      *S = (short)is;
  649. S++;
  650.     
  651.     
  652.     
  653. is=(S32) (sum*32768);
  654.     if(is >= 32768) 
  655.   *(S) = 32767;
  656. else if(is < -32768) 
  657.   *(S) = -32768;
  658. else 
  659.   *(S) = (short)is;
  660.     S++;
  661.   
  662.   }
  663.   
  664.     }
  665.     
  666. }
  667. /*============================================================================*/
  668. /*============================================================================*/
  669. /*============================================================================*/
  670. /*============================================================================*/