| 21 | |
| 22 | template<typename T, typename accT> |
| 23 | Array<T> convolve2(Array<T> const& signal, Array<accT> const& c_filter, |
| 24 | Array<accT> const& r_filter, const bool expand) { |
| 25 | const auto cflen = c_filter.elements(); |
| 26 | const auto rflen = r_filter.elements(); |
| 27 | |
| 28 | if ((cflen > kernel::MAX_SCONV_FILTER_LEN) || |
| 29 | (rflen > kernel::MAX_SCONV_FILTER_LEN)) { |
| 30 | // TODO call upon fft |
| 31 | char errMessage[256]; |
| 32 | snprintf(errMessage, sizeof(errMessage), |
| 33 | "\noneAPI Separable convolution doesn't support %llu(coloumn) " |
| 34 | "%llu(row) filters\n", |
| 35 | cflen, rflen); |
| 36 | ONEAPI_NOT_SUPPORTED(errMessage); |
| 37 | } |
| 38 | |
| 39 | const dim4& sDims = signal.dims(); |
| 40 | dim4 tDims = sDims; |
| 41 | dim4 oDims = sDims; |
| 42 | |
| 43 | if (expand) { |
| 44 | tDims[0] += cflen - 1; |
| 45 | oDims[0] += cflen - 1; |
| 46 | oDims[1] += rflen - 1; |
| 47 | } |
| 48 | |
| 49 | Array<T> temp = createEmptyArray<T>(tDims); |
| 50 | Array<T> out = createEmptyArray<T>(oDims); |
| 51 | |
| 52 | kernel::convSep<T, accT>(temp, signal, c_filter, 0, expand); |
| 53 | kernel::convSep<T, accT>(out, temp, r_filter, 1, expand); |
| 54 | |
| 55 | return out; |
| 56 | } |
| 57 | |
| 58 | #define INSTANTIATE(T, accT) \ |
| 59 | template Array<T> convolve2<T, accT>(Array<T> const&, Array<accT> const&, \ |