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