JASPL  0.2
Just Another Signal Processing Library
jlinearfilter.h
1 #ifndef JFILTER_H
2 #define JFILTER_H
3 
4 //Header for this file
5 //
6 //C System-Headers
7 //
8 //C++ System headers
9 #include <mutex>
10 //OpenCL Headers
11 //
12 //Boost Headers
13 //
14 //OpenMP Headers
15 #include<omp.h>
16 //Project specific headers
17 #include "../jTypeTraits/jtypetraits.h"
18 #include "../JASPL/jVector/jvector.h"
19 
20 namespace jaspl {
21 
22 class JFilter {
23  public:
24  JFilter();
25 
26 };
27 
28 template <typename T>
29 T JLinearConvolve( T& signal, T& kernel) {
30 
31  static_assert( std::is_pointer<T>::value || is_stdlib_container<T>::value, "JLinearConvolve:: signal and kernel must be pointer of container-like objects.");
32 
33  int kernel_size = kernel.size();
34  int half_k_size = (kernel_size - 1 )/2;
35 
36  int signal_size = signal.size();
37  int signal_max_index = signal_size - 1;
38 
39  T output( signal.size(), 0.0f );
40 
41  #pragma omp parallel for
42  for ( int i = 0 ; i < signal_size ; i++ ) {
43 
44  float conv_elem = 0.0f;
45 
46  int k_max = ( ( i + half_k_size ) > signal_max_index )?( signal_max_index + half_k_size - i ):(kernel_size);
47  int k_min = ( ( i - half_k_size ) < 0 )?( half_k_size - i ):(0);
48 
49  for ( int j = k_min ; j < k_max ; j++ ) {
50 
51  conv_elem += signal[ i + j - half_k_size]*kernel[ j ];
52  }
53 
54  for ( int j = 0 ; j < k_min ; j++ ) {
55 
56  conv_elem += signal[ -i - j + half_k_size ]*kernel[ j ];
57  }
58 
59  for ( int j = k_max ; j < kernel_size ; j++ ) {
60 
61  conv_elem += signal[ 2*signal_max_index - i - j + half_k_size ]*kernel[ j ];
62 
63  }
64 
65  output[i] = conv_elem;
66 
67  }
68 
69  return output;
70 }
71 
72 }
73 
74 #endif // JFILTER_H