FastLED 3.9.15
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 229 of file mic_response_data.h.

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

References fl::audio::MicResponseCurve::count, fl_progmem_read_float(), fl::audio::MicResponseCurve::freqs, fl::audio::MicResponseCurve::gains, and fl::logf().

Referenced by downsampleMicResponse().

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