summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--macros/tripuls.sci101
1 files changed, 63 insertions, 38 deletions
diff --git a/macros/tripuls.sci b/macros/tripuls.sci
index 498160b..b4fc2fb 100644
--- a/macros/tripuls.sci
+++ b/macros/tripuls.sci
@@ -1,44 +1,69 @@
-function [y] = tripuls(t,w,skew)
-
-//This function generates a triangular pulse over the interval [-w/2,w/2] sampled at times t
-//Calling Sequence
-//[y] = tripuls(t)
-//[y] = tripuls(t,w)
-//[y] = tripuls(t,w,skew)
-//Parameters
-//t: vector of real or complex numbers
-//w: real or complex number
-//skew: real number, -1 <= s <= 1
-//Description
-//This function generates a triangular pulse which is sampled at times t over the interval [-w/2,w/2]. The value of skew lies between -1
-//and 1.
-//The value of skew represents the relative placement of the peak in the given width.
-//Examples
+function y = tripuls(t, w, skew)
+//This function generates a triangular pulse over the interval [-w/2, w/2] sampled at times t.
+//Calling Sequence:
+//y = tripuls(t)
+//y = tripuls(t, w)
+//y = tripuls(t, w, skew)
+//Parameters:
+//t: Vector of real numbers
+//w: Real number. The default value is 1.
+//skew: Real number in the interval [-1, 1], The default value is 0.
+//Description:
+//This function generates a triangular pulse which is sampled at times t over the interval [-w/2,w/2].
+//The value of skew lies between -1 and 1. The value of skew represents the relative placement of the peak in the given width.
+//Examples:
//tripuls([0, .5, .6, 1], 0.9)
//ans =
// 1 0 0 0
-//This function is being called from Octave
-
-funcprot(0);
-
-rhs = argn(2)
-
-if(rhs<1 | rhs>3)
-error("Wrong number of input arguments.")
-end
- select(rhs)
- case 1 then
- y = callOctave("tripuls",t)
- case 2 then
- y = callOctave("tripuls",t,w)
- case 3 then
- //tip = type(skew)
- //if(tip==1)
- y = callOctave("tripuls",t,w,skew)
- //else
- //error("Wrong arguments.")
- //end
- end
+
+ funcprot(0);
+ rhs= argn(2);
+ if (rhs < 1 | rhs > 3)
+ error("tripuls: wrong number of input arguments");
+ end
+
+ if (rhs == 1)
+ w = 1;
+ skew = 0;
+ else if (rhs == 2)
+ skew = 0;
+ end
+ end
+
+ if (~isreal(w) | ~isscalar(w))
+ error ("tripuls: arg2 (W) must be a real scalar");
+ end
+
+ if (~isreal(skew) | ~isscalar(skew) | skew < -1 | skew > 1)
+ error ("tripuls: arg3 (SKEW) must be a real scalar in the range [-1, 1]");
+ end
+
+ y = zeros(size(t, 'r'), size(t, 'c'));
+ peak = skew * w/2;
+
+ idx = find((t >= -w/2) & (t <= peak));
+ if (idx)
+ y(idx) = (t(idx) + w/2) / (peak + w/2);
+ end
+
+ idx = find((t > peak) & (t < w/2));
+ if (idx)
+ y(idx) = (t(idx) - w/2) / (peak - w/2);
+ end
+
endfunction
+//input validation:
+//assert_checkerror("tripuls()", "tripuls: wrong number of input arguments");
+//assert_checkerror("tripuls(1, 2, 3, 4)", "Wrong number of input arguments.");
+//assert_checkerror("tripuls(1, 2*%i)", "tripuls: arg2 (W) must be a real scalar");
+//assert_checkerror("tripuls(1, 2, 2)", "tripuls: arg3 (SKEW) must be a real scalar in the range [-1, 1]");
+//assert_checkerror("tripuls(1, 2, -2)", "tripuls: arg3 (SKEW) must be a real scalar in the range [-1, 1]");
+//tests:
+//assert_checkequal(tripuls([]), []);
+//assert_checkequal(tripuls([], 0.1), []);
+//assert_checkequal(tripuls(zeros (10, 1)), ones (10, 1));
+//assert_checkequal(tripuls(-1:1), [0, 1, 0]);
+//assert_checkequal(tripuls(-5:5, 9), [0, 1, 3, 5, 7, 9, 7, 5, 3, 1, 0] / 9);
+//assert_checkequal(tripuls(0:1/100:0.3, 0.1), tripuls([0:1/100:0.3]', 0.1)');