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);
}