29unsigned short reverse(
unsigned short x,
unsigned short N,
int order);
34static inline int16_t
xtfixed_bf_1(int16_t a0, int16_t a1, int16_t a2, int16_t a3, int16_t a4,
int result_shift)
37 result -= (int32_t)a1 * (int32_t)a2 + (int32_t)a3 * (int32_t)a4;
39 result = result >> result_shift;
40 return (int16_t)result;
43static inline int16_t
xtfixed_bf_2(int16_t a0, int16_t a1, int16_t a2, int16_t a3, int16_t a4,
int result_shift)
46 result -= ((int32_t)a1 * (int32_t)a2 - (int32_t)a3 * (int32_t)a4);
48 result = result >> result_shift;
49 return (int16_t)result;
52static inline int16_t
xtfixed_bf_3(int16_t a0, int16_t a1, int16_t a2, int16_t a3, int16_t a4,
int result_shift)
55 result += (int32_t)a1 * (int32_t)a2 + (int32_t)a3 * (int32_t)a4;
57 result = result >> result_shift;
58 return (int16_t)result;
61static inline int16_t
xtfixed_bf_4(int16_t a0, int16_t a1, int16_t a2, int16_t a3, int16_t a4,
int result_shift)
64 result += (int32_t)a1 * (int32_t)a2 - (int32_t)a3 * (int32_t)a4;
66 result = result >> result_shift;
67 return (int16_t)result;
79 if (table_size == 0) {
82 if (fft_table_buff != NULL) {
128 uint32_t *w = (uint32_t *)sc_table;
129 uint32_t *in_data = (uint32_t *)
data;
137 for (
int N2 =
N / 2; N2 > 0; N2 >>= 1) {
139 for (
int j = 0; j < ie; j++) {
143 for (
int i = 0; i < N2; i++) {
145 m_data.
data = in_data[
m];
146 a_data.
data = in_data[ia];
152 in_data[
m] = m1.
data;
159 in_data[ia] = m2.
data;
170static inline unsigned short reverse_sc16(
unsigned short x,
unsigned short N,
int order)
172 unsigned short b =
x;
174 b = (b & 0xff00) >> 8 | (b & 0x00fF) << 8;
175 b = (b & 0xf0F0) >> 4 | (b & 0x0f0F) << 4;
176 b = (b & 0xCCCC) >> 2 | (b & 0x3333) << 2;
177 b = (b & 0xAAAA) >> 1 | (b & 0x5555) << 1;
178 return b >> (16 - order);
190 uint32_t *in_data = (uint32_t *)
data;
192 for (
int i = 1; i < (
N - 1); i++) {
201 in_data[j] = in_data[i];
217 float e =
M_PI * 2.0 /
N;
219 for (i = 0; i < (
N >> 1); i++) {
220 w[2 * i] = (int16_t)(INT16_MAX * cosf(i * e));
221 w[2 * i + 1] = (int16_t)(INT16_MAX * sinf(i * e));
236 uint32_t *in_data = (uint32_t *)
data;
243 for (i = 0; i < (
N / 4); i++) {
244 kl.
data = in_data[i + 1];
245 nl.
data = in_data[
N - i - 1];
246 kh.
data = in_data[i + 1 +
N / 2];
247 nh.
data = in_data[
N - i - 1 -
N / 2];
249 data[i * 2 + 0 + 2] = kl.
re + nl.
re;
250 data[i * 2 + 1 + 2] = kl.
im - nl.
im;
252 data[n2 - i * 2 - 1 -
N] = kh.
re + nh.
re;
253 data[n2 - i * 2 - 2 -
N] = kh.
im - nh.
im;
258 data[n2 - i * 2 - 1] = kh.
im + nh.
im;
259 data[n2 - i * 2 - 2] = kh.
re - nh.
re;
280 int16_t tmp_re = result[0].
re;
281 result[0].
re = (tmp_re + result[0].
im) >> 1;
282 result[0].
im = (tmp_re - result[0].
im) >> 1;
285 for (
int k = 1;
k <=
N / 2 ; ++
k ) {
288 fpnk.
re = result[
N -
k].
re;
289 fpnk.
im = result[
N -
k].
im;
290 f1k.
re = fpk.
re + fpnk.
re;
291 f1k.
im = fpk.
im - fpnk.
im;
292 f2k.
re = fpk.
re - fpnk.
re;
293 f2k.
im = fpk.
im + fpnk.
im;
299 sc16_t w = table[table_index];
303 int re = (w.
re * f2k.
im - w.
im * f2k.
re) >> 15;
304 int im = (+w.
re * f2k.
re + w.
im * f2k.
im) >> 15;
309 result[
k].
re = (f1k.
re + tw.
re) >> 2;
310 result[
k].
im = (f1k.
im - tw.
im) >> 2;
311 result[
N -
k].
re = (f1k.
re - tw.
re) >> 2;
312 result[
N -
k].
im = -(f1k.
im + tw.
im) >> 2;
bool dsp_is_power_of_two(int x)
check power of two The function check if the argument is power of 2. The implementation use ANSI C an...
int dsp_power_of_two(int x)
Power of two The function return power of 2 for values 2^N. The implementation use ANSI C and could b...
#define ESP_ERR_DSP_PARAM_OUTOFRANGE
#define ESP_ERR_DSP_UNINITIALIZED
#define ESP_ERR_DSP_INVALID_LENGTH
#define ESP_ERR_DSP_REINITIALIZED
#define memalign(align_, size_)
#define CONFIG_DSP_MAX_FFT_SIZE
esp_err_t dsps_fft2r_init_sc16(int16_t *fft_table_buff, int table_size)
static const int add_rount_mult
esp_err_t dsps_bit_rev_sc16_ansi(int16_t *data, int N)
static unsigned short reverse_sc16(unsigned short x, unsigned short N, int order)
uint8_t dsps_fft2r_sc16_initialized
static int16_t xtfixed_bf_2(int16_t a0, int16_t a1, int16_t a2, int16_t a3, int16_t a4, int result_shift)
int16_t * dsps_fft_w_table_sc16
void dsps_fft2r_deinit_sc16()
uint8_t dsps_fft2r_sc16_mem_allocated
esp_err_t dsps_gen_w_r2_sc16(int16_t *w, int N)
static int16_t xtfixed_bf_4(int16_t a0, int16_t a1, int16_t a2, int16_t a3, int16_t a4, int result_shift)
unsigned short reverse(unsigned short x, unsigned short N, int order)
esp_err_t dsps_cplx2reC_sc16(int16_t *data, int N)
static int16_t xtfixed_bf_3(int16_t a0, int16_t a1, int16_t a2, int16_t a3, int16_t a4, int result_shift)
esp_err_t dsps_cplx2real_sc16_ansi(int16_t *data, int N)
Convert complex FFT result to real array.
static int16_t xtfixed_bf_1(int16_t a0, int16_t a1, int16_t a2, int16_t a3, int16_t a4, int result_shift)
esp_err_t dsps_fft2r_sc16_ansi_(int16_t *data, int N, int16_t *sc_table)
int dsps_fft_w_table_sc16_size
static const int mult_shift_const
static float data[128 *2]