diff --git a/radio/interpolation/Farrow.hpp b/radio/interpolation/Farrow.hpp index 10d30c2..baff21c 100644 --- a/radio/interpolation/Farrow.hpp +++ b/radio/interpolation/Farrow.hpp @@ -22,7 +22,7 @@ namespace Interpolation // [unknown date], Fred Harris, Signal Processing ChairCommunication Systems and Signal Processing Institute // College of Engineering, San Diego State University, San Diego, CA 92182-0190 USA // -------------------------------------------------------------- -class Farrow : public FirComplex +class Farrow { typedef struct _ml_farrow_coef_hdr_t { @@ -32,7 +32,7 @@ class Farrow : public FirComplex public: Farrow(uint32_t M=0, uint32_t N=0) - : FirComplex(N) + : m_fir(N) , m_M(M) , m_N(N) , m_w(0) @@ -40,7 +40,6 @@ public: , m_coeff(N, M) , m_b(M) , m_h(M) - , m_fifo(N) , m_bufferIn(8*1024) , m_bufferOut(8*1024) { @@ -54,39 +53,28 @@ public: void init(uint32_t M, uint32_t N) { - FirComplex::setNumTaps(N); + m_fir.setNumTaps(N); m_M = M; m_N = N; m_coeff.resize(N, M); m_b.resize(M); m_h.resize(M); - m_fifo.resize(N); - m_fifo = ComplexScalar(0,0); // m_bufferIn.fill(ComplexScalar(0,0)); // m_bufferOut.fill(ComplexScalar(0,0)); } + size_t feed(CVec const &x, uint32_t size=1) + { + return m_bufferIn.write(x.data(), size); + } + size_t feed(ComplexScalar const *x, uint32_t size=1) { - m_w = (m_w + size) % m_N; - m_fifo[m_w] = *x; return m_bufferIn.write(x, size); } - bool process_new(TimingGenerator &timingGenerator) + void process(TimingGenerator &timingGenerator) { -#if 0 - while(m_bufferIn.len()) - { - ComplexScalar xout; - m_bufferIn.consume(1); - m_bufferIn.read(&xout, 1, false); - m_bufferOut.write(&xout, 1); - std::cout << "xout: " << xout << std::endl; - }; - std::cout << "----- SKIP -----" << std::endl; - -#else while(true) { size_t adv = timingGenerator.getAdv(); @@ -99,12 +87,12 @@ public: if (adv != 0) { - FirComplex::feed(m_bufferIn, adv); + m_fir.feed(m_bufferIn, adv); // Partial filter responses for (int i=0; i < m_M; i++) { - m_h[i] = FirComplex::processReal(column(m_coeff, i)); + m_h[i] = m_fir.processReal(column(m_coeff, i)); } } // Combine @@ -114,42 +102,8 @@ public: timingGenerator.process(yout); } -#endif - return true; } - ComplexScalar process(RealScalar mu, uint32_t pop) - { - uint32_t i, r; - int32_t j; - - m_r = (m_r + pop) % m_N; - - if (pop) - { - r = m_r; - j = m_N-1; - while(r < m_N) - { - m_state[j--] = m_fifo[r++]; - } - r = 0; - while(j >= 0) - { - m_state[j--] = m_fifo[r++]; - } - } - - // Partial filter responses - for (i=0; i < m_M; i++) - { - m_h[i] = FirComplex::processReal(column(m_coeff, i)); - } - - // Combine - return horner(mu); - } - void load(const char *pFilename) { int i, j; @@ -198,6 +152,7 @@ public: } private: + FirComplex m_fir; uint32_t m_M; uint32_t m_N; uint32_t m_r; @@ -205,10 +160,8 @@ private: RMat m_coeff; CVec m_b; CVec m_h; - CVec m_fifo; Processor::Buffer m_bufferIn; Processor::Buffer m_bufferOut; - TimingGenerator m_timing; ComplexScalar horner(RealScalar mu) {