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