Statistics
| Branch: | Tag: | Revision:

root / gnuradio-core / src / lib / filter / gri_fir_filter_with_buffer_ccf.cc @ 4a3fb7eb

History | View | Annotate | Download (2.2 kB)

1
/* -*- c++ -*- */
2
/*
3
 * Copyright 2010 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 <gri_fir_filter_with_buffer_ccf.h>
28
29
gri_fir_filter_with_buffer_ccf::gri_fir_filter_with_buffer_ccf(const std::vector<float> &taps)
30
{
31
  d_buffer = NULL;
32
  set_taps(taps);
33
}
34
35
gri_fir_filter_with_buffer_ccf::~gri_fir_filter_with_buffer_ccf()
36
{
37
  if(d_buffer != NULL)
38
    free(d_buffer);
39
}
40
41
void
42
gri_fir_filter_with_buffer_ccf::set_taps (const std::vector<float> &taps)
43
{
44
  d_taps = gr_reverse(taps);
45
  
46
  if(d_buffer != NULL) {
47
    free(d_buffer);
48
    d_buffer = NULL;
49
  }
50
  
51
  // FIXME: memalign this to 16-byte boundaries for SIMD later
52
  size_t t = sizeof(gr_complex) * 2 * d_taps.size();
53
  d_buffer = (gr_complex*)malloc(t);
54
  memset(d_buffer, 0x00, t);
55
  d_idx = 0;
56
}
57
58
gr_complex
59
gri_fir_filter_with_buffer_ccf::filter (gr_complex input)
60
{
61
  unsigned int i;
62
63
  d_buffer[d_idx] = input;
64
  d_buffer[d_idx+ntaps()] = input;
65
66
  // using the later for the case when ntaps=0;
67
  // profiling shows this doesn't make a difference
68
  //d_idx = (d_idx + 1) % ntaps();
69
  d_idx++;
70
  if(d_idx >= ntaps())
71
    d_idx = 0;
72
73
  gr_complex out = 0;
74
  for(i = 0; i < ntaps(); i++) {
75
    out +=  d_buffer[d_idx + i] * d_taps[i];
76
  }
77
  return out;
78
}
79
80
void
81
gri_fir_filter_with_buffer_ccf::filterN (gr_complex output[],
82
                 const gr_complex input[],
83
                 unsigned long n)
84
{
85
  for(unsigned long i = 0; i < n; i++) {
86
    output[i] = filter(input[i]);
87
  }
88
}