FFTLIB User Guide
FFTLIB_fft1dBatched_i32f_c32fc_o32fc_ci.cpp
Go to the documentation of this file.
1 /*******************************************************************************
2 **+--------------------------------------------------------------------------+**
3 **| **** |**
4 **| **** |**
5 **| ******o*** |**
6 **| ********_///_**** |**
7 **| ***** /_//_/ **** |**
8 **| ** ** (__/ **** |**
9 **| ********* |**
10 **| **** |**
11 **| *** |**
12 **| |**
13 **| Copyright (c) 2017 Texas Instruments Incorporated |**
14 **| ALL RIGHTS RESERVED |**
15 **| |**
16 **| Permission to use, copy, modify, or distribute this software, |**
17 **| whether in part or in whole, for any purpose is forbidden without |**
18 **| a signed licensing agreement and NDA from Texas Instruments |**
19 **| Incorporated (TI). |**
20 **| |**
21 **| TI makes no representation or warranties with respect to the |**
22 **| performance of this computer program, and specifically disclaims |**
23 **| any responsibility for any damages, special or consequential, |**
24 **| connected with the use of this program. |**
25 **| |**
26 **+--------------------------------------------------------------------------+**
27 *******************************************************************************/
28 
29 #include "../../../common/c71/FFTLIB_debug.h"
30 #include "../../FFTLIB_fft1dBatched_i32fc_c32fc_o32fc/FFTLIB_fft1dBatched_i32fc_c32fc_o32fc.h"
31 #include "../FFTLIB_fft1dBatched_i32f_c32fc_o32fc.h"
32 #include "FFTLIB_types.h"
33 /* #include "ti_he_impl/targ_defs.h" */
34 
35 #define SE_PARAM_BASE (0x0000)
36 #define SE0_PARAM_OFFSET (SE_PARAM_BASE)
37 #define SE1_PARAM_OFFSET (SE0_PARAM_OFFSET + SE_PARAM_SIZE)
38 #define SA0_PARAM_OFFSET (SE1_PARAM_OFFSET + SE_PARAM_SIZE)
39 #define SA1_PARAM_OFFSET (SA0_PARAM_OFFSET + SE_PARAM_SIZE)
40 #define SA2_PARAM_OFFSET (SA1_PARAM_OFFSET + SE_PARAM_SIZE)
41 #define SA3_PARAM_OFFSET (SA2_PARAM_OFFSET + SE_PARAM_SIZE)
42 
43 typedef typename c7x::cfloat_vec CV;
44 typedef typename c7x::float_vec V;
45 
48  FFTLIB_bufParams1D_t *bufParamsX,
49  FFTLIB_F32 *pW,
50  FFTLIB_bufParams1D_t *bufParamsW,
51  FFTLIB_F32 *pXFFT,
52  FFTLIB_bufParams1D_t *bufParamsXFFT,
53  FFTLIB_F32 *pSf,
54  FFTLIB_bufParams1D_t *bufParamsSf,
55  FFTLIB_F32 *pY,
56  FFTLIB_bufParams1D_t *bufParamsY,
57  uint32_t numPoints,
58  uint32_t numChannels,
59  uint8_t outmode,
60  void *pBlock)
61 {
63 
64  __SE_TEMPLATE_v1 se0_param = __gen_SE_TEMPLATE_v1();
65  __SE_TEMPLATE_v1 se1_param = __gen_SE_TEMPLATE_v1();
66  __SA_TEMPLATE_v1 sa0_param = __gen_SA_TEMPLATE_v1();
67  __SA_TEMPLATE_v1 sa1_param = __gen_SA_TEMPLATE_v1();
68  __SA_TEMPLATE_v1 sa2_param = __gen_SA_TEMPLATE_v1();
69  __SA_TEMPLATE_v1 sa3_param = __gen_SA_TEMPLATE_v1();
70 
71  FFTLIB_bufParams1D_t bufParamsX_FFT;
72 
73  bufParamsX_FFT.dim_x = numChannels * numPoints;
74  bufParamsX_FFT.data_type = FFTLIB_FLOAT32;
75 
76  FFTLIB_fft1dBatched_i32fc_c32fc_o32fc_init((FFTLIB_F32 *) pX, &bufParamsX_FFT, (FFTLIB_F32 *) pW, &bufParamsX_FFT,
77  (FFTLIB_F32 *) pXFFT, &bufParamsX_FFT, (numPoints >> 1), numChannels,
78  &((uint8_t *) pBlock)[7 * SE_PARAM_SIZE]);
79 
80  uint32_t numPointsOut = (outmode == 1) ? numPoints : (numPoints >> 1) + 1;
81  uint32_t elementCount = c7x::element_count_of<CV>::value;
82  uint32_t SEBlocks = (numPoints >> 1) / elementCount;
83 
84  /* element type is 64 bits, element count reflects type */
85  se0_param.ICNT0 = elementCount;
86  se0_param.DIM1 = elementCount;
87  se0_param.ICNT1 = SEBlocks;
88  se0_param.DIM2 = (numPoints >> 1);
89  se0_param.ICNT2 = numChannels;
90 
91  se0_param.ELETYPE = __SE_ELETYPE_32BIT_CMPLX_SWAP;
92  se0_param.VECLEN = c7x::se_veclen<CV>::value;
93  se0_param.DIMFMT = __SE_DIMFMT_3D;
94  *((__SE_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE0_PARAM_OFFSET)) = se0_param;
95 
96  se1_param.ICNT0 = elementCount;
97  se1_param.DIM1 = -elementCount;
98  se1_param.ICNT1 = SEBlocks;
99  se1_param.DIM2 = (numPoints >> 1);
100  se1_param.ICNT2 = numChannels;
101 
102  se1_param.DIR = __SE_DIR_DEC;
103  se1_param.ELETYPE = __SE_ELETYPE_32BIT_CMPLX_SWAP;
104  se1_param.VECLEN = c7x::se_veclen<CV>::value;
105  se1_param.DIMFMT = __SE_DIMFMT_3D;
106  *((__SE_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE1_PARAM_OFFSET)) = se1_param;
107 
108  /* Split Factor fetch forward */
109  sa2_param.ICNT0 = elementCount;
110  sa2_param.DIM1 = elementCount;
111  sa2_param.ICNT1 = SEBlocks;
112  sa2_param.DIM2 = 0;
113  sa2_param.ICNT2 = numChannels;
114 
115  sa2_param.VECLEN = c7x::sa_veclen<CV>::value;
116  sa2_param.DIMFMT = __SA_DIMFMT_3D;
117  *((__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SA2_PARAM_OFFSET)) = sa2_param;
118 
119  /* Split Factor fetch inverse */
120  sa3_param.ICNT0 = elementCount;
121  sa3_param.DIM1 = -elementCount;
122  sa3_param.ICNT1 = SEBlocks;
123  sa3_param.DIM2 = 0;
124  sa3_param.ICNT2 = numChannels;
125 
126  sa3_param.VECLEN = c7x::sa_veclen<CV>::value;
127  sa3_param.DIMFMT = __SA_DIMFMT_3D;
128  *((__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SA3_PARAM_OFFSET)) = sa3_param;
129 
130  sa0_param.ICNT0 = elementCount;
131  sa0_param.DIM1 = elementCount;
132  sa0_param.ICNT1 = SEBlocks;
133  sa0_param.DECDIM1 = __SA_DECDIM_DIM1;
134  sa0_param.DECDIM1_WIDTH = numPointsOut - 1;
135  sa0_param.DIM2 = (numPointsOut);
136  sa0_param.ICNT2 = numChannels;
137  sa0_param.VECLEN = c7x::sa_veclen<CV>::value;
138  sa0_param.DIMFMT = __SA_DIMFMT_3D;
139  *((__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SA0_PARAM_OFFSET)) = sa0_param;
140 
141  /* only need to store complex conjugate if full spectrum */
142  if (outmode == 1) {
143  sa1_param.ICNT0 = elementCount;
144  sa1_param.DIM1 = -elementCount;
145  sa1_param.ICNT1 = SEBlocks;
146  sa1_param.DIM2 = (numPoints);
147  sa1_param.ICNT2 = numChannels;
148  sa1_param.VECLEN = c7x::sa_veclen<CV>::value;
149  sa1_param.DIMFMT = __SA_DIMFMT_3D;
150  *((__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SA1_PARAM_OFFSET)) = sa1_param;
151  }
152 
153  else {
154  /* Nothing for half spectrum */
155  }
156 
157  return (status);
158 }
159 
162  FFTLIB_bufParams1D_t *bufParamsX,
163  FFTLIB_F32 *restrict pW,
164  FFTLIB_bufParams1D_t *bufParamsW,
165  FFTLIB_F32 *restrict pXFFT,
166  FFTLIB_bufParams1D_t *bufParamsXFFT,
167  FFTLIB_F32 *restrict pSf,
168  FFTLIB_bufParams1D_t *bufParamsSf,
169  FFTLIB_F32 *restrict pY,
170  FFTLIB_bufParams1D_t *bufParamsY,
171  uint32_t numPoints,
172  uint32_t numChannels,
173  uint8_t outmode,
174  void *pBlock)
175 {
176 
177  FFTLIB_STATUS status = FFTLIB_SUCCESS;
178 
179  FFTLIB_bufParams1D_t bufParamsX_FFT;
180 
181  bufParamsX_FFT.dim_x = numPoints * numChannels;
182  bufParamsX_FFT.data_type = FFTLIB_FLOAT32;
183 
184  FFTLIB_fft1dBatched_i32fc_c32fc_o32fc_kernel((FFTLIB_F32 *) pX, &bufParamsX_FFT, (FFTLIB_F32 *) pW, &bufParamsX_FFT,
185  (FFTLIB_F32 *) pXFFT, &bufParamsX_FFT, (numPoints >> 1), numChannels,
186  &((uint8_t *) pBlock)[7 * SE_PARAM_SIZE]);
187 
188  FFTLIB_asm(" MARK 6");
189 
190  __SE_TEMPLATE_v1 se0Params = __gen_SE_TEMPLATE_v1(); // SE parameter vector
191  __SE_TEMPLATE_v1 se1Params = __gen_SE_TEMPLATE_v1(); // SE parameter vector
192 
193  /* __SE_TEMPLATE_v1 se1ParamsLast = __gen_SE_TEMPLATE_v1 (); */
194  __SA_TEMPLATE_v1 sa0Params = __gen_SA_TEMPLATE_v1();
195 
196  __SA_TEMPLATE_v1 sa2Params = __gen_SA_TEMPLATE_v1();
197  __SA_TEMPLATE_v1 sa3Params = __gen_SA_TEMPLATE_v1();
198 
199  se0Params = *(__SE_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE0_PARAM_OFFSET);
200  se1Params = *(__SE_TEMPLATE_v1 *) ((uint8_t *) pBlock + SE1_PARAM_OFFSET);
201  sa0Params = *(__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SA0_PARAM_OFFSET);
202  sa2Params = *(__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SA2_PARAM_OFFSET);
203  sa3Params = *(__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SA3_PARAM_OFFSET);
204 
205  uint32_t elementCount = c7x::element_count_of<CV>::value;
206  uint32_t SEBlocks = (numPoints >> 1) / elementCount;
207  uint32_t numPointsOut = (outmode == 1) ? numPoints : (numPoints >> 1) + 1;
208 
209  FFTLIB_F32 *restrict pYLocal = pY;
210  FFTLIB_F32 *restrict pSfLocal = pSf;
211 
212  __SE0_OPEN(pXFFT + 2, se0Params);
213  __SE1_OPEN(pXFFT + numPoints, se1Params);
214  __SA0_OPEN(sa0Params);
215  __SA2_OPEN(sa2Params);
216  __SA3_OPEN(sa3Params);
217 
218  CV var0, var1;
219  CV temp0, temp1;
220  CV sFA, sFB;
221  CV regStore0, regStore1;
222 
223  __vpred tmp, tmpSf;
224  CV *addr, *addrSf;
225 
226 #if defined(_HOST_BUILD)
227  c7x::ulong_vec xorVec = (c7x::ulong_vec)(0x0000000080000000);
228 
229 #else
230  c7x::ulong_vec xorVec = (0x0000000080000000);
231 #endif
232 
233  uint32_t i = 0;
234  uint32_t ch = 0;
235 
236  /* Full Spectrum Outmode */
237  if (outmode == 1) {
238 
239  /* full spectrum complex conjugate store */
240  __SA_TEMPLATE_v1 sa1Params = __gen_SA_TEMPLATE_v1();
241  sa1Params = *(__SA_TEMPLATE_v1 *) ((uint8_t *) pBlock + SA1_PARAM_OFFSET);
242  __SA1_OPEN(sa1Params);
243 
244  FFTLIB_F32 *restrict pYLocalReverse = pYLocal + (2 * numPoints - (elementCount << 1));
245 
246  /* FFTLIB_asm(" MARK 8"); */
247 #pragma MUST_ITERATE(8, , 8)
248 #pragma UNROLL(8)
249  for (ch = 0; ch < numChannels; ch++) {
250  for (i = 0; i < SEBlocks; i++) {
251  var0 = c7x::strm_eng<0, CV>::get_adv();
252  var1 = c7x::strm_eng<1, CV>::get_adv();
253 
254  tmpSf = c7x::strm_agen<2, CV>::get_vpred();
255  addrSf = c7x::strm_agen<2, CV>::get_adv(pSfLocal + 2);
256  sFA = __vload_pred(tmpSf, addrSf);
257 
258  tmpSf = c7x::strm_agen<3, CV>::get_vpred();
259  addrSf = c7x::strm_agen<3, CV>::get_adv(pSf + (numPoints * 2) - (elementCount * 2) - 2);
260  sFB = __reverse(__vload_pred(tmpSf, addrSf));
261 
262  temp0 = (__complex_multiply(var0, c7x::as_cfloat_vec(sFA)));
263  temp1 = (__complex_conjugate_multiply(var1, c7x::as_cfloat_vec(sFB)));
264 
265  regStore0 = temp0 + temp1;
266  tmp = c7x::strm_agen<0, CV>::get_vpred();
267  addr = c7x::strm_agen<0, CV>::get_adv(pYLocal + 2);
268 
269  __vstore_pred(tmp, addr, regStore0);
270 
271  regStore1 = c7x::as_cfloat_vec((c7x::as_ulong_vec(regStore0)) ^ (xorVec));
272 
273  tmp = c7x::strm_agen<1, CV>::get_vpred();
274  addr = c7x::strm_agen<1, CV>::get_adv(pYLocalReverse);
275 
276  __vstore_pred(tmp, addr, (__reverse(regStore1)));
277  }
278 
279  /*********************************/
280  /* Write pY[0] and pY[numPoints] */
281  /*********************************/
282 
283  cfloat var2, temp2, temp3;
284  /* current channel row */
285  uint32_t c = numPoints * ch;
286 
287  // pY[0]
288  var2 = ((cfloat *) pXFFT)[(c >> 1) + 0];
289 
290  temp2 = __complex_multiply(var2, (((cfloat *) pSf)[0]));
291  temp3 = __complex_conjugate_multiply(var2, (((cfloat *) pSf)[numPoints - 1]));
292 
293  ((cfloat *) pY)[c + 0] = temp2 + temp3;
294 
295  // pY[numPoints]
296  pY[(c << 1) + numPoints] = pXFFT[c + 0] - pXFFT[c + 1];
297  pY[(c << 1) + numPoints + 1] = 0;
298  }
299  /* FFTLIB_asm(" MARK 9"); */
300 
301  __SA1_CLOSE();
302  }
303 
304  /* Half Spectrum Outmode */
305  else {
306 
307  /* FFTLIB_asm(" MARK 8"); */
308 #pragma MUST_ITERATE(8, , 8)
309 #pragma UNROLL(8)
310  for (ch = 0; ch < numChannels; ch++) {
311  for (i = 0; i < SEBlocks; i++) {
312  var0 = c7x::strm_eng<0, CV>::get_adv();
313  var1 = c7x::strm_eng<1, CV>::get_adv();
314 
315  tmpSf = c7x::strm_agen<2, CV>::get_vpred();
316  addrSf = c7x::strm_agen<2, CV>::get_adv(pSfLocal + 2);
317  sFA = __vload_pred(tmpSf, addrSf);
318 
319  tmpSf = c7x::strm_agen<3, CV>::get_vpred();
320  addrSf = c7x::strm_agen<3, CV>::get_adv(pSf + (numPoints * 2) - (elementCount * 2) - 2);
321  sFB = __reverse(__vload_pred(tmpSf, addrSf));
322 
323  temp0 = (__complex_multiply(var0, c7x::as_cfloat_vec(sFA)));
324  temp1 = (__complex_conjugate_multiply(var1, c7x::as_cfloat_vec(sFB)));
325 
326  regStore0 = temp0 + temp1;
327  tmp = c7x::strm_agen<0, CV>::get_vpred();
328  addr = c7x::strm_agen<0, CV>::get_adv(pYLocal + 2);
329 
330  __vstore_pred(tmp, addr, regStore0);
331  }
332 
333  /***************/
334  /* Write pY[0] */
335  /***************/
336 
337  cfloat var2, temp2, temp3;
338  /* current channel row */
339  uint32_t c = numPoints * ch;
340  uint32_t cout = numPointsOut * ch;
341 
342  // pY[0]
343  var2 = ((cfloat *) pXFFT)[(c >> 1) + 0];
344 
345  temp2 = __complex_multiply(var2, (((cfloat *) pSf)[0]));
346  temp3 = __complex_conjugate_multiply(var2, (((cfloat *) pSf)[numPoints - 1]));
347 
348  ((cfloat *) pY)[cout + 0] = temp2 + temp3;
349 
350  /***************/
351  /* Write pY[N] */
352  /***************/
353 
354  pY[(cout << 1) + numPoints] = pXFFT[c + 0] - pXFFT[c + 1];
355  pY[(cout << 1) + numPoints + 1] = 0;
356  }
357  /* FFTLIB_asm(" MARK 9"); */
358  }
359 
360  __SA0_CLOSE();
361  __SA2_CLOSE();
362  __SA3_CLOSE();
363  __SE0_CLOSE();
364  __SE1_CLOSE();
365 
366  return status;
367 }
368 
371  FFTLIB_bufParams1D_t *bufParamsX,
372  FFTLIB_F32 *pW,
373  FFTLIB_bufParams1D_t *bufParamsW,
374  FFTLIB_F32 *pY,
375  FFTLIB_bufParams1D_t *bufParamsY,
376  uint32_t numPoints,
377  uint32_t numChannels,
378  uint8_t outmode,
379  void *pBlock)
380 {
381  FFTLIB_STATUS status = FFTLIB_SUCCESS;
382 
383  if ((pX == NULL) || (pW == NULL) || (pY == NULL)) {
384  status = FFTLIB_ERR_NULL_POINTER;
385  }
386  else if (bufParamsX->dim_x != bufParamsW->dim_x || bufParamsX->dim_x != bufParamsY->dim_x) {
388  }
389  /* else if (bufParamsX->dim_x < 64 * 2) { /\* Minimum number of points is 64 */
390  /* *\/ */
391  /* printf("dim < 64\n"); */
392  /* status = FFTLIB_ERR_INVALID_DIMENSION; */
393  /* } */
394  else if ((bufParamsX->data_type != FFTLIB_FLOAT32) || (bufParamsW->data_type != FFTLIB_FLOAT32) ||
395  (bufParamsY->data_type != FFTLIB_FLOAT32)) {
396  status = FFTLIB_ERR_INVALID_TYPE;
397  }
398  else if (((uint64_t) pX) & 0xFu) { /* pX must be 16-byte aligned for a
399  */
400  status = FFTLIB_ERR_NOT_ALIGNED_PTRS_STRIDES; /* streaming engine
401  configuration */
402  }
403 
404  else if ((outmode != 0) && (outmode != 1)) {
405 
407  }
408 
409  /* 512b not supported currently */
410  else if (__C7X_VEC_SIZE_BITS__ == 512) {
411 
413  }
414 
415  else {
416  /* Check if number of pts is a power of 2 */
417  uint32_t k = 0;
418  while (k < 32) {
419  if (bufParamsX->dim_x & (1u << k)) {
420  break;
421  }
422  k++;
423  }
424  if ((1u << k) != bufParamsX->dim_x) {
426  }
427  }
428 
429  return (status);
430 }
@ FFTLIB_FLOAT32
c7x::cfloat_vec CV
FFTLIB_STATUS_NAME
The enumeration of all status codes.
Definition: FFTLIB_types.h:172
@ FFTLIB_ERR_NOT_IMPLEMENTED
Definition: FFTLIB_types.h:179
@ FFTLIB_ERR_INVALID_TYPE
Definition: FFTLIB_types.h:176
@ FFTLIB_ERR_NULL_POINTER
Definition: FFTLIB_types.h:178
@ FFTLIB_ERR_INVALID_DIMENSION
Definition: FFTLIB_types.h:177
@ FFTLIB_ERR_INVALID_OUTMODE
Definition: FFTLIB_types.h:187
@ FFTLIB_SUCCESS
Definition: FFTLIB_types.h:173
@ FFTLIB_ERR_NOT_ALIGNED_PTRS_STRIDES
Definition: FFTLIB_types.h:181
float FFTLIB_F32
Single precision floating point.
Definition: FFTLIB_types.h:169
FFTLIB_STATUS FFTLIB_fft1dBatched_i32f_c32fc_o32fc_kernel(FFTLIB_F32 *restrict pX, FFTLIB_bufParams1D_t *bufParamsX, FFTLIB_F32 *restrict pW, FFTLIB_bufParams1D_t *bufParamsW, FFTLIB_F32 *restrict pXFFT, FFTLIB_bufParams1D_t *bufParamsXFFT, FFTLIB_F32 *restrict pSf, FFTLIB_bufParams1D_t *bufParamsSf, FFTLIB_F32 *restrict pY, FFTLIB_bufParams1D_t *bufParamsY, uint32_t numPoints, uint32_t numChannels, uint8_t outmode, void *pBlock)
This function is the main kernel compute function.
FFTLIB_STATUS FFTLIB_fft1dBatched_i32f_c32fc_o32fc_init(FFTLIB_F32 *pX, FFTLIB_bufParams1D_t *bufParamsX, FFTLIB_F32 *pW, FFTLIB_bufParams1D_t *bufParamsW, FFTLIB_F32 *pXFFT, FFTLIB_bufParams1D_t *bufParamsXFFT, FFTLIB_F32 *pSf, FFTLIB_bufParams1D_t *bufParamsSf, FFTLIB_F32 *pY, FFTLIB_bufParams1D_t *bufParamsY, uint32_t numPoints, uint32_t numChannels, uint8_t outmode, void *pBlock)
This function should be called before the FFTLIB_fft1dBatched_i32f_c32fc_o32fc_kernel function is cal...
FFTLIB_STATUS FFTLIB_fft1dBatched_i32f_c32fc_o32fc_checkParams(FFTLIB_F32 *pX, FFTLIB_bufParams1D_t *bufParamsX, FFTLIB_F32 *pW, FFTLIB_bufParams1D_t *bufParamsW, FFTLIB_F32 *pY, FFTLIB_bufParams1D_t *bufParamsY, uint32_t numPoints, uint32_t numChannels, uint8_t outmode, void *pBlock)
This function checks the validity of the parameters passed to FFTLIB_fft1dBatched_i32f_c32fc_o32fc_in...
FFTLIB_STATUS FFTLIB_fft1dBatched_i32fc_c32fc_o32fc_init(FFTLIB_F32 *pX, FFTLIB_bufParams1D_t *bufParamsX, FFTLIB_F32 *pW, FFTLIB_bufParams1D_t *bufParamsW, FFTLIB_F32 *pY, FFTLIB_bufParams1D_t *bufParamsY, uint32_t numPoints, uint32_t numChannels, void *pBlock)
This function should be called before the FFTLIB_fft1dBatched_i32fc_c32fc_o32fc_kernel function is ca...
FFTLIB_STATUS FFTLIB_fft1dBatched_i32fc_c32fc_o32fc_kernel(FFTLIB_F32 *pX, FFTLIB_bufParams1D_t *bufParamsX, FFTLIB_F32 *pW, FFTLIB_bufParams1D_t *bufParamsW, FFTLIB_F32 *pY, FFTLIB_bufParams1D_t *bufParamsY, uint32_t numPoints, uint32_t numChannels, void *pBlock)
This function is the main kernel compute function.
A structure for a 1 dimensional buffer descriptor.
uint32_t data_type
Values are of type FFTLIB_data_type_e.
uint32_t dim_x
Width of buffer in X dimension in elements.