View Raw SPL
/* design FIR low pass filter using Kaiser Window */
firlp(r, fp, fs, att)
{
local lp;
lp = ksinc(r, fp, fs, att);
setxoffset(lp, kwoffset(length(lp), r));
return(lp);
}
/* Kaiser sinx/x - ideal sinc multiplied by a Kaiser window */
ksinc(r, fp, fs, att)
{
local sx;
sx = (2 * kwfc(fp, fs) / r) * gwsinc(kwm(r, fp, fs, att), 1 / r, kwfc(fp, fs)) * gkaiser(kwm(r, fp, fs, att), 1 / r, kwbeta(att));
return(sx);
}
/* generate windowed sinx/x */
gwsinc(l, d, fc)
{
return(gsinc(l, d, fc*2*pi, -fc*pi*d*(l - 1)));
}
/* Kaiser filter length */
kwm(r, fp, fs, att)
{
local l;
l = floor(r * (2 + ((att) - 8)) / (2.285 * abs((fp) - (fs)) * 2 * pi));
if (l % 2 == 0) l++;
return(l);
}
/* Beta for Kaiser window */
kwbeta(att)
{
local beta;
if (att > 50)
{
beta = 0.1102 * (att - 8.7);
}
else if (att >= 21)
{
beta = 0.5842 * (att - 21) ^ 0.4 + 0.07886 * (att - 21);
}
else
{
beta = 0.0;
}
return(beta);
}
/* cutoff or center frequency */
kwfc(fp, fs)
{
return((abs((fp + fs) / 2)));
}
/* time offset of filter */
kwoffset(l, r)
{
return((1 - l) / (2*r));
}