GNU Radio's MESA Package
fir_filter_lfast.h
Go to the documentation of this file.
1 /*
2  * fir_filter_lfast.h
3  *
4  * Author: ghostop14
5  */
6 
7 #ifndef INCLUDE_LFAST_FIR_FILTER_LFAST_H_
8 #define INCLUDE_LFAST_FIR_FILTER_LFAST_H_
9 
10 #include <gnuradio/gr_complex.h>
11 
12 #include <boost/thread/thread.hpp>
13 #include <volk/volk.h>
14 using namespace std;
15 
16 namespace gr {
17  namespace lfast {
18  /*
19  * Base Filter
20  */
21  template<class io_type, class tap_type>
22  class Filter {
23  protected:
24  tap_type *alignedTaps;
26  std::vector<tap_type> d_taps;
27  long numTaps;
28 
29  public:
30  Filter();
31  Filter(const std::vector<tap_type>& newTaps);
32  virtual ~Filter();
33 
34  virtual void setTaps(const std::vector<tap_type>& newTaps);
35  // For compatibility
36  inline virtual void set_taps(const std::vector<tap_type>& newTaps) { setTaps(newTaps); };
37  virtual std::vector<tap_type> getTaps() const;
38  inline virtual std::vector<tap_type> taps() const { return getTaps();};
39  inline virtual long ntaps() { return numTaps;};
40 
41  // Returns number of samples consumed / produced
42  virtual long filter(io_type *outputBuffer, const io_type *inputBuffer, long numSamples) {return 0;};
43  }; // end base filter template
44 
45  /*
46  * FIR Filter - Complex inputs, float taps
47  */
48  class FIRFilterCCF:public Filter<gr_complex,float> {
49  public:
50  FIRFilterCCF();
51  FIRFilterCCF(const std::vector<float>& newTaps);
52  virtual ~FIRFilterCCF();
53 
54  // NOTE: This routine is expecting numSamples to be an integer multiple of the number of taps
55  virtual long filterN(gr_complex *outputBuffer, const gr_complex *inputBuffer, long numSamples);
56 
57  // OutputBuffer here should be at least numSamples/decimation in length
58  virtual long filterNdec(gr_complex *outputBuffer, const gr_complex *inputBuffer, long numSamples, int decimation);
59 
60  virtual gr_complex filter(const gr_complex *inputBuffer);
61 
62  // This is for testing comparison. This function does all calculations in 1 CPU-based thread.
63  virtual long filterCPU(gr_complex *outputBuffer, const gr_complex *inputBuffer, long numSamples);
64  };
65 
66  /*
67  * FIR Filter - float inputs, float taps
68  */
69  class FIRFilterFFF:public Filter<float,float> {
70  public:
71  FIRFilterFFF();
72  FIRFilterFFF(const std::vector<float>& newTaps);
73  virtual ~FIRFilterFFF();
74 
75  // NOTE: This routine is expecting numSamples to be an integer multiple of the number of taps
76  virtual long filterN(float *outputBuffer, const float *inputBuffer, long numSamples);
77 
78  // OutputBuffer here should be at least numSamples/decimation in length
79  virtual long filterNdec(float *outputBuffer, const float *inputBuffer, long numSamples, int decimation);
80 
81  virtual gr_complex filter(const float *inputBuffer);
82 
83  // This is for testing comparison. This function does all calculations in 1 CPU-based thread.
84  virtual long filterCPU(float *outputBuffer, const float *inputBuffer, long numSamples);
85  };
86 
87  /*
88  * FIR Filter - complex inputs, complex taps
89  */
90  class FIRFilterCCC:public Filter<gr_complex,gr_complex> {
91  public:
92  FIRFilterCCC();
93  FIRFilterCCC(const std::vector<gr_complex>& newTaps);
94  virtual ~FIRFilterCCC();
95 
96  // NOTE: This routine is expecting numSamples to be an integer multiple of the number of taps
97  virtual long filterN(gr_complex *outputBuffer, const gr_complex *inputBuffer, long numSamples);
98 
99  // OutputBuffer here should be at least numSamples/decimation in length
100  virtual long filterNdec(gr_complex *outputBuffer, const gr_complex *inputBuffer, long numSamples, int decimation);
101 
102  virtual gr_complex filter(const gr_complex *inputBuffer);
103 
104  // This is for testing comparison. This function does all calculations in 1 CPU-based thread.
105  virtual long filterCPU(gr_complex *outputBuffer, const gr_complex *inputBuffer, long numSamples);
106  };
107 
108 
109  // -----------------------------------------------------------------
110  // ------ Multi-threaded filters ----------------------------------
111  // -----------------------------------------------------------------
112 
113  /*
114  * Multi-threaded base template.
115  * Provides threading and buffers
116  *
117  */
118  template<class io_type>
119  class MTBase {
120  protected:
121  const io_type *pInputBuffer;
122  io_type *pOutputBuffer;
123 
124  // Supports up to 16 threads
125  boost::thread *threads[16];
126  bool threadRunning[16];
130 
131 
132  public:
133  MTBase(int nthreads=4);
134  virtual ~MTBase();
135 
136  int numThreads() { return d_nthreads; };
137 
138  inline virtual void setDecimation(int newDecimation) { decimation = newDecimation; };
139  inline virtual int getDecimation() { return decimation; };
140  inline virtual bool decimating() { if (decimation > 1) return true; else return false; };
141 
142  virtual long calcDecimationBlockSize(long numSamples);
143 
144  // NOTE: calcDecimationIndex assumes the index is an even multiple of a decimation block size
145  // In other words, calcDecimationBlockSize was called to get an appropriate block size,
146  // then blockStartIndex is an integer multiple of that result.
147  virtual long calcDecimationIndex(long blockStartIndex);
148 
149  // NOTE: This method IS NOT thread-safe. Make sure to use a scoped_lock or be sure no threads are running
150  // before changing the number of threads.
151  virtual void setThreads(int nthreads);
152 
153  virtual bool anyThreadRunning();
154  };
155 
156  // --------------------------------------------------
157  // Multi-threaded filter, complex data, float taps
158  // --------------------------------------------------
159  class FIRFilterCCF_MT:public MTBase<gr_complex>, public FIRFilterCCF {
160  protected:
161  virtual void runThread1(long startIndex,long numSamples);
162  virtual void runThread2(long startIndex,long numSamples);
163  virtual void runThread3(long startIndex,long numSamples);
164  virtual void runThread4(long startIndex,long numSamples);
165  virtual void runThread5(long startIndex,long numSamples);
166  virtual void runThread6(long startIndex,long numSamples);
167  virtual void runThread7(long startIndex,long numSamples);
168  virtual void runThread8(long startIndex,long numSamples);
169  virtual void runThread9(long startIndex,long numSamples);
170  virtual void runThread10(long startIndex,long numSamples);
171  virtual void runThread11(long startIndex,long numSamples);
172  virtual void runThread12(long startIndex,long numSamples);
173  virtual void runThread13(long startIndex,long numSamples);
174  virtual void runThread14(long startIndex,long numSamples);
175  virtual void runThread15(long startIndex,long numSamples);
176  virtual void runThread16(long startIndex,long numSamples);
177 
178  public:
179  FIRFilterCCF_MT(int nthreads);
180  FIRFilterCCF_MT(const std::vector<float>& newTaps, int nthreads);
181  virtual ~FIRFilterCCF_MT();
182 
183  // NOTE: This routine is expecting numSamples to be an integer multiple of the number of taps
184  virtual long filterN(gr_complex *outputBuffer, const gr_complex *inputBuffer, long numSamples);
185 
186  // OutputBuffer here should be at least numSamples/decimation in length
187  virtual long filterNdec(gr_complex *outputBuffer, const gr_complex *inputBuffer, long numSamples, int decimation);
188 
189  };
190 
191  // --------------------------------------------------
192  // Multi-threaded filter, complex data, float taps
193  // --------------------------------------------------
194  class FIRFilterFFF_MT:public MTBase<float>, public FIRFilterFFF {
195  protected:
196  virtual void runThread1(long startIndex,long numSamples);
197  virtual void runThread2(long startIndex,long numSamples);
198  virtual void runThread3(long startIndex,long numSamples);
199  virtual void runThread4(long startIndex,long numSamples);
200  virtual void runThread5(long startIndex,long numSamples);
201  virtual void runThread6(long startIndex,long numSamples);
202  virtual void runThread7(long startIndex,long numSamples);
203  virtual void runThread8(long startIndex,long numSamples);
204  virtual void runThread9(long startIndex,long numSamples);
205  virtual void runThread10(long startIndex,long numSamples);
206  virtual void runThread11(long startIndex,long numSamples);
207  virtual void runThread12(long startIndex,long numSamples);
208  virtual void runThread13(long startIndex,long numSamples);
209  virtual void runThread14(long startIndex,long numSamples);
210  virtual void runThread15(long startIndex,long numSamples);
211  virtual void runThread16(long startIndex,long numSamples);
212 
213  public:
214  FIRFilterFFF_MT(int nthreads);
215  FIRFilterFFF_MT(const std::vector<float>& newTaps, int nthreads);
216  virtual ~FIRFilterFFF_MT();
217 
218  // NOTE: This routine is expecting numSamples to be an integer multiple of the number of taps
219  virtual long filterN(float *outputBuffer, const float *inputBuffer, long numSamples);
220 
221  // OutputBuffer here should be at least numSamples/decimation in length
222  virtual long filterNdec(float *outputBuffer, const float *inputBuffer, long numSamples, int decimation);
223  };
224 
225  // --------------------------------------------------
226  // Multi-threaded filter, complex data, complex taps
227  // --------------------------------------------------
228  class FIRFilterCCC_MT:public MTBase<gr_complex>, public FIRFilterCCC {
229  protected:
230  virtual void runThread1(long startIndex,long numSamples);
231  virtual void runThread2(long startIndex,long numSamples);
232  virtual void runThread3(long startIndex,long numSamples);
233  virtual void runThread4(long startIndex,long numSamples);
234  virtual void runThread5(long startIndex,long numSamples);
235  virtual void runThread6(long startIndex,long numSamples);
236  virtual void runThread7(long startIndex,long numSamples);
237  virtual void runThread8(long startIndex,long numSamples);
238  virtual void runThread9(long startIndex,long numSamples);
239  virtual void runThread10(long startIndex,long numSamples);
240  virtual void runThread11(long startIndex,long numSamples);
241  virtual void runThread12(long startIndex,long numSamples);
242  virtual void runThread13(long startIndex,long numSamples);
243  virtual void runThread14(long startIndex,long numSamples);
244  virtual void runThread15(long startIndex,long numSamples);
245  virtual void runThread16(long startIndex,long numSamples);
246 
247  public:
248  FIRFilterCCC_MT(int nthreads);
249  FIRFilterCCC_MT(const std::vector<gr_complex>& newTaps, int nthreads);
250  virtual ~FIRFilterCCC_MT();
251 
252  // NOTE: This routine is expecting numSamples to be an integer multiple of the number of taps
253  virtual long filterN(gr_complex *outputBuffer, const gr_complex *inputBuffer, long numSamples);
254 
255  // OutputBuffer here should be at least numSamples/decimation in length
256  virtual long filterNdec(gr_complex *outputBuffer, const gr_complex *inputBuffer, long numSamples, int decimation);
257  };
258  } // end lfast
259 } // end gr
260 
261 
262 
263 #endif /* INCLUDE_LFAST_FIR_FILTER_LFAST_H_ */
Definition: fir_filter_lfast.h:228
const io_type * pInputBuffer
Definition: fir_filter_lfast.h:121
int decimation
Definition: fir_filter_lfast.h:129
virtual long filter(io_type *outputBuffer, const io_type *inputBuffer, long numSamples)
Definition: fir_filter_lfast.h:42
STL namespace.
int d_nthreads
Definition: fir_filter_lfast.h:128
Definition: fir_filter_lfast.h:22
int numThreads()
Definition: fir_filter_lfast.h:136
Definition: fir_filter_lfast.h:119
Definition: fir_filter_lfast.h:159
virtual long ntaps()
Definition: fir_filter_lfast.h:39
std::vector< tap_type > d_taps
Definition: fir_filter_lfast.h:26
Definition: AutoDopplerCorrect.h:28
Definition: fir_filter_lfast.h:69
bool threadReady
Definition: fir_filter_lfast.h:127
long numTaps
Definition: fir_filter_lfast.h:27
Definition: fir_filter_lfast.h:90
io_type * pOutputBuffer
Definition: fir_filter_lfast.h:122
virtual void setDecimation(int newDecimation)
Definition: fir_filter_lfast.h:138
Definition: fir_filter_lfast.h:48
io_type * singlePointBuffer
Definition: fir_filter_lfast.h:25
Definition: fir_filter_lfast.h:194
tap_type * alignedTaps
Definition: fir_filter_lfast.h:24
virtual std::vector< tap_type > taps() const
Definition: fir_filter_lfast.h:38
virtual void set_taps(const std::vector< tap_type > &newTaps)
Definition: fir_filter_lfast.h:36
virtual bool decimating()
Definition: fir_filter_lfast.h:140
virtual int getDecimation()
Definition: fir_filter_lfast.h:139