* Bug #13527 fixed - hilb did not check correctly the type of first input argument.
[scilab.git] / scilab / modules / signal_processing / macros / hilb.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA
3 //
4 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at
8 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
9
10 function xh=hilb(n,wtype,par)
11     //xh=hilb(n [,wtype [,par]])
12     //returns the first n points of the
13     //Hilbert IIR filter  centered around the origin.
14     //That is, xh=(2/(n*pi))*(sin(n*pi/2))**2.
15     //Window type and window parameters are optional.
16     // n     :Number of points in filter
17     // wtype :window type ('re','tr','hn','hm','kr','ch')
18     //       :     default wtype='re'
19     // par   :window parameter for wtype='kr' or 'ch'
20     //       :     default par=[0 0]
21     //       :see the macro window for more help
22     // xh    :Hilbert transform
23     //
24     //!
25     // References:
26     // http://ieeexplore.ieee.org/iel4/78/7823/00330385.pdf?tp=&arnumber=330385&isnumber=7823
27     //  A. Reilly, G. Frazer, and B. Boashash, "Analytic signal generation
28     //  Tips and traps,ยก IEEE Trans. Signal Processing, vol. 42,
29     //  pp.3241-3245, Nov. 1994.
30     [lhs,rhs]=argn(0);
31     if rhs==1 then,
32         wtype="re";
33         par=[0 0];
34     elseif rhs==2 then,
35         par=[0 0];
36     end,
37
38     if type(n)<>1|size(n,"*")<>1 then
39         error(msprintf(gettext("%s: Wrong size for input argument #%d: A scalar expected.\n"),"hilb",1));
40     end
41     if (n - floor(n) <> 0) | (floor(n/2) == n/2) then
42         error(msprintf(gettext("%s: Wrong type for input argument #%d: An odd integer expected.\n"),"hilb",1));
43     end
44     if and(wtype<>["re","tr","hn","hm","kr","ch"]) then
45         error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n") ,"hilb",2,"''re'',''tr'',''hn'',''hm'',''kr'',''ch''"));
46
47     end
48     no2=int(n/2)
49     if no2==n/2 then,
50         xh0=[]
51     else
52         xh0=0
53     end,
54     th=zeros(1,no2);
55     th(1:2:no2)=ones(1:2:no2)./(1:2:no2);
56     xh=[-th(no2:-1:1),xh0,th];
57     xh=2*xh/%pi;
58
59     [win_l,cwp]=window(wtype,n,par);
60     xh=xh.*win_l;
61 endfunction