%% Copyright (C) 2021 Tony Richardson %% %% This program is free software: you can redistribute it and/or modify %% it under the terms of the GNU General Public License as published by %% the Free Software Foundation, either version 3 of the License, or %% (at your option) any later version. %% %% This program is distributed in the hope that it will be useful, %% but WITHOUT ANY WARRANTY; without even the implied warranty of %% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the %% GNU General Public License for more details. %% %% You should have received a copy of the GNU General Public License %% along with this program. If not, see . %% -*- texinfo -*- %% @deftypefn {} {@var{[bt, at]} =} lp3bs (@var{b}, @var{a}, @var{Wo}, @var{Bw}) %% @deftypefnx {}{@var{[At,Bt,Ct,Dt]} =} lp3bs (@var{A}, @var{B}, @var{C}, @var{D}, @var{Wo}, @var{Bw}) %% %% [bt, at] = lp3bs(b, a, Wo, Bw) transforms an analog lowpass filter in transfer %% function form to an analog bandstop filter with center frequency Wo and %% bandwidth Bw. %% %% [At,Bt,Ct,Dt] = lp3bs(A, B, C, D, Wo, Bw) transforms an analog lowpass filter in state %% space form to an analog bandstop filter with center frequency Wo and %% bandwidth Bw. %% %% @seealso{lp2lp, lp2hp, lp2bp} %% @end deftypefn %% Author: Tony Richardson %% Created: 2021-04-09 function [BT AT XO1 XO2] = lp3bs(BP, AP, Wo, Bw, XI1, XI2) if (nargin == 6) [BP AP] = ss2tf(BP, AP, Wo, Bw); Wo = XI1; Bw = XI2; elseif nargin!=4 print_usage; end Fl = sqrt(Wo^2 + 0.25*Bw^2)-0.5*Bw; Fu = Fl + Bw; [BT AT] = tftrans(BP, AP, [Fl Fu], true); if (nargout == 4) [BT AT XO1 XO2] = tf2ss(BT, AT); endif end %!demo %! n = 10; %! [z p k] = buttap(n); %! [b a] = zp2tf(z, p, real(k)); %! %! w = logspace(-1, 1, 501); %! H = freqs(b, a, w); %! figure(1) %! clf %! subplot(2, 1, 1) %! loglog(w, abs(H)) %! ylim([1e-15 1]); %! yticks(logspace(-15, 0, 4)) %! grid on %! subplot(2, 1, 2) %! semilogx(w, rad2deg(angle(H))) %! grid on %! %! fl = 20; fh = 60; %! Wo = 2*pi*sqrt(fl*fh); %! Bw = 2*pi*(fh - fl); %! [bt, at] = lp3bs(b, a, Wo, Bw); %! %! w = logspace(1, 3, 501); %! H = freqs(bt, at, w); %! %! figure(2) %! clf %! subplot(2, 1, 1) %! loglog(w, abs(H)) %! ylim([1e-20 1]); %! yticks(logspace(-20, 0, 3)) %! grid on %! subplot(2, 1, 2) %! semilogx(w, rad2deg(angle(H))) %! grid on