summaryrefslogtreecommitdiff
path: root/modules/signal_processing/macros/analpf.sci
blob: 6418b850e4cbe7591fb5111ab49410654eebf46a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) INRIA - 1988 - C. Bunks
//
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution.  The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt

function [hs,pols,zers,gain]=analpf(n,fdesign,rp,omega)
    //[hs,pols,zers,gain]=analpf(n,fdesign,rp,omega)
    //Creates analog low-pass filter with cut-off frequency at omega
    //  n       :filter order (pos. integer)
    //  fdesign :filter design method
    //          :    fdesign=('butt','cheb1','cheb2','ellip')
    //  rp      :2-vector of error values for cheb1, cheb2, and
    //          :ellip filters where only rp(1) is used for
    //          :cheb1 case, only rp(2) is used for cheb2 case, and
    //          :rp(1) and rp(2) are both used for ellip case.
    //          :          0<rp(1),rp(2)<1
    //          :for cheb1 filters:  1-rp(1)<ripple<1 in passband
    //          :for cheb2 filters:  0<ripple<rp(2)   in stopband
    //          :for ellip filters:  1-rp(1)<ripple<1 in passband
    //          :                    0<ripple<rp(2)   in stopband
    //  omega   :cut-off frequency of low-pass filter in rd/s
    //  hs      :rational polynomial transfer function
    //  pols    :poles of transfer function
    //  zers    :zeros of transfer function
    //  gain    :gain of transfer function
    //
    //    hs=gain*poly(zers,'s')/poly(pols,'s')
    //
    //!


    select fdesign
    case "butt" then
        [pols,gain]=zpbutt(n,omega);
        zers=[];
        hs=gain/real(poly(pols,"s"));
    case "cheb1" then
        epsilon=sqrt(-1+1/(1-rp(1))**2);
        [pols,gain]=zpch1(n,epsilon,omega);
        zers=[];
        hs=gain/real(poly(pols,"s"));
    case "cheb2" then
        att=1/rp(2);
        [zers,pols,gain]=zpch2(n,att,omega);
        hs=gain*real(poly(zers,"s"))./real(poly(pols,"s"));
    case "ellip" then
        epsilon=sqrt(-1+1/(1-rp(1))**2);
        att=1/rp(2);
        m=find_freq(epsilon,att,n);
        omegar=omega/sqrt(m);
        [zers,pols,gain]=zpell(epsilon,att,omega,omegar);
        hs=gain*real(poly(zers,"s"))./real(poly(pols,"s"));
    else
        error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"),..
        "analpf",2,"''butt'',''cheb1'',''cheb2'',''ellip''"));
    end
    hs.dt="c";
endfunction