poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_fft_ifft.c
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/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
26EXPORT double* reim_ifft_precomp_get_buffer(const REIM_IFFT_PRECOMP* tables, uint32_t buffer_index) {
27 return (double*)((uint8_t*)tables->aligned_buffers + buffer_index * tables->buf_size);
28}
29
30EXPORT double* reim_fft_precomp_get_buffer(const REIM_FFT_PRECOMP* tables, uint32_t buffer_index) {
31 return (double*)((uint8_t*)tables->aligned_buffers + buffer_index * tables->buf_size);
32}
33
34EXPORT void reim_fft(const REIM_FFT_PRECOMP* tables, double* data) { tables->function(tables, data); }
35EXPORT void reim_ifft(const REIM_IFFT_PRECOMP* tables, double* data) { tables->function(tables, data); }