Signed-off-by: myperworld <myperworld@126.com>

This commit is contained in:
myperworld committed 2025-10-06 12:34:26 +08:00
1 parent 0986832fd1
commit aacd052c06
3403 files changed
+597376 -12

No files matched your search

@@ -0,0 +1,74 @@
#include "fl/fft.h"
#include "fl/compiler_control.h"
#include "fl/fft_impl.h"
#include "fl/hash_map_lru.h"
#include "fl/int.h"
#include "fl/memory.h"
namespace fl {
template <> struct Hash<FFT_Args> {
fl::u32 operator()(const FFT_Args &key) const noexcept {
return MurmurHash3_x86_32(&key, sizeof(FFT_Args));
}
};
struct FFT::HashMap : public HashMapLru<FFT_Args, fl::shared_ptr<FFTImpl>> {
HashMap(fl::size max_size)
: fl::HashMapLru<FFT_Args, fl::shared_ptr<FFTImpl>>(max_size) {}
};
FFT::FFT() { mMap.reset(new HashMap(8)); };
FFT::~FFT() = default;
FFT::FFT(const FFT &other) {
// copy the map
mMap.reset();
mMap.reset(new HashMap(*other.mMap));
}
FFT &FFT::operator=(const FFT &other) {
mMap.reset();
mMap.reset(new HashMap(*other.mMap));
return *this;
}
void FFT::run(const span<const fl::i16> &sample, FFTBins *out,
const FFT_Args &args) {
FFT_Args args2 = args;
args2.samples = sample.size();
get_or_create(args2).run(sample, out);
}
void FFT::clear() { mMap->clear(); }
fl::size FFT::size() const { return mMap->size(); }
void FFT::setFFTCacheSize(fl::size size) { mMap->setMaxSize(size); }
FFTImpl &FFT::get_or_create(const FFT_Args &args) {
fl::shared_ptr<FFTImpl> *val = mMap->find_value(args);
if (val) {
// we have it.
return **val;
}
// else we have to make a new one.
fl::shared_ptr<FFTImpl> fft = fl::make_shared<FFTImpl>(args);
(*mMap)[args] = fft;
return *fft;
}
bool FFT_Args::operator==(const FFT_Args &other) const {
FL_DISABLE_WARNING_PUSH
FL_DISABLE_WARNING(float-equal);
return samples == other.samples && bands == other.bands &&
fmin == other.fmin && fmax == other.fmax &&
sample_rate == other.sample_rate;
FL_DISABLE_WARNING_POP
}
} // namespace fl