Mercurial > hg > ishara
diff dsp/synth/unbuffer_nu.m @ 34:c75bb62b90a9
Imported audio synthesis tools.
author | samer |
---|---|
date | Sun, 20 Jan 2013 19:05:05 +0000 |
parents | |
children | 9e7be347b3a0 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dsp/synth/unbuffer_nu.m Sun Jan 20 19:05:05 2013 +0000 @@ -0,0 +1,35 @@ +% unbuffer_nu - Non-uniform hop overlap and add +% +% unbuffer_nu :: +% seq([[1,_]]) ~'sequence of overlapping frames', +% seq(natural) ~'sequence of hop sizes' +% -> seq([[1,_]]) ~'sequence of de-overlapped frames'. + +function Y=unbuffer_nu(X,hop) + Y=zipaccum(@olap,{hop,X},[]); + + function [y,s1]=olap(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 + end +end +