-
Notifications
You must be signed in to change notification settings - Fork 18
/
Copy pathsignal.cpp
66 lines (55 loc) · 3.17 KB
/
signal.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "jni_helper.h"
BEGIN_EXTERN_C
#define SIGNAL_FUNC(FUNC) AF_MANGLE(Signal, FUNC)
#define CONVOLVE(N) \
JNIEXPORT jlong JNICALL SIGNAL_FUNC(convolve##N)( \
JNIEnv * env, jclass clazz, jlong a, jlong b, int method) { \
af_array ret = 0; \
AF_CHECK(af_convolve##N(&ret, ARRAY(a), ARRAY(b), (af_conv_mode)method, \
AF_CONV_AUTO)); \
return JLONG(ret); \
}
CONVOLVE(1)
CONVOLVE(2)
CONVOLVE(3)
#define FFT(func, is_inv) \
JNIEXPORT jlong JNICALL SIGNAL_FUNC(func)(JNIEnv * env, jclass clazz, \
jlong a, int dim0, int method) { \
af_array ret = 0; \
double norm = 1.0; \
dim_t dims[4]; \
AF_CHECK(af_get_dims(dims + 0, dims + 1, dims + 2, dims + 3, ARRAY(a))); \
if (is_inv) norm *= dims[0]; \
AF_CHECK(af_##func(&ret, ARRAY(a), norm, dim0)); \
return JLONG(ret); \
}
FFT(fft, true)
FFT(ifft, false)
#define FFT2(func, is_inv) \
JNIEXPORT jlong JNICALL SIGNAL_FUNC(func)( \
JNIEnv * env, jclass clazz, jlong a, int dim0, int dim1, int method) { \
af_array ret = 0; \
double norm = 1.0; \
dim_t dims[4]; \
AF_CHECK(af_get_dims(dims + 0, dims + 1, dims + 2, dims + 3, ARRAY(a))); \
if (is_inv) norm *= dims[0] * dims[1]; \
AF_CHECK(af_##func(&ret, ARRAY(a), norm, dim0, dim1)); \
return JLONG(ret); \
}
FFT2(fft2, true)
FFT2(ifft2, false)
#define FFT3(func, is_inv) \
JNIEXPORT jlong JNICALL SIGNAL_FUNC(func)(JNIEnv * env, jclass clazz, \
jlong a, int dim0, int dim1, \
int dim2, int method) { \
af_array ret = 0; \
double norm = 1.0; \
dim_t dims[4]; \
AF_CHECK(af_get_dims(dims + 0, dims + 1, dims + 2, dims + 3, ARRAY(a))); \
if (is_inv) norm *= dims[0] * dims[1] * dims[2]; \
AF_CHECK(af_##func(&ret, ARRAY(a), norm, dim0, dim1, dim2)); \
return JLONG(ret); \
}
FFT3(fft3, true)
FFT3(ifft3, false)
END_EXTERN_C