home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 July & August / PCWorld_2007-07-08_cd.bin / audio-video / reaper / reaper1861-install.exe / Effects / Utility / dither_psycho < prev    next >
Text File  |  2007-04-22  |  3KB  |  150 lines

  1. desc:Dither with psychoacoustic noise shaping.
  2.  
  3. slider1:16<1,32,1>output bit depth
  4. slider2:1<0,3,1{off,on,disabled (sample rate not supported),disabled (overload)}>psychoacoustic noise shaping
  5. slider3:2<0,1,2{off (truncate),on (TPDF),on (high pass TPDF)}>dither
  6. slider4:2<1,2,0.1>dither bit width (LSB)
  7.  
  8. @init
  9.  
  10. N = 0;
  11. coeffs = 0;
  12.  
  13. // All coefficients John Schwartz 2007.
  14. // http://www.gnu.org/licenses/gpl.html
  15.  
  16. (srate == 44100) ? (
  17.   N = 9;
  18.   coeffs[0] = 2.372839;
  19.   coeffs[1] = -3.132662;
  20.   coeffs[2] = 3.203963;
  21.   coeffs[3] = -2.853749;
  22.   coeffs[4] = 1.971429;
  23.   coeffs[5] = -1.013035;
  24.   coeffs[6] = 0.369805;
  25.   coeffs[7] = -0.091063;
  26.   coeffs[8] = 0.013578;
  27.  
  28.   // Wannamaker 1992 coefficients for reference.
  29.   //
  30.   // coeffs[0] =  2.412;
  31.   // coeffs[1] = -3.370;
  32.   // coeffs[2] =  3.937;
  33.   // coeffs[3] = -4.174;
  34.   // coeffs[4] =  3.353;
  35.   // coeffs[5] = -2.205;
  36.   // coeffs[6] =  1.281;
  37.   // coeffs[7] = -0.569;
  38.   // coeffs[8] =  0.0847;
  39. ) : 
  40. (srate == 48000) ? (
  41.   N = 9;
  42.   coeffs[0] = 2.077677;
  43.   coeffs[1] = -2.721001;
  44.   coeffs[2] = 2.602012;
  45.   coeffs[3] = -2.157415;
  46.   coeffs[4] = 1.398085;
  47.   coeffs[5] = -0.84755;
  48.   coeffs[6] = 0.373337;
  49.   coeffs[7] = -0.161701;
  50.   coeffs[8] = 0.003758;
  51. ) :
  52. (srate == 88200) ? (
  53.   N = 10;
  54.   coeffs[0] = -0.037508;
  55.   coeffs[1] = 2.14333;
  56.   coeffs[2] = -0.089328;
  57.   coeffs[3] = -2.38445;
  58.   coeffs[4] = 0.376261;
  59.   coeffs[5] = 1.940341;
  60.   coeffs[6] = -0.463485;
  61.   coeffs[7] = -1.241821;
  62.   coeffs[8] = 0.157735;
  63.   coeffs[9] = 0.412081;
  64. ) :
  65. (srate == 96000) ? (
  66.   N = 10;
  67.   coeffs[0] = -0.26496;
  68.   coeffs[1] = 1.847721;
  69.   coeffs[2] = 0.692557;
  70.   coeffs[3] = -1.949565;
  71.   coeffs[4] = -0.691542;
  72.   coeffs[5] = 1.415063;
  73.   coeffs[6] = 0.463352;
  74.   coeffs[7] = -0.792872;
  75.   coeffs[8] = -0.229575;
  76.   coeffs[9] = 0.156314;
  77. );
  78.  
  79. (N == 0) ? (
  80.   psycho = 0;
  81.   slider2 = 2;
  82.   sliderchange(slider2);
  83. );
  84.  
  85. errBufL = coeffs + N;
  86. errBufR = errBufL + N;
  87.  
  88. @slider
  89.  
  90. resolution = 2 ^ (slider1 - 1);
  91. psycho = (slider2 == 1);  
  92. tpdf = (slider3 == 1);
  93. hiTPDF = (slider3 == 2);
  94. ditherX = slider4 / 2.0;
  95.  
  96. memset(errBufL, 0, N);
  97. memset(errBufR, 0, N);
  98. p = 0;
  99.  
  100. zL = zR = 0.5;
  101. rndL = rndR = 0.0;
  102.  
  103. @sample
  104.  
  105. sL = spl0;
  106. sR = spl1;
  107.  
  108. (psycho) ? (
  109.   i = 0;
  110.   q = p;
  111.   loop(N,
  112.     sL -= coeffs[i] * errBufL[q];
  113.     sR -= coeffs[i] * errBufR[q];
  114.     i += 1;
  115.     q += 1;
  116.     (q == N) ? (q = 0);      // % is expensive.
  117.   );
  118. );
  119.  
  120. (tpdf) ? (
  121.   zL = 0.5 + (rand(1) + rand(1) - 1.0) * ditherX;
  122.   zR = 0.5 + (rand(1) + rand(1) - 1.0) * ditherX;
  123. ) : 
  124. (hiTPDF) ? (
  125.   zL = 0.5 + rndL;
  126.   zR = 0.5 + rndR;
  127.   rndL = rand(1) * ditherX;
  128.   rndR = rand(1) * ditherX;
  129.   zL -= rndL;
  130.   zR -= rndR;
  131. );
  132.  
  133. spl0 = floor(sL * resolution + zL) / resolution;
  134. spl1 = floor(sR * resolution + zR) / resolution;
  135.  
  136. spl0 = max(-1.0, min(spl0, 1.0));
  137. spl1 = max(-1.0, min(spl1, 1.0));
  138.  
  139. (psycho) ? (
  140.   (p == 0) ? (p = N - 1) : (p -= 1);  // % is expensive.
  141.   errBufL[p] = spl0 - sL;
  142.   errBufR[p] = spl1 - sR;
  143.  
  144.   (abs(spl0) == 1 || abs(spl1) == 1) ? (
  145.     psycho = 0;
  146.     slider2 = 3;
  147.     sliderchange(slider2);
  148.   );
  149. );
  150.