FastLED 3.10.8
Loading...
Searching...
No Matches

◆ interpolateMicResponse()

float fl::audio::interpolateMicResponse ( const MicResponseCurve & curve,
float freq_hz )
inline

Interpolate mic response at an arbitrary frequency (Hz).

Uses log-frequency linear interpolation with binary search. Clamps to endpoint values outside the data range.

Definition at line 230 of file mic_response_data.h.

230 {
231 if (curve.count <= 0 || !curve.freqs || !curve.gains) return 1.0f;
232
233 float f0 = fl_progmem_read_float(&curve.freqs[0]);
234 float fN = fl_progmem_read_float(&curve.freqs[curve.count - 1]);
235
236 // Clamp to endpoints
237 if (freq_hz <= f0) return fl_progmem_read_float(&curve.gains[0]);
238 if (freq_hz >= fN) return fl_progmem_read_float(&curve.gains[curve.count - 1]);
239
240 // Binary search for bracketing interval
241 int lo = 0, hi = curve.count - 1;
242 while (hi - lo > 1) {
243 int mid = (lo + hi) / 2;
244 float fMid = fl_progmem_read_float(&curve.freqs[mid]);
245 if (freq_hz < fMid) {
246 hi = mid;
247 } else {
248 lo = mid;
249 }
250 }
251
252 float fLo = fl_progmem_read_float(&curve.freqs[lo]);
253 float fHi = fl_progmem_read_float(&curve.freqs[hi]);
254 float gLo = fl_progmem_read_float(&curve.gains[lo]);
255 float gHi = fl_progmem_read_float(&curve.gains[hi]);
256
257 // Log-frequency linear interpolation
258 float logFrac = fl::logf(freq_hz / fLo) / fl::logf(fHi / fLo);
259 return gLo + (gHi - gLo) * logFrac;
260}
float fl_progmem_read_float(const float *addr) FL_NO_EXCEPT
Read a float from PROGMEM.
const float * freqs
Pointer to frequency array (PROGMEM)
int count
Number of data points.
const float * gains
Pointer to gain array (PROGMEM)
float logf(float value) FL_NO_EXCEPT
Definition math.h:426

References fl::FL_NO_EXCEPT, fl_progmem_read_float(), and fl::logf().

Referenced by downsampleMicResponse().

+ Here is the call graph for this function:
+ Here is the caller graph for this function: