boblsturm@0: function [output, segments] = templateAdditionResynth(X, H, varargin) boblsturm@0: boblsturm@0: if(nargin > 2) boblsturm@0: win = varargin{1}; boblsturm@0: windowLength = win.Length; boblsturm@0: overlap = win.Hop; boblsturm@0: winfn = lower(win.Type); boblsturm@0: win = window(winfn, windowLength); boblsturm@0: else boblsturm@0: overlap = floor((length(X)/size(H, 2))/2); boblsturm@0: windowLength = floor(2*overlap); boblsturm@0: win = window(@hann,(windowLength)); boblsturm@0: end boblsturm@0: boblsturm@0: windowhop = windowLength - overlap; boblsturm@0: start_samples_in_corpus=[0:size(H,1)-1]*windowhop + 1; boblsturm@0: end_samples_in_corpus = start_samples_in_corpus + windowLength - 1; boblsturm@0: start_samples_in_synthesis=[0:size(H,2)-1]*windowhop + 1; boblsturm@0: end_samples_in_synthesis = start_samples_in_synthesis + windowLength - 1; boblsturm@0: boblsturm@0: waitbarHandle = waitbar(0, 'Starting Template Addition Synthesis...'); boblsturm@0: boblsturm@0: output=zeros(windowhop*(size(H,2)-1)+windowLength,1); boblsturm@0: boblsturm@0: for kk=1:size(H, 2) boblsturm@0: waitbar(kk/size(H, 2), waitbarHandle, ['Creating segments...', num2str(kk), '/', num2str(size(H, 2))]); boblsturm@0: extracted=H(:,kk); boblsturm@0: boblsturm@0: for ii=find(extracted>1e-10)' boblsturm@0: if length(X) > end_samples_in_corpus(ii) boblsturm@0: output(start_samples_in_synthesis(kk):end_samples_in_synthesis(kk)) = ... boblsturm@0: output(start_samples_in_synthesis(kk):end_samples_in_synthesis(kk)) + ... boblsturm@0: win.*( ... boblsturm@0: X(start_samples_in_corpus(ii):end_samples_in_corpus(ii))*extracted(ii)); boblsturm@0: end boblsturm@0: end boblsturm@0: end boblsturm@0: boblsturm@0: output = output'; boblsturm@0: boblsturm@0: output = output./max(max(output)); boblsturm@0: close(waitbarHandle) boblsturm@0: end