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

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. #ifdef __cplusplus
  36. extern "C" {
  37. #endif
  38. void window(float *vbuf, int vb_ptr, short *pcm);
  39. void window_dual(float *vbuf, int vb_ptr, short *pcm);
  40. #ifdef __cplusplus
  41. }
  42. #endif
  43. #ifdef _M_IX86 /* Asm versions */
  44. __inline short
  45. RoundFtoS(float f) {
  46. long l;
  47. __asm fld f
  48. __asm fistp l
  49. if (l < -32768)
  50. l = -32768;
  51. else if (l > 32767)
  52. l = 32767;
  53. return (short)l;
  54. }
  55. #else /* C versions */
  56. __inline short
  57. RoundFtoS(float f) {
  58. long l = (long)(f < 0.0f ? f - 0.5f : f + 0.5f);
  59. if (l < -32768)
  60. l = -32768;
  61. else if (l > 32767)
  62. l = 32767;
  63. return (short)l;
  64. }
  65. #endif /* _M_IX86 */
  66. /*-------------------------------------------------------------------------*/
  67. void window(float *vbuf, int vb_ptr, short *pcm)
  68. {
  69. int i, j;
  70. int si, bx;
  71. const float *coef;
  72. float sum;
  73. si = vb_ptr + 16;
  74. bx = (si+32) & 511;
  75. coef = wincoef;
  76. /*-- first 16 --*/
  77. for(i=0;i<16;i++) {
  78.    sum = 0.0F;
  79.    for(j=0;j<8;j++) {
  80.       sum += (*coef++)*vbuf[si];
  81.       si = (si+64) & 511;
  82.       sum -= (*coef++)*vbuf[bx];
  83.       bx = (bx+64) & 511;
  84.    }
  85.    si++;
  86.    bx--;
  87.    *pcm++ = RoundFtoS(sum) ;
  88. }
  89. /*--  special case --*/
  90. sum = 0.0F;
  91. for(j=0;j<8;j++) {
  92.    sum += (*coef++)*vbuf[bx];
  93.    bx = (bx+64) & 511;
  94. }
  95. *pcm++ = RoundFtoS(sum) ;
  96. /*-- last 15 --*/
  97. coef = wincoef + 255;    /* back pass through coefs */
  98. for(i=0;i<15;i++) {
  99.    si--;
  100.    bx++;
  101.    sum = 0.0F;
  102.    for(j=0;j<8;j++) {
  103.       sum += (*coef--)*vbuf[si];
  104.       si = (si+64) & 511;
  105.       sum += (*coef--)*vbuf[bx];
  106.       bx = (bx+64) & 511;
  107.    }
  108.    *pcm++ = RoundFtoS(sum) ;
  109. }
  110. }
  111. /*------------------------------------------------------------*/
  112. void window_dual(float *vbuf, int vb_ptr, short *pcm)
  113. {
  114. int i, j;       /* dual window interleaves output */
  115. int si, bx;
  116. const float *coef;
  117. float sum;
  118. si = vb_ptr + 16;
  119. bx = (si+32) & 511;
  120. coef = wincoef;
  121. /*-- first 16 --*/
  122. for(i=0;i<16;i++) {
  123.    sum = 0.0F;
  124.    for(j=0;j<8;j++) {
  125.       sum += (*coef++)*vbuf[si];
  126.       si = (si+64) & 511;
  127.       sum -= (*coef++)*vbuf[bx];
  128.       bx = (bx+64) & 511;
  129.    }
  130.    si++;
  131.    bx--;
  132.    *pcm = RoundFtoS(sum) ;
  133.    pcm += 2;
  134. }
  135. /*--  special case --*/
  136. sum = 0.0F;
  137. for(j=0;j<8;j++) {
  138.    sum += (*coef++)*vbuf[bx];
  139.    bx = (bx+64) & 511;
  140. }
  141. *pcm = RoundFtoS(sum) ;
  142. pcm += 2;
  143. /*-- last 15 --*/
  144. coef = wincoef + 255;    /* back pass through coefs */
  145. for(i=0;i<15;i++) {
  146.    si--;
  147.    bx++;
  148.    sum = 0.0F;
  149.    for(j=0;j<8;j++) {
  150.       sum += (*coef--)*vbuf[si];
  151.       si = (si+64) & 511;
  152.       sum += (*coef--)*vbuf[bx];
  153.       bx = (bx+64) & 511;
  154.    }
  155.    *pcm = RoundFtoS(sum) ;
  156.    pcm += 2;
  157. }
  158. }
  159. /*------------------------------------------------------------*/
  160. #ifdef REDUCTION
  161. /*------------------------------------------------------------*/
  162. /*------------------- 16 pt window ------------------------------*/
  163. void window16(float *vbuf, int vb_ptr, short *pcm)
  164. {
  165. int i, j;
  166. unsigned char si, bx;
  167. float *coef;
  168. float sum;
  169. long tmp;
  170. si = vb_ptr + 8;
  171. bx = si+16;
  172. coef = wincoef;
  173. /*-- first 8 --*/
  174. for(i=0;i<8;i++) {
  175.    sum = 0.0F;
  176.    for(j=0;j<8;j++) {
  177.       sum += (*coef++)*vbuf[si];
  178.       si += 32;
  179.       sum -= (*coef++)*vbuf[bx];
  180.       bx += 32;
  181.    }
  182.    si++;
  183.    bx--;
  184.    coef+=16;
  185.    *pcm++ = RoundFtoS(sum) ;
  186. }
  187. /*--  special case --*/
  188. sum = 0.0F;
  189. for(j=0;j<8;j++) {
  190.    sum += (*coef++)*vbuf[bx];
  191.    bx += 32;
  192. }
  193. *pcm++ = RoundFtoS(sum) ;
  194. /*-- last 7 --*/
  195. coef = wincoef + 255;    /* back pass through coefs */
  196. for(i=0;i<7;i++) {
  197.    coef-=16;
  198.    si--;
  199.    bx++;
  200.    sum = 0.0F;
  201.    for(j=0;j<8;j++) {
  202.       sum += (*coef--)*vbuf[si];
  203.       si +=32;
  204.       sum += (*coef--)*vbuf[bx];
  205.       bx +=32;
  206.    }
  207.    *pcm++ = RoundFtoS(sum) ;
  208. }
  209. }
  210. /*--------------- 16 pt dual window (interleaved output) -----------------*/
  211. void window16_dual(float *vbuf, int vb_ptr, short *pcm)
  212. {
  213. int i, j;
  214. unsigned char si, bx;
  215. float *coef;
  216. float sum;
  217. long tmp;
  218. si = vb_ptr + 8;
  219. bx = si+16;
  220. coef = wincoef;
  221. /*-- first 8 --*/
  222. for(i=0;i<8;i++) {
  223.    sum = 0.0F;
  224.    for(j=0;j<8;j++) {
  225.       sum += (*coef++)*vbuf[si];
  226.       si += 32;
  227.       sum -= (*coef++)*vbuf[bx];
  228.       bx += 32;
  229.    }
  230.    si++;
  231.    bx--;
  232.    coef+=16;
  233.    *pcm = RoundFtoS(sum) ;
  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. *pcm = RoundFtoS(sum) ;
  243. pcm+=2;
  244. /*-- last 7 --*/
  245. coef = wincoef + 255;    /* back pass through coefs */
  246. for(i=0;i<7;i++) {
  247.    coef-=16;
  248.    si--;
  249.    bx++;
  250.    sum = 0.0F;
  251.    for(j=0;j<8;j++) {
  252.       sum += (*coef--)*vbuf[si];
  253.       si +=32;
  254.       sum += (*coef--)*vbuf[bx];
  255.       bx +=32;
  256.    }
  257.    *pcm = RoundFtoS(sum) ;
  258.    pcm+=2;
  259. }
  260. }
  261. /*------------------- 8 pt window ------------------------------*/
  262. void window8(float *vbuf, int vb_ptr, short *pcm)
  263. {
  264. int i, j;
  265. int si, bx;
  266. float *coef;
  267. float sum;
  268. long tmp;
  269. si = vb_ptr + 4;
  270. bx = (si+8)&127;
  271. coef = wincoef;
  272. /*-- first 4 --*/
  273. for(i=0;i<4;i++) {
  274.    sum = 0.0F;
  275.    for(j=0;j<8;j++) {
  276.       sum += (*coef++)*vbuf[si];
  277.       si = (si+16) & 127;
  278.       sum -= (*coef++)*vbuf[bx];
  279.       bx = (bx+16) & 127;
  280.    }
  281.    si++;
  282.    bx--;
  283.    coef+=48;
  284.    *pcm++ = RoundFtoS(sum) ;
  285. }
  286. /*--  special case --*/
  287. sum = 0.0F;
  288. for(j=0;j<8;j++) {
  289.    sum += (*coef++)*vbuf[bx];
  290.    bx = (bx+16) & 127;
  291. }
  292. *pcm++ = RoundFtoS(sum) ;
  293. /*-- last 3 --*/
  294. coef = wincoef + 255;    /* back pass through coefs */
  295. for(i=0;i<3;i++) {
  296.    coef-=48;
  297.    si--;
  298.    bx++;
  299.    sum = 0.0F;
  300.    for(j=0;j<8;j++) {
  301.       sum += (*coef--)*vbuf[si];
  302.       si = (si+16) & 127;
  303.       sum += (*coef--)*vbuf[bx];
  304.       bx = (bx+16) & 127;
  305.    }
  306.    *pcm++ = RoundFtoS(sum) ;
  307. }
  308. }
  309. /*--------------- 8 pt dual window (interleaved output) -----------------*/
  310. void window8_dual(float *vbuf, int vb_ptr, short *pcm)
  311. {
  312. int i, j;
  313. int si, bx;
  314. float *coef;
  315. float sum;
  316. long tmp;
  317. si = vb_ptr + 4;
  318. bx = (si+8) & 127;
  319. coef = wincoef;
  320. /*-- first 4 --*/
  321. for(i=0;i<4;i++) {
  322.    sum = 0.0F;
  323.    for(j=0;j<8;j++) {
  324.       sum += (*coef++)*vbuf[si];
  325.       si = (si+16) & 127;
  326.       sum -= (*coef++)*vbuf[bx];
  327.       bx = (bx+16) & 127;
  328.    }
  329.    si++;
  330.    bx--;
  331.    coef+=48;
  332.    *pcm = RoundFtoS(sum) ;
  333.    pcm+=2;
  334. }
  335. /*--  special case --*/
  336. sum = 0.0F;
  337. for(j=0;j<8;j++) {
  338.    sum += (*coef++)*vbuf[bx];
  339.    bx = (bx+16) & 127;
  340. }
  341. *pcm = RoundFtoS(sum) ;
  342. pcm+=2;
  343. /*-- last 3 --*/
  344. coef = wincoef + 255;    /* back pass through coefs */
  345. for(i=0;i<3;i++) {
  346.    coef-=48;
  347.    si--;
  348.    bx++;
  349.    sum = 0.0F;
  350.    for(j=0;j<8;j++) {
  351.       sum += (*coef--)*vbuf[si];
  352.       si = (si+16) & 127;
  353.       sum += (*coef--)*vbuf[bx];
  354.       bx = (bx+16) & 127;
  355.    }
  356.    *pcm = RoundFtoS(sum) ;
  357.    pcm+=2;
  358. }
  359. }
  360. /*------------------------------------------------------------*/
  361. #endif    // end reduction