diff lappedwindow.m @ 0:9c6ab153f1f2

Initial repository from previous disjointness project
author danieleb@code.soundsoftware.ac.uk
date Tue, 14 Jun 2011 14:44:20 +0100
parents
children e23a23349e31
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/lappedwindow.m	Tue Jun 14 14:44:20 2011 +0100
@@ -0,0 +1,96 @@
+function g = lappedwindow(wLength,tailLength,tailFunc,special)
+%LAPPEDWINDOW Lapped window used for lapped orthogonal transform
+%
+% g = lappedwindow(wLength,tailLength,tailFunc,special)
+%
+% returns the window g used in the lapped orthogonal transform
+%
+% INPUT:
+% - wLength: length of the window
+% - tailLength: length of the tail of the overlapping window. 
+%
+%     ......................
+%   |.                      .|
+%   .                        .
+%  .|                        |.
+% . |---------wLength--------| .
+%                            |-| 
+%                         tailLength
+%
+% The maximum tailLength cannot exceed half the window length. 
+% - tailFunc: either a string or a function handle used to define the tails
+% of the overlapping windows. The default is 'sin2' (twicely differentiable
+% sinusoidal).
+%
+% OUTPUT:
+% - g: vector containing the window
+%
+% REFERENCE:
+% S. Mallat, A Wavelet Tour of Signal Processing
+%
+% SEE ALSO
+% lappedorthobasis, lappedorthotransform
+%
+% ----------------------------------------------------------- %
+%  Daniele Barchiesi, daniele.barchiesi@eecs.qmul.ac.uk       %
+%  Centre for Digital Music, Queen Mary University of London  %
+%  Apr. 2011                                                  %
+% ----------------------------------------------------------- %
+
+%% Check inputs
+error(nargchk(2, 4, nargin, 'struct'));
+if ~exist('special','var') || isempty(special), special = []; end
+if ~exist('tailFunx','var') || isempty(tailFunc), tailFunc = 'sin2'; end
+
+%check that the window is not too short
+if wLength<2*tailLength
+    error('the window length must be at least twice as long as the tail length');
+end
+
+%manage tail function
+if ischar(tailFunc)
+    [fname iter] = parsefunctionname(tailFunc);
+    switch lower(fname)
+        case 'sin'
+            tailFunc = @(x)sin((pi/4)*(x+1));
+        otherwise
+            error('invalid tail function');
+    end
+    if iter
+        for i=1:iter
+            tailFun = @(x)tailFun(sin(pi*x/2));
+        end
+    end
+else %if a function handler, check that it corresponds to a valid tail.
+    t = linspace(-1,1,1000);
+    test = norm((tailFunc(t).^2)+(tailFunc(fliplr(t)).^2)-ones(1,length(t)));
+    if test>1e-8
+        error('invalid tail function');
+    end
+end
+
+%% construct the window
+if ~isempty(special)
+    g = ones(wLength+tailLength,1);
+    g(1:2*tailLength) = tailFunc((-tailLength+0.5:tailLength-0.5)'/tailLength);
+    if strcmpi(special,'first')
+        g = flipud(g);
+    end
+else
+    g = ones(wLength+2*tailLength,1);
+    g(1:2*tailLength) = tailFunc((-tailLength+0.5:tailLength-0.5)'/tailLength);
+    g(wLength+1:wLength+2*tailLength) = ...
+        flipud(tailFunc((-tailLength+0.5:tailLength-0.5)'/tailLength));
+end
+
+function [fname iter] = parsefunctionname(tailFunc)
+nameLen = length(tailFunc);
+for i=1:nameLen
+    if real(str2double(tailFunc(i)))>0
+        fname = tailFunc(1:i-1);
+        iter = uint16(str2double(tailFunc(i:end)));
+        return
+    end
+end
+fname = tailFunc;
+iter = [];
\ No newline at end of file