/* StageProcFPU.h Copyright (c) 2005 Laurent de Soras Template parameters: - REMAINING: Number of remaining coefficients to process, >= 0 --- Legal stuff --- This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it and/or modify it under the terms of the Do What The Fuck You Want To Public License, Version 2, as published by Sam Hocevar. See http://sam.zoy.org/wtfpl/COPYING for more details. */ #pragma once namespace hiir { template class StageProcFPU { public: static inline void process_sample_pos (const int nbr_coefs, T &spl_0, T &spl_1, const T coef [], T x [], T y []); static inline void process_sample_neg (const int nbr_coefs, T &spl_0, T &spl_1, const T coef [], T x [], T y []); private: StageProcFPU(); StageProcFPU(const StageProcFPU &other); StageProcFPU& operator = (const StageProcFPU &other); bool operator == (const StageProcFPU &other); bool operator != (const StageProcFPU &other); }; // class StageProcFPU template <> inline void StageProcFPU <1, double>::process_sample_pos (const int nbr_coefs, double &spl_0, double &/*spl_1*/, const double coef [], double x [], double y []) { const int last = nbr_coefs - 1; const double temp = (spl_0 - y [last]) * coef [last] + x [last]; x [last] = spl_0; y [last] = temp; spl_0 = temp; } template <> inline void StageProcFPU <0, double>::process_sample_pos (const int /*nbr_coefs*/, double &/*spl_0*/, double &/*spl_1*/, const double /*coef*/ [], double /*x*/ [], double /*y*/ []) { // Nothing (stops recursion) } template <> inline void StageProcFPU <1, float>::process_sample_pos (const int nbr_coefs, float &spl_0, float &/*spl_1*/, const float coef [], float x [], float y []) { const int last = nbr_coefs - 1; const float temp = (spl_0 - y [last]) * coef [last] + x [last]; x [last] = spl_0; y [last] = temp; spl_0 = temp; } template <> inline void StageProcFPU <0, float>::process_sample_pos (const int /*nbr_coefs*/, float &/*spl_0*/, float &/*spl_1*/, const float /*coef*/ [], float /*x*/ [], float /*y*/ []) { // Nothing (stops recursion) } template void StageProcFPU ::process_sample_pos (const int nbr_coefs, T &spl_0, T &spl_1, const T coef [], T x [], T y []) { const int cnt = nbr_coefs - REMAINING; const T temp_0 = (spl_0 - y [cnt + 0]) * coef [cnt + 0] + x [cnt + 0]; const T temp_1 = (spl_1 - y [cnt + 1]) * coef [cnt + 1] + x [cnt + 1]; x [cnt + 0] = spl_0; x [cnt + 1] = spl_1; y [cnt + 0] = temp_0; y [cnt + 1] = temp_1; spl_0 = temp_0; spl_1 = temp_1; StageProcFPU ::process_sample_pos ( nbr_coefs, spl_0, spl_1, &coef [0], &x [0], &y [0] ); } template <> inline void StageProcFPU <1, double>::process_sample_neg (const int nbr_coefs, double &spl_0, double &/*spl_1*/, const double coef [], double x [], double y []) { const int last = nbr_coefs - 1; const double temp = (spl_0 + y [last]) * coef [last] - x [last]; x [last] = spl_0; y [last] = temp; spl_0 = temp; } template <> inline void StageProcFPU <0, double>::process_sample_neg (const int /*nbr_coefs*/, double &/*spl_0*/, double &/*spl_1*/, const double /*coef*/ [], double /*x*/ [], double /*y*/ []) { // Nothing (stops recursion) } template <> inline void StageProcFPU <1, float>::process_sample_neg (const int nbr_coefs, float &spl_0, float &/*spl_1*/, const float coef [], float x [], float y []) { const int last = nbr_coefs - 1; const float temp = (spl_0 + y [last]) * coef [last] - x [last]; x [last] = spl_0; y [last] = temp; spl_0 = temp; } template <> inline void StageProcFPU <0, float>::process_sample_neg (const int /*nbr_coefs*/, float &/*spl_0*/, float &/*spl_1*/, const float /*coef*/ [], float /*x*/ [], float /*y*/ []) { // Nothing (stops recursion) } template void StageProcFPU ::process_sample_neg (const int nbr_coefs, T &spl_0, T &spl_1, const T coef [], T x [], T y []) { const int cnt = nbr_coefs - REMAINING; const T temp_0 = (spl_0 + y [cnt + 0]) * coef [cnt + 0] - x [cnt + 0]; const T temp_1 = (spl_1 + y [cnt + 1]) * coef [cnt + 1] - x [cnt + 1]; x [cnt + 0] = spl_0; x [cnt + 1] = spl_1; y [cnt + 0] = temp_0; y [cnt + 1] = temp_1; spl_0 = temp_0; spl_1 = temp_1; StageProcFPU ::process_sample_neg ( nbr_coefs, spl_0, spl_1, &coef [0], &x [0], &y [0] ); } } // namespace hiir