winb.c
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:10k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. void windowB(float *vbuf, int vb_ptr, unsigned char *pcm)
  36. {
  37. int i, j;
  38. int si, bx;
  39. float *coef;
  40. float sum;
  41. long tmp;
  42. si = vb_ptr + 16;
  43. bx = (si+32) & 511;
  44. coef = wincoef;
  45. /*-- first 16 --*/
  46. for(i=0;i<16;i++) {
  47.    sum = 0.0F;
  48.    for(j=0;j<8;j++) {
  49.       sum += (*coef++)*vbuf[si];
  50.       si = (si+64) & 511;
  51.       sum -= (*coef++)*vbuf[bx];
  52.       bx = (bx+64) & 511;
  53.    }
  54.    si++;
  55.    bx--;
  56.    tmp = (long)sum;
  57.    if( tmp > 32767 )        tmp =  32767;
  58.    else if( tmp < -32768 )  tmp = -32768;
  59.    *pcm++ = ((unsigned char)(tmp>>8))^0x80;
  60. }
  61. /*--  special case --*/
  62. sum = 0.0F;
  63. for(j=0;j<8;j++) {
  64.    sum += (*coef++)*vbuf[bx];
  65.    bx = (bx+64) & 511;
  66. }
  67. tmp = (long)sum;
  68. if( tmp > 32767 )        tmp =  32767;
  69. else if( tmp < -32768 )  tmp = -32768;
  70. *pcm++ = ((unsigned char)(tmp>>8))^0x80;
  71. /*-- last 15 --*/
  72. coef = wincoef + 255;    /* back pass through coefs */
  73. for(i=0;i<15;i++) {
  74.    si--;
  75.    bx++;
  76.    sum = 0.0F;
  77.    for(j=0;j<8;j++) {
  78.       sum += (*coef--)*vbuf[si];
  79.       si = (si+64) & 511;
  80.       sum += (*coef--)*vbuf[bx];
  81.       bx = (bx+64) & 511;
  82.    }
  83.    tmp = (long)sum;
  84.    if( tmp > 32767 )        tmp =  32767;
  85.    else if( tmp < -32768 )  tmp = -32768;
  86.    *pcm++ = ((unsigned char)(tmp>>8))^0x80;
  87. }
  88. }
  89. /*------------------------------------------------------------*/
  90. void windowB_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
  91. {
  92. int i, j;       /* dual window interleaves output */
  93. int si, bx;
  94. float *coef;
  95. float sum;
  96. long tmp;
  97. si = vb_ptr + 16;
  98. bx = (si+32) & 511;
  99. coef = wincoef;
  100. /*-- first 16 --*/
  101. for(i=0;i<16;i++) {
  102.    sum = 0.0F;
  103.    for(j=0;j<8;j++) {
  104.       sum += (*coef++)*vbuf[si];
  105.       si = (si+64) & 511;
  106.       sum -= (*coef++)*vbuf[bx];
  107.       bx = (bx+64) & 511;
  108.    }
  109.    si++;
  110.    bx--;
  111.    tmp = (long)sum;
  112.    if( tmp > 32767 )        tmp =  32767;
  113.    else if( tmp < -32768 )  tmp = -32768;
  114.    *pcm = ((unsigned char)(tmp>>8))^0x80;
  115.    pcm += 2;
  116. }
  117. /*--  special case --*/
  118. sum = 0.0F;
  119. for(j=0;j<8;j++) {
  120.    sum += (*coef++)*vbuf[bx];
  121.    bx = (bx+64) & 511;
  122. }
  123. tmp = (long)sum;
  124. if( tmp > 32767 )        tmp =  32767;
  125. else if( tmp < -32768 )  tmp = -32768;
  126. *pcm = ((unsigned char)(tmp>>8))^0x80;
  127. pcm += 2;
  128. /*-- last 15 --*/
  129. coef = wincoef + 255;    /* back pass through coefs */
  130. for(i=0;i<15;i++) {
  131.    si--;
  132.    bx++;
  133.    sum = 0.0F;
  134.    for(j=0;j<8;j++) {
  135.       sum += (*coef--)*vbuf[si];
  136.       si = (si+64) & 511;
  137.       sum += (*coef--)*vbuf[bx];
  138.       bx = (bx+64) & 511;
  139.    }
  140.    tmp = (long)sum;
  141.    if( tmp > 32767 )        tmp =  32767;
  142.    else if( tmp < -32768 )  tmp = -32768;
  143.    *pcm = ((unsigned char)(tmp>>8))^0x80;
  144.    pcm += 2;
  145. }
  146. }
  147. /*------------------------------------------------------------*/
  148. #ifdef REDUCTION
  149. /*------------------------------------------------------------*/
  150. /*------------------- 16 pt window ------------------------------*/
  151. void windowB16(float *vbuf, int vb_ptr, unsigned char *pcm)
  152. {
  153. int i, j;
  154. unsigned char si, bx;
  155. float *coef;
  156. float sum;
  157. long tmp;
  158. si = vb_ptr + 8;
  159. bx = si+16;
  160. coef = wincoef;
  161. /*-- first 8 --*/
  162. for(i=0;i<8;i++) {
  163.    sum = 0.0F;
  164.    for(j=0;j<8;j++) {
  165.       sum += (*coef++)*vbuf[si];
  166.       si += 32;
  167.       sum -= (*coef++)*vbuf[bx];
  168.       bx += 32;
  169.    }
  170.    si++;
  171.    bx--;
  172.    coef+=16;
  173.    tmp = (long)sum;
  174.    if( tmp > 32767 )        tmp =  32767;
  175.    else if( tmp < -32768 )  tmp = -32768;
  176.    *pcm++ = ((unsigned char)(tmp>>8))^0x80;
  177. }
  178. /*--  special case --*/
  179. sum = 0.0F;
  180. for(j=0;j<8;j++) {
  181.    sum += (*coef++)*vbuf[bx];
  182.    bx += 32;
  183. }
  184. tmp = (long)sum;
  185. if( tmp > 32767 )        tmp =  32767;
  186. else if( tmp < -32768 )  tmp = -32768;
  187. *pcm++ = ((unsigned char)(tmp>>8))^0x80;
  188. /*-- last 7 --*/
  189. coef = wincoef + 255;    /* back pass through coefs */
  190. for(i=0;i<7;i++) {
  191.    coef-=16;
  192.    si--;
  193.    bx++;
  194.    sum = 0.0F;
  195.    for(j=0;j<8;j++) {
  196.       sum += (*coef--)*vbuf[si];
  197.       si +=32;
  198.       sum += (*coef--)*vbuf[bx];
  199.       bx +=32;
  200.    }
  201.    tmp = (long)sum;
  202.    if( tmp > 32767 )        tmp =  32767;
  203.    else if( tmp < -32768 )  tmp = -32768;
  204.    *pcm++ = ((unsigned char)(tmp>>8))^0x80;
  205. }
  206. }
  207. /*--------------- 16 pt dual window (interleaved output) -----------------*/
  208. void windowB16_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
  209. {
  210. int i, j;
  211. unsigned char si, bx;
  212. float *coef;
  213. float sum;
  214. long tmp;
  215. si = vb_ptr + 8;
  216. bx = si+16;
  217. coef = wincoef;
  218. /*-- first 8 --*/
  219. for(i=0;i<8;i++) {
  220.    sum = 0.0F;
  221.    for(j=0;j<8;j++) {
  222.       sum += (*coef++)*vbuf[si];
  223.       si += 32;
  224.       sum -= (*coef++)*vbuf[bx];
  225.       bx += 32;
  226.    }
  227.    si++;
  228.    bx--;
  229.    coef+=16;
  230.    tmp = (long)sum;
  231.    if( tmp > 32767 )        tmp =  32767;
  232.    else if( tmp < -32768 )  tmp = -32768;
  233.    *pcm = ((unsigned char)(tmp>>8))^0x80;
  234.    pcm+=2;
  235. }
  236. /*--  special case --*/
  237. sum = 0.0F;
  238. for(j=0;j<8;j++) {
  239.    sum += (*coef++)*vbuf[bx];
  240.    bx += 32;
  241. }
  242. tmp = (long)sum;
  243. if( tmp > 32767 )        tmp =  32767;
  244. else if( tmp < -32768 )  tmp = -32768;
  245. *pcm = ((unsigned char)(tmp>>8))^0x80;
  246. pcm+=2;
  247. /*-- last 7 --*/
  248. coef = wincoef + 255;    /* back pass through coefs */
  249. for(i=0;i<7;i++) {
  250.    coef-=16;
  251.    si--;
  252.    bx++;
  253.    sum = 0.0F;
  254.    for(j=0;j<8;j++) {
  255.       sum += (*coef--)*vbuf[si];
  256.       si +=32;
  257.       sum += (*coef--)*vbuf[bx];
  258.       bx +=32;
  259.    }
  260.    tmp = (long)sum;
  261.    if( tmp > 32767 )        tmp =  32767;
  262.    else if( tmp < -32768 )  tmp = -32768;
  263.    *pcm = ((unsigned char)(tmp>>8))^0x80;
  264.    pcm+=2;
  265. }
  266. }
  267. /*------------------- 8 pt window ------------------------------*/
  268. void windowB8(float *vbuf, int vb_ptr, unsigned char *pcm)
  269. {
  270. int i, j;
  271. int si, bx;
  272. float *coef;
  273. float sum;
  274. long tmp;
  275. si = vb_ptr + 4;
  276. bx = (si+8)&127;
  277. coef = wincoef;
  278. /*-- first 4 --*/
  279. for(i=0;i<4;i++) {
  280.    sum = 0.0F;
  281.    for(j=0;j<8;j++) {
  282.       sum += (*coef++)*vbuf[si];
  283.       si = (si+16) & 127;
  284.       sum -= (*coef++)*vbuf[bx];
  285.       bx = (bx+16) & 127;
  286.    }
  287.    si++;
  288.    bx--;
  289.    coef+=48;
  290.    tmp = (long)sum;
  291.    if( tmp > 32767 )        tmp =  32767;
  292.    else if( tmp < -32768 )  tmp = -32768;
  293.    *pcm++ = ((unsigned char)(tmp>>8))^0x80;
  294. }
  295. /*--  special case --*/
  296. sum = 0.0F;
  297. for(j=0;j<8;j++) {
  298.    sum += (*coef++)*vbuf[bx];
  299.    bx = (bx+16) & 127;
  300. }
  301. tmp = (long)sum;
  302. if( tmp > 32767 )        tmp =  32767;
  303. else if( tmp < -32768 )  tmp = -32768;
  304. *pcm++ = ((unsigned char)(tmp>>8))^0x80;
  305. /*-- last 3 --*/
  306. coef = wincoef + 255;    /* back pass through coefs */
  307. for(i=0;i<3;i++) {
  308.    coef-=48;
  309.    si--;
  310.    bx++;
  311.    sum = 0.0F;
  312.    for(j=0;j<8;j++) {
  313.       sum += (*coef--)*vbuf[si];
  314.       si = (si+16) & 127;
  315.       sum += (*coef--)*vbuf[bx];
  316.       bx = (bx+16) & 127;
  317.    }
  318.    tmp = (long)sum;
  319.    if( tmp > 32767 )        tmp =  32767;
  320.    else if( tmp < -32768 )  tmp = -32768;
  321.    *pcm++ = ((unsigned char)(tmp>>8))^0x80;
  322. }
  323. }
  324. /*--------------- 8 pt dual window (interleaved output) -----------------*/
  325. void windowB8_dual(float *vbuf, int vb_ptr, unsigned char *pcm)
  326. {
  327. int i, j;
  328. int si, bx;
  329. float *coef;
  330. float sum;
  331. long tmp;
  332. si = vb_ptr + 4;
  333. bx = (si+8) & 127;
  334. coef = wincoef;
  335. /*-- first 4 --*/
  336. for(i=0;i<4;i++) {
  337.    sum = 0.0F;
  338.    for(j=0;j<8;j++) {
  339.       sum += (*coef++)*vbuf[si];
  340.       si = (si+16) & 127;
  341.       sum -= (*coef++)*vbuf[bx];
  342.       bx = (bx+16) & 127;
  343.    }
  344.    si++;
  345.    bx--;
  346.    coef+=48;
  347.    tmp = (long)sum;
  348.    if( tmp > 32767 )        tmp =  32767;
  349.    else if( tmp < -32768 )  tmp = -32768;
  350.    *pcm = ((unsigned char)(tmp>>8))^0x80;
  351.    pcm+=2;
  352. }
  353. /*--  special case --*/
  354. sum = 0.0F;
  355. for(j=0;j<8;j++) {
  356.    sum += (*coef++)*vbuf[bx];
  357.    bx = (bx+16) & 127;
  358. }
  359. tmp = (long)sum;
  360. if( tmp > 32767 )        tmp =  32767;
  361. else if( tmp < -32768 )  tmp = -32768;
  362. *pcm = ((unsigned char)(tmp>>8))^0x80;
  363. pcm+=2;
  364. /*-- last 3 --*/
  365. coef = wincoef + 255;    /* back pass through coefs */
  366. for(i=0;i<3;i++) {
  367.    coef-=48;
  368.    si--;
  369.    bx++;
  370.    sum = 0.0F;
  371.    for(j=0;j<8;j++) {
  372.       sum += (*coef--)*vbuf[si];
  373.       si = (si+16) & 127;
  374.       sum += (*coef--)*vbuf[bx];
  375.       bx = (bx+16) & 127;
  376.    }
  377.    tmp = (long)sum;
  378.    if( tmp > 32767 )        tmp =  32767;
  379.    else if( tmp < -32768 )  tmp = -32768;
  380.    *pcm = ((unsigned char)(tmp>>8))^0x80;
  381.    pcm+=2;
  382. }
  383. }
  384. /*------------------------------------------------------------*/
  385. #endif      // end reduction