660 {
662 const int numOctaves =
static_cast<int>(
mOctaves.size());
663 const int numRawBins = N / 2 + 1;
664
666
667
668 int workLen = N;
669 for (int i = 0; i < N; i++) {
671 (i < static_cast<int>(buffer.size())) ? buffer[i] : 0;
672 }
673
674
676
677
679 s.re.resize(numRawBins);
680 s.im.resize(numRawBins);
681 s.mag.resize(numRawBins);
683 batchMag(s.re.data(), s.im.data(), s.mag.data(), numRawBins);
684
686
687
688 fl::vector<float> &rawBins = out->raw_mut();
691 rawBins[i] = 0.0f;
692 }
693
694
696
697
698
699
700 for (
int oct = numOctaves - 1;
oct >= 0;
oct--) {
702 if (oi.numBins <= 0 || !oi.kernels)
703 continue;
704
705 if (
oct != numOctaves - 1) {
707 workLen = workLen / 2;
708
709 for (int i = workLen; i < N; i++)
712 }
713
714
715 fl::memset(cq, 0,
sizeof(kiss_fft_cpx) * oi.numBins);
717
718 for (int i = 0; i < oi.numBins; i++) {
719 int binIdx = oi.firstBin + i;
720 i32 real = cq[i].r;
721 i32 imag = cq[i].i;
722#ifdef FIXED_POINT
723 rawBins[binIdx] =
static_cast<float>(
fastMag(real, imag));
724#else
725 float r2 = float(real * real);
726 float i2 = float(imag * imag);
727 rawBins[binIdx] =
sqrt(r2 + i2);
728#endif
729 }
730 }
731 }
#define FASTLED_STACK_ARRAY(TYPE, NAME, SIZE)
Stack-allocated array with automatic zero-initialization.
static void decimateBy2(kiss_fft_scalar *buf, int len)
static void deinterleave(const kiss_fft_cpx *cpx, kiss_fft_scalar *re, kiss_fft_scalar *im, int n)
fl::vector< kiss_fft_scalar > mWorkBuf
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)
fl::vector< OctaveInfo > mOctaves
fl::vector< kiss_fft_cpx > mFftOut
void computeLinearBins(const u16 *mag, int, Bins *out)
void resize(fl::size n) FL_NOEXCEPT
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
void * memset(void *s, int c, size_t n) FL_NOEXCEPT