Statistics
| Branch: | Tag: | Revision:

root / gnuradio-core / src / lib / filter / gr_interp_fir_filter_XXX.cc.t @ 0b5f6611

History | View | Annotate | Download (3.7 kB)

1 5d69a524 jcorgan
/* -*- c++ -*- */
2 5d69a524 jcorgan
/*
3 0a9b999b Eric Blossom
 * Copyright 2004,2010 Free Software Foundation, Inc.
4 5d69a524 jcorgan
 * 
5 5d69a524 jcorgan
 * This file is part of GNU Radio
6 5d69a524 jcorgan
 * 
7 5d69a524 jcorgan
 * GNU Radio is free software; you can redistribute it and/or modify
8 5d69a524 jcorgan
 * it under the terms of the GNU General Public License as published by
9 937b719d eb
 * the Free Software Foundation; either version 3, or (at your option)
10 5d69a524 jcorgan
 * any later version.
11 5d69a524 jcorgan
 * 
12 5d69a524 jcorgan
 * GNU Radio is distributed in the hope that it will be useful,
13 5d69a524 jcorgan
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 5d69a524 jcorgan
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 5d69a524 jcorgan
 * GNU General Public License for more details.
16 5d69a524 jcorgan
 * 
17 5d69a524 jcorgan
 * You should have received a copy of the GNU General Public License
18 5d69a524 jcorgan
 * along with GNU Radio; see the file COPYING.  If not, write to
19 86f5c924 eb
 * the Free Software Foundation, Inc., 51 Franklin Street,
20 86f5c924 eb
 * Boston, MA 02110-1301, USA.
21 5d69a524 jcorgan
 */
22 5d69a524 jcorgan
23 5d69a524 jcorgan
/*
24 5d69a524 jcorgan
 * WARNING: This file is automatically generated by generate_gr_fir_filter_XXX.py
25 5d69a524 jcorgan
 * Any changes made to this file will be overwritten.
26 5d69a524 jcorgan
 */
27 5d69a524 jcorgan
28 5d69a524 jcorgan
#ifdef HAVE_CONFIG_H
29 5d69a524 jcorgan
#include "config.h"
30 5d69a524 jcorgan
#endif
31 5d69a524 jcorgan
32 5d69a524 jcorgan
#include <@NAME@.h>
33 5d69a524 jcorgan
#include <@FIR_TYPE@.h>
34 5d69a524 jcorgan
#include <gr_fir_util.h>
35 5d69a524 jcorgan
#include <gr_io_signature.h>
36 5d69a524 jcorgan
#include <stdexcept>
37 5d69a524 jcorgan
#include <iostream>
38 5d69a524 jcorgan
39 5d69a524 jcorgan
@SPTR_NAME@ gr_make_@BASE_NAME@ (unsigned interpolation, const std::vector<@TAP_TYPE@> &taps)
40 5d69a524 jcorgan
{
41 0a9b999b Eric Blossom
  return gnuradio::get_initial_sptr (new @NAME@ (interpolation, taps));
42 5d69a524 jcorgan
}
43 5d69a524 jcorgan
44 5d69a524 jcorgan
45 5d69a524 jcorgan
@NAME@::@NAME@ (unsigned interpolation, const std::vector<@TAP_TYPE@> &taps)
46 5d69a524 jcorgan
  : gr_sync_interpolator ("@BASE_NAME@",
47 5d69a524 jcorgan
			  gr_make_io_signature (1, 1, sizeof (@I_TYPE@)),
48 5d69a524 jcorgan
			  gr_make_io_signature (1, 1, sizeof (@O_TYPE@)),
49 5d69a524 jcorgan
			  interpolation),
50 5d69a524 jcorgan
    d_updated (false), d_firs (interpolation)
51 5d69a524 jcorgan
{
52 5d69a524 jcorgan
  if (interpolation == 0)
53 5d69a524 jcorgan
    throw std::out_of_range ("interpolation must be > 0");
54 5d69a524 jcorgan
55 5d69a524 jcorgan
  std::vector<@TAP_TYPE@>	dummy_taps;
56 5d69a524 jcorgan
  
57 5d69a524 jcorgan
  for (unsigned i = 0; i < interpolation; i++)
58 5d69a524 jcorgan
    d_firs[i] = gr_fir_util::create_@FIR_TYPE@ (dummy_taps);
59 5d69a524 jcorgan
60 5d69a524 jcorgan
  set_taps (taps);
61 5d69a524 jcorgan
  install_taps(d_new_taps);
62 5d69a524 jcorgan
}
63 5d69a524 jcorgan
64 5d69a524 jcorgan
@NAME@::~@NAME@ ()
65 5d69a524 jcorgan
{
66 5d69a524 jcorgan
  int interp = interpolation ();
67 5d69a524 jcorgan
  for (int i = 0; i < interp; i++)
68 5d69a524 jcorgan
    delete d_firs[i];
69 5d69a524 jcorgan
}
70 5d69a524 jcorgan
71 5d69a524 jcorgan
void
72 5d69a524 jcorgan
@NAME@::set_taps (const std::vector<@TAP_TYPE@> &taps)
73 5d69a524 jcorgan
{
74 5d69a524 jcorgan
  d_new_taps = taps;
75 5d69a524 jcorgan
  d_updated = true;
76 5d69a524 jcorgan
77 5d69a524 jcorgan
  // round up length to a multiple of the interpolation factor
78 5d69a524 jcorgan
  int n = taps.size () % interpolation ();
79 5d69a524 jcorgan
  if (n > 0){
80 5d69a524 jcorgan
    n = interpolation () - n;
81 5d69a524 jcorgan
    while (n-- > 0)
82 5d69a524 jcorgan
      d_new_taps.insert(d_new_taps.begin(), 0);
83 5d69a524 jcorgan
  }
84 5d69a524 jcorgan
85 5d69a524 jcorgan
  assert (d_new_taps.size () % interpolation () == 0);
86 5d69a524 jcorgan
}
87 5d69a524 jcorgan
88 5d69a524 jcorgan
89 5d69a524 jcorgan
void
90 5d69a524 jcorgan
@NAME@::install_taps (const std::vector<@TAP_TYPE@> &taps)
91 5d69a524 jcorgan
{
92 5d69a524 jcorgan
  int nfilters = interpolation ();
93 5d69a524 jcorgan
  int nt = taps.size () / nfilters;
94 5d69a524 jcorgan
95 5d69a524 jcorgan
  assert (nt * nfilters == (int) taps.size ());
96 5d69a524 jcorgan
97 5d69a524 jcorgan
  std::vector< std::vector <@TAP_TYPE@> > xtaps (nfilters);
98 5d69a524 jcorgan
99 5d69a524 jcorgan
  for (int n = 0; n < nfilters; n++)
100 5d69a524 jcorgan
    xtaps[n].resize (nt);  
101 5d69a524 jcorgan
102 5d69a524 jcorgan
  for (int i = 0; i < (int) taps.size(); i++)
103 5d69a524 jcorgan
    xtaps[i % nfilters][i / nfilters] = taps[i];
104 5d69a524 jcorgan
105 5d69a524 jcorgan
  for (int n = 0; n < nfilters; n++)
106 5d69a524 jcorgan
    d_firs[n]->set_taps (xtaps[n]);
107 5d69a524 jcorgan
  
108 5d69a524 jcorgan
  set_history (nt);
109 5d69a524 jcorgan
  d_updated = false;
110 5d69a524 jcorgan
111 5d69a524 jcorgan
#if 0
112 5d69a524 jcorgan
  for (int i = 0; i < nfilters; i++){
113 5d69a524 jcorgan
    std::cout << "filter[" << i << "] = ";
114 5d69a524 jcorgan
    for (int j = 0; j < nt; j++)
115 5d69a524 jcorgan
      std::cout << xtaps[i][j] << " ";
116 5d69a524 jcorgan
117 5d69a524 jcorgan
    std::cout << "\n";
118 5d69a524 jcorgan
  }
119 5d69a524 jcorgan
#endif
120 5d69a524 jcorgan
121 5d69a524 jcorgan
}
122 5d69a524 jcorgan
123 5d69a524 jcorgan
int
124 5d69a524 jcorgan
@NAME@::work (int noutput_items,
125 5d69a524 jcorgan
		   gr_vector_const_void_star &input_items,
126 5d69a524 jcorgan
		   gr_vector_void_star &output_items)
127 5d69a524 jcorgan
{
128 5d69a524 jcorgan
  const @I_TYPE@ *in = (const @I_TYPE@ *) input_items[0];
129 5d69a524 jcorgan
  @O_TYPE@ *out = (@O_TYPE@ *) output_items[0];
130 5d69a524 jcorgan
131 5d69a524 jcorgan
  if (d_updated) {
132 5d69a524 jcorgan
    install_taps (d_new_taps);
133 5d69a524 jcorgan
    return 0;		     // history requirements may have changed.
134 5d69a524 jcorgan
  }
135 5d69a524 jcorgan
136 5d69a524 jcorgan
  int nfilters = interpolation ();
137 5d69a524 jcorgan
  int ni = noutput_items / interpolation ();
138 5d69a524 jcorgan
  
139 5d69a524 jcorgan
  for (int i = 0; i < ni; i++){
140 5d69a524 jcorgan
    for (int nf = 0; nf < nfilters; nf++)
141 5d69a524 jcorgan
      out[nf] = d_firs[nf]->filter (&in[i]);
142 5d69a524 jcorgan
    out += nfilters;
143 5d69a524 jcorgan
  }
144 5d69a524 jcorgan
145 5d69a524 jcorgan
  return noutput_items;
146 5d69a524 jcorgan
}