synfilt.cpp
上传用户:tuheem
上传日期:2007-05-01
资源大小:21889k
文件大小:33k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* synfilt.cpp
  2. Synthesis Filter implementation */
  3. /* -- 03/20/97 --
  4.  *  compute_new_v() -- reoptimized with the assumption that constant offsets
  5.  *    to memory are free.  Common subexpression were redone for better
  6.  *    optimization.
  7.  *  compute_pcm_samples() -- reoptimized with constant offsets.
  8.  *
  9.  *  -- Conrad Wei-Li Song (conradsong@mail.utexas.edu)
  10.  */
  11. /*
  12.  *  @(#) synthesis_filter.cc 1.14, last edit: 6/21/94 11:22:20
  13.  *  @(#) Copyright (C) 1993, 1994 Tobias Bading (bading@cs.tu-berlin.de)
  14.  *  @(#) Berlin University of Technology
  15.  *
  16.  *  This program is free software; you can redistribute it and/or modify
  17.  *  it under the terms of the GNU General Public License as published by
  18.  *  the Free Software Foundation; either version 2 of the License, or
  19.  *  (at your option) any later version.
  20.  *
  21.  *  This program is distributed in the hope that it will be useful,
  22.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  23.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  24.  *  GNU General Public License for more details.
  25.  *
  26.  *  You should have received a copy of the GNU General Public License
  27.  *  along with this program; if not, write to the Free Software
  28.  *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  29.  */
  30. /*
  31.  *  Changes from version 1.1 to 1.2:
  32.  *    - compute_new_v() uses a 32 point fast cosine transform as described by
  33.  *      Byeong Gi Lee in IEEE Transactions ASSP-32 Part 2, August 1984,
  34.  *      "A New Algorithm to Compute the Discrete Cosine Transform"
  35.  *      instead of the matrix-vector multiplication in V1.1
  36.  *    - loop unrolling done in compute_pcm_samples()
  37.  *    - if ULAW is defined, the synthesis filter does a downsampling
  38.  *      to 8 kHz by dropping samples and ignoring subbands above 4 kHz
  39.  */
  40. #include <math.h>
  41. #include "all.h"
  42. #include "synfilt.h"
  43. #define MY_PI 3.14159265358979323846
  44. #include "scalfact.h"
  45. #ifdef __WIN32__
  46. #pragma warning (disable: 4244 4305)
  47. #endif
  48. static const real cos1_64  = (real)(1.0 / (2.0 * cos(MY_PI / 64.0)));
  49. static const real cos3_64  = (real)(.0 / (2.0 * cos(MY_PI * 3.0  / 64.0)));
  50. static const real cos5_64  = (real)(1.0 / (2.0 * cos(MY_PI * 5.0  / 64.0)));
  51. static const real cos7_64  = (real)(1.0 / (2.0 * cos(MY_PI * 7.0  / 64.0)));
  52. static const real cos9_64  = (real)(1.0 / (2.0 * cos(MY_PI * 9.0  / 64.0)));
  53. static const real cos11_64 = (real)(1.0 / (2.0 * cos(MY_PI * 11.0 / 64.0)));
  54. static const real cos13_64 = (real)(1.0 / (2.0 * cos(MY_PI * 13.0 / 64.0)));
  55. static const real cos15_64 = (real)(1.0 / (2.0 * cos(MY_PI * 15.0 / 64.0)));
  56. static const real cos17_64 = (real)(1.0 / (2.0 * cos(MY_PI * 17.0 / 64.0)));
  57. static const real cos19_64 = (real)(1.0 / (2.0 * cos(MY_PI * 19.0 / 64.0)));
  58. static const real cos21_64 = (real)(1.0 / (2.0 * cos(MY_PI * 21.0 / 64.0)));
  59. static const real cos23_64 = (real)(1.0 / (2.0 * cos(MY_PI * 23.0 / 64.0)));
  60. static const real cos25_64 = (real)(1.0 / (2.0 * cos(MY_PI * 25.0 / 64.0)));
  61. static const real cos27_64 = (real)(1.0 / (2.0 * cos(MY_PI * 27.0 / 64.0)));
  62. static const real cos29_64 = (real)(1.0 / (2.0 * cos(MY_PI * 29.0 / 64.0)));
  63. static const real cos31_64 = (real)(1.0 / (2.0 * cos(MY_PI * 31.0 / 64.0)));
  64. static const real cos1_32  = (real)(1.0 / (2.0 * cos(MY_PI        / 32.0)));
  65. static const real cos3_32  = (real)(1.0 / (2.0 * cos(MY_PI * 3.0  / 32.0)));
  66. static const real cos5_32  = (real)(1.0 / (2.0 * cos(MY_PI * 5.0  / 32.0)));
  67. static const real cos7_32  = (real)(1.0 / (2.0 * cos(MY_PI * 7.0  / 32.0)));
  68. static const real cos9_32  = (real)(1.0 / (2.0 * cos(MY_PI * 9.0  / 32.0)));
  69. static const real cos11_32 = (real)(1.0 / (2.0 * cos(MY_PI * 11.0 / 32.0)));
  70. static const real cos13_32 = (real)(1.0 / (2.0 * cos(MY_PI * 13.0 / 32.0)));
  71. static const real cos15_32 = (real)(1.0 / (2.0 * cos(MY_PI * 15.0 / 32.0)));
  72. static const real cos1_16  = (real)(1.0 / (2.0 * cos(MY_PI        / 16.0)));
  73. static const real cos3_16  = (real)(1.0 / (2.0 * cos(MY_PI * 3.0  / 16.0)));
  74. static const real cos5_16  = (real)(1.0 / (2.0 * cos(MY_PI * 5.0  / 16.0)));
  75. static const real cos7_16  = (real)(1.0 / (2.0 * cos(MY_PI * 7.0  / 16.0)));
  76. static const real cos1_8   = (real)(1.0 / (2.0 * cos(MY_PI        / 8.0)));
  77. static const real cos3_8   = (real)(1.0 / (2.0 * cos(MY_PI * 3.0  / 8.0)));
  78. static const real cos1_4   = (real)(1.0 / (2.0 * cos(MY_PI / 4.0)));
  79. const real SynthesisFilter::d[512] = {
  80. // Note: These values are not in the same order
  81. // as in Annex 3-B.3 of the ISO/IEC DIS 11172-3
  82. 0.000000000f, -0.000442505f,  0.003250122f, -0.007003784f,
  83. 0.031082153f, -0.078628540f,  0.100311279f, -0.572036743f,
  84. 1.144989014f,  0.572036743f,  0.100311279f,  0.078628540f,
  85. 0.031082153f,  0.007003784f,  0.003250122f,  0.000442505f,
  86. -0.000015259f, -0.000473022f,  0.003326416f, -0.007919312f,
  87. 0.030517578f, -0.084182739f,  0.090927124f, -0.600219727f,
  88. 1.144287109f,  0.543823242f,  0.108856201f,  0.073059082f,
  89. 0.031478882f,  0.006118774f,  0.003173828f,  0.000396729f,
  90.   -0.000015259f, -0.000534058f,  0.003387451f, -0.008865356f,
  91. 0.029785156f, -0.089706421f,  0.080688477f, -0.628295898f,
  92. 1.142211914f,  0.515609741f,  0.116577148f,  0.067520142f,
  93.  0.031738281f,  0.005294800f,  0.003082275f,  0.000366211f,
  94. -0.000015259f, -0.000579834f,  0.003433228f, -0.009841919f,
  95.  0.028884888f, -0.095169067f,  0.069595337f, -0.656219482f,
  96. 1.138763428f,  0.487472534f,  0.123474121f,  0.061996460f,
  97.    0.031845093f,  0.004486084f,  0.002990723f,  0.000320435f,
  98.   -0.000015259f, -0.000625610f,  0.003463745f, -0.010848999f,
  99.  0.027801514f, -0.100540161f,  0.057617188f, -0.683914185f,
  100. 1.133926392f,  0.459472656f,  0.129577637f,  0.056533813f,
  101. 0.031814575f,  0.003723145f,  0.002899170f,  0.000289917f,
  102.   -0.000015259f, -0.000686646f,  0.003479004f, -0.011886597f,
  103. 0.026535034f, -0.105819702f,  0.044784546f, -0.711318970f,
  104. 1.127746582f,  0.431655884f,  0.134887695f,  0.051132202f,
  105. 0.031661987f,  0.003005981f,  0.002792358f,  0.000259399f,
  106. -0.000015259f, -0.000747681f,  0.003479004f, -0.012939453f,
  107. 0.025085449f, -0.110946655f,  0.031082153f, -0.738372803f,
  108.    1.120223999f,  0.404083252f,  0.139450073f,  0.045837402f,
  109.    0.031387329f,  0.002334595f,  0.002685547f,  0.000244141f,
  110.   -0.000030518f, -0.000808716f,  0.003463745f, -0.014022827f,
  111.    0.023422241f, -0.115921021f,  0.016510010f, -0.765029907f,
  112. 1.111373901f,  0.376800537f,  0.143264771f,  0.040634155f,
  113.    0.031005859f,  0.001693726f,  0.002578735f,  0.000213623f,
  114. -0.000030518f, -0.000885010f,  0.003417969f, -0.015121460f,
  115. 0.021575928f, -0.120697021f,  0.001068115f, -0.791213989f,
  116.    1.101211548f,  0.349868774f,  0.146362305f,  0.035552979f,
  117. 0.030532837f,  0.001098633f,  0.002456665f,  0.000198364f,
  118. -0.000030518f, -0.000961304f,  0.003372192f, -0.016235352f,
  119.    0.019531250f, -0.125259399f, -0.015228271f, -0.816864014f,
  120.  1.089782715f,  0.323318481f,  0.148773193f,  0.030609131f,
  121. 0.029937744f,  0.000549316f,  0.002349854f,  0.000167847f,
  122. -0.000030518f, -0.001037598f,  0.003280640f, -0.017349243f,
  123. 0.017257690f, -0.129562378f, -0.032379150f, -0.841949463f,
  124.    1.077117920f,  0.297210693f,  0.150497437f,  0.025817871f,
  125.    0.029281616f,  0.000030518f,  0.002243042f,  0.000152588f,
  126.   -0.000045776f, -0.001113892f,  0.003173828f, -0.018463135f,
  127. 0.014801025f, -0.133590698f, -0.050354004f, -0.866363525f,
  128. 1.063217163f,  0.271591187f,  0.151596069f,  0.021179199f,
  129. 0.028533936f, -0.000442505f,  0.002120972f,  0.000137329f,
  130. -0.000045776f, -0.001205444f,  0.003051758f, -0.019577026f,
  131. 0.012115479f, -0.137298584f, -0.069168091f, -0.890090942f,
  132.  1.048156738f,  0.246505737f,  0.152069092f,  0.016708374f,
  133. 0.027725220f, -0.000869751f,  0.002014160f,  0.000122070f,
  134.   -0.000061035f, -0.001296997f,  0.002883911f, -0.020690918f,
  135.    0.009231567f, -0.140670776f, -0.088775635f, -0.913055420f,
  136.  1.031936646f,  0.221984863f,  0.151962280f,  0.012420654f,
  137.    0.026840210f, -0.001266479f,  0.001907349f,  0.000106812f,
  138.   -0.000061035f, -0.001388550f,  0.002700806f, -0.021789551f,
  139. 0.006134033f, -0.143676758f, -0.109161377f, -0.935195923f,
  140.    1.014617920f,  0.198059082f,  0.151306152f,  0.008316040f,
  141. 0.025909424f, -0.001617432f,  0.001785278f,  0.000106812f,
  142. -0.000076294f, -0.001480103f,  0.002487183f, -0.022857666f,
  143.  0.002822876f, -0.146255493f, -0.130310059f, -0.956481934f,
  144. 0.996246338f,  0.174789429f,  0.150115967f,  0.004394531f,
  145.    0.024932861f, -0.001937866f,  0.001693726f,  0.000091553f,
  146.   -0.000076294f, -0.001586914f,  0.002227783f, -0.023910522f,
  147. -0.000686646f, -0.148422241f, -0.152206421f, -0.976852417f,
  148.    0.976852417f,  0.152206421f,  0.148422241f,  0.000686646f,
  149. 0.023910522f, -0.002227783f,  0.001586914f,  0.000076294f,
  150. -0.000091553f, -0.001693726f,  0.001937866f, -0.024932861f,
  151. -0.004394531f, -0.150115967f, -0.174789429f, -0.996246338f,
  152.    0.956481934f,  0.130310059f,  0.146255493f, -0.002822876f,
  153.    0.022857666f, -0.002487183f,  0.001480103f,  0.000076294f,
  154. -0.000106812f, -0.001785278f,  0.001617432f, -0.025909424f,
  155.   -0.008316040f, -0.151306152f, -0.198059082f, -1.014617920f,
  156.    0.935195923f,  0.109161377f,  0.143676758f, -0.006134033f,
  157.    0.021789551f, -0.002700806f,  0.001388550f,  0.000061035f,
  158.   -0.000106812f, -0.001907349f,  0.001266479f, -0.026840210f,
  159. -0.012420654f, -0.151962280f, -0.221984863f, -1.031936646f,
  160. 0.913055420f,  0.088775635f,  0.140670776f, -0.009231567f,
  161.  0.020690918f, -0.002883911f,  0.001296997f,  0.000061035f,
  162. -0.000122070f, -0.002014160f,  0.000869751f, -0.027725220f,
  163.   -0.016708374f, -0.152069092f, -0.246505737f, -1.048156738f,
  164.    0.890090942f,  0.069168091f,  0.137298584f, -0.012115479f,
  165. 0.019577026f, -0.003051758f,  0.001205444f,  0.000045776f,
  166. -0.000137329f, -0.002120972f,  0.000442505f, -0.028533936f,
  167.   -0.021179199f, -0.151596069f, -0.271591187f, -1.063217163f,
  168.    0.866363525f,  0.050354004f,  0.133590698f, -0.014801025f,
  169.    0.018463135f, -0.003173828f,  0.001113892f,  0.000045776f,
  170.   -0.000152588f, -0.002243042f, -0.000030518f, -0.029281616f,
  171.   -0.025817871f, -0.150497437f, -0.297210693f, -1.077117920f,
  172.  0.841949463f,  0.032379150f,  0.129562378f, -0.017257690f,
  173.  0.017349243f, -0.003280640f,  0.001037598f,  0.000030518f,
  174.   -0.000167847f, -0.002349854f, -0.000549316f, -0.029937744f,
  175.   -0.030609131f, -0.148773193f, -0.323318481f, -1.089782715f,
  176. 0.816864014f,  0.015228271f,  0.125259399f, -0.019531250f,
  177.    0.016235352f, -0.003372192f,  0.000961304f,  0.000030518f,
  178. -0.000198364f, -0.002456665f, -0.001098633f, -0.030532837f,
  179. -0.035552979f, -0.146362305f, -0.349868774f, -1.101211548f,
  180.  0.791213989f, -0.001068115f,  0.120697021f, -0.021575928f,
  181. 0.015121460f, -0.003417969f,  0.000885010f,  0.000030518f,
  182.   -0.000213623f, -0.002578735f, -0.001693726f, -0.031005859f,
  183. -0.040634155f, -0.143264771f, -0.376800537f, -1.111373901f,
  184.    0.765029907f, -0.016510010f,  0.115921021f, -0.023422241f,
  185.    0.014022827f, -0.003463745f,  0.000808716f,  0.000030518f,
  186.   -0.000244141f, -0.002685547f, -0.002334595f, -0.031387329f,
  187.   -0.045837402f, -0.139450073f, -0.404083252f, -1.120223999f,
  188.    0.738372803f, -0.031082153f,  0.110946655f, -0.025085449f,
  189. 0.012939453f, -0.003479004f,  0.000747681f,  0.000015259f,
  190. -0.000259399f, -0.002792358f, -0.003005981f, -0.031661987f,
  191.   -0.051132202f, -0.134887695f, -0.431655884f, -1.127746582f,
  192. 0.711318970f, -0.044784546f,  0.105819702f, -0.026535034f,
  193.    0.011886597f, -0.003479004f,  0.000686646f,  0.000015259f,
  194. -0.000289917f, -0.002899170f, -0.003723145f, -0.031814575f,
  195. -0.056533813f, -0.129577637f, -0.459472656f, -1.133926392f,
  196.    0.683914185f, -0.057617188f,  0.100540161f, -0.027801514f,
  197. 0.010848999f, -0.003463745f,  0.000625610f,  0.000015259f,
  198.   -0.000320435f, -0.002990723f, -0.004486084f, -0.031845093f,
  199.   -0.061996460f, -0.123474121f, -0.487472534f, -1.138763428f,
  200. 0.656219482f, -0.069595337f,  0.095169067f, -0.028884888f,
  201. 0.009841919f, -0.003433228f,  0.000579834f,  0.000015259f,
  202. -0.000366211f, -0.003082275f, -0.005294800f, -0.031738281f,
  203.   -0.067520142f, -0.116577148f, -0.515609741f, -1.142211914f,
  204. 0.628295898f, -0.080688477f,  0.089706421f, -0.029785156f,
  205. 0.008865356f, -0.003387451f,  0.000534058f,  0.000015259f,
  206.   -0.000396729f, -0.003173828f, -0.006118774f, -0.031478882f,
  207.   -0.073059082f, -0.108856201f, -0.543823242f, -1.144287109f,
  208. 0.600219727f, -0.090927124f,  0.084182739f, -0.030517578f,
  209. 0.007919312f, -0.003326416f,  0.000473022f,  0.000015259f
  210. };
  211. SynthesisFilter::SynthesisFilter(uint32 channelnumber, real factor)
  212. {
  213.   channel = channelnumber;
  214.   scalefactor = factor;
  215.   reset();
  216. }
  217. void SynthesisFilter::reset()
  218. {
  219.   register real *floatp, *floatp2;
  220.   // initialize v1[] and v2[]:
  221.   for (floatp = v1 + 512, floatp2 = v2 + 512; floatp > v1; )
  222.  *--floatp = *--floatp2 = 0.0;
  223.   // initialize samples[]:
  224.   for (floatp = samples + 32; floatp > samples; )
  225.  *--floatp = 0.0;
  226.   actual_v = v1;
  227.   actual_write_pos = 15;
  228. }
  229. void SynthesisFilter::compute_new_v()
  230. {
  231. real new_v[32];         // new V[0-15] and V[33-48] of Figure 3-A.2 in ISO DIS 11172-3
  232. real p[16];
  233. real pp[16];
  234. // compute new values via a fast cosine transform:
  235. {
  236. register real *x1 = samples;
  237. p[0] = x1[0] + x1[31];
  238. p[1] = x1[1] + x1[30];
  239. p[2] = x1[2] + x1[29];
  240. p[3] = x1[3] + x1[28];
  241. p[4] = x1[4] + x1[27];
  242. p[5] = x1[5] + x1[26];
  243. p[6] = x1[6] + x1[25];
  244. p[7] = x1[7] + x1[24];
  245. p[8] = x1[8] + x1[23];
  246. p[9] = x1[9] + x1[22];
  247. p[10] = x1[10] + x1[21];
  248. p[11] = x1[11] + x1[20];
  249. p[12] = x1[12] + x1[19];
  250. p[13] = x1[13] + x1[18];
  251. p[14] = x1[14] + x1[17];
  252. p[15] = x1[15] + x1[16];
  253. }
  254. {
  255. pp[0] = p[0] + p[15];
  256. pp[1] = p[1] + p[14];
  257. pp[2] = p[2] + p[13];
  258. pp[3] = p[3] + p[12];
  259. pp[4] = p[4] + p[11];
  260. pp[5] = p[5] + p[10];
  261. pp[6] = p[6] + p[9];
  262. pp[7] = p[7] + p[8];
  263. pp[8] = (p[0] - p[15]) * cos1_32;
  264. pp[9] = (p[1] - p[14]) * cos3_32;
  265. pp[10] = (p[2] - p[13]) * cos5_32;
  266. pp[11] = (p[3] - p[12]) * cos7_32;
  267. pp[12] = (p[4] - p[11]) * cos9_32;
  268. pp[13] = (p[5] - p[10]) * cos11_32;
  269. pp[14] = (p[6] - p[9]) * cos13_32;
  270. pp[15] = (p[7] - p[8]) * cos15_32;
  271. }
  272. {
  273. p[0] = pp[0] + pp[7];
  274. p[1] = pp[1] + pp[6];
  275. p[2] = pp[2] + pp[5];
  276. p[3] = pp[3] + pp[4];
  277. p[4] = (pp[0] - pp[7]) * cos1_16;
  278. p[5] = (pp[1] - pp[6]) * cos3_16;
  279. p[6] = (pp[2] - pp[5]) * cos5_16;
  280. p[7] = (pp[3] - pp[4]) * cos7_16;
  281. p[8] = pp[8] + pp[15];
  282. p[9] = pp[9] + pp[14];
  283. p[10] = pp[10] + pp[13];
  284. p[11] = pp[11] + pp[12];
  285. p[12] = (pp[8] - pp[15]) * cos1_16;
  286. p[13] = (pp[9] - pp[14]) * cos3_16;
  287. p[14] = (pp[10] - pp[13]) * cos5_16;
  288. p[15] = (pp[11] - pp[12]) * cos7_16;
  289. }
  290. {
  291. pp[0] = p[0] + p[3];
  292. pp[1] = p[1] + p[2];
  293. pp[2] = (p[0] - p[3]) * cos1_8;
  294. pp[3] = (p[1] - p[2]) * cos3_8;
  295. pp[4] = p[4] + p[7];
  296. pp[5] = p[5] + p[6];
  297. pp[6] = (p[4] - p[7]) * cos1_8;
  298. pp[7] = (p[5] - p[6]) * cos3_8;
  299. pp[8] = p[8] + p[11];
  300. pp[9] = p[9] + p[10];
  301. pp[10] = (p[8] - p[11]) * cos1_8;
  302. pp[11] = (p[9] - p[10]) * cos3_8;
  303. pp[12] = p[12] + p[15];
  304. pp[13] = p[13] + p[14];
  305. pp[14] = (p[12] - p[15]) * cos1_8;
  306. pp[15] = (p[13] - p[14]) * cos3_8;
  307. }
  308. {
  309. p[0] = pp[0] + pp[1];
  310. p[1] = (pp[0] - pp[1]) * cos1_4;
  311. p[2] = pp[2] + pp[3];
  312. p[3] = (pp[2] - pp[3]) * cos1_4;
  313. p[4] = pp[4] + pp[5];
  314. p[5] = (pp[4] - pp[5]) * cos1_4;
  315. p[6] = pp[6] + pp[7];
  316. p[7] = (pp[6] - pp[7]) * cos1_4;
  317. p[8] = pp[8] + pp[9];
  318. p[9] = (pp[8] - pp[9]) * cos1_4;
  319. p[10] = pp[10] + pp[11];
  320. p[11] = (pp[10] - pp[11]) * cos1_4;
  321. p[12] = pp[12] + pp[13];
  322. p[13] = (pp[12] - pp[13]) * cos1_4;
  323. p[14] = pp[14] + pp[15];
  324. p[15] = (pp[14] - pp[15]) * cos1_4;
  325. }
  326. {
  327. // this is pretty insane coding
  328. register real tmp1;
  329. new_v[36-17] = -(new_v[4] = (new_v[12] = p[7]) + p[5]) - p[6];
  330. new_v[44-17] = -p[6] - p[7] - p[4];
  331. new_v[6] = (new_v[10] = (new_v[14] = p[15]) + p[11]) + p[13];
  332. new_v[34-17] = -(new_v[2] = p[15] + p[13] + p[9]) - p[14];
  333. new_v[38-17] = (tmp1 = -p[14] - p[15] - p[10] - p[11]) - p[13];
  334. new_v[46-17] = -p[14] - p[15] - p[12] - p[8];
  335. new_v[42-17] = tmp1 - p[12];
  336. new_v[48-17] = -p[0];
  337. new_v[0] = p[1];
  338. new_v[40-17] = -(new_v[8] = p[3]) - p[2];
  339. }
  340. {
  341. register real *x1 = samples;
  342. p[0] = (x1[0] - x1[31]) * cos1_64;
  343. p[1] = (x1[1] - x1[30]) * cos3_64;
  344. p[2] = (x1[2] - x1[29]) * cos5_64;
  345. p[3] = (x1[3] - x1[28]) * cos7_64;
  346. p[4] = (x1[4] - x1[27]) * cos9_64;
  347. p[5] = (x1[5] - x1[26]) * cos11_64;
  348. p[6] = (x1[6] - x1[25]) * cos13_64;
  349. p[7] = (x1[7] - x1[24]) * cos15_64;
  350. p[8] = (x1[8] - x1[23]) * cos17_64;
  351. p[9] = (x1[9] - x1[22]) * cos19_64;
  352. p[10] = (x1[10] - x1[21]) * cos21_64;
  353. p[11] = (x1[11] - x1[20]) * cos23_64;
  354. p[12] = (x1[12] - x1[19]) * cos25_64;
  355. p[13] = (x1[13] - x1[18]) * cos27_64;
  356. p[14] = (x1[14] - x1[17]) * cos29_64;
  357. p[15] = (x1[15] - x1[16]) * cos31_64;
  358. }
  359. {
  360. pp[0] = p[0] + p[15];
  361. pp[1] = p[1] + p[14];
  362. pp[2] = p[2] + p[13];
  363. pp[3] = p[3] + p[12];
  364. pp[4] = p[4] + p[11];
  365. pp[5] = p[5] + p[10];
  366. pp[6] = p[6] + p[9];
  367. pp[7] = p[7] + p[8];
  368. pp[8] = (p[0] - p[15]) * cos1_32;
  369. pp[9] = (p[1] - p[14]) * cos3_32;
  370. pp[10] = (p[2] - p[13]) * cos5_32;
  371. pp[11] = (p[3] - p[12]) * cos7_32;
  372. pp[12] = (p[4] - p[11]) * cos9_32;
  373. pp[13] = (p[5] - p[10]) * cos11_32;
  374. pp[14] = (p[6] - p[9]) * cos13_32;
  375. pp[15] = (p[7] - p[8]) * cos15_32;
  376. }
  377. {
  378. p[0] = pp[0] + pp[7];
  379. p[1] = pp[1] + pp[6];
  380. p[2] = pp[2] + pp[5];
  381. p[3] = pp[3] + pp[4];
  382. p[4] = (pp[0] - pp[7]) * cos1_16;
  383. p[5] = (pp[1] - pp[6]) * cos3_16;
  384. p[6] = (pp[2] - pp[5]) * cos5_16;
  385. p[7] = (pp[3] - pp[4]) * cos7_16;
  386. p[8] = pp[8] + pp[15];
  387. p[9] = pp[9] + pp[14];
  388. p[10] = pp[10] + pp[13];
  389. p[11] = pp[11] + pp[12];
  390. p[12] = (pp[8] - pp[15]) * cos1_16;
  391. p[13] = (pp[9] - pp[14]) * cos3_16;
  392. p[14] = (pp[10] - pp[13]) * cos5_16;
  393. p[15] = (pp[11] - pp[12]) * cos7_16;
  394. }
  395. {
  396. pp[0] = p[0] + p[3];
  397. pp[1] = p[1] + p[2];
  398. pp[2] = (p[0] - p[3]) * cos1_8;
  399. pp[3] = (p[1] - p[2]) * cos3_8;
  400. pp[4] = p[4] + p[7];
  401. pp[5] = p[5] + p[6];
  402. pp[6] = (p[4] - p[7]) * cos1_8;
  403. pp[7] = (p[5] - p[6]) * cos3_8;
  404. pp[8] = p[8] + p[11];
  405. pp[9] = p[9] + p[10];
  406. pp[10] = (p[8] - p[11]) * cos1_8;
  407. pp[11] = (p[9] - p[10]) * cos3_8;
  408. pp[12] = p[12] + p[15];
  409. pp[13] = p[13] + p[14];
  410. pp[14] = (p[12] - p[15]) * cos1_8;
  411. pp[15] = (p[13] - p[14]) * cos3_8;
  412. }
  413. {
  414. p[0] = pp[0] + pp[1];
  415. p[1] = (pp[0] - pp[1]) * cos1_4;
  416. p[2] = pp[2] + pp[3];
  417. p[3] = (pp[2] - pp[3]) * cos1_4;
  418. p[4] = pp[4] + pp[5];
  419. p[5] = (pp[4] - pp[5]) * cos1_4;
  420. p[6] = pp[6] + pp[7];
  421. p[7] = (pp[6] - pp[7]) * cos1_4;
  422. p[8] = pp[8] + pp[9];
  423. p[9] = (pp[8] - pp[9]) * cos1_4;
  424. p[10] = pp[10] + pp[11];
  425. p[11] = (pp[10] - pp[11]) * cos1_4;
  426. p[12] = pp[12] + pp[13];
  427. p[13] = (pp[12] - pp[13]) * cos1_4;
  428. p[14] = pp[14] + pp[15];
  429. p[15] = (pp[14] - pp[15]) * cos1_4;
  430. }
  431. {
  432. // manually doing something that a compiler should handle sucks
  433. // coding like this is hard to read
  434. register real tmp1, tmp2;
  435. new_v[5] = (new_v[11] = (new_v[13] = (new_v[15] = p[15]) + p[7]) + p[11])
  436. + p[5] + p[13];
  437. new_v[7] = (new_v[9] = p[15] + p[11] + p[3]) + p[13];
  438. new_v[33-17] = -(new_v[1] = (tmp1 = p[13] + p[15] + p[9]) + p[1]) - p[14];
  439. new_v[35-17] = -(new_v[3] = tmp1 + p[5] + p[7]) - p[6] - p[14];
  440. new_v[39-17] = (tmp1 = -p[10] - p[11] - p[14] - p[15])
  441. - p[13] - p[2] - p[3];
  442. new_v[37-17] = tmp1 - p[13] - p[5] - p[6] - p[7];
  443. new_v[41-17] = tmp1 - p[12] - p[2] - p[3];
  444. new_v[43-17] = tmp1 - p[12] - (tmp2 = p[4] + p[6] + p[7]);
  445. new_v[47-17] = (tmp1 = -p[8] - p[12] - p[14] - p[15]) - p[0];
  446. new_v[45-17] = tmp1 - tmp2;
  447. }
  448. {
  449. // insert V[0-15] (== new_v[0-15]) into actual v:
  450. register real *x1 = new_v;
  451. register real *x2 = actual_v + actual_write_pos;
  452. x2[0] = x1[0];
  453. x2[16] = x1[1];
  454. x2[32] = x1[2];
  455. x2[48] = x1[3];
  456. x2[64] = x1[4];
  457. x2[80] = x1[5];
  458. x2[96] = x1[6];
  459. x2[112] = x1[7];
  460. x2[128] = x1[8];
  461. x2[144] = x1[9];
  462. x2[160] = x1[10];
  463. x2[176] = x1[11];
  464. x2[192] = x1[12];
  465. x2[208] = x1[13];
  466. x2[224] = x1[14];
  467. x2[240] = x1[15];
  468. // V[16] is always 0.0:
  469. x2[256] = 0.0f;
  470. // insert V[17-31] (== -new_v[15-1]) into actual v:
  471. x2[272] = -x1[15];
  472. x2[288] = -x1[14];
  473. x2[304] = -x1[13];
  474. x2[320] = -x1[12];
  475. x2[336] = -x1[11];
  476. x2[352] = -x1[10];
  477. x2[368] = -x1[9];
  478. x2[384] = -x1[8];
  479. x2[400] = -x1[7];
  480. x2[416] = -x1[6];
  481. x2[432] = -x1[5];
  482. x2[448] = -x1[4];
  483. x2[464] = -x1[3];
  484. x2[480] = -x1[2];
  485. x2[496] = -x1[1];
  486. // insert V[32] (== -new_v[0]) into other v:
  487. x2 = (actual_v == v1 ? v2 : v1) + actual_write_pos;
  488. x2[0] = -x1[0];
  489. // insert V[33-48] (== new_v[16-31]) into other v:
  490. x2[16] = x1[16];
  491. x2[32] = x1[17];
  492. x2[48] = x1[18];
  493. x2[64] = x1[19];
  494. x2[80] = x1[20];
  495. x2[96] = x1[21];
  496. x2[112] = x1[22];
  497. x2[128] = x1[23];
  498. x2[144] = x1[24];
  499. x2[160] = x1[25];
  500. x2[176] = x1[26];
  501. x2[192] = x1[27];
  502. x2[208] = x1[28];
  503. x2[224] = x1[29];
  504. x2[240] = x1[30];
  505. x2[256] = x1[31];
  506. // insert V[49-63] (== new_v[30-16]) into other v:
  507. x2[272] = x1[30];
  508. x2[288] = x1[29];
  509. x2[304] = x1[28];
  510. x2[320] = x1[27];
  511. x2[336] = x1[26];
  512. x2[352] = x1[25];
  513. x2[368] = x1[24];
  514. x2[384] = x1[23];
  515. x2[400] = x1[22];
  516. x2[416] = x1[21];
  517. x2[432] = x1[20];
  518. x2[448] = x1[19];
  519. x2[464] = x1[18];
  520. x2[480] = x1[17];
  521. x2[496] = x1[16];
  522. }
  523. }
  524. void SynthesisFilter::compute_pcm_samples(Obuffer *buffer)
  525. {
  526. // scoping variables makes it easier to optimize for the compiler
  527. register real *vp = actual_v;
  528. //real a[32];
  529. //real * pa=a;
  530. // switch depending on the value for actual_write_pos
  531. switch (actual_write_pos) {
  532. case 0: {
  533. // fat chance of having this loop unroll
  534. for( register const real *dp = d;
  535.  dp < d + (32 * 16);
  536.  dp += 16, vp += 16 ) {
  537. register real pcm_sample;
  538. pcm_sample = (real)(((vp[0] * dp[0]) +
  539. (vp[15] * dp[1]) +
  540. (vp[14] * dp[2]) +
  541. (vp[13] * dp[3]) +
  542. (vp[12] * dp[4]) +
  543. (vp[11] * dp[5]) +
  544. (vp[10] * dp[6]) +
  545. (vp[9] * dp[7]) +
  546. (vp[8] * dp[8]) +
  547. (vp[7] * dp[9]) +
  548. (vp[6] * dp[10]) +
  549. (vp[5] * dp[11]) +
  550. (vp[4] * dp[12]) +
  551. (vp[3] * dp[13]) +
  552. (vp[2] * dp[14]) +
  553. (vp[1] * dp[15])
  554. ) /* * scalefactor */);
  555.             buffer->append (channel, (int16)pcm_sample);
  556. } // for
  557. } break; // case 0:
  558. case 1: {
  559. // fat chance of having this loop unroll
  560. for( register const real *dp = d;
  561.  dp < d + (32 * 16);
  562.  dp += 16, vp += 16 ) {
  563. register real pcm_sample;
  564. pcm_sample = (real)(((vp[1] * dp[0]) +
  565. (vp[0] * dp[1]) +
  566. (vp[15] * dp[2]) +
  567. (vp[14] * dp[3]) +
  568. (vp[13] * dp[4]) +
  569. (vp[12] * dp[5]) +
  570. (vp[11] * dp[6]) +
  571. (vp[10] * dp[7]) +
  572. (vp[9] * dp[8]) +
  573. (vp[8] * dp[9]) +
  574. (vp[7] * dp[10]) +
  575. (vp[6] * dp[11]) +
  576. (vp[5] * dp[12]) +
  577. (vp[4] * dp[13]) +
  578. (vp[3] * dp[14]) +
  579. (vp[2] * dp[15])
  580. ) /* * scalefactor */);
  581.             buffer->append (channel, (int16)pcm_sample);
  582.          } // for
  583. } break; // case 1:
  584. case 2: {
  585. // fat chance of having this loop unroll
  586. for( register const real *dp = d;
  587.  dp < d + (32 * 16);
  588.  dp += 16, vp += 16 ) {
  589. register real pcm_sample;
  590. pcm_sample = (real)(((vp[2] * dp[0]) +
  591. (vp[1] * dp[1]) +
  592. (vp[0] * dp[2]) +
  593. (vp[15] * dp[3]) +
  594. (vp[14] * dp[4]) +
  595. (vp[13] * dp[5]) +
  596. (vp[12] * dp[6]) +
  597. (vp[11] * dp[7]) +
  598. (vp[10] * dp[8]) +
  599. (vp[9] * dp[9]) +
  600. (vp[8] * dp[10]) +
  601. (vp[7] * dp[11]) +
  602. (vp[6] * dp[12]) +
  603. (vp[5] * dp[13]) +
  604. (vp[4] * dp[14]) +
  605. (vp[3] * dp[15])
  606. ) /* * scalefactor */);
  607.             buffer->append (channel, (int16)pcm_sample);
  608. } // for
  609. } break; // case 2:
  610. case 3: {
  611. // fat chance of having this loop unroll
  612. for( register const real *dp = d;
  613.  dp < d + (32 * 16);
  614.  dp += 16, vp += 16 ) {
  615. register real pcm_sample;
  616. pcm_sample = (real)(((vp[3] * dp[0]) +
  617. (vp[2] * dp[1]) +
  618. (vp[1] * dp[2]) +
  619. (vp[0] * dp[3]) +
  620. (vp[15] * dp[4]) +
  621. (vp[14] * dp[5]) +
  622. (vp[13] * dp[6]) +
  623. (vp[12] * dp[7]) +
  624. (vp[11] * dp[8]) +
  625. (vp[10] * dp[9]) +
  626. (vp[9] * dp[10]) +
  627. (vp[8] * dp[11]) +
  628. (vp[7] * dp[12]) +
  629. (vp[6] * dp[13]) +
  630. (vp[5] * dp[14]) +
  631. (vp[4] * dp[15])
  632. ) /* * scalefactor */);
  633. buffer->append (channel, (int16)pcm_sample);
  634. } // for
  635. } break; // case 3:
  636. case 4: {
  637. // fat chance of having this loop unroll
  638. for( register const real *dp = d;
  639.  dp < d + (32 * 16);
  640.  dp += 16, vp += 16 ) {
  641. register real pcm_sample;
  642. pcm_sample = (real)(((vp[4] * dp[0]) +
  643. (vp[3] * dp[1]) +
  644. (vp[2] * dp[2]) +
  645. (vp[1] * dp[3]) +
  646. (vp[0] * dp[4]) +
  647. (vp[15] * dp[5]) +
  648. (vp[14] * dp[6]) +
  649. (vp[13] * dp[7]) +
  650. (vp[12] * dp[8]) +
  651. (vp[11] * dp[9]) +
  652. (vp[10] * dp[10]) +
  653. (vp[9] * dp[11]) +
  654. (vp[8] * dp[12]) +
  655. (vp[7] * dp[13]) +
  656. (vp[6] * dp[14]) +
  657. (vp[5] * dp[15])
  658. ) /* * scalefactor */);
  659. buffer->append (channel, (int16)pcm_sample);
  660. } // for
  661. } break; // case 4:
  662. case 5: {
  663. // fat chance of having this loop unroll
  664. for( register const real *dp = d;
  665.  dp < d + (32 * 16);
  666.  dp += 16, vp += 16 ) {
  667. register real pcm_sample;
  668. pcm_sample = (real)(((vp[5] * dp[0]) +
  669. (vp[4] * dp[1]) +
  670. (vp[3] * dp[2]) +
  671. (vp[2] * dp[3]) +
  672. (vp[1] * dp[4]) +
  673. (vp[0] * dp[5]) +
  674. (vp[15] * dp[6]) +
  675. (vp[14] * dp[7]) +
  676. (vp[13] * dp[8]) +
  677. (vp[12] * dp[9]) +
  678. (vp[11] * dp[10]) +
  679. (vp[10] * dp[11]) +
  680. (vp[9] * dp[12]) +
  681. (vp[8] * dp[13]) +
  682. (vp[7] * dp[14]) +
  683. (vp[6] * dp[15])
  684. ) /* * scalefactor */);
  685. buffer->append (channel, (int16)pcm_sample);
  686. } // for
  687. } break; // case 5:
  688. case 6: {
  689. // fat chance of having this loop unroll
  690. for( register const real *dp = d;
  691.  dp < d + (32 * 16);
  692.  dp += 16, vp += 16 ) {
  693. register real pcm_sample;
  694. pcm_sample = (real)(((vp[6] * dp[0]) +
  695. (vp[5] * dp[1]) +
  696. (vp[4] * dp[2]) +
  697. (vp[3] * dp[3]) +
  698. (vp[2] * dp[4]) +
  699. (vp[1] * dp[5]) +
  700. (vp[0] * dp[6]) +
  701. (vp[15] * dp[7]) +
  702. (vp[14] * dp[8]) +
  703. (vp[13] * dp[9]) +
  704. (vp[12] * dp[10]) +
  705. (vp[11] * dp[11]) +
  706. (vp[10] * dp[12]) +
  707. (vp[9] * dp[13]) +
  708. (vp[8] * dp[14]) +
  709. (vp[7] * dp[15])
  710. ) /* * scalefactor */);
  711.             buffer->append (channel, (int16)pcm_sample);
  712. } // for
  713. } break; // case 6:
  714. case 7: {
  715. // fat chance of having this loop unroll
  716. for( register const real *dp = d;
  717.  dp < d + (32 * 16);
  718.  dp += 16, vp += 16 ) {
  719. register real pcm_sample;
  720. pcm_sample = (real)(((vp[7] * dp[0]) +
  721. (vp[6] * dp[1]) +
  722. (vp[5] * dp[2]) +
  723. (vp[4] * dp[3]) +
  724. (vp[3] * dp[4]) +
  725. (vp[2] * dp[5]) +
  726. (vp[1] * dp[6]) +
  727. (vp[0] * dp[7]) +
  728. (vp[15] * dp[8]) +
  729. (vp[14] * dp[9]) +
  730. (vp[13] * dp[10]) +
  731. (vp[12] * dp[11]) +
  732. (vp[11] * dp[12]) +
  733. (vp[10] * dp[13]) +
  734. (vp[9] * dp[14]) +
  735. (vp[8] * dp[15])
  736. ) /* * scalefactor */);
  737.             buffer->append (channel, (int16)pcm_sample);
  738. } // for
  739. } break; // case 7:
  740. case 8: {
  741. // fat chance of having this loop unroll
  742. for( register const real *dp = d;
  743.  dp < d + (32 * 16);
  744.  dp += 16, vp += 16 ) {
  745. register real pcm_sample;
  746. pcm_sample = (real)(((vp[8] * dp[0]) +
  747. (vp[7] * dp[1]) +
  748. (vp[6] * dp[2]) +
  749. (vp[5] * dp[3]) +
  750. (vp[4] * dp[4]) +
  751. (vp[3] * dp[5]) +
  752. (vp[2] * dp[6]) +
  753. (vp[1] * dp[7]) +
  754. (vp[0] * dp[8]) +
  755. (vp[15] * dp[9]) +
  756. (vp[14] * dp[10]) +
  757. (vp[13] * dp[11]) +
  758. (vp[12] * dp[12]) +
  759. (vp[11] * dp[13]) +
  760. (vp[10] * dp[14]) +
  761. (vp[9] * dp[15])
  762. ) /* * scalefactor */);
  763.             buffer->append (channel, (int16)pcm_sample);
  764. } // for
  765. } break; // case 8:
  766. case 9: {
  767. // fat chance of having this loop unroll
  768. for( register const real *dp = d;
  769.  dp < d + (32 * 16);
  770.  dp += 16, vp += 16 ) {
  771. register real pcm_sample;
  772. pcm_sample = (real)(((vp[9] * dp[0]) +
  773. (vp[8] * dp[1]) +
  774. (vp[7] * dp[2]) +
  775. (vp[6] * dp[3]) +
  776. (vp[5] * dp[4]) +
  777. (vp[4] * dp[5]) +
  778. (vp[3] * dp[6]) +
  779. (vp[2] * dp[7]) +
  780. (vp[1] * dp[8]) +
  781. (vp[0] * dp[9]) +
  782. (vp[15] * dp[10]) +
  783. (vp[14] * dp[11]) +
  784. (vp[13] * dp[12]) +
  785. (vp[12] * dp[13]) +
  786. (vp[11] * dp[14]) +
  787. (vp[10] * dp[15])
  788. ) /* * scalefactor */);
  789.             buffer->append (channel, (int16)pcm_sample);
  790. } // for
  791. } break; // case 9:
  792. case 10: {
  793. // fat chance of having this loop unroll
  794. for( register const real *dp = d;
  795.  dp < d + (32 * 16);
  796.  dp += 16, vp += 16 ) {
  797. register real pcm_sample;
  798. pcm_sample = (real)(((vp[10] * dp[0]) +
  799. (vp[9] * dp[1]) +
  800. (vp[8] * dp[2]) +
  801. (vp[7] * dp[3]) +
  802. (vp[6] * dp[4]) +
  803. (vp[5] * dp[5]) +
  804. (vp[4] * dp[6]) +
  805. (vp[3] * dp[7]) +
  806. (vp[2] * dp[8]) +
  807. (vp[1] * dp[9]) +
  808. (vp[0] * dp[10]) +
  809. (vp[15] * dp[11]) +
  810. (vp[14] * dp[12]) +
  811. (vp[13] * dp[13]) +
  812. (vp[12] * dp[14]) +
  813. (vp[11] * dp[15])
  814. ) /* * scalefactor */);
  815.             buffer->append (channel, (int16)pcm_sample);
  816. } // for
  817. } break; // case 10:
  818. case 11: {
  819. // fat chance of having this loop unroll
  820. for( register const real *dp = d;
  821.  dp < d + (32 * 16);
  822.  dp += 16, vp += 16 ) {
  823. register real pcm_sample;
  824. pcm_sample = (real)(((vp[11] * dp[0]) +
  825. (vp[10] * dp[1]) +
  826. (vp[9] * dp[2]) +
  827. (vp[8] * dp[3]) +
  828. (vp[7] * dp[4]) +
  829. (vp[6] * dp[5]) +
  830. (vp[5] * dp[6]) +
  831. (vp[4] * dp[7]) +
  832. (vp[3] * dp[8]) +
  833. (vp[2] * dp[9]) +
  834. (vp[1] * dp[10]) +
  835. (vp[0] * dp[11]) +
  836. (vp[15] * dp[12]) +
  837. (vp[14] * dp[13]) +
  838. (vp[13] * dp[14]) +
  839. (vp[12] * dp[15])
  840. ) /* * scalefactor */);
  841.             buffer->append (channel, (int16)pcm_sample);
  842. } // for
  843. } break; // case 11:
  844. case 12: {
  845. // fat chance of having this loop unroll
  846. for( register const real *dp = d;
  847.  dp < d + (32 * 16);
  848.  dp += 16, vp += 16 ) {
  849. register real pcm_sample;
  850. pcm_sample = (real)(((vp[12] * dp[0]) +
  851. (vp[11] * dp[1]) +
  852. (vp[10] * dp[2]) +
  853. (vp[9] * dp[3]) +
  854. (vp[8] * dp[4]) +
  855. (vp[7] * dp[5]) +
  856. (vp[6] * dp[6]) +
  857. (vp[5] * dp[7]) +
  858. (vp[4] * dp[8]) +
  859. (vp[3] * dp[9]) +
  860. (vp[2] * dp[10]) +
  861. (vp[1] * dp[11]) +
  862. (vp[0] * dp[12]) +
  863. (vp[15] * dp[13]) +
  864. (vp[14] * dp[14]) +
  865. (vp[13] * dp[15])
  866. ) /* * scalefactor */);
  867.             buffer->append (channel, (int16)pcm_sample);
  868. } // for
  869. } break; // case 12:
  870. case 13: {
  871. // fat chance of having this loop unroll
  872. for( register const real *dp = d;
  873.  dp < d + (32 * 16);
  874.  dp += 16, vp += 16 ) {
  875. register real pcm_sample;
  876. pcm_sample = (real)(((vp[13] * dp[0]) +
  877. (vp[12] * dp[1]) +
  878. (vp[11] * dp[2]) +
  879. (vp[10] * dp[3]) +
  880. (vp[9] * dp[4]) +
  881. (vp[8] * dp[5]) +
  882. (vp[7] * dp[6]) +
  883. (vp[6] * dp[7]) +
  884. (vp[5] * dp[8]) +
  885. (vp[4] * dp[9]) +
  886. (vp[3] * dp[10]) +
  887. (vp[2] * dp[11]) +
  888. (vp[1] * dp[12]) +
  889. (vp[0] * dp[13]) +
  890. (vp[15] * dp[14]) +
  891. (vp[14] * dp[15])
  892. ) /* * scalefactor */);
  893.             buffer->append (channel, (int16)pcm_sample);
  894. } // for
  895. } break; // case 13:
  896. case 14: {
  897. // fat chance of having this loop unroll
  898. for( register const real *dp = d;
  899.  dp < d + (32 * 16);
  900.  dp += 16, vp += 16 ) {
  901. register real pcm_sample;
  902. pcm_sample = (real)(((vp[14] * dp[0]) +
  903. (vp[13] * dp[1]) +
  904. (vp[12] * dp[2]) +
  905. (vp[11] * dp[3]) +
  906. (vp[10] * dp[4]) +
  907. (vp[9] * dp[5]) +
  908. (vp[8] * dp[6]) +
  909. (vp[7] * dp[7]) +
  910. (vp[6] * dp[8]) +
  911. (vp[5] * dp[9]) +
  912. (vp[4] * dp[10]) +
  913. (vp[3] * dp[11]) +
  914. (vp[2] * dp[12]) +
  915. (vp[1] * dp[13]) +
  916. (vp[0] * dp[14]) +
  917. (vp[15] * dp[15])
  918. ) /* * scalefactor */);
  919.             buffer->append (channel, (int16)pcm_sample);
  920. } // for
  921. } break; // case 14:
  922. case 15: {
  923. // fat chance of having this loop unroll
  924. for( register const real *dp = d;
  925.  dp < d + (32 * 16);
  926.  dp += 16, vp += 16 ) {
  927. register real pcm_sample;
  928. pcm_sample = (real)(((vp[15] * dp[0]) +
  929. (vp[14] * dp[1]) +
  930. (vp[13] * dp[2]) +
  931. (vp[12] * dp[3]) +
  932. (vp[11] * dp[4]) +
  933. (vp[10] * dp[5]) +
  934. (vp[9] * dp[6]) +
  935. (vp[8] * dp[7]) +
  936. (vp[7] * dp[8]) +
  937. (vp[6] * dp[9]) +
  938. (vp[5] * dp[10]) +
  939. (vp[4] * dp[11]) +
  940. (vp[3] * dp[12]) +
  941. (vp[2] * dp[13]) +
  942. (vp[1] * dp[14]) +
  943. (vp[0] * dp[15])
  944. ) /* * scalefactor */);
  945.             buffer->append (channel, (int16)pcm_sample);
  946. } // for
  947. } break; // case 15:
  948. }; // switch (actual_write_pos)
  949. //buffer->appendblock (channel, a, 32);
  950. }
  951. void SynthesisFilter::calculate_pcm_samples(Obuffer *buffer)
  952. {
  953. compute_new_v();
  954. compute_pcm_samples(buffer);
  955.    actual_write_pos = (actual_write_pos + 1) & 0xf;
  956. actual_v = (actual_v == v1) ? v2 : v1;
  957. // initialize samples[]:
  958.   for (register real *floatp = samples + 32; floatp > samples; )
  959.  *--floatp = 0.0f;
  960. }