Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. // disable precision loss warning on type conversion
  2. #ifdef _MSC_VER
  3. #pragma warning(disable:4244 4056)
  4. #endif
  5.  
  6. float wincoef[264] =
  7. {                               // window coefs
  8. 0.000000000f, 0.000442505f, -0.003250122f, 0.007003784f,
  9. -0.031082151f, 0.078628540f, -0.100311279f, 0.572036743f,
  10. -1.144989014f, -0.572036743f, -0.100311279f, -0.078628540f,
  11. -0.031082151f, -0.007003784f, -0.003250122f, -0.000442505f,
  12. 0.000015259f, 0.000473022f, -0.003326416f, 0.007919312f,
  13. -0.030517576f, 0.084182739f, -0.090927124f, 0.600219727f,
  14. -1.144287109f, -0.543823242f, -0.108856201f, -0.073059082f,
  15. -0.031478882f, -0.006118774f, -0.003173828f, -0.000396729f,
  16. 0.000015259f, 0.000534058f, -0.003387451f, 0.008865356f,
  17. -0.029785154f, 0.089706421f, -0.080688477f, 0.628295898f,
  18. -1.142211914f, -0.515609741f, -0.116577141f, -0.067520142f,
  19. -0.031738281f, -0.005294800f, -0.003082275f, -0.000366211f,
  20. 0.000015259f, 0.000579834f, -0.003433228f, 0.009841919f,
  21. -0.028884888f, 0.095169067f, -0.069595337f, 0.656219482f,
  22. -1.138763428f, -0.487472534f, -0.123474121f, -0.061996460f,
  23. -0.031845093f, -0.004486084f, -0.002990723f, -0.000320435f,
  24. 0.000015259f, 0.000625610f, -0.003463745f, 0.010848999f,
  25. -0.027801514f, 0.100540161f, -0.057617184f, 0.683914185f,
  26. -1.133926392f, -0.459472656f, -0.129577637f, -0.056533810f,
  27. -0.031814575f, -0.003723145f, -0.002899170f, -0.000289917f,
  28. 0.000015259f, 0.000686646f, -0.003479004f, 0.011886597f,
  29. -0.026535034f, 0.105819702f, -0.044784546f, 0.711318970f,
  30. -1.127746582f, -0.431655884f, -0.134887695f, -0.051132202f,
  31. -0.031661987f, -0.003005981f, -0.002792358f, -0.000259399f,
  32. 0.000015259f, 0.000747681f, -0.003479004f, 0.012939452f,
  33. -0.025085449f, 0.110946655f, -0.031082151f, 0.738372803f,
  34. -1.120223999f, -0.404083252f, -0.139450073f, -0.045837402f,
  35. -0.031387329f, -0.002334595f, -0.002685547f, -0.000244141f,
  36. 0.000030518f, 0.000808716f, -0.003463745f, 0.014022826f,
  37. -0.023422241f, 0.115921021f, -0.016510010f, 0.765029907f,
  38. -1.111373901f, -0.376800537f, -0.143264771f, -0.040634155f,
  39. -0.031005858f, -0.001693726f, -0.002578735f, -0.000213623f,
  40. 0.000030518f, 0.000885010f, -0.003417969f, 0.015121460f,
  41. -0.021575928f, 0.120697014f, -0.001068115f, 0.791213989f,
  42. -1.101211548f, -0.349868774f, -0.146362305f, -0.035552979f,
  43. -0.030532837f, -0.001098633f, -0.002456665f, -0.000198364f,
  44. 0.000030518f, 0.000961304f, -0.003372192f, 0.016235352f,
  45. -0.019531250f, 0.125259399f, 0.015228271f, 0.816864014f,
  46. -1.089782715f, -0.323318481f, -0.148773193f, -0.030609131f,
  47. -0.029937742f, -0.000549316f, -0.002349854f, -0.000167847f,
  48. 0.000030518f, 0.001037598f, -0.003280640f, 0.017349243f,
  49. -0.017257690f, 0.129562378f, 0.032379150f, 0.841949463f,
  50. -1.077117920f, -0.297210693f, -0.150497437f, -0.025817871f,
  51. -0.029281614f, -0.000030518f, -0.002243042f, -0.000152588f,
  52. 0.000045776f, 0.001113892f, -0.003173828f, 0.018463135f,
  53. -0.014801024f, 0.133590698f, 0.050354004f, 0.866363525f,
  54. -1.063217163f, -0.271591187f, -0.151596069f, -0.021179199f,
  55. -0.028533936f, 0.000442505f, -0.002120972f, -0.000137329f,
  56. 0.000045776f, 0.001205444f, -0.003051758f, 0.019577026f,
  57. -0.012115479f, 0.137298584f, 0.069168091f, 0.890090942f,
  58. -1.048156738f, -0.246505737f, -0.152069092f, -0.016708374f,
  59. -0.027725220f, 0.000869751f, -0.002014160f, -0.000122070f,
  60. 0.000061035f, 0.001296997f, -0.002883911f, 0.020690918f,
  61. -0.009231566f, 0.140670776f, 0.088775635f, 0.913055420f,
  62. -1.031936646f, -0.221984863f, -0.151962280f, -0.012420653f,
  63. -0.026840210f, 0.001266479f, -0.001907349f, -0.000106812f,
  64. 0.000061035f, 0.001388550f, -0.002700806f, 0.021789551f,
  65. -0.006134033f, 0.143676758f, 0.109161377f, 0.935195923f,
  66. -1.014617920f, -0.198059082f, -0.151306152f, -0.008316040f,
  67. -0.025909424f, 0.001617432f, -0.001785278f, -0.000106812f,
  68. 0.000076294f, 0.001480103f, -0.002487183f, 0.022857666f,
  69. -0.002822876f, 0.146255493f, 0.130310059f, 0.956481934f,
  70. -0.996246338f, -0.174789429f, -0.150115967f, -0.004394531f,
  71. -0.024932859f, 0.001937866f, -0.001693726f, -0.000091553f,
  72. -0.001586914f, -0.023910521f, -0.148422241f, -0.976852417f,
  73. 0.152206421f, 0.000686646f, -0.002227783f, 0.000076294f,
  74. };
  75.  
  76. void window(float *vbuf, int vb_ptr, short *pcm)
  77. {
  78.    int i, j;
  79.    int si, bx;
  80.    float *coef;
  81.    float sum;
  82.    long tmp;
  83.  
  84.    si = vb_ptr + 16;
  85.    bx = (si + 32) & 511;
  86.    coef = wincoef;
  87.  
  88. /*-- first 16 --*/
  89.    for (i = 0; i < 16; i++)
  90.    {
  91.       sum = 0.0F;
  92.       for (j = 0; j < 8; j++)
  93.       {
  94.          sum += (*coef++) * vbuf[si];
  95.          si = (si + 64) & 511;
  96.          sum -= (*coef++) * vbuf[bx];
  97.          bx = (bx + 64) & 511;
  98.       }
  99.       si++;
  100.       bx--;
  101.       tmp = (long) sum;
  102.       if (tmp > 32767)
  103.          tmp = 32767;
  104.       else if (tmp < -32768)
  105.          tmp = -32768;
  106.       *pcm++ = tmp;
  107.    }
  108. /*--  special case --*/
  109.    sum = 0.0F;
  110.    for (j = 0; j < 8; j++)
  111.    {
  112.       sum += (*coef++) * vbuf[bx];
  113.       bx = (bx + 64) & 511;
  114.    }
  115.    tmp = (long) sum;
  116.    if (tmp > 32767)
  117.       tmp = 32767;
  118.    else if (tmp < -32768)
  119.       tmp = -32768;
  120.    *pcm++ = tmp;
  121. /*-- last 15 --*/
  122.    coef = wincoef + 255;        /* back pass through coefs */
  123.    for (i = 0; i < 15; i++)
  124.    {
  125.       si--;
  126.       bx++;
  127.       sum = 0.0F;
  128.       for (j = 0; j < 8; j++)
  129.       {
  130.          sum += (*coef--) * vbuf[si];
  131.          si = (si + 64) & 511;
  132.          sum += (*coef--) * vbuf[bx];
  133.          bx = (bx + 64) & 511;
  134.       }
  135.       tmp = (long) sum;
  136.       if (tmp > 32767)
  137.          tmp = 32767;
  138.       else if (tmp < -32768)
  139.          tmp = -32768;
  140.       *pcm++ = tmp;
  141.    }
  142. }
  143.  
  144.  
  145.  
  146. /*------------------------------------------------------------*/
  147. void window_dual(float *vbuf, int vb_ptr, short *pcm)
  148. {
  149.    int i, j;                    /* dual window interleaves output */
  150.    int si, bx;
  151.    float *coef;
  152.    float sum;
  153.    long tmp;
  154.  
  155.    si = vb_ptr + 16;
  156.    bx = (si + 32) & 511;
  157.    coef = wincoef;
  158.  
  159. /*-- first 16 --*/
  160.    for (i = 0; i < 16; i++)
  161.    {
  162.       sum = 0.0F;
  163.       for (j = 0; j < 8; j++)
  164.       {
  165.          sum += (*coef++) * vbuf[si];
  166.          si = (si + 64) & 511;
  167.          sum -= (*coef++) * vbuf[bx];
  168.          bx = (bx + 64) & 511;
  169.       }
  170.       si++;
  171.       bx--;
  172.       tmp = (long) sum;
  173.       if (tmp > 32767)
  174.          tmp = 32767;
  175.       else if (tmp < -32768)
  176.          tmp = -32768;
  177.       *pcm = tmp;
  178.       pcm += 2;
  179.    }
  180. /*--  special case --*/
  181.    sum = 0.0F;
  182.    for (j = 0; j < 8; j++)
  183.    {
  184.       sum += (*coef++) * vbuf[bx];
  185.       bx = (bx + 64) & 511;
  186.    }
  187.    tmp = (long) sum;
  188.    if (tmp > 32767)
  189.       tmp = 32767;
  190.    else if (tmp < -32768)
  191.       tmp = -32768;
  192.    *pcm = tmp;
  193.    pcm += 2;
  194. /*-- last 15 --*/
  195.    coef = wincoef + 255;        /* back pass through coefs */
  196.    for (i = 0; i < 15; i++)
  197.    {
  198.       si--;
  199.       bx++;
  200.       sum = 0.0F;
  201.       for (j = 0; j < 8; j++)
  202.       {
  203.          sum += (*coef--) * vbuf[si];
  204.          si = (si + 64) & 511;
  205.          sum += (*coef--) * vbuf[bx];
  206.          bx = (bx + 64) & 511;
  207.       }
  208.       tmp = (long) sum;
  209.       if (tmp > 32767)
  210.          tmp = 32767;
  211.       else if (tmp < -32768)
  212.          tmp = -32768;
  213.       *pcm = tmp;
  214.       pcm += 2;
  215.    }
  216. }
  217. /*------------------------------------------------------------*/
  218. /*------------------- 16 pt window ------------------------------*/
  219. void window16(float *vbuf, int vb_ptr, short *pcm)
  220. {
  221.    int i, j;
  222.    unsigned char si, bx;
  223.    float *coef;
  224.    float sum;
  225.    long tmp;
  226.  
  227.    si = vb_ptr + 8;
  228.    bx = si + 16;
  229.    coef = wincoef;
  230.  
  231. /*-- first 8 --*/
  232.    for (i = 0; i < 8; i++)
  233.    {
  234.       sum = 0.0F;
  235.       for (j = 0; j < 8; j++)
  236.       {
  237.          sum += (*coef++) * vbuf[si];
  238.          si += 32;
  239.          sum -= (*coef++) * vbuf[bx];
  240.          bx += 32;
  241.       }
  242.       si++;
  243.       bx--;
  244.       coef += 16;
  245.       tmp = (long) sum;
  246.       if (tmp > 32767)
  247.          tmp = 32767;
  248.       else if (tmp < -32768)
  249.          tmp = -32768;
  250.       *pcm++ = tmp;
  251.    }
  252. /*--  special case --*/
  253.    sum = 0.0F;
  254.    for (j = 0; j < 8; j++)
  255.    {
  256.       sum += (*coef++) * vbuf[bx];
  257.       bx += 32;
  258.    }
  259.    tmp = (long) sum;
  260.    if (tmp > 32767)
  261.       tmp = 32767;
  262.    else if (tmp < -32768)
  263.       tmp = -32768;
  264.    *pcm++ = tmp;
  265. /*-- last 7 --*/
  266.    coef = wincoef + 255;        /* back pass through coefs */
  267.    for (i = 0; i < 7; i++)
  268.    {
  269.       coef -= 16;
  270.       si--;
  271.       bx++;
  272.       sum = 0.0F;
  273.       for (j = 0; j < 8; j++)
  274.       {
  275.          sum += (*coef--) * vbuf[si];
  276.          si += 32;
  277.          sum += (*coef--) * vbuf[bx];
  278.          bx += 32;
  279.       }
  280.       tmp = (long) sum;
  281.       if (tmp > 32767)
  282.          tmp = 32767;
  283.       else if (tmp < -32768)
  284.          tmp = -32768;
  285.       *pcm++ = tmp;
  286.    }
  287. }
  288. /*--------------- 16 pt dual window (interleaved output) -----------------*/
  289. void window16_dual(float *vbuf, int vb_ptr, short *pcm)
  290. {
  291.    int i, j;
  292.    unsigned char si, bx;
  293.    float *coef;
  294.    float sum;
  295.    long tmp;
  296.  
  297.    si = vb_ptr + 8;
  298.    bx = si + 16;
  299.    coef = wincoef;
  300.  
  301. /*-- first 8 --*/
  302.    for (i = 0; i < 8; i++)
  303.    {
  304.       sum = 0.0F;
  305.       for (j = 0; j < 8; j++)
  306.       {
  307.          sum += (*coef++) * vbuf[si];
  308.          si += 32;
  309.          sum -= (*coef++) * vbuf[bx];
  310.          bx += 32;
  311.       }
  312.       si++;
  313.       bx--;
  314.       coef += 16;
  315.       tmp = (long) sum;
  316.       if (tmp > 32767)
  317.          tmp = 32767;
  318.       else if (tmp < -32768)
  319.          tmp = -32768;
  320.       *pcm = tmp;
  321.       pcm += 2;
  322.    }
  323. /*--  special case --*/
  324.    sum = 0.0F;
  325.    for (j = 0; j < 8; j++)
  326.    {
  327.       sum += (*coef++) * vbuf[bx];
  328.       bx += 32;
  329.    }
  330.    tmp = (long) sum;
  331.    if (tmp > 32767)
  332.       tmp = 32767;
  333.    else if (tmp < -32768)
  334.       tmp = -32768;
  335.    *pcm = tmp;
  336.    pcm += 2;
  337. /*-- last 7 --*/
  338.    coef = wincoef + 255;        /* back pass through coefs */
  339.    for (i = 0; i < 7; i++)
  340.    {
  341.       coef -= 16;
  342.       si--;
  343.       bx++;
  344.       sum = 0.0F;
  345.       for (j = 0; j < 8; j++)
  346.       {
  347.          sum += (*coef--) * vbuf[si];
  348.          si += 32;
  349.          sum += (*coef--) * vbuf[bx];
  350.          bx += 32;
  351.       }
  352.       tmp = (long) sum;
  353.       if (tmp > 32767)
  354.          tmp = 32767;
  355.       else if (tmp < -32768)
  356.          tmp = -32768;
  357.       *pcm = tmp;
  358.       pcm += 2;
  359.    }
  360. }
  361. /*------------------- 8 pt window ------------------------------*/
  362. void window8(float *vbuf, int vb_ptr, short *pcm)
  363. {
  364.    int i, j;
  365.    int si, bx;
  366.    float *coef;
  367.    float sum;
  368.    long tmp;
  369.  
  370.    si = vb_ptr + 4;
  371.    bx = (si + 8) & 127;
  372.    coef = wincoef;
  373.  
  374. /*-- first 4 --*/
  375.    for (i = 0; i < 4; i++)
  376.    {
  377.       sum = 0.0F;
  378.       for (j = 0; j < 8; j++)
  379.       {
  380.          sum += (*coef++) * vbuf[si];
  381.          si = (si + 16) & 127;
  382.          sum -= (*coef++) * vbuf[bx];
  383.          bx = (bx + 16) & 127;
  384.       }
  385.       si++;
  386.       bx--;
  387.       coef += 48;
  388.       tmp = (long) sum;
  389.       if (tmp > 32767)
  390.          tmp = 32767;
  391.       else if (tmp < -32768)
  392.          tmp = -32768;
  393.       *pcm++ = tmp;
  394.    }
  395. /*--  special case --*/
  396.    sum = 0.0F;
  397.    for (j = 0; j < 8; j++)
  398.    {
  399.       sum += (*coef++) * vbuf[bx];
  400.       bx = (bx + 16) & 127;
  401.    }
  402.    tmp = (long) sum;
  403.    if (tmp > 32767)
  404.       tmp = 32767;
  405.    else if (tmp < -32768)
  406.       tmp = -32768;
  407.    *pcm++ = tmp;
  408. /*-- last 3 --*/
  409.    coef = wincoef + 255;        /* back pass through coefs */
  410.    for (i = 0; i < 3; i++)
  411.    {
  412.       coef -= 48;
  413.       si--;
  414.       bx++;
  415.       sum = 0.0F;
  416.       for (j = 0; j < 8; j++)
  417.       {
  418.          sum += (*coef--) * vbuf[si];
  419.          si = (si + 16) & 127;
  420.          sum += (*coef--) * vbuf[bx];
  421.          bx = (bx + 16) & 127;
  422.       }
  423.       tmp = (long) sum;
  424.       if (tmp > 32767)
  425.          tmp = 32767;
  426.       else if (tmp < -32768)
  427.          tmp = -32768;
  428.       *pcm++ = tmp;
  429.    }
  430. }
  431. /*--------------- 8 pt dual window (interleaved output) -----------------*/
  432. void window8_dual(float *vbuf, int vb_ptr, short *pcm)
  433. {
  434.    int i, j;
  435.    int si, bx;
  436.    float *coef;
  437.    float sum;
  438.    long tmp;
  439.  
  440.    si = vb_ptr + 4;
  441.    bx = (si + 8) & 127;
  442.    coef = wincoef;
  443.  
  444. /*-- first 4 --*/
  445.    for (i = 0; i < 4; i++)
  446.    {
  447.       sum = 0.0F;
  448.       for (j = 0; j < 8; j++)
  449.       {
  450.          sum += (*coef++) * vbuf[si];
  451.          si = (si + 16) & 127;
  452.          sum -= (*coef++) * vbuf[bx];
  453.          bx = (bx + 16) & 127;
  454.       }
  455.       si++;
  456.       bx--;
  457.       coef += 48;
  458.       tmp = (long) sum;
  459.       if (tmp > 32767)
  460.          tmp = 32767;
  461.       else if (tmp < -32768)
  462.          tmp = -32768;
  463.       *pcm = tmp;
  464.       pcm += 2;
  465.    }
  466. /*--  special case --*/
  467.    sum = 0.0F;
  468.    for (j = 0; j < 8; j++)
  469.    {
  470.       sum += (*coef++) * vbuf[bx];
  471.       bx = (bx + 16) & 127;
  472.    }
  473.    tmp = (long) sum;
  474.    if (tmp > 32767)
  475.       tmp = 32767;
  476.    else if (tmp < -32768)
  477.       tmp = -32768;
  478.    *pcm = tmp;
  479.    pcm += 2;
  480. /*-- last 3 --*/
  481.    coef = wincoef + 255;        /* back pass through coefs */
  482.    for (i = 0; i < 3; i++)
  483.    {
  484.       coef -= 48;
  485.       si--;
  486.       bx++;
  487.       sum = 0.0F;
  488.       for (j = 0; j < 8; j++)
  489.       {
  490.          sum += (*coef--) * vbuf[si];
  491.          si = (si + 16) & 127;
  492.          sum += (*coef--) * vbuf[bx];
  493.          bx = (bx + 16) & 127;
  494.       }
  495.       tmp = (long) sum;
  496.       if (tmp > 32767)
  497.          tmp = 32767;
  498.       else if (tmp < -32768)
  499.          tmp = -32768;
  500.       *pcm = tmp;
  501.       pcm += 2;
  502.    }
  503. }
  504.