summaryrefslogtreecommitdiff
path: root/macros/cheb1ord.sci
blob: 61737a0d345840aef460f28a9758f462995d64e3 (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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
// Copyright (C) 2018 - IIT Bombay - FOSSEE
//
// 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-en.txt
// Original Source : https://octave.sourceforge.io/signal/
// Modifieded by:Sonu Sharma, RGIT Mumbai
// Organization: FOSSEE, IIT Bombay
// Email: toolbox@scilab.in
function [n, Wc] = cheb1ord(Wp, Ws, Rp, Rs)
    //Minimum filter order of a digital Chebyshev type I filter with the desired response characteristics.

    //Calling Sequence
    //n = cheb1ord(Wp, Ws, Rp, Rs)
    //[n, Wp] = cheb1ord(Wp, Ws, Rp, Rs)

    //Parameters
    //Wp: scalar or vector of length 2 (passband edge(s)), all elements must be in the range [0,1]
    //Ws: scalar or vector of length 2 (stopband edge(s)), all elements must be in the range [0,1]
    //Rp: passband ripple in dB.
    //Rs: stopband attenuation in dB.
    //n: Minimum filter order satisfying specs
    //Wp: passband edge(s)

    //Description
    //This function computes the minimum filter order of a Chebyshev type I filter with the desired response characteristics.
    //Stopband frequency ws and passband frequency wp specify the the filter frequency band edges.
    //Frequencies are normalized to the Nyquist frequency in the range [0,1].
    //Rp is measured in decibels and is the allowable passband ripple and Rs is also measured in decibels and is the minimum attenuation in the stop band.
    //If ws>wp then the filter is a low pass filter. If wp>ws, then the filter is a high pass filter.
    //If wp and ws are vectors of length 2, then the passband interval is defined by wp and the stopband interval is defined by ws.
    //If wp is contained within the lower and upper limits of ws, the filter is a band-pass filter. If ws is contained within the lower and upper limits of wp, the filter is a band-stop or band-reject filter.

    //Examples
    //[n, wp]=cheb1ord([0.25 0.3],[0.24 0.31],3,10)
    // wp  =
    //
    //    0.25    0.3
    // n  =
    //
    //    3.

    funcprot(0);
    [nargout nargin] = argn();

    if nargin ~= 4
        error("cheb1ord: invalid number of inputs");
    else
        validate_filter_bands ("cheb1ord", Wp, Ws);
    end

    T = 2;

    // returned frequency is the same as the input frequency
    Wc = Wp;

    // warp the target frequencies according to the bilinear transform
    Ws = (2/T)*tan(%pi*Ws./T);
    Wp = (2/T)*tan(%pi*Wp./T);

    if (Wp(1) < Ws(1))
        // low pass
        if (length(Wp) == 1)
            Wa = Ws/Wp;
        else
            // FIXME: Implement band reject filter type
            error ("cheb1ord: band reject is not yet implemented");
        end;
    else
        // if high pass, reverse the sense of the test
        if (length(Wp) == 1)
            Wa = Wp/Ws;
        else
            // band pass
            Wa=(Ws.^2 - Wp(1)*Wp(2))./(Ws*(Wp(1)-Wp(2)));
        end;
    end;
    Wa = min(abs(Wa));

    // compute minimum n which satisfies all band edge conditions
    stop_atten = 10^(abs(Rs)/10);
    pass_atten = 10^(abs(Rp)/10);
    n = ceil(acosh(sqrt((stop_atten-1)/(pass_atten-1)))/acosh(Wa));

endfunction