| 150 | mCurrentSpl(spl_floor) {} |
| 151 | |
| 152 | void SoundLevelMeter::processBlock(const fl::i16 *samples, fl::size count) { |
| 153 | // 1) compute block power → dBFS |
| 154 | double sum_sq = 0.0; |
| 155 | for (fl::size i = 0; i < count; ++i) { |
| 156 | double s = samples[i] / 32768.0; // normalize to ±1 |
| 157 | sum_sq += s * s; |
| 158 | } |
| 159 | double p = sum_sq / count; // mean power |
| 160 | double dbfs = 10.0 * log10(p + 1e-12); |
| 161 | mCurrentDbfs = dbfs; |
| 162 | |
| 163 | // 2) update global floor (with optional smoothing) |
| 164 | if (dbfs < mDbfsFloorGlobal) { |
| 165 | if (mSmoothingAlpha <= 0.0) { |
| 166 | mDbfsFloorGlobal = dbfs; |
| 167 | } else { |
| 168 | mDbfsFloorGlobal = mSmoothingAlpha * dbfs + |
| 169 | (1.0 - mSmoothingAlpha) * mDbfsFloorGlobal; |
| 170 | } |
| 171 | mOffset = mSplFloor - mDbfsFloorGlobal; |
| 172 | } |
| 173 | |
| 174 | // 3) estimate SPL |
| 175 | mCurrentSpl = dbfs + mOffset; |
| 176 | } |
| 177 | |
| 178 | void Sample::fft(fft::Bins *out) const { |
| 179 | fl::span<const fl::i16> sample = pcm(); |
no test coverage detected