| 56 | |
| 57 | template<typename T, typename accT> |
| 58 | Array<T> convolve2(Array<T> const &signal, Array<accT> const &c_filter, |
| 59 | Array<accT> const &r_filter, const bool expand) { |
| 60 | const dim4 &cfDims = c_filter.dims(); |
| 61 | const dim4 &rfDims = r_filter.dims(); |
| 62 | |
| 63 | const dim_t cfLen = cfDims.elements(); |
| 64 | const dim_t rfLen = rfDims.elements(); |
| 65 | |
| 66 | const dim4 &sDims = signal.dims(); |
| 67 | dim4 tDims = sDims; |
| 68 | dim4 oDims = sDims; |
| 69 | |
| 70 | if (expand) { |
| 71 | tDims[0] += cfLen - 1; |
| 72 | oDims[0] += cfLen - 1; |
| 73 | oDims[1] += rfLen - 1; |
| 74 | } |
| 75 | |
| 76 | Array<T> temp = createEmptyArray<T>(tDims); |
| 77 | Array<T> out = createEmptyArray<T>(oDims); |
| 78 | |
| 79 | kernel::convolve2<T, accT>(temp, signal, c_filter, 0, expand); |
| 80 | kernel::convolve2<T, accT>(out, temp, r_filter, 1, expand); |
| 81 | |
| 82 | return out; |
| 83 | } |
| 84 | |
| 85 | #define INSTANTIATE(T, accT) \ |
| 86 | template Array<T> convolve<T, accT>(Array<T> const &, Array<accT> const &, \ |