int posix_memalign(void **memptr, size_t alignment, size_t size) { if ((1 << log2_int(alignment)) != alignment) { return EINVAL; } *memptr = allocator_aligned_alloc(allocator_get_global(), alignment, size); if (!*memptr) { return ENOMEM; } return 0; }
void *aligned_alloc(size_t alignment, size_t size) { if ((1 << log2_int(alignment)) != alignment) { errno = EINVAL; return NULL; } void* ret = allocator_aligned_alloc(allocator_get_global(), alignment, size); if (!ret) { errno = ENOMEM; } return ret; }
//length of S[i] int shuffle_p(int y_num,int tag_length) { return 3*log2_int(tag_length)+2*log2_int(y_num); }
static inline int main_fft(float *rex, float *imx, int n) { int i, ip, j, k, m; int le, le2; int nd2; float si, sr, ti, tr, ui, ur; nd2 = n / 2; if (n <= 0 || rex == NULL || imx == NULL) return -1; /* Bit rev sorting * Idea from Smith Scientist and * Engineers guide to DSP * second edition */ j = nd2; for (i = 1; i < n - 1; i++) { if ( i < j) { tr = rex[j]; ti = imx[j]; rex[j] = rex[i]; imx[j] = imx[i]; rex[i] = tr; imx[i] = ti; } k = nd2; while (k <= j) { j -= k; k >>= 1; } j = j + k; } m = log2_int(n); le = 1; for (k = 1; k <= m; k++) { //Each stage le2 = le; le <<= 1; ur = 1; ui = 0; sr = cos(M_PI / le2); si = -sin(M_PI / le2); for (j = 1; j <= le2; j++) { //Each SUB DFT for (i = j - 1; i < n; i += le) { //Each butterfly ip = i + le2; //Butterfly tr = rex[ip] * ur - imx[ip] * ui; ti = rex[ip] * ui + imx[ip] * ur; rex[ip] = rex[i] - tr; imx[ip] = imx[i] - ti; rex[i] = rex[i] + tr; imx[i] = imx[i] + ti; } tr = ur; ur = tr * sr - ui * si; ui = tr * si + ui * sr; } } return 0; }