// Host stand-in for esp-dsp: float32 radix-2 FFT with the same call sequence // (fft2r then bit_rev). Output order is natural, so bit_rev is a no-op here. #pragma once #include #include "esp_err.h" static inline esp_err_t dsps_fft2r_init_fc32(float *t, int n) { (void)t; (void)n; return ESP_OK; } static inline esp_err_t dsps_fft2r_fc32(float *d, int n) { for (int i = 1, j = 0; i < n; i++) { // bit-reverse permutation int bit = n >> 1; for (; j & bit; bit >>= 1) j ^= bit; j ^= bit; if (i < j) { float a = d[2*i], b = d[2*i+1]; d[2*i] = d[2*j]; d[2*i+1] = d[2*j+1]; d[2*j] = a; d[2*j+1] = b; } } for (int len = 2; len <= n; len <<= 1) { float ang = -2.0f * (float)M_PI / (float)len; for (int i = 0; i < n; i += len) for (int k = 0; k < len / 2; k++) { float wr = cosf(ang * k), wi = sinf(ang * k); int a = i + k, b = i + k + len / 2; float xr = d[2*b] * wr - d[2*b+1] * wi, xi = d[2*b] * wi + d[2*b+1] * wr; d[2*b] = d[2*a] - xr; d[2*b+1] = d[2*a+1] - xi; d[2*a] += xr; d[2*a+1] += xi; } } return ESP_OK; } static inline esp_err_t dsps_bit_rev_fc32(float *d, int n) { (void)d; (void)n; return ESP_OK; }