Skip to content

Commit 0bd44be

Browse files
committed
signal processing methods declared
1 parent 83b62de commit 0bd44be

1 file changed

Lines changed: 264 additions & 30 deletions

File tree

src/signalprocessing.cpp

Lines changed: 264 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -40,46 +40,280 @@ using namespace v8;
4040
using namespace std;
4141
using namespace node;
4242

43-
//AFAPI array convolve (const array &signal, const array &filter, const convMode mode=AF_CONV_DEFAULT, const convDomain domain=AF_CONV_AUTO)
44-
//AFAPI array convolve (const array &col_filter, const array &row_filter, const array &signal, const convMode mode=AF_CONV_DEFAULT)
45-
//AFAPI array convolve1 (const array &signal, const array &filter, const convMode mode=AF_CONV_DEFAULT, const convDomain domain=AF_CONV_AUTO)
46-
//AFAPI array convolve2 (const array &signal, const array &filter, const convMode mode=AF_CONV_DEFAULT, const convDomain domain=AF_CONV_AUTO)
47-
//AFAPI array convolve3 (const array &signal, const array &filter, const convMode mode=AF_CONV_DEFAULT, const convDomain domain=AF_CONV_AUTO)
43+
NAN_METHOD(ConvolveSeparable)
44+
{
45+
NanScope();
46+
try
47+
{
48+
ARGS_LEN(3);
49+
auto pArray1 = ArrayWrapper::GetArrayAt(args, 0);
50+
auto pArray2 = ArrayWrapper::GetArrayAt(args, 1);
51+
auto pArray3 = ArrayWrapper::GetArrayAt(args, 2);
52+
af::convMode mode = AF_CONV_DEFAULT;
53+
if (args.Length() > 3) mode = (af::convMode)args[3]->Uint32Value();
54+
Guard();
55+
ArrayWrapper::New(af::convolve(*pArray1, *pArray2, *pArray3, mode));
56+
}
57+
ARRAYFIRE_CATCH;
58+
}
59+
60+
#define ARRAYFIRE_CONVOLVE(F, f)\
61+
NAN_METHOD(F)\
62+
{\
63+
NanScope();\
64+
try\
65+
{\
66+
ARGS_LEN(2);\
67+
auto pArray1 = ArrayWrapper::GetArrayAt(args, 0);\
68+
auto pArray2 = ArrayWrapper::GetArrayAt(args, 1);\
69+
af::convMode mode = AF_CONV_DEFAULT;\
70+
af::convDomain domain = AF_CONV_AUTO;\
71+
if (args.Length() > 2) mode = (af::convMode)args[2]->Uint32Value();\
72+
if (args.Length() > 3) domain = (af::convDomain)args[3]->Uint32Value();\
73+
Guard();\
74+
ArrayWrapper::New(af::f(*pArray1, *pArray2, mode, domain));\
75+
}\
76+
ARRAYFIRE_CATCH;\
77+
}
78+
79+
ARRAYFIRE_CONVOLVE(Convolve, convolve)
80+
ARRAYFIRE_CONVOLVE(Convolve1, convolve1)
81+
ARRAYFIRE_CONVOLVE(Convolve2, convolve2)
82+
ARRAYFIRE_CONVOLVE(Convolve3, convolve3)
83+
84+
#undef ARRAYFIRE_CONVOLVE
85+
#define ARRAYFIRE_CONVOLVE(F, f)\
86+
NAN_METHOD(F)\
87+
{\
88+
NanScope();\
89+
try\
90+
{\
91+
ARGS_LEN(2);\
92+
auto pArray1 = ArrayWrapper::GetArrayAt(args, 0);\
93+
auto pArray2 = ArrayWrapper::GetArrayAt(args, 1);\
94+
af::convMode mode = AF_CONV_DEFAULT;\
95+
if (args.Length() > 2) mode = (af::convMode)args[2]->Uint32Value();\
96+
Guard();\
97+
ArrayWrapper::New(af::f(*pArray1, *pArray2, mode));\
98+
}\
99+
ARRAYFIRE_CATCH;\
100+
}
48101

49-
//AFAPI array fftConvolve (const array &signal, const array &filter, const convMode mode=AF_CONV_DEFAULT)
50-
//AFAPI array fftConvolve2 (const array &signal, const array &filter, const convMode mode=AF_CONV_DEFAULT)
51-
//AFAPI array fftConvolve3 (const array &signal, const array &filter, const convMode mode=AF_CONV_DEFAULT)
102+
ARRAYFIRE_CONVOLVE(FFTConvolve, fftConvolve)
103+
ARRAYFIRE_CONVOLVE(FFTConvolve2, fftConvolve2)
104+
ARRAYFIRE_CONVOLVE(FFTConvolve3, fftConvolve3)
105+
#undef ARRAYFIRE_CONVOLVE
52106

53-
//AFAPI array fftNorm (const array &in, const double norm_factor, const dim_t odim0=0)
54-
//AFAPI array fft (const array &in, const dim_t odim0=0)
55-
//AFAPI array dft (const array &in, const double norm_factor, const dim4 outDims)
56-
//AFAPI array dft (const array &in, const dim4 outDims)
57-
//AFAPI array dft (const array &in)
58-
//AFAPI array idft (const array &in, const double norm_factor, const dim4 outDims)
59-
//AFAPI array idft (const array &in, const dim4 outDims)
60-
//AFAPI array idft (const array &in)
107+
#define ARRAY_FIRE_FFTNORM(F, f)\
108+
NAN_METHOD(F)\
109+
{\
110+
NanScope();\
111+
try\
112+
{\
113+
ARGS_LEN(2);\
114+
auto pArray = ArrayWrapper::GetArrayAt(args, 0);\
115+
double factor = args[1]->NumberValue();\
116+
dim_t odim0 = 0;\
117+
if (args.Length() > 2) odim0 = args[2]->Uint32Value();\
118+
Guard();\
119+
ArrayWrapper::New(af::f(*pArray, factor, odim0));\
120+
}\
121+
ARRAYFIRE_CATCH;\
122+
}
61123

62-
//AFAPI array fft2Norm (const array &in, const double norm_factor, const dim_t odim0=0, const dim_t odim1=0)
63-
//AFAPI array fft2 (const array &in, const dim_t odim0=0, const dim_t odim1=0)
124+
ARRAY_FIRE_FFTNORM(FFTNorm, fftNorm)
125+
ARRAY_FIRE_FFTNORM(IFFTNorm, ifftNorm)
126+
#undef ARRAY_FIRE_FFTNORM
64127

65-
//AFAPI array fft3Norm (const array &in, const double norm_factor, const dim_t odim0=0, const dim_t odim1=0, const dim_t odim2=0)
66-
//AFAPI array fft3 (const array &in, const dim_t odim0=0, const dim_t odim1=0, const dim_t odim2=0)
128+
#define ARRAY_FIRE_FFT(F, f)\
129+
NAN_METHOD(F)\
130+
{\
131+
NanScope();\
132+
try\
133+
{\
134+
ARGS_LEN(2);\
135+
auto pArray = ArrayWrapper::GetArrayAt(args, 0);\
136+
dim_t odim0 = 0;\
137+
if (args.Length() > 1) odim0 = args[1]->Uint32Value();\
138+
Guard();\
139+
ArrayWrapper::New(af::f(*pArray, odim0));\
140+
}\
141+
ARRAYFIRE_CATCH;\
142+
}
67143

68-
//AFAPI array ifftNorm (const array &in, const double norm_factor, const dim_t odim0=0)
69-
//AFAPI array ifft (const array &in, const dim_t odim0=0)
144+
ARRAY_FIRE_FFT(FFT, fft)
145+
ARRAY_FIRE_FFT(IFFT, ifft)
146+
#undef ARRAY_FIRE_FFT
70147

71-
//AFAPI array ifft2Norm (const array &in, const double norm_factor, const dim_t odim0=0, const dim_t odim1=0)
72-
//AFAPI array ifft2 (const array &in, const dim_t odim0=0, const dim_t odim1=0)
148+
#define ARRAYFIRE_DFT(F, f)\
149+
NAN_METHOD(F)\
150+
{\
151+
NanScope();\
152+
try\
153+
{\
154+
ARGS_LEN(1);\
155+
auto pArray = ArrayWrapper::GetArrayAt(args, 0);\
156+
if (args.Length() == 1)\
157+
{\
158+
Guard();\
159+
ArrayWrapper::New(af::f(*pArray));\
160+
}\
161+
else if (args.Length() == 2)\
162+
{\
163+
Guard();\
164+
ArrayWrapper::New(af::f(*pArray, ToDim4(args[1])));\
165+
}\
166+
else if (args.Length() == 3)\
167+
{\
168+
Guard();\
169+
ArrayWrapper::New(af::f(*pArray, args[1]->NumberValue(), ToDim4(args[2])));\
170+
}\
171+
else \
172+
{\
173+
NAN_THROW_INVALID_NO_OF_ARGS();\
174+
}\
175+
}\
176+
ARRAYFIRE_CATCH;\
177+
}
73178

74-
//AFAPI array ifft3Norm (const array &in, const double norm_factor, const dim_t odim0=0, const dim_t odim1=0, const dim_t odim2=0)
75-
//AFAPI array ifft3 (const array &in, const dim_t odim0=0, const dim_t odim1=0, const dim_t odim2=0)
179+
ARRAYFIRE_DFT(DFT, dft)
180+
ARRAYFIRE_DFT(IDFT, idft)
181+
#undef ARRAYFIRE_DFT
76182

77-
//AFAPI array fir (const array &b, const array &x)
78-
//AFAPI array iir (const array &b, const array &a, const array &x)
183+
#define ARRAYFIRE_FFT2(F, f)\
184+
NAN_METHOD(F)\
185+
{\
186+
NanScope();\
187+
try\
188+
{\
189+
ARGS_LEN(1);\
190+
auto pArray = ArrayWrapper::GetArrayAt(args, 0);\
191+
dim_t dim0 = 0;\
192+
dim_t dim1 = 0;\
193+
if (args.Length() > 1) dim0 = args[1]->Uint32Value();\
194+
if (args.Length() > 2) dim1 = args[2]->Uint32Value();\
195+
Guard();\
196+
ArrayWrapper::New(af::f(*pArray, dim0, dim1));\
197+
}\
198+
ARRAYFIRE_CATCH;\
199+
}
200+
201+
ARRAYFIRE_FFT2(FFT2, fft2)
202+
ARRAYFIRE_FFT2(IFFT2, ifft2)
203+
#undef ARRAYFIRE_FFT2
204+
205+
#define ARRAYFIRE_FFT3(F, f)\
206+
NAN_METHOD(F)\
207+
{\
208+
NanScope();\
209+
try\
210+
{\
211+
ARGS_LEN(1);\
212+
auto pArray = ArrayWrapper::GetArrayAt(args, 0);\
213+
dim_t dim0 = 0;\
214+
dim_t dim1 = 0;\
215+
dim_t dim2 = 0;\
216+
if (args.Length() > 1) dim0 = args[1]->Uint32Value();\
217+
if (args.Length() > 2) dim1 = args[2]->Uint32Value();\
218+
if (args.Length() > 3) dim2 = args[3]->Uint32Value();\
219+
Guard();\
220+
ArrayWrapper::New(af::f(*pArray, dim0, dim1, dim2));\
221+
}\
222+
ARRAYFIRE_CATCH;\
223+
}
79224

80-
//AFAPI array approx1 (const array &in, const array &pos, const interpType method=AF_INTERP_LINEAR, const float offGrid=0.0f)
225+
ARRAYFIRE_FFT3(FFT3, fft3)
226+
ARRAYFIRE_FFT3(IFFT3, ifft3)
227+
#undef ARRAYFIRE_FFT3
81228

82-
//AFAPI array approx2 (const array &in, const array &pos0, const array &pos1, const interpType method=AF_INTERP_LINEAR, const float offGrid=0.0f)
229+
#define ARRAYFIRE_FFT2NORM(F, f)\
230+
NAN_METHOD(F)\
231+
{\
232+
NanScope();\
233+
try\
234+
{\
235+
ARGS_LEN(2);\
236+
auto pArray = ArrayWrapper::GetArrayAt(args, 0);\
237+
double factor = args[1]->NumberValue();\
238+
dim_t dim0 = 0;\
239+
dim_t dim1 = 0;\
240+
if (args.Length() > 2) dim0 = args[2]->Uint32Value();\
241+
if (args.Length() > 3) dim1 = args[3]->Uint32Value();\
242+
Guard();\
243+
ArrayWrapper::New(af::f(*pArray, factor, dim0, dim1));\
244+
}\
245+
ARRAYFIRE_CATCH;\
246+
}
247+
248+
ARRAYFIRE_FFT2NORM(FFT2Norm, fft2Norm)
249+
ARRAYFIRE_FFT2NORM(IFFT2Norm, ifft2Norm)
250+
#undef ARRAYFIRE_FFT2NORM
251+
252+
#define ARRAYFIRE_FFT3NORM(F, f)\
253+
NAN_METHOD(F)\
254+
{\
255+
NanScope();\
256+
try\
257+
{\
258+
ARGS_LEN(2);\
259+
auto pArray = ArrayWrapper::GetArrayAt(args, 0);\
260+
double factor = args[1]->NumberValue();\
261+
dim_t dim0 = 0;\
262+
dim_t dim1 = 0;\
263+
dim_t dim2 = 0;\
264+
if (args.Length() > 2) dim0 = args[2]->Uint32Value();\
265+
if (args.Length() > 3) dim1 = args[3]->Uint32Value();\
266+
if (args.Length() > 4) dim2 = args[4]->Uint32Value();\
267+
Guard();\
268+
ArrayWrapper::New(af::f(*pArray, factor, dim0, dim1, dim2));\
269+
}\
270+
ARRAYFIRE_CATCH;\
271+
}
272+
273+
ARRAYFIRE_FFT3NORM(FFT3Norm, fft3Norm)
274+
ARRAYFIRE_FFT3NORM(IFFT3Norm, ifft3Norm)
275+
#undef ARRAYFIRE_FFT3NORM
276+
277+
278+
ARRAYFIRE_SYNC_METHOD_ARR_ARR(FIR, fir)
279+
ARRAYFIRE_SYNC_METHOD_ARR_ARR_ARR(IIR, iir)
280+
281+
NAN_METHOD(Approx1)
282+
{
283+
NanScope();
284+
try
285+
{
286+
ARGS_LEN(2);
287+
auto pArray1 = ArrayWrapper::GetArrayAt(args, 0);
288+
auto pArray2 = ArrayWrapper::GetArrayAt(args, 1);
289+
af::interpType method = AF_INTERP_LINEAR;
290+
float offGrid = 0.0f;
291+
if (args.Length() > 2) method = (af::interpType)args[2]->Uint32Value();
292+
if (args.Length() > 3) offGrid = args[3]->NumberValue();
293+
Guard();
294+
ArrayWrapper::New(af::approx1(*pArray1, *pArray2, method, offGrid));
295+
}
296+
ARRAYFIRE_CATCH;
297+
}
298+
299+
NAN_METHOD(Approx2)
300+
{
301+
NanScope();
302+
try
303+
{
304+
ARGS_LEN(3);
305+
auto pArray1 = ArrayWrapper::GetArrayAt(args, 0);
306+
auto pArray2 = ArrayWrapper::GetArrayAt(args, 1);
307+
auto pArray3 = ArrayWrapper::GetArrayAt(args, 2);
308+
af::interpType method = AF_INTERP_LINEAR;
309+
float offGrid = 0.0f;
310+
if (args.Length() > 3) method = (af::interpType)args[3]->Uint32Value();
311+
if (args.Length() > 4) offGrid = args[4]->NumberValue();
312+
Guard();
313+
ArrayWrapper::New(af::approx2(*pArray1, *pArray2, *pArray3, method, offGrid));
314+
}
315+
ARRAYFIRE_CATCH;
316+
}
83317

84318
void InitSignalProcessing(v8::Handle<v8::Object> exports)
85319
{

0 commit comments

Comments
 (0)