View Raw SPL
/* sinc interpolation */
ITERATE sincinterp(y, rate, correct, padlen, padtype)
{
        local beg, end, y1, yr, yi;

        if (argc < 5)
        {
                if (argc < 4)
                {
                        if (argc < 3)
                        {
                                if (argc < 2)
                                {
                                        if (argc < 1) error(sprintf("%s - input series required", __FUNC__));

                                        /* default to double original rate */
                                        rate = rate(y) * 2;
                                }
        
                                /* mean correction */
                                correct = 2;
                        }

                        /* 50 sample padding */
                        padlen = 50;
                }

                /* flip end points */
                padtype = 3;
        }

        if (isxy(y))
        {
                y = sincinterpxy(xvals(y), yvals(y), rate, correct, padlen, padtype);
        }
        else if (iscomplex(y))
        {
                yr = sincinterp(real(y), rate, correct, padlen, padtype);
                yi = sincinterp(imag(y), rate, correct, padlen, padtype);

                y = yr + i * yi;
        }
        else
        {
                beg    = idxtox(y, 1);
                end    = idxtox(y, length(y));

                /* for mean correction */
                padlen = min(length(y) - 1, padlen);

                if (padlen > 0)
                {
                        switch (padtype)
                        {
                                case 1:
                                        y = endflip(y, padlen);
                                        break;

                                case 2:
                                        y = zeroflip(y, padlen);
                                        break;

                                case 3:
                                        y = revflip(y, padlen);
                                        break;

                                default:
                                        break;
                        }
                }

                switch (correct)
                {
                        case 1:
                        default:
                                y1 = y[1];

                                /* demean and match first sample */
                                y = dspresample(demean(y), rate / rate(y));

                                /* correct for demean */
                                y += y1 - y[1];
                                break;

                        case 0:
                                y = dspresample(y, rate / rate(y));
                                break;

                        case 2:
                                /* demean and add original mean */
                                y = dspresample(demean(y), rate / rate(y)) + mean(y);
                                break;
                }

                if (padlen > 0 && padtype > 0 && padtype <= 3)
                {
                        y = xextract(y, beg, end);
                }
        }

        return(y);
}