Used bilinear transfer to design a one pole one zero filter. Can be used as both Low or High shelving filer.

 

Useful Links:

http://ccrma.stanford.edu/~jos/mus423h/Discrete_Time_Peak_Shelf_Filter.html

http://ccrma.stanford.edu/~jos/filters/Low_High_Shelving_Filters.html



Transfer function derives details by Dr. Jonathon Able

Notes: Bilinear Transfer is used to map from S plane to Z plane, first calculate with Wt = pi/2, then map Wt = pi/2 to any other transient frequency using Z-plane to Z-plane.



VST Codes download: (I do not why it does not show the parameter numbers under Cubase, but it works pretty well under Soundforge 8.0)

Shelf.cpp

Shelf.hpp

Shelfmain.cpp



Matlab Prototype( by Dr. Jonathon Able):
Note that gDC, gFT and gPI are the DC, transition frequency and band edge gains, and wT is the transition frequency in radians.

if (gPI^2 + gDC^2 - 2*gFT^2 == 0),

        %% one-zero cannonical system

        alpha = 0;

else,

        %% pole needed

        lambda = (gPI^2 - gDC^2) / (gPI^2 + gDC^2 - 2*gFT^2);

        alpha = lambda - sign(lambda)*sqrt(lambda^2 - 1);

end;

beta0 = 0.5 * ((gDC + gPI) + (gDC - gPI) * alpha);

beta1 = 0.5 * ((gDC - gPI) + (gDC + gPI) * alpha);


rho = sin(wT/2 - pi/4) / sin(wT/2 + pi/4);

b = [(beta0 + rho*beta1) (beta1 + rho*beta0)] / (1 + rho*alpha);

a = [1 (rho + alpha)/(1 + rho*alpha)];


What I did was design the shelf filter with a transition frequency of pi/2, and then used the substitution z^{-1} = (\rho+\zeta^{-1})/(1+\rho*\zeta^{-1}) to warp the transition frequency to wT.