17 #include "../jTypeTraits/jtypetraits.h" 18 #include "../JASPL/jVector/jvector.h" 29 T JLinearConvolve( T& signal, T& kernel) {
31 static_assert( std::is_pointer<T>::value ||
is_stdlib_container<T>::value,
"JLinearConvolve:: signal and kernel must be pointer of container-like objects.");
33 int kernel_size = kernel.size();
34 int half_k_size = (kernel_size - 1 )/2;
36 int signal_size = signal.size();
37 int signal_max_index = signal_size - 1;
39 T output( signal.size(), 0.0f );
41 #pragma omp parallel for 42 for (
int i = 0 ; i < signal_size ; i++ ) {
44 float conv_elem = 0.0f;
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);
49 for (
int j = k_min ; j < k_max ; j++ ) {
51 conv_elem += signal[ i + j - half_k_size]*kernel[ j ];
54 for (
int j = 0 ; j < k_min ; j++ ) {
56 conv_elem += signal[ -i - j + half_k_size ]*kernel[ j ];
59 for (
int j = k_max ; j < kernel_size ; j++ ) {
61 conv_elem += signal[ 2*signal_max_index - i - j + half_k_size ]*kernel[ j ];
65 output[i] = conv_elem;