Files
2026-10-13 19:47:46 -05:00

27 lines
1.2 KiB
C

// 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 <math.h>
#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; }