danieleb@0: function g = lappedwindow(wLength,tailLength,tailFunc,special) danieleb@15: %LAPPEDWINDOW lapped window for lapped orthogonal transform danieleb@0: % danieleb@14: % Example danieleb@0: % g = lappedwindow(wLength,tailLength,tailFunc,special) danieleb@0: % danieleb@14: % Input: danieleb@0: % - wLength: length of the window danieleb@4: % - tailLength: (optional, default=floor(wLength/2))length of the tail of danieleb@4: % the overlapping window. danieleb@0: % danieleb@0: % ...................... danieleb@0: % |. .| danieleb@0: % . . danieleb@0: % .| |. danieleb@0: % . |---------wLength--------| . danieleb@0: % |-| danieleb@0: % tailLength danieleb@0: % danieleb@0: % The maximum tailLength cannot exceed half the window length. danieleb@4: % - tailFunc: (optional, default='sin2') either a string or a function danieleb@4: % handle used to define the tails of the overlapping windows. The default danieleb@4: % is 'sin2' (twicely differentiable sinusoidal). danieleb@0: % danieleb@14: % Output: danieleb@0: % - g: vector containing the window danieleb@0: % danieleb@14: % Reference: danieleb@0: % S. Mallat, A Wavelet Tour of Signal Processing danieleb@0: % danieleb@14: % See also lot, ilot danieleb@4: danieleb@4: % Author(s): Daniele Barchiesi danieleb@14: % Copyright 2011-2011 danieleb@0: danieleb@0: %% Check inputs danieleb@4: error(nargchk(1, 4, nargin, 'struct')); danieleb@0: if ~exist('special','var') || isempty(special), special = []; end danieleb@4: if ~exist('tailFunc','var') || isempty(tailFunc), tailFunc = 'sin2'; end danieleb@4: if ~exist('tailLength','var') || isempty(tailLength), tailLength = floor(wLength/2); end danieleb@0: danieleb@0: %check that the window is not too short danieleb@0: if wLength<2*tailLength danieleb@0: error('the window length must be at least twice as long as the tail length'); danieleb@0: end danieleb@0: danieleb@0: %manage tail function danieleb@0: if ischar(tailFunc) danieleb@0: [fname iter] = parsefunctionname(tailFunc); danieleb@0: switch lower(fname) danieleb@0: case 'sin' danieleb@0: tailFunc = @(x)sin((pi/4)*(x+1)); danieleb@0: otherwise danieleb@0: error('invalid tail function'); danieleb@0: end danieleb@0: if iter danieleb@0: for i=1:iter danieleb@0: tailFun = @(x)tailFun(sin(pi*x/2)); danieleb@0: end danieleb@0: end danieleb@0: else %if a function handler, check that it corresponds to a valid tail. danieleb@0: t = linspace(-1,1,1000); danieleb@0: test = norm((tailFunc(t).^2)+(tailFunc(fliplr(t)).^2)-ones(1,length(t))); danieleb@0: if test>1e-8 danieleb@0: error('invalid tail function'); danieleb@0: end danieleb@0: end danieleb@0: danieleb@0: %% construct the window danieleb@0: if ~isempty(special) danieleb@0: g = ones(wLength+tailLength,1); danieleb@0: g(1:2*tailLength) = tailFunc((-tailLength+0.5:tailLength-0.5)'/tailLength); danieleb@0: if strcmpi(special,'first') danieleb@0: g = flipud(g); danieleb@0: end danieleb@0: else danieleb@0: g = ones(wLength+2*tailLength,1); danieleb@0: g(1:2*tailLength) = tailFunc((-tailLength+0.5:tailLength-0.5)'/tailLength); danieleb@0: g(wLength+1:wLength+2*tailLength) = ... danieleb@0: flipud(tailFunc((-tailLength+0.5:tailLength-0.5)'/tailLength)); danieleb@0: end danieleb@0: danieleb@0: function [fname iter] = parsefunctionname(tailFunc) danieleb@0: nameLen = length(tailFunc); danieleb@0: for i=1:nameLen danieleb@0: if real(str2double(tailFunc(i)))>0 danieleb@0: fname = tailFunc(1:i-1); danieleb@0: iter = uint16(str2double(tailFunc(i:end))); danieleb@0: return danieleb@0: end danieleb@0: end danieleb@0: fname = tailFunc; danieleb@0: iter = [];