% error: [Sz, Sp, Sg] = sftrans(Sz, Sp, Sg, W, stop) % % Transform band edges of a generic lowpass filter (cutoff at W=1) % represented in splane zero-pole-gain form. W is the edge of the % target filter (or edges if band pass or band stop). Stop is true for % high pass and band stop filters or false for low pass and band pass % filters. Filter edges are specified in radians, from 0 to pi (the % nyquist frequency). % % Theory: Given a low pass filter represented by poles and zeros in the % splane, you can convert it to a low pass, high pass, band pass or % band stop by transforming each of the poles and zeros individually. % The following table summarizes the transformation: % % Transform Zero at x Pole at x % ---------------- ------------------------- ------------------------ % Low Pass zero: Fc x/C pole: Fc x/C % S -> C S/Fc gain: C/Fc gain: Fc/C % ---------------- ------------------------- ------------------------ % High Pass zero: Fc C/x pole: Fc C/x % S -> C Fc/S pole: 0 zero: 0 % gain: -x gain: -1/x % ---------------- ------------------------- ------------------------ % Band Pass zero: b � sqrt(b^2-FhFl) pole: b � sqrt(b^2-FhFl) % S^2+FhFl pole: 0 zero: 0 % S -> C -------- gain: C/(Fh-Fl) gain: (Fh-Fl)/C % S(Fh-Fl) b=x/C (Fh-Fl)/2 b=x/C (Fh-Fl)/2 % ---------------- ------------------------- ------------------------ % Band Stop zero: b � sqrt(b^2-FhFl) pole: b � sqrt(b^2-FhFl) % S(Fh-Fl) pole: �sqrt(-FhFl) zero: �sqrt(-FhFl) % S -> C -------- gain: -x gain: -1/x % S^2+FhFl b=C/x (Fh-Fl)/2 b=C/x (Fh-Fl)/2 % ---------------- ------------------------- ------------------------ % Bilinear zero: (2+xT)/(2-xT) pole: (2+xT)/(2-xT) % 2 z-1 pole: -1 zero: -1 % S -> - --- gain: (2-xT)/T gain: (2-xT)/T % T z+1 % ---------------- ------------------------- ------------------------ % % where C is the cutoff frequency of the initial lowpass filter, Fc is % the edge of the target low/high pass filter and [Fl,Fh] are the edges % of the target band pass/stop filter. With abundant tedious algebra, % you can derive the above formulae yourself by substituting the % transform for S into H(S)=S-x for a zero at x or H(S)=1/(S-x) for a % pole at x, and converting the result into the form: % % H(S)=g prod(S-Xi)/prod(S-Xj) % % The transforms are from the references. The actual pole-zero-gain % changes I derived myself. % % Please note that a pole and a zero at the same place exactly cancel. % This is significant for High Pass, Band Pass and Band Stop filters % which create numerous extra poles and zeros, most of which cancel. % Those which do not cancel have a 'fill-in' effect, extending the % shorter of the sets to have the same number of as the longer of the % sets of poles and zeros (or at least split the difference in the case % of the band pass filter). There may be other opportunistic % cancellations but I will not check for them. % % Also note that any pole on the unit circle or beyond will result in % an unstable filter. Because of cancellation, this will only happen % if the number of poles is smaller than the number of zeros and the % filter is high pass or band pass. The analytic design methods all % yield more poles than zeros, so this will not be a problem. % % References: % % Proakis & Manolakis (1992). Digital Signal Processing. New York: % Macmillan Publishing Company.