arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/spqlios/lib/spqlios/reim/reim_fft_ifft.c
spqlios/lib/spqlios/reim/reim_fft_ifft.cRaw
 1#include <math.h>
 2#include <stdint.h>
 3#include <stdlib.h>
 4#include <string.h>
 5
 6#include "../commons_private.h"
 7#include "reim_fft_internal.h"
 8#include "reim_fft_private.h"
 9
10double accurate_cos(int32_t i, int32_t n) {  // cos(2pi*i/n)
11  i = ((i % n) + n) % n;
12  if (i >= 3 * n / 4) return cos(2. * M_PI * (n - i) / (double)(n));
13  if (i >= 2 * n / 4) return -cos(2. * M_PI * (i - n / 2) / (double)(n));
14  if (i >= 1 * n / 4) return -cos(2. * M_PI * (n / 2 - i) / (double)(n));
15  return cos(2. * M_PI * (i) / (double)(n));
16}
17
18double accurate_sin(int32_t i, int32_t n) {  // sin(2pi*i/n)
19  i = ((i % n) + n) % n;
20  if (i >= 3 * n / 4) return -sin(2. * M_PI * (n - i) / (double)(n));
21  if (i >= 2 * n / 4) return -sin(2. * M_PI * (i - n / 2) / (double)(n));
22  if (i >= 1 * n / 4) return sin(2. * M_PI * (n / 2 - i) / (double)(n));
23  return sin(2. * M_PI * (i) / (double)(n));
24}
25
26
27EXPORT double* reim_ifft_precomp_get_buffer(const REIM_IFFT_PRECOMP* tables, uint32_t buffer_index) {
28  return (double*)((uint8_t*) tables->aligned_buffers + buffer_index * tables->buf_size);
29}
30
31EXPORT double* reim_fft_precomp_get_buffer(const REIM_FFT_PRECOMP* tables, uint32_t buffer_index) {
32  return (double*)((uint8_t*) tables->aligned_buffers + buffer_index * tables->buf_size);
33}
34
35
36EXPORT void reim_fft(const REIM_FFT_PRECOMP* tables, double* data) { tables->function(tables, data); }
37EXPORT void reim_ifft(const REIM_IFFT_PRECOMP* tables, double* data) { tables->function(tables, data); }