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