diff sequences/@data/unbuffer.m @ 0:672052bd81f8

Initial partial import.
author samer
date Wed, 19 Dec 2012 22:38:28 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sequences/@data/unbuffer.m	Wed Dec 19 22:38:28 2012 +0000
@@ -0,0 +1,68 @@
+function Y=unbuffer(X,hop)
+% UNBUFFER - Opposite of buffer using overlap and add (for sequences)
+% 
+% Usage: x=unbuffer(X,hop)
+%	X:	sequences of [[N]] frames of signal data
+%	hop:	Determines how much overlap there is between neighbouring frames
+
+
+	if isa(hop,'data')
+		Y=zipaccum(@olap2,[],{hop,X});
+	else
+		if isscalar(hop)
+			N=max(size(X));
+			ol=N-hop;
+			if ol<=hop
+				I=1:hop; J=1:ol; K=hop+1:N;
+				Y=sfndata(@olap1,zeros(ol,1),X);
+			else
+				I=1:hop; J=hop+1:ol; K=ol+1:N;
+				Y=sfndata(@olap3,zeros(ol,1),X);
+			end
+		else
+			Y=zipaccum(@olap2,[],{windowdata(repeat(hop)),X});
+		end
+	end
+
+	function [y,s1]=olap1(x,s)
+		y=x(I)';
+		y(J)=y(J)+s';
+		s1=x(K);
+	end
+
+	function [y,s1]=olap3(x,s)
+		y=(s(I)+x(I))';
+		s1=[s(J)+x(J);x(K)];
+	end
+
+	function [y,s1]=olap2(hop,x,s)
+		ls=length(s);
+		lx=length(x);
+		if lx>=hop
+			if ls>=hop
+				% NB: this will fail if ls>lx, but this shouldn't happen since ls<=lx-hop
+				y=(x(1:hop)+s(1:hop))';
+				s1=[s(hop+1:ls)+x(hop+1:ls);x(ls+1:end)];
+			else
+				y=[x(1:ls)+s;x(ls+1:hop)]';
+				s1=x(hop+1:end);
+			end
+		else
+			if ls>=hop
+				y=[s(1:lx)+x;s(lx+1:hop)]';
+				s1=s(hop+1:end);
+			else
+				y=zeros(1,hop);
+				y(1:ls)=y(1:ls)+s';
+				y(1:lx)=y(1:lx)+x';
+			end
+		end
+
+		% y=x(1:hop)';
+		% ch=min(hop,ls);
+		% J=(1:ch)';
+		% y(J)=y(J)+s(J)';
+		% s1=x(hop+1:end)+[s(ch+1:end);zeros(lx-max(hop,ls),1)];
+	end
+end
+