View Raw SPL
/* driver for xmovavg, xmovrms, etc. */
xmovfun(s, funname, fun, xdur, ramp = 1, dof = nan, flag1 = "", flag2 = "", flag3 = "")
{
        local n, y;

        /* hurdles */
        if (argc < 3)
        {
                if (argc < 2)
                {
                        error(sprintf("%s - series and X duration required", funname));
                }
                
                ramp = 1;
        }

        if (xdur < 0) error(sprintf("%s - xdur must be > %g", funname, 0.0));

        if (isstring(dof))
        {
                if (isstring(flag1) && strlen(flag1) == 0)
                {
                        flag1 = dof;
                }
                else if (isstring(flag2) && strlen(flag2) == 0)
                {
                        flag2 = dof;
                }
                else if (isstring(flag3) && strlen(flag3) == 0)
                {
                        flag3 = dof;
                }

                dof = nan;
        }

        if (isstring(ramp))
        {
                if (isstring(flag1) && strlen(flag1) == 0)
                {
                        flag1 = ramp;
                }
                else if (isstring(flag2) && strlen(flag2) == 0)
                {
                        flag2 = ramp;
                }
                else if (isstring(flag3) && strlen(flag3) == 0)
                {
                        flag3 = ramp;
                }

                ramp = 1;
        }


        /* convert interval to number of samples */
        n = xtoidx(s, xdur, 0);

        /* moving fun calculation */
        if (isnavalue(ramp))
        {
                /* skip ramp flag */
                if (isnavalue(dof))
                {
                        /* skip dof */
                        y = feval(fun, s, n, flag1, flag2, flag3);
                }
                else
                {
                        y = feval(fun, s, n, dof, flag1, flag2, flag3);
                }
        }
        else if (isnavalue(dof))
        {
                /* skip dof */
                y = feval(fun, s, n, ramp, flag1, flag2, flag3);
        }
        else
        {
                y = feval(fun, s, n, ramp, dof, flag1, flag2, flag3);
        }

        return(y);
}