samer@34: % unbuffer_nu - Non-uniform hop overlap and add samer@34: % samer@34: % unbuffer_nu :: samer@34: % seq([[1,_]]) ~'sequence of overlapping frames', samer@34: % seq(natural) ~'sequence of hop sizes' samer@34: % -> seq([[1,_]]) ~'sequence of de-overlapped frames'. samer@34: samer@34: function Y=unbuffer_nu(X,hop) samer@36: Y=zipaccum(@olap,[],hop,X); samer@34: samer@34: function [y,s1]=olap(hop,x,s) samer@34: ls=length(s); samer@34: lx=length(x); samer@34: if lx>=hop samer@34: if ls>=hop samer@34: % NB: this will fail if ls>lx, but this shouldn't happen since ls<=lx-hop samer@34: y=(x(1:hop)+s(1:hop))'; samer@34: s1=[s(hop+1:ls)+x(hop+1:ls);x(ls+1:end)]; samer@34: else samer@34: y=[x(1:ls)+s;x(ls+1:hop)]'; samer@34: s1=x(hop+1:end); samer@34: end samer@34: else samer@34: if ls>=hop samer@34: y=[s(1:lx)+x;s(lx+1:hop)]'; samer@34: s1=s(hop+1:end); samer@34: else samer@34: y=zeros(1,hop); samer@34: y(1:ls)=y(1:ls)+s'; samer@34: y(1:lx)=y(1:lx)+x'; samer@34: end samer@34: end samer@34: end samer@34: end samer@34: