diff general/arrutils/mapwindows.m @ 4:e44f49929e56

Adding reorganised general toolbox, now in several subdirectories.
author samer
date Sat, 12 Jan 2013 19:21:22 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/general/arrutils/mapwindows.m	Sat Jan 12 19:21:22 2013 +0000
@@ -0,0 +1,51 @@
+function m=mapwindows(fn,x,L,M)
+% mapwindows - Apply function to windowed signal with causality control
+%
+% mapwindows ::
+%    F:([[N]]->[[M]]) ~'function to apply to windowed segments',
+%    [[T]]            ~'signal of length T',
+%    L:natural        ~'post-window (ie causal part)',
+%    M:natural        ~'pre-window (ie anti-causal part)'
+% -> [[M,T]]          ~'sequence of results'.
+%
+% This function applies a function to a sequence of segments extracted from
+% the given signal by sliding a window along the signal. The
+% post- and pre- window lengths determine the positioning of the window:
+%
+%    ....   x1   x2   x3   x4   x5    x6   x7   x8   x9  ...
+%         |<--- post --> | now |<----- pre ------> |
+%         \________________________________________/
+%                           |
+%                       function
+%                           |
+%               ...   y3   y4   y5 ...
+%
+% Note: the function F must make sense when applied to windows of
+% different lengths since the first and last few windows will
+% be shorter than L+M+1. The windows will not be zero padded!
+%
+% EXAMPLES
+%
+% To compute a running mean using only past values (ie causally)
+% >> Y=mapwindows(@mean,X,6,0);
+%
+% To compute a running local median
+% >> Y=mapwindows(@median,X,4,3);
+
+N=length(x);
+
+for i=1:min(L,N)
+	k=min(i+M,N);
+	MM=feval(fn,x(1:k));
+	m(:,i)=feval(fn,x(1:k));
+end
+
+if N>(L+M)
+	m=[m feval(fn,buffer(x,L+M+1,L+M,'nodelay'))];
+end
+
+for i=N+(1-M:0)
+	j=max(i-L,1);
+	m(:,i)=feval(fn,x(j:end));
+end
+