FastLED 3.9.15
Loading...
Searching...
No Matches
audio.cpp
Go to the documentation of this file.
1
2#include "audio.h"
3#include "fl/thread_local.h"
4
5namespace fl {
6
7namespace {
8
10 // This is a singleton for the FFT implementation.
11 // It is used to avoid creating multiple FFT instances.
12 static ThreadLocal<FFT> gFlexFFT;
13 return gFlexFFT.access();
14}
15
16} // namespace
17
19 if (isValid()) {
20 return mImpl->pcm();
21 }
22 static VectorPCM empty;
23 return empty;
24}
25
27 mImpl = other.mImpl;
28 return *this;
29}
30
31size_t AudioSample::size() const {
32 if (isValid()) {
33 return mImpl->pcm().size();
34 }
35 return 0;
36}
37
38const int16_t &AudioSample::at(size_t i) const {
39 if (i < size()) {
40 return pcm()[i];
41 }
42 return empty()[0];
43}
44
45const int16_t &AudioSample::operator[](size_t i) const { return at(i); }
46
47bool AudioSample::operator==(const AudioSample &other) const {
48 if (mImpl == other.mImpl) {
49 return true;
50 }
51 if (mImpl == nullptr || other.mImpl == nullptr) {
52 return false;
53 }
54 if (mImpl->pcm().size() != other.mImpl->pcm().size()) {
55 return false;
56 }
57 for (size_t i = 0; i < mImpl->pcm().size(); ++i) {
58 if (mImpl->pcm()[i] != other.mImpl->pcm()[i]) {
59 return false;
60 }
61 }
62 return true;
63}
64
65bool AudioSample::operator!=(const AudioSample &other) const {
66 return !(*this == other);
67}
68
70 static int16_t empty_data[1] = {0};
71 static VectorPCM empty(empty_data);
72 return empty;
73}
74
75float AudioSample::zcf() const { return mImpl->zcf(); }
76
77float AudioSample::rms() const {
78 if (!isValid()) {
79 return 0.0f;
80 }
81 uint64_t sum_sq = 0;
82 const int N = size();
83 for (int i = 0; i < N; ++i) {
84 int32_t x32 = int32_t(pcm()[i]);
85 sum_sq += x32 * x32;
86 }
87 float rms = sqrtf(float(sum_sq) / N);
88 return rms;
89}
90
91SoundLevelMeter::SoundLevelMeter(double spl_floor, double smoothing_alpha)
92 : spl_floor_(spl_floor), smoothing_alpha_(smoothing_alpha),
94 current_spl_(spl_floor) {}
95
96void SoundLevelMeter::processBlock(const int16_t *samples, size_t count) {
97 // 1) compute block power → dBFS
98 double sum_sq = 0.0;
99 for (size_t i = 0; i < count; ++i) {
100 double s = samples[i] / 32768.0; // normalize to ±1
101 sum_sq += s * s;
102 }
103 double p = sum_sq / count; // mean power
104 double dbfs = 10.0 * log10(p + 1e-12);
105 current_dbfs_ = dbfs;
106
107 // 2) update global floor (with optional smoothing)
108 if (dbfs < dbfs_floor_global_) {
109 if (smoothing_alpha_ <= 0.0) {
110 dbfs_floor_global_ = dbfs;
111 } else {
114 }
116 }
117
118 // 3) estimate SPL
119 current_spl_ = dbfs + offset_;
120}
121
123 fl::Slice<const int16_t> sample = pcm();
125 args.samples = sample.size();
126 args.bands = out->size();
129 args.sample_rate =
130 FFT_Args::DefaultSampleRate(); // TODO: get sample rate from AudioSample
131 get_flex_fft().run(sample, out, args);
132}
133
134} // namespace fl
fl::vector< int16_t > VectorPCM
Definition audio.h:22
const VectorPCM & pcm() const
Definition audio.cpp:18
AudioSampleImplPtr mImpl
Definition audio.h:50
const int16_t & at(size_t i) const
Definition audio.cpp:38
float zcf() const
Definition audio.cpp:75
bool operator!=(const AudioSample &other) const
Definition audio.cpp:65
bool isValid() const
Definition audio.h:28
bool operator==(const AudioSample &other) const
Definition audio.cpp:47
float rms() const
Definition audio.cpp:77
const int16_t & operator[](size_t i) const
Definition audio.cpp:45
void fft(FFTBins *out)
Definition audio.cpp:122
size_t size() const
Definition audio.cpp:31
AudioSample & operator=(const AudioSample &other)
Definition audio.cpp:26
static const VectorPCM & empty()
Definition audio.cpp:69
void run(const Slice< const int16_t > &sample, FFTBins *out, const FFT_Args &args=FFT_Args())
Definition fft.cpp:24
Definition fft.h:66
size_t size() const
Definition slice.h:92
double dbfs_floor_global_
Definition audio.h:93
void processBlock(const int16_t *samples, size_t count)
Process a block of int16 PCM samples.
Definition audio.cpp:96
SoundLevelMeter(double spl_floor=33.0f, double smoothing_alpha=0.0)
Definition audio.cpp:91
double current_dbfs_
Definition audio.h:95
double smoothing_alpha_
Definition audio.h:92
double spl_floor_
Definition audio.h:91
double current_spl_
Definition audio.h:96
#define INFINITY_DOUBLE
Definition math_macros.h:51
ThreadLocalFake< T > ThreadLocal
Implements a simple red square effect for 2D LED grids.
Definition crgb.h:16
static FASTLED_NAMESPACE_BEGIN uint8_t const p[]
Definition noise.cpp:30
corkscrew_args args
Definition old.h:142
static int DefaultSampleRate()
Definition fft.h:40
static float DefaultMinFrequency()
Definition fft.h:38
static float DefaultMaxFrequency()
Definition fft.h:39
size_t size() const
Definition fft.h:24