574 {
575
576
577
578
579 int numOctaves =
static_cast<int>(
floorf(
log2f(fmax / fmin)));
580 if (numOctaves < 1)
581 numOctaves = 1;
582
583
584 float logRatio =
logf(fmax / fmin);
586 for (int i = 0; i < bands; i++) {
587 centerFreqs[i] =
588 fmin *
589 expf(logRatio *
static_cast<float>(i) /
590 static_cast<float>(bands - 1));
591 }
592
593
595 for (int i = 0; i < bands; i++) {
597 static_cast<int>(
floorf(
log2f(centerFreqs[i] / fmin)));
600 if (
oct >= numOctaves)
601 oct = numOctaves - 1;
603 }
604
605
608 for (
int oct = 0;
oct < numOctaves;
oct++) {
609 int first = -1, last = -1;
610 for (int i = 0; i < bands; i++) {
611 if (binOctave[i] ==
oct) {
612 if (first < 0)
613 first = i;
614 last = i;
615 }
616 }
617
620 oi.kernels = nullptr;
621 if (first < 0) {
622 oi.firstBin = 0;
623 oi.numBins = 0;
624 continue;
625 }
626
627 oi.firstBin = first;
628 oi.numBins = last - first + 1;
631 }
632
633
634
635 int decimExp = numOctaves - 1 -
oct;
636 float effectiveFs =
637 static_cast<float>(sr) /
638 static_cast<float>(1 << decimExp);
639
640 oi.cfg.samples = samples;
641 oi.cfg.bands = oi.numBins;
642 oi.cfg.fmin = centerFreqs[first];
643 oi.cfg.fmax = (oi.numBins > 1) ? centerFreqs[last]
644 : centerFreqs[first] * 2.0f;
645 oi.cfg.fs = effectiveFs;
647
649 }
650
651
654
656
657
658 }
#define FASTLED_STACK_ARRAY(TYPE, NAME, SIZE)
Stack-allocated array with automatic zero-initialization.
fl::vector< kiss_fft_scalar > mWorkBuf
fl::vector< u8 > mLinearBinLut
void buildLinearBinLut(fl::vector< u8 > &lut, int fftN)
fl::vector< OctaveInfo > mOctaves
fl::vector< kiss_fft_cpx > mFftOut
struct sparse_arr * generate_kernels(struct cq_kernel_cfg cfg) FL_NOEXCEPT
float expf(float value) FL_NOEXCEPT
float floorf(float value) FL_NOEXCEPT
void * memset(void *s, int c, size_t n) FL_NOEXCEPT
float log2f(float value) FL_NOEXCEPT
float logf(float value) FL_NOEXCEPT