@@ -40,46 +40,280 @@ using namespace v8;
4040using namespace std ;
4141using 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
84318void InitSignalProcessing (v8::Handle<v8::Object> exports)
85319{
0 commit comments