From d4e9070508ca6f1ecb12123111cd90b1d39c767e Mon Sep 17 00:00:00 2001 From: Jens Ahrensfeld Date: Mon, 22 Dec 2014 17:36:46 +0000 Subject: [PATCH] - added Upsampler git-svn-id: http://moon:8086/svn/software/trunk/libsrc/cpp@106 b431acfa-c32f-4a4a-93f1-934dc6c82436 --- radio/Interpolation.hpp | 100 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 93 insertions(+), 7 deletions(-) diff --git a/radio/Interpolation.hpp b/radio/Interpolation.hpp index 172a970..4ddaa48 100644 --- a/radio/Interpolation.hpp +++ b/radio/Interpolation.hpp @@ -83,12 +83,12 @@ public: j = m_N-1; while(r < m_N) { - m_x[j--] = m_fifo[r++]; + m_state[j--] = m_fifo[r++]; } r = 0; while(j >= 0) { - m_x[j--] = m_fifo[r++]; + m_state[j--] = m_fifo[r++]; } } @@ -137,7 +137,7 @@ public: m_coeff(j,i) = pCoeff[j]; } } - printf("Farrow filter coefficients loaded (M=%d, N=%d)", m_M, m_N); + printf("Farrow filter coefficients loaded (M=%d, N=%d)\n", m_M, m_N); delete [] pCoeff; fclose(pFile); @@ -235,12 +235,12 @@ public: j = m_N-1; while(r < m_N) { - m_x[j--] = m_fifo[r++]; + m_state[j--] = m_fifo[r++]; } r = 0; while(j >= 0) { - m_x[j--] = m_fifo[r++]; + m_state[j--] = m_fifo[r++]; } } @@ -256,7 +256,7 @@ private: CVec m_fifo; }; -class DownSampler : public FirComplex +class DownSampler { public: DownSampler() @@ -304,7 +304,10 @@ public: j=0; for (i=stage; i < N; i += M) { - m_pCoeff[stage](j++) = coeff[i]; + if (coeff) + { + m_pCoeff[stage](j++) = coeff[i]; + } } } m_M = M; @@ -346,6 +349,89 @@ private: uint32_t m_currStage; }; + +class UpSampler +{ +public: + UpSampler() + : m_pFir(nullptr) + , m_pCoeff(nullptr) + , m_L(0) + { + + } + ~UpSampler() + { + if (m_pFir) + delete [] m_pFir; + + if (m_pCoeff) + delete [] m_pCoeff; + + } + void init(uint32_t L, RealScalar const *coeff, uint32_t N) + { + uint32_t i, j; + uint32_t stage_N; + uint32_t stage; + + if (m_pFir) + delete [] m_pFir; + + if (m_pCoeff) + delete [] m_pCoeff; + + m_pFir = new FirComplex[L]; + m_pCoeff = new RVec[L]; + + for (stage=0; stage < L; stage++) + { + stage_N = 0; + for (i=L-stage-1; i < N; i += L) + { + stage_N++; + } + m_pFir[stage].setNumTaps(stage_N); + m_pCoeff[stage].resize(stage_N); + + j=0; + for (i=L-stage-1; i < N; i += L) + { + if (coeff) + { + m_pCoeff[stage](j++) = coeff[i]; + } + } + } + m_L = L; + } + + uint32_t process(CVec &dst, CVec const &src, uint32_t len) + { + uint32_t i; + uint32_t j; + uint32_t currStage; + + j = 0; + for (i=0; i < len; i++) + { + for (currStage=0; currStage < m_L; currStage++) + { + m_pFir[currStage].feed(src(i)); + dst(m_L-1-currStage+j) = m_pFir[currStage].processReal(m_pCoeff[currStage]); + } + j += m_L; + } + return j; + } + +private: + FirComplex *m_pFir; + RVec *m_pCoeff; + uint32_t m_L; + +}; + } // Radio::Interpolation } // ::Radio