summaryrefslogtreecommitdiff
path: root/macros/bilinear.sci
diff options
context:
space:
mode:
Diffstat (limited to 'macros/bilinear.sci')
-rw-r--r--macros/bilinear.sci40
1 files changed, 40 insertions, 0 deletions
diff --git a/macros/bilinear.sci b/macros/bilinear.sci
new file mode 100644
index 0000000..387b8d0
--- /dev/null
+++ b/macros/bilinear.sci
@@ -0,0 +1,40 @@
+function [Zb, Za, Zg]= bilinear(Sb,varargin)
+// Transform a s-plane filter specification into a z-plane specification
+//Calling Sequence
+// [ZB, ZA] = bilinear (SB, SA, T)
+// [ZB, ZA] = bilinear (SZ, SP, SG, T)
+// [ZZ, ZP, ZG] = bilinear (...)
+//Description
+//Transform a s-plane filter specification into a z-plane specification. Filters can be specified in either zero-pole-gain or transfer function form. The input form does not have to match the output form. 1/T is the sampling frequency represented in the z plane.
+//
+//Note: this differs from the bilinear function in the signal processing toolbox, which uses 1/T rather than T.
+//
+//Theory: Given a piecewise flat filter design, you can transform it from the s-plane to the z-plane while maintaining the band edges by means of the bilinear transform. This maps the left hand side of the s-plane into the interior of the unit circle. The mapping is highly non-linear, so you must design your filter with band edges in the s-plane positioned at 2/T tan(w*T/2) so that they will be positioned at w after the bilinear transform is complete.
+//Examples
+//[ZB,ZA]=bilinear([1],[2,3],3)
+ funcprot(0);
+ lhs= argn(1);
+ rhs= argn(2);
+ if(rhs < 3 | rhs > 4)
+ error("Wrong number of input arguments");
+ end
+ if(lhs < 2 | lhs > 3)
+ error("Wrong number of output arguments");
+ end
+ select(rhs)
+ case 3 then
+ select(lhs)
+ case 2 then
+ [Zb, Za]= callOctave("bilinear", Sb, varargin(1), varargin(2));
+ case 3 then
+ [Zb, Za, Zg]= callOctave("bilinear", Sb, varargin(1), varargin(2));
+ end
+ case 4 then
+ select(lhs)
+ case 2 then
+ [Zb, Za]= callOctave("bilinear", Sb, varargin(1), varargin(2), varargin(3));
+ case 3 then
+ [Zb, Za, Zg]= callOctave("bilinear", Sb, varargin(1), varargin(2), varargin(3));
+ end
+ end
+endfunction \ No newline at end of file