samer@3: % unbuffer - Opposite of buffer using overlap and add (for sequences) samer@3: % samer@3: % unbuffer :: samer@3: % seq([[N]]) ~'sequence of overlapping frames', samer@3: % M:natural ~'hop size' samer@3: % -> seq([[1,M]])~'sequence of de-overlapped frames'. samer@3: % samer@3: % NB. what about windowing function? samer@3: samer@3: function Y=unbuffer(X,hop) samer@3: if isscalar(hop) samer@3: N=max(size(X)); samer@3: ol=N-hop; samer@3: if ol<=hop samer@3: I=1:hop; J=1:ol; K=hop+1:N; samer@3: Y=mapaccum(@olap1,X,zeros(ol,1)); samer@3: else samer@3: I=1:hop; J=hop+1:ol; K=ol+1:N; samer@3: Y=mapaccum(@olap3,X,zeros(ol,1)); samer@3: end samer@3: else samer@3: Y=zipaccum(@olap2,{windowdata(repeat(hop)),X},[]); samer@3: end samer@3: samer@3: function [y,s1]=olap1(x,s) samer@3: y=x(I)'; samer@3: y(J)=y(J)+s'; samer@3: s1=x(K); samer@3: end samer@3: samer@3: function [y,s1]=olap3(x,s) samer@3: y=(s(I)+x(I))'; samer@3: s1=[s(J)+x(J);x(K)]; samer@3: end samer@3: end samer@3: