FastLED 3.9.15
Loading...
Searching...
No Matches
fft_impl.cpp
Go to the documentation of this file.
1
2// #include <iostream>
3// #include "audio_types.h"
4// // #include "defs.h"
5// #include "thirdparty/cq_kernel/cq_kernel.h"
6// #include "thirdparty/cq_kernel/kiss_fftr.h"
7// #include "util.h"
8
9#ifndef FASTLED_INTERNAL
10#define FASTLED_INTERNAL 1
11#endif
12
13#include "FastLED.h"
14
17
18#include "fl/array.h"
19#include "fl/audio.h"
20#include "fl/fft.h"
21#include "fl/fft_impl.h"
22#include "fl/str.h"
23#include "fl/unused.h"
24#include "fl/vector.h"
25#include "fl/warn.h"
26
27#include "fl/memfill.h"
28// #define SAMPLES IS2_AUDIO_BUFFER_LEN
29#define AUDIO_SAMPLE_RATE 44100
30#define SAMPLES 512
31#define BANDS 16
32#define SAMPLING_FREQUENCY AUDIO_SAMPLE_RATE
33#define MAX_FREQUENCY 4698.3
34#define MIN_FREQUENCY 174.6
35#define MIN_VAL 5000 // Equivalent to 0.15 in Q15
36
37#define PRINT_HEADER 1
38
39namespace fl {
40
42 public:
43 FFTContext(int samples, int bands, float fmin, float fmax, int sample_rate)
44 : m_fftr_cfg(nullptr), m_kernels(nullptr) {
45 fl::memfill(&m_cq_cfg, 0, sizeof(m_cq_cfg));
46 m_cq_cfg.samples = samples;
47 m_cq_cfg.bands = bands;
48 m_cq_cfg.fmin = fmin;
49 m_cq_cfg.fmax = fmax;
50 m_cq_cfg.fs = sample_rate;
51 m_cq_cfg.min_val = MIN_VAL;
52 m_fftr_cfg = kiss_fftr_alloc(samples, 0, NULL, NULL);
53 if (!m_fftr_cfg) {
54 FASTLED_WARN("Failed to allocate FFTImpl context");
55 return;
56 }
58 }
60 if (m_fftr_cfg) {
62 }
63 if (m_kernels) {
65 }
66 }
67
68 fl::size sampleSize() const { return m_cq_cfg.samples; }
69
71
72 // FASTLED_ASSERT(512 == m_cq_cfg.samples, "FFTImpl samples mismatch and
73 // are still hardcoded to 512");
74 out->clear();
75 // allocate
78 // initialize
79 kiss_fftr(m_fftr_cfg, buffer.data(), fft);
81 const float maxf = m_cq_cfg.fmax;
82 const float minf = m_cq_cfg.fmin;
83 const float delta_f = (maxf - minf) / m_cq_cfg.bands;
84 // begin transform
85 for (int i = 0; i < m_cq_cfg.bands; ++i) {
86 i32 real = cq[i].r;
87 i32 imag = cq[i].i;
88 float r2 = float(real * real);
89 float i2 = float(imag * imag);
90 float magnitude = sqrt(r2 + i2);
91 float magnitude_db = 20 * log10(magnitude);
92 float f_start = minf + i * delta_f;
93 float f_end = f_start + delta_f;
94 FASTLED_UNUSED(f_start);
95 FASTLED_UNUSED(f_end);
96
97 if (magnitude <= 0.0f) {
98 magnitude_db = 0.0f;
99 }
100
101 // FASTLED_UNUSED(magnitude_db);
102 // FASTLED_WARN("magnitude_db: " << magnitude_db);
103 // out->push_back(magnitude_db);
104 out->bins_raw.push_back(magnitude);
105 out->bins_db.push_back(magnitude_db);
106 }
107 }
108
109 fl::string info() const {
110 // Calculate frequency delta
111 float delta_f = (m_cq_cfg.fmax - m_cq_cfg.fmin) / m_cq_cfg.bands;
112 fl::StrStream ss;
113 ss << "FFTImpl Frequency Bands: ";
114
115 for (int i = 0; i < m_cq_cfg.bands; ++i) {
116 float f_start = m_cq_cfg.fmin + i * delta_f;
117 float f_end = f_start + delta_f;
118 ss << f_start << "Hz-" << f_end << "Hz, ";
119 }
120
121 return ss.str();
122 }
123
124 private:
128};
129
131 mContext.reset(new FFTContext(args.samples, args.bands, args.fmin,
132 args.fmax, args.sample_rate));
133}
134
136
138 if (mContext) {
139 return mContext->info();
140 } else {
141 FASTLED_WARN("FFTImpl context is not initialized");
142 return fl::string();
143 }
144}
145
146fl::size FFTImpl::sampleSize() const {
147 if (mContext) {
148 return mContext->sampleSize();
149 }
150 return 0;
151}
152
154 auto &audio_sample = sample.pcm();
155 span<const i16> slice(audio_sample);
156 return run(slice, out);
157}
158
160 if (!mContext) {
161 return FFTImpl::Result(false, "FFTImpl context is not initialized");
162 }
163 if (sample.size() != mContext->sampleSize()) {
164 FASTLED_WARN("FFTImpl sample size mismatch");
165 return FFTImpl::Result(false, "FFTImpl sample size mismatch");
166 }
167 mContext->fft_unit_test(sample, out);
168 return FFTImpl::Result(true, "");
169}
170
171} // namespace fl
central include file for FastLED, defines the CFastLED class/object
AudioAnalyzeFFT1024 fft
#define FASTLED_STACK_ARRAY(TYPE, NAME, SIZE)
Definition array.h:185
const VectorPCM & pcm() const
Definition audio.cpp:17
FFTContext(int samples, int bands, float fmin, float fmax, int sample_rate)
Definition fft_impl.cpp:43
cq_kernels_t m_kernels
Definition fft_impl.cpp:126
kiss_fftr_cfg m_fftr_cfg
Definition fft_impl.cpp:125
fl::size sampleSize() const
Definition fft_impl.cpp:68
void fft_unit_test(span< const i16 > buffer, FFTBins *out)
Definition fft_impl.cpp:70
fl::string info() const
Definition fft_impl.cpp:109
cq_kernel_cfg m_cq_cfg
Definition fft_impl.cpp:127
FFTImpl(const FFT_Args &args)
Definition fft_impl.cpp:130
Result run(const AudioSample &sample, FFTBins *out)
Definition fft_impl.cpp:153
fl::string info() const
Definition fft_impl.cpp:137
fl::size sampleSize() const
Definition fft_impl.cpp:146
fl::unique_ptr< FFTContext > mContext
Definition fft_impl.h:55
const T * data() const
Definition slice.h:138
fl::size size() const
Definition slice.h:142
const string & str() const
Definition strstream.h:51
void free_kernels(struct sparse_arr *kernels, struct cq_kernel_cfg cfg)
void apply_kernels(kiss_fft_cpx fft[], kiss_fft_cpx cq[], struct sparse_arr kernels[], struct cq_kernel_cfg cfg)
struct sparse_arr * generate_kernels(struct cq_kernel_cfg cfg)
Definition cq_kernel.cpp:89
struct sparse_arr * cq_kernels_t
Definition cq_kernel.h:59
#define MIN_VAL
Definition fft_impl.cpp:35
void kiss_fftr(kiss_fftr_cfg st, const kiss_fft_scalar *timedata, kiss_fft_cpx *freqdata)
Definition kiss_fftr.cpp:67
kiss_fftr_cfg kiss_fftr_alloc(int nfft, int inverse_fft, void *mem, size_t *lenmem)
Definition kiss_fftr.cpp:21
#define kiss_fftr_free
Definition kiss_fftr.h:49
struct kiss_fftr_state * kiss_fftr_cfg
Definition kiss_fftr.h:26
Slice< T > span
Definition span.h:8
void * memfill(void *ptr, int value, fl::size num)
Definition memfill.h:11
IMPORTANT!
Definition crgb.h:20
corkscrew_args args
Definition old.h:150
fl::vector< float > bins_raw
Definition fft.h:53
void clear()
Definition fft.h:45
fl::vector< float > bins_db
Definition fft.h:55
#define FASTLED_UNUSED(x)
Definition unused.h:4
#define FASTLED_WARN
Definition warn.h:7