Imported Upstream version 3.0
[debian/gnuradio] / gnuradio-core / src / lib / filter / gr_filter_delay_fc.cc
1 /* -*- c++ -*- */
2 /*
3  * Copyright 2004 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 2, 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 #ifdef HAVE_CONFIG_H
24 #include "config.h"
25 #endif
26
27 #include <gr_filter_delay_fc.h>
28 #include <gr_fir_fff.h>
29 #include <gr_fir_util.h>
30
31 // public constructor
32 gr_filter_delay_fc_sptr 
33 gr_make_filter_delay_fc (const std::vector<float> &taps) 
34 {
35   return gr_filter_delay_fc_sptr (new gr_filter_delay_fc (taps));
36 }
37
38 gr_filter_delay_fc::gr_filter_delay_fc (const std::vector<float> &taps)
39   : gr_sync_block ("filter_delay_fc",
40                    gr_make_io_signature (1, 2, sizeof (float)),
41                    gr_make_io_signature (1, 1, sizeof (gr_complex)))
42 {
43   d_fir = gr_fir_util::create_gr_fir_fff (taps);
44   d_delay = d_fir->ntaps () / 2;
45   set_history (d_fir->ntaps ());
46 }
47
48 gr_filter_delay_fc::~gr_filter_delay_fc ()
49 {
50   delete d_fir;
51 }
52
53 int
54 gr_filter_delay_fc::work (int noutput_items,
55                      gr_vector_const_void_star &input_items,
56                      gr_vector_void_star &output_items)
57 {
58   float *in0  = (float *) input_items[0];
59   float *in1  = (float *) input_items[1];
60   gr_complex *out = (gr_complex *) output_items[0];
61
62   switch (input_items.size ()){
63   case 1:
64     for (int i = 0; i < noutput_items; i++)
65       out[i] = gr_complex (in0[i + d_delay], 
66                            d_fir->filter (&in0[i]));
67     break;
68
69   case 2:
70     for (int j = 0; j < noutput_items; j++)
71       out[j] = gr_complex (in0[j + d_delay],
72                            d_fir->filter (&in1[j]));
73     break;
74
75   default:
76     assert (0);
77   }
78
79   return noutput_items;
80 }