View Raw SPL
/* XY sinx/sin(x) interpolation */
ITERATE sinxinterpxy(x, y, rate)
{
local olen, erate, yr, yi;
if (argc < 3)
{
if (argc < 2) error(sprintf("%s - X and Y input series required", __FUNC__));
rate = 1;
}
if (isdtunit(getvunits(x)))
{
/* dt */
sethunits(y, getvunits(x));
}
if (iscomplex(y))
{
yr = sinxinterpxy(x, real(y), rate);
yi = sinxinterpxy(x, imag(y), rate);
y = yr + i * yi;
}
else
{
/* expected output length */
olen = 1 + round((max(x) - min(x)) * rate);
/* effective sample rate assuming input rate of 1.0 */
erate = (olen - 1) / (length(y) - 1);
/* sinxinterp y vals */
y = sinxinterp(y, rate(y) * erate, 0);
/* linearly interp x vals */
x = xyinterp(x, deltax(x) / erate);
/* linearly sample */
y = xyinterp(x, y, 1.0 / rate);
}
return(y);
}