Statistics
| Branch: | Tag: | Revision:

root / gnuradio-core / src / lib / filter / gr_adaptive_fir_ccf.cc @ 34af4364

History | View | Annotate | Download (2.3 kB)

1
/* -*- c++ -*- */
2
/*
3
 * Copyright 2004,2006 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
#ifdef HAVE_CONFIG_H
24
#include "config.h"
25
#endif
26
27
#include <gr_adaptive_fir_ccf.h>
28
#include <gr_io_signature.h>
29
30
gr_adaptive_fir_ccf::gr_adaptive_fir_ccf(const char *name, int decimation, const std::vector<float> &taps)
31
  : gr_sync_decimator (name,
32
                       gr_make_io_signature (1, 1, sizeof(gr_complex)),
33
                       gr_make_io_signature (1, 1, sizeof(gr_complex)),
34
                       decimation),
35
    d_updated(false)
36
{
37
  d_taps = taps;
38
  set_history(d_taps.size());
39
}
40
41
void gr_adaptive_fir_ccf::set_taps(const std::vector<float> &taps)
42
{
43
  d_new_taps = taps;
44
  d_updated = true;
45
}
46
47
int gr_adaptive_fir_ccf::work(int noutput_items,
48
                              gr_vector_const_void_star &input_items,
49
                              gr_vector_void_star &output_items)
50
{
51
  gr_complex *in = (gr_complex *)input_items[0];
52
  gr_complex *out = (gr_complex *)output_items[0];
53
54
  if (d_updated) {
55
    d_taps = d_new_taps;
56
    set_history(d_taps.size());
57
    d_updated = false;
58
    return 0;                     // history requirements may have changed.
59
  }
60
61
  int j = 0, k, l = d_taps.size();
62
  for (int i = 0; i < noutput_items; i++) {
63
    // Generic dot product of d_taps[] and in[]
64
    gr_complex sum(0.0, 0.0);
65
    for (k = 0; k < l; k++)
66
      sum += d_taps[l-k-1]*in[j+k];
67
    out[i] = sum;
68
        
69
    // Adjust taps
70
    d_error = error(sum);
71
    for (k = 0; k < l; k++) {
72
      //printf("%f ", d_taps[k]);
73
      update_tap(d_taps[l-k-1], in[j+k]);
74
    }
75
    //printf("\n");
76
    
77
    j += decimation();
78
  }
79
80
  return noutput_items;
81
}