diff --git a/include/algorithms/public/CepstrumF0.hpp b/include/algorithms/public/CepstrumF0.hpp index 4b0df471f..a6bc5e62d 100644 --- a/include/algorithms/public/CepstrumF0.hpp +++ b/include/algorithms/public/CepstrumF0.hpp @@ -32,8 +32,11 @@ class CepstrumF0 void init(index size) { - // avoid allocation of maxSize^2 at constructor - mDCT = DCT(size, size); + // avoid allocation of maxSize^2 at constructor, but don't reallocate if not needed + + if (mDCT.maxOutputSize() < size || mDCT.maxInputSize() < size) + mDCT = DCT(size, size); + mDCT.init(size, size); mCepstrum = mCepstrumStorage.segment(0, size); diff --git a/include/algorithms/public/DCT.hpp b/include/algorithms/public/DCT.hpp index aad0e21c1..4d8e4d82f 100644 --- a/include/algorithms/public/DCT.hpp +++ b/include/algorithms/public/DCT.hpp @@ -28,6 +28,8 @@ class DCT using MatrixXd = Eigen::MatrixXd; DCT(index maxInputSize, index maxOutputSize) + : mMaxInputSize(maxInputSize) + , mMaxOutputSize(maxOutputSize) { mTableStorage = MatrixXd::Zero(maxOutputSize, maxInputSize); } @@ -36,6 +38,11 @@ class DCT { using namespace std; assert(inputSize >= outputSize); + assert(inputSize <= mMaxInputSize); + assert(outputSize <= mMaxOutputSize); + // Exit if already initialised + if (mInputSize == inputSize && mOutputSize == outputSize) + return; mInputSize = inputSize; mOutputSize = outputSize; mTable = mTableStorage.block(0, 0, mOutputSize, mInputSize); @@ -61,8 +68,14 @@ class DCT { output = (mTable * input.matrix()).array(); } - index mInputSize{40}; - index mOutputSize{13}; + + index maxInputSize() const { return mMaxInputSize; } + index maxOutputSize() const { return mMaxOutputSize; } + + index mInputSize{0}; + index mOutputSize{0}; + index mMaxInputSize{0}; + index mMaxOutputSize{0}; MatrixXd mTable; MatrixXd mTableStorage; }; diff --git a/include/clients/rt/PitchClient.hpp b/include/clients/rt/PitchClient.hpp index 477ec5b97..d7255da5b 100644 --- a/include/clients/rt/PitchClient.hpp +++ b/include/clients/rt/PitchClient.hpp @@ -150,7 +150,7 @@ class PitchClient : public FluidBaseClient, public AudioIn, public ControlOut return { get().winSize(), get().hopSize() }; } - void reset() + void reset() { mSTFTBufferedProcess.reset(); cepstrumF0.init(get().frameSize());