FastLED 3.9.15
Loading...
Searching...
No Matches

◆ runNaive()

void fl::audio::fft::Context::runNaive ( span< const i16 > buffer,
Bins * out )
inlineprivate

Definition at line 295 of file fft_impl.cpp.hpp.

295 {
296 out->setParams(mFmin, mFmax, mSampleRate);
297 const int fftSize = mInputSamples;
298 const int numRawBins = fftSize / 2 + 1;
299
300 FftScratch &s = scratch();
301 s.fftOut.resize(fftSize);
302 s.re.resize(numRawBins);
303 s.im.resize(numRawBins);
304 s.mag.resize(numRawBins);
305
306 fl_fft_real_forward(mFftrCfg, mInputSamples, buffer.data(), s.fftOut.data());
307
308 // Deinterleave AoS → SoA and batch-compute magnitudes
309 deinterleave(s.fftOut.data(), s.re.data(), s.im.data(), numRawBins);
310 batchMag(s.re.data(), s.im.data(), s.mag.data(), numRawBins);
311
312 computeLinearBins(s.mag.data(), fftSize, out);
313
314 FASTLED_STACK_ARRAY(kiss_fft_cpx, cq, mCqCfg.bands);
315 apply_kernels(s.fftOut.data(), cq, mKernels, mCqCfg);
316
317 const int bands = mCqCfg.bands;
318 fl::vector<float> &rawBins = out->raw_mut();
319 rawBins.resize(bands);
320 for (int i = 0; i < bands; ++i) {
321 i32 real = cq[i].r;
322 i32 imag = cq[i].i;
323#ifdef FIXED_POINT
324 rawBins[i] = static_cast<float>(fastMag(real, imag));
325#else
326 float r2 = float(real * real);
327 float i2 = float(imag * imag);
328 rawBins[i] = sqrt(r2 + i2);
329#endif
330 }
331 }
#define FASTLED_STACK_ARRAY(TYPE, NAME, SIZE)
Stack-allocated array with automatic zero-initialization.
Definition alloca.h:32
static void deinterleave(const kiss_fft_cpx *cpx, kiss_fft_scalar *re, kiss_fft_scalar *im, int n)
static void batchMag(const kiss_fft_scalar *re, const kiss_fft_scalar *im, u16 *mag, int n)
static FftScratch & scratch()
static u16 fastMag(i32 re, i32 im)
void computeLinearBins(const u16 *mag, int, Bins *out)
void resize(fl::size n) FL_NOEXCEPT
Definition vector.h:593
void apply_kernels(kiss_fft_cpx fft[], kiss_fft_cpx cq[], struct sparse_arr kernels[], struct cq_kernel_cfg cfg) FL_NOEXCEPT
void fl_fft_real_forward(kiss_fftr_cfg cfg, int N, const kiss_fft_scalar *in, kiss_fft_cpx *out) FL_NOEXCEPT
Forward real-to-complex FFT.
constexpr enable_if< is_fixed_point< T >::value, T >::type sqrt(T x) FL_NOEXCEPT

References apply_kernels(), batchMag(), computeLinearBins(), fl::span< T, Extent >::data(), fl::vector< T >::data(), deinterleave(), FASTLED_STACK_ARRAY, fastMag(), fl::audio::fft::Context::FftScratch::fftOut, fl::audio::fft::fl_fft_real_forward(), fl::audio::fft::Context::FftScratch::im, fl::audio::fft::Context::FftScratch::mag, mCqCfg, mFftrCfg, mFmax, mFmin, mInputSamples, mKernels, mSampleRate, fl::audio::fft::Bins::raw_mut(), fl::audio::fft::Context::FftScratch::re, fl::vector< T >::resize(), scratch(), fl::audio::fft::Bins::setParams(), and fl::sqrt().

Referenced by run().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: