H =
A relatively straightforward presentation stats with (for a fourth-order prototype lowpass filter) --

where
is a normalising constant and --

and then do a lowpass-to bandpass transformation --
where
and
are the high and low corner frequencies, resspectively.
Coding it --
syms K_0 s t
lpf = 20;
hpf = 450;
omega_L = 2*pi*lpf
omega_H = 2*pi*hpf
sbp = @(s) (s^2 + omega_H/omega_L) / (s*(omega_H - omega_L))
n = 4;
sexp = @(k,n) exp((1j*pi/2)*(1+(2*k*1)/n))
for k = 1:n
st(k) = s - sexp(k,n);
end
H = vpa(expand(1/prod(st)), 7)
[n,d] = numden(H)
H = vpa(simplify(expand(subs(H,s,sbp(s))), 500), 7)
figure
fplot(abs(H), [1, 500])
grid
set(gca, XScale='log', YScale='log') % The 'mag2db' function doesn't work here for some reason
h = vpa(simplify(ilaplace(H, s, t), 500), 4)
Using the Signal Processing Toolbox --
[b,a] = butter(4, [lpf, hpf]/500, 'bandpass');
figure
freqs(b, a, 2^16)
I doubt that you will get the bandpass result you want with a 4th order Butterworth design.
To use this with a sampled signal, you would then need to use the bilinear transform.
I would use an elliptic filter, such as that designed by the bandpass function with the 'iir' option --
Fs = 1000;
L = 1;
t = linspace(0, Fs*L, Fs*L+1)/Fs;
s = randn(size(t));
[sf,df] = bandpass(s, [lpf, hpf], Fs, ImpulseResponse='iir');
df
figure
freqz(df, 2^16, Fs)
% sgtitle('Efficient Elliptic Filter Designed By the ''bandpass'' Function')
If you are doing biomedical signal processing, you really need to get the Signal Processing Toolbox.
.






