home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2008 February
/
PCWorld_2008-02_cd.bin
/
audio-video
/
reaper
/
reaper2028-install.exe
/
Effects
/
Utility
/
dither_psycho
< prev
next >
Wrap
Text File
|
2007-12-03
|
3KB
|
150 lines
desc:Dither with psychoacoustic noise shaping.
slider1:16<1,32,1>output bit depth
slider2:1<0,3,1{off,on,disabled (sample rate not supported),disabled (overload)}>psychoacoustic noise shaping
slider3:2<0,1,2{off (truncate),on (TPDF),on (high pass TPDF)}>dither
slider4:2<1,2,0.1>dither bit width (LSB)
@init
N = 0;
coeffs = 0;
// All coefficients John Schwartz 2007.
// http://www.gnu.org/licenses/gpl.html
(srate == 44100) ? (
N = 9;
coeffs[0] = 2.372839;
coeffs[1] = -3.132662;
coeffs[2] = 3.203963;
coeffs[3] = -2.853749;
coeffs[4] = 1.971429;
coeffs[5] = -1.013035;
coeffs[6] = 0.369805;
coeffs[7] = -0.091063;
coeffs[8] = 0.013578;
// Wannamaker 1992 coefficients for reference.
//
// coeffs[0] = 2.412;
// coeffs[1] = -3.370;
// coeffs[2] = 3.937;
// coeffs[3] = -4.174;
// coeffs[4] = 3.353;
// coeffs[5] = -2.205;
// coeffs[6] = 1.281;
// coeffs[7] = -0.569;
// coeffs[8] = 0.0847;
) :
(srate == 48000) ? (
N = 9;
coeffs[0] = 2.077677;
coeffs[1] = -2.721001;
coeffs[2] = 2.602012;
coeffs[3] = -2.157415;
coeffs[4] = 1.398085;
coeffs[5] = -0.84755;
coeffs[6] = 0.373337;
coeffs[7] = -0.161701;
coeffs[8] = 0.003758;
) :
(srate == 88200) ? (
N = 10;
coeffs[0] = -0.037508;
coeffs[1] = 2.14333;
coeffs[2] = -0.089328;
coeffs[3] = -2.38445;
coeffs[4] = 0.376261;
coeffs[5] = 1.940341;
coeffs[6] = -0.463485;
coeffs[7] = -1.241821;
coeffs[8] = 0.157735;
coeffs[9] = 0.412081;
) :
(srate == 96000) ? (
N = 10;
coeffs[0] = -0.26496;
coeffs[1] = 1.847721;
coeffs[2] = 0.692557;
coeffs[3] = -1.949565;
coeffs[4] = -0.691542;
coeffs[5] = 1.415063;
coeffs[6] = 0.463352;
coeffs[7] = -0.792872;
coeffs[8] = -0.229575;
coeffs[9] = 0.156314;
);
(N == 0) ? (
psycho = 0;
slider2 = 2;
sliderchange(slider2);
);
errBufL = coeffs + N;
errBufR = errBufL + N;
@slider
resolution = 2 ^ (slider1 - 1);
psycho = (slider2 == 1);
tpdf = (slider3 == 1);
hiTPDF = (slider3 == 2);
ditherX = slider4 / 2.0;
memset(errBufL, 0, N);
memset(errBufR, 0, N);
p = 0;
zL = zR = 0.5;
rndL = rndR = 0.0;
@sample
sL = spl0;
sR = spl1;
(psycho) ? (
i = 0;
q = p;
loop(N,
sL -= coeffs[i] * errBufL[q];
sR -= coeffs[i] * errBufR[q];
i += 1;
q += 1;
(q == N) ? (q = 0); // % is expensive.
);
);
(tpdf) ? (
zL = 0.5 + (rand(1) + rand(1) - 1.0) * ditherX;
zR = 0.5 + (rand(1) + rand(1) - 1.0) * ditherX;
) :
(hiTPDF) ? (
zL = 0.5 + rndL;
zR = 0.5 + rndR;
rndL = rand(1) * ditherX;
rndR = rand(1) * ditherX;
zL -= rndL;
zR -= rndR;
);
spl0 = floor(sL * resolution + zL) / resolution;
spl1 = floor(sR * resolution + zR) / resolution;
spl0 = max(-1.0, min(spl0, 1.0));
spl1 = max(-1.0, min(spl1, 1.0));
(psycho) ? (
(p == 0) ? (p = N - 1) : (p -= 1); // % is expensive.
errBufL[p] = spl0 - sL;
errBufR[p] = spl1 - sR;
(abs(spl0) == 1 || abs(spl1) == 1) ? (
psycho = 0;
slider2 = 3;
sliderchange(slider2);
);
);