From aa45dcbd178e5b7fe85a5df2b11eb41e5168bc7f Mon Sep 17 00:00:00 2001 From: f4exb Date: Mon, 10 Oct 2016 02:08:48 +0200 Subject: [PATCH] Add an interpolate method to the Interpolator class --- sdrbase/dsp/interpolator.h | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/sdrbase/dsp/interpolator.h b/sdrbase/dsp/interpolator.h index cdd7055ef..1ce9da83d 100644 --- a/sdrbase/dsp/interpolator.h +++ b/sdrbase/dsp/interpolator.h @@ -35,6 +35,24 @@ public: return true; } + // interpolation works nearly the same way + bool interpolate(Real *distance, const Complex& next, Complex* result) + { + *distance -= 1.0; + + if (*distance < 1.0) // use sample + { + advanceFilter(next); + doInterpolate((int) floor(*distance * (Real)m_phaseSteps), result); + return true; // need new input sample and increment distance + } + else // use zero + { + advanceFilter(); + doInterpolate((int) floor(*distance * (Real)m_phaseSteps), result); + return false; // input sample was not used and do not increment distance + } + } private: float* m_taps; @@ -56,6 +74,15 @@ private: m_samples[m_ptr] = next; } + void advanceFilter() + { + m_ptr--; + if(m_ptr < 0) + m_ptr = m_nTaps - 1; + m_samples[m_ptr].real(0.0); + m_samples[m_ptr].imag(0.0); + } + void doInterpolate(int phase, Complex* result) { if (phase < 0)