diff --git a/include/algorithms/public/Envelope.hpp b/include/algorithms/public/Envelope.hpp index db732a351..75036bac0 100644 --- a/include/algorithms/public/Envelope.hpp +++ b/include/algorithms/public/Envelope.hpp @@ -33,23 +33,24 @@ class Envelope mInitialized = true; } - double processSample(const double in, - double floor, index fastRampUpTime, index slowRampUpTime, - index fastRampDownTime, index slowRampDownTime, - double hiPassFreq) + double processSample(const double in, double floor, index fastRampUpTime, + index slowRampUpTime, index fastRampDownTime, + index slowRampDownTime, double hiPassFreq) { using namespace std; assert(mInitialized); mFastSlide.updateCoeffs(fastRampUpTime, fastRampDownTime); mSlowSlide.updateCoeffs(slowRampUpTime, slowRampDownTime); - double filtered = in; + if (std::isfinite(in)) mPrevValid = in; + double filtered = mPrevValid; if (hiPassFreq != mHiPassFreq) { initFilters(hiPassFreq); mHiPassFreq = hiPassFreq; } - if (mHiPassFreq > 0){ - filtered = mHiPass2.processSample(mHiPass1.processSample(in)); + if (mHiPassFreq > 0) + { + filtered = mHiPass2.processSample(mHiPass1.processSample(filtered)); } double rectified = abs(filtered); double dB = 20 * log10(rectified); @@ -70,6 +71,7 @@ class Envelope double mHiPassFreq{0}; bool mInitialized{false}; + double mPrevValid{0}; ButterworthHPFilter mHiPass1; ButterworthHPFilter mHiPass2; diff --git a/include/algorithms/public/EnvelopeGate.hpp b/include/algorithms/public/EnvelopeGate.hpp index ab18bc75b..490fecdb8 100644 --- a/include/algorithms/public/EnvelopeGate.hpp +++ b/include/algorithms/public/EnvelopeGate.hpp @@ -29,13 +29,12 @@ class EnvelopeGate public: EnvelopeGate(index maxSize, Allocator& alloc = FluidDefaultAllocator()) - : mInputBuffer(maxSize, alloc), - mOutputBuffer(maxSize, alloc) + : mInputBuffer(maxSize, alloc), mOutputBuffer(maxSize, alloc) {} void init(double onThreshold, double offThreshold, double hiPassFreq, - index minTimeAboveThreshold, index upwardLookupTime, - index minTimeBelowThreshold, index downwardLookupTime) + index minTimeAboveThreshold, index upwardLookupTime, + index minTimeBelowThreshold, index downwardLookupTime) { using namespace std; @@ -44,8 +43,8 @@ class EnvelopeGate mMinTimeBelowThreshold = minTimeBelowThreshold, mDownwardLookupTime = downwardLookupTime; mDownwardLatency = max(minTimeBelowThreshold, mDownwardLookupTime); - mLatency = max( - mMinTimeAboveThreshold + mUpwardLookupTime, mDownwardLatency); + mLatency = max(mMinTimeAboveThreshold + mUpwardLookupTime, + mDownwardLatency); if (mLatency < 0) mLatency = 1; assert(mLatency <= mInputBuffer.size()); mHiPassFreq = hiPassFreq; @@ -63,22 +62,23 @@ class EnvelopeGate } double processSample(const double in, double onThreshold, double offThreshold, - index rampUpTime, index rampDownTime, double hiPassFreq, - index minEventDuration, index minSilenceDuration) + index rampUpTime, index rampDownTime, double hiPassFreq, + index minEventDuration, index minSilenceDuration) { using namespace std; assert(mInitialized); mSlide.updateCoeffs(rampUpTime, rampDownTime); - double filtered = in; + if (std::isfinite(in)) mPrevValid = in; + double filtered = mPrevValid; if (hiPassFreq != mHiPassFreq) { initFilters(hiPassFreq); mHiPassFreq = hiPassFreq; } if (mHiPassFreq > 0) - filtered = mHiPass2.processSample(mHiPass1.processSample(in)); + filtered = mHiPass2.processSample(mHiPass1.processSample(filtered)); double rectified = abs(filtered); double dB = 20 * log10(rectified); @@ -122,7 +122,7 @@ class EnvelopeGate { index onsetIndex = refineStart(mWriteHead - mMinTimeAboveThreshold - mUpwardLookupTime, - mUpwardLookupTime); + mUpwardLookupTime); index blockSize = mWriteHead > onsetIndex ? mWriteHead - onsetIndex @@ -248,19 +248,14 @@ class EnvelopeGate mOnStateCount = 0; mOffStateCount = 1; } - else if (mInputState && nextState) - { - mOnStateCount++; - } - else if (!mInputState && !nextState) - { - mOffStateCount++; - } + else if (mInputState && nextState) { mOnStateCount++; } + else if (!mInputState && !nextState) { mOffStateCount++; } } index mLatency; index mFillCount; double mHiPassFreq{0}; + double mPrevValid{0}; index mMinTimeAboveThreshold{440}; index mDownwardLookupTime{10};