38e62d929f86aba2ab4b738d38f5d484517eea69
[debian/gnuradio] / gr-atsc / src / lib / atsci_exp2_lp.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2002 Free Software Foundation, Inc.
4  * 
5  * This file is part of GNU Radio
6  * 
7  * GNU Radio is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3, or (at your option)
10  * any later version.
11  * 
12  * GNU Radio is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Radio; see the file COPYING.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street,
20  * Boston, MA 02110-1301, USA.
21  */
22
23 #include <atsc_consts.h>
24 #include <atsci_exp2_lp.h>
25 #include <stdexcept>
26 #include <cmath>
27 #include <iostream>
28
29 using std::vector;
30 using std::cerr;
31 using std::endl;
32
33 /*
34  * FILTER SPECIFICATION FILE
35  * FILTER TYPE:LOW PASS                       1H
36  * PASSBAND RIPPLE IN -dB            -.0100
37  * STOPBAND RIPPLE IN -dB          -66.0000
38  * PASSBAND CUTOFF FREQUENCY    5.69000     HERTZ              
39  * STOPBAND CUTOFF FREQUENCY    6.12000     HERTZ              
40  * SAMPLING FREQUENCY           21.5200     HERTZ
41  */
42 static const float atsci_exp2_lp2x[] = {
43 #include "atsci_exp2_lp2x.dat"
44 };
45
46 /*
47  * FILTER SPECIFICATION FILE
48  * FILTER TYPE:LOW PASS                       1H
49  * PASSBAND RIPPLE IN -dB            -.0100
50  * STOPBAND RIPPLE IN -dB          -66.0000
51  * PASSBAND CUTOFF FREQUENCY    5.69000     HERTZ              
52  * STOPBAND CUTOFF FREQUENCY    6.12000     HERTZ              
53  * SAMPLING FREQUENCY           20.0000     HERTZ
54  */
55 static const float atsci_exp2_lp20[] = {
56 #include "atsci_exp2_lp20.dat"
57 };
58
59
60 #define NELEM(x) (sizeof (x) / sizeof ((x)[0]))
61
62 // is A within 5% of TARGET?
63
64 static bool 
65 close_enough_p (double a, double target)
66 {
67   double delta = fabs (target * 0.05);  //  5 percent
68
69   return fabs (target - a) <= delta;
70 }
71
72 vector<float> 
73 atsci_exp2_lp::taps (double sampling_freq)
74 {
75   if (close_enough_p (sampling_freq, 20e6)){
76     return vector<float>(&atsci_exp2_lp20[0], &atsci_exp2_lp20[NELEM(atsci_exp2_lp20)]);
77   }
78   if (close_enough_p (sampling_freq, 2 * ATSC_SYMBOL_RATE)){
79     return vector<float>(&atsci_exp2_lp2x[0], &atsci_exp2_lp2x[NELEM(atsci_exp2_lp2x)]);
80   }
81   else
82     throw std::out_of_range (
83      "atsci_exp2_lp: no pre-designed filter close enough");
84 }