28 mStats.noiseGateOpen =
false;
30 mStats.samplesProcessed = 0;
38 const auto pcm =
sample.pcm();
39 const size sampleCount = pcm.size();
50 if (
mConfig.enableSpikeFilter) {
78 mStats.dcOffset = dcOffset;
80 mStats.samplesProcessed += sampleCount;
89 const size count = pcm.
size();
94 const i16 threshold =
mConfig.spikeThreshold;
96 for (size i = 0; i < count; ++i) {
98 const bool isValid = (
sample > -threshold) && (
sample < threshold);
106 const size spikesInSample = count - validCount;
107 mStats.spikesRejected += spikesInSample;
113 const size count = pcm.
size();
118 for (size i = 0; i < count; ++i) {
125 if (validCount == 0) {
131 const i32 instantDC =
static_cast<i32
>(sum /
static_cast<i64>(validCount));
136 const size count = pcm.
size();
138 output.reserve(count);
140 for (size i = 0; i < count; ++i) {
147 i32 sample32 =
static_cast<i32
>(pcm[i]) - dcOffset;
150 if (sample32 > 32767) sample32 = 32767;
151 if (sample32 < -32768) sample32 = -32768;
153 output.push_back(
static_cast<i16
>(sample32));
158 const size count = pcm.
size();
160 output.reserve(count);
162 const i16 openThreshold =
mConfig.noiseGateOpenThreshold;
163 const i16 closeThreshold =
mConfig.noiseGateCloseThreshold;
165 for (size i = 0; i < count; ++i) {
166 const i16
sample = pcm[i];
172 if (absSample >= openThreshold) {
177 if (absSample < closeThreshold) {
void removeDCOffset(span< const i16 > pcm, i32 dcOffset, vector< i16 > &output) FL_NOEXCEPT
Remove DC offset from samples.
bool mNoiseGateOpen
Noise gate state.
i32 calculateDCOffset(span< const i16 > pcm, const vector< bool > &validMask) FL_NOEXCEPT
Calculate DC offset from valid samples only.
~SignalConditioner() FL_NOEXCEPT
vector< bool > mValidMask
Working buffers (reused to avoid allocations)
void applyNoiseGate(span< const i16 > pcm, vector< i16 > &output) FL_NOEXCEPT
Apply noise gate with hysteresis.
Sample processSample(const Sample &sample) FL_NOEXCEPT
Process a raw audio sample through the conditioning pipeline.
vector< i16 > mTempBuffer
size filterSpikes(span< const i16 > pcm, vector< bool > &validMask) FL_NOEXCEPT
Detect and reject spike samples.
void configure(const SignalConditionerConfig &config) FL_NOEXCEPT
Configure the signal conditioner.
SignalConditioner() FL_NOEXCEPT
vector< i16 > mOutputBuffer
void reset() FL_NOEXCEPT
Reset internal state (DC estimate, noise gate state)
SignalConditionerConfig mConfig
constexpr fl::size size() const FL_NOEXCEPT
void reserve(fl::size n) FL_NOEXCEPT
void push_back(const T &value) FL_NOEXCEPT
Configuration for signal conditioning pipeline.
CRGB sample(const CRGB *grid, const XYMap &xyMap, float x, float y, SampleMode mode)
Sample a pixel from a 2D CRGB grid at floating-point coordinates.
shared_ptr< T > make_shared(Args &&... args) FL_NOEXCEPT
Base definition for an LED controller.