35 size numSamples = pcm.
size();
41 if (numSamples <
static_cast<size
>(
mMaxPeriod * 2)) {
114 const float normFactor = 1.0f / 32768.0f;
120 int validSamples = 0;
122 for (size i = 0; i + lag < numSamples; i++) {
123 float s1 =
static_cast<float>(pcm[i]) * normFactor;
124 float s2 =
static_cast<float>(pcm[i + lag]) * normFactor;
130 if (validSamples > 0) {
131 mAutocorrelation[
static_cast<size
>(lag)] = sum /
static_cast<float>(validSamples);
155 float maxValue = -1.0f;
158 for (
int lag =
mMinPeriod; lag <= mMaxPeriod && lag < static_cast<int>(autocorr.size()); lag++) {
159 float value = autocorr[
static_cast<size
>(lag)];
176 if (peakLag <= 0 || peakLag >=
static_cast<int>(autocorr.size())) {
180 float peakValue = autocorr[
static_cast<size
>(peakLag)];
188 int windowSize =
fl::max(2, peakLag / 10);
189 float neighborSum = 0.0f;
190 int neighborCount = 0;
193 if (
offset == 0)
continue;
195 int lag = peakLag +
offset;
197 neighborSum +=
fl::max(0.0f, autocorr[
static_cast<size
>(lag)]);
202 if (neighborCount > 0) {
203 float neighborAvg = neighborSum /
static_cast<float>(neighborCount);
207 if (neighborAvg > 1e-6f) {
208 float clarity =
fl::min(1.0f, (peakValue - neighborAvg) / neighborAvg);
209 confidence *= (0.7f + 0.3f * clarity);
224 if (frequency <= 0.0f) {
function_list< void(float hz)> onPitch
function_list< void(float hz)> onPitchChange
vector< float > mAutocorrelation
bool shouldReportPitchChange(float newPitch) const FL_NO_EXCEPT
void updatePitchSmoothing(float newPitch) FL_NO_EXCEPT
void fireCallbacks() FL_NO_EXCEPT override
float calculateConfidence(const vector< float > &autocorr, int peakLag) const FL_NO_EXCEPT
function_list< void(float hz, float confidence)> onPitchWithConfidence
float mPitchChangeSensitivity
function_list< void(u8 voiced)> onVoiced
void update(shared_ptr< Context > context) FL_NO_EXCEPT override
float calculateAutocorrelation(const i16 *pcm, size numSamples) FL_NO_EXCEPT
float periodToFrequency(int period) const FL_NO_EXCEPT
int findBestPeakLag(const vector< float > &autocorr) const FL_NO_EXCEPT
~Pitch() FL_NO_EXCEPT override
OneEuroFilter< float > mPitchSmoother
void updatePeriodRange() FL_NO_EXCEPT
void reset() FL_NO_EXCEPT override
float mConfidenceThreshold
int frequencyToPeriod(float frequency) const FL_NO_EXCEPT
const T * data() const FL_NO_EXCEPT
constexpr fl::size size() const FL_NO_EXCEPT
fl::UISlider offset("Offset", 0.0f, 0.0f, 1.0f, 0.01f)
float computeAudioDt(fl::size pcmSize, int sampleRate) FL_NO_EXCEPT
Compute the time delta (in seconds) for an audio buffer.
constexpr common_type_t< T, U > max(T a, U b) FL_NO_EXCEPT
u8 u8 fract8 blur_amount FL_NO_EXCEPT
constexpr int type_rank< T >::value
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NO_EXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type abs(T x) FL_NO_EXCEPT
Base definition for an LED controller.