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