bug 13694 fix
[scilab.git] / scilab / modules / signal_processing / macros / wfir.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA - 1988 - C. Bunks
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 [wft,wfm,fr]=wfir(ftype,forder,cfreq,wtype,fpar)
11     //[wft,wfm,fr]=wfir(ftype,forder,cfreq,wtype,fpar)
12     //Macro which makes linear-phase, FIR low-pass, band-pass,
13     //high-pass, and stop-band filters
14     //using the windowing technique.
15     //Works interactively if called with no arguments.
16     //  ftype  :Filter type ('lp','hp','bp','sb')
17     //  forder :Filter order (pos integer)(odd for ftype='hp' or 'sb')
18     //  cfreq  :2-vector of cutoff frequencies (0<cfreq(1),cfreq(2)<.5)
19     //         :only cfreq(1) is used when ftype='lp' or 'hp'
20     //  wtype  :Window type ('re','tr','hm','hn','kr','ch')
21     //  fpar   :2-vector of window parameters
22     //         :     Kaiser window: fpar(1)>0 fpar(2)=0
23     //         :     Chebyshev window: fpar(1)>0 fpar(2)<0 or
24     //         :                       fpar(1)<0 0<fpar(2)<.5
25     //  wft    :Time domain filter coefficients
26     //  wfm    :Frequency domain filter response on the grid fr
27     //  fr     :Frequency grid
28     //!
29     wft=[];wfm=[];fr=[]
30
31     FT=["lp","hp","bp","sb"]
32
33     [lhs,rhs]=argn(0);
34
35     if rhs<=0 then,
36         //if macro called with no arguments query user for values
37         [ok,values,exprs]=wfir_gui()
38         if ~ok then return,end
39         ftype=values.ftype
40         forder=values.forder
41         cfreq=[values.low,values.high]/values.freq_ech;
42         wtype=values.wtype
43         fpar=values.fpar
44
45         fl=values.low/values.freq_ech;
46         fh=values.high/values.freq_ech;
47     else
48         //check arguments of macro call
49         if and(ftype<>FT) then
50             error(msprintf(_("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"),"wfir",1,strcat(FT,",")))
51         end
52         if type(forder)<>1|size(forder,"*")<>1|~isreal(forder)|size(forder,"*")<>1|int(forder)<>forder|forder<1 then
53             error(msprintf(_("%s: Wrong type for input argument #%d: A positive integer expected.\n"),"wfir",2))
54         end
55         if or(ftype==["hp" "sb"]) then
56             if 2*int(forder/2)==forder then
57                 error(msprintf(_("%s:  Wrong value for input argument #%d: Must be odd.\n"),"wfir",2))
58             end
59         end
60
61         if type(cfreq)<>1|~isreal(cfreq) then
62             error(msprintf(_("%s: Wrong type for input argument #%d: A %d-by-%d real vector expected.\n"),"wfir",3,1,2))
63         end
64         if or(ftype==["hp" "lp"]) then
65             if size(cfreq,"*")==0| size(cfreq,"*")>2 then
66                 error(msprintf(_("%s: Wrong size for input argument #%d: A %d-by-%d real vector expected.\n"),"wfir",3,1,2))
67             end
68             if cfreq(1)<0|cfreq(1)>0.5 then
69                 error(msprintf(_("%s: Wrong value for input argument #%d: Must be in the interval %s.\n"),"wfir",3,"]0,0.5["))
70             end
71             fl=cfreq(1);fh=[]
72         else
73             if size(cfreq,"*")<>2 then
74                 error(msprintf(_("%s: Wrong size for input argument #%d: A %d-by-%d real vector expected.\n"),"wfir",3,1,2))
75             end
76             if or(cfreq<0|cfreq>0.5) then
77                 error(msprintf(_("%s: Wrong value for input argument #%d: Must be in the interval %s.\n"),"wfir",3,"]1,0.5["))
78             end
79             if cfreq(1)>=cfreq(2) then
80                 error(msprintf(_("%s: Elements of %dth argument must be in increasing order.\n"),"wfir",3))
81             end
82             fl=cfreq(1);
83             fh=cfreq(2);
84         end
85     end
86
87
88     //Calculate window coefficients
89
90     [win_l,cwp]=window(wtype,forder,fpar);
91     [dummy,forder]=size(win_l);
92
93     //Get forder samples of the appropriate filter type
94
95     hfilt=ffilt(ftype,forder,fl,fh);
96
97     //Multiply window with sinc function
98
99     wft=win_l.*hfilt;
100
101     //Calculate frequency response of the windowed filter
102
103     [wfm,fr]=frmag(wft,256);
104 endfunction
105