summaryrefslogtreecommitdiff
path: root/macros/sftrans.sci
blob: 916d44d0e3093100ca94aeb1fc702d8fb5bb7681 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
function [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.
//Calling Sequence
//[Sz, Sp, Sg] = sftrans (Sz, Sp, Sg, W, stop)
//[Sz, Sp] = sftrans (Sz, Sp, Sg, W, stop)
//[Sz] = sftrans (Sz, Sp, Sg, W, stop)
//Parameters
//Sz: Zeros.
//Sp: Poles.
//Sg: Gain.
//W: Edge of target filter.
//stop: True for high pass and band stop filters or false for low pass and band pass filters.
//Description
//This is an Octave function.
//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)
//Examples
//[Sz, Sp, Sg] = sftrans (5, 10, 15, 20, 30)
//Sz =  4
//Sp =  2
//Sg =  7.5000

funcprot(0);
lhs = argn(1)
rhs = argn(2)
if (rhs < 5 | rhs > 5)
error("Wrong number of input arguments.")
end

select(rhs)
	
	case 5 then
		if(lhs==1)
		Sz = callOctave("sftrans",Sz, Sp, Sg, W, stop)
		elseif(lhs==2)
		[Sz, Sp] = callOctave("sftrans",Sz, Sp, Sg, W, stop)
		elseif(lhs==3)
		[Sz, Sp, Sg] = callOctave("sftrans",Sz, Sp, Sg, W, stop)
		else
		error("Wrong number of output argments.")
		end

	end
endfunction