36 #ifndef DSPFILTERS_SMOOTHEDFILTER_H
37 #define DSPFILTERS_SMOOTHEDFILTER_H
48 template <
class DesignClass,
50 class StateType = DirectFormII>
60 : m_transitionSamples (transitionSamples)
61 , m_remainingSamples (-1)
66 template <
typename Sample>
67 void processBlock (
int numSamples,
68 Sample*
const* destChannelArray)
70 const int numChannels = this->getNumChannels();
73 assert (m_remainingSamples >= 0);
76 int remainingSamples = std::min (m_remainingSamples, numSamples);
78 if (remainingSamples > 0)
81 const double t = 1. / m_remainingSamples;
82 double dp[maxParameters];
83 for (
int i = 0; i < DesignClass::NumParams; ++i)
84 dp[i] = (this->getParams()[i] - m_transitionParams[i]) * t;
86 for (
int n = 0; n < remainingSamples; ++n)
88 for (
int i = DesignClass::NumParams; --i >=0;)
89 m_transitionParams[i] += dp[i];
91 m_transitionFilter.setParams (m_transitionParams);
93 for (
int i = numChannels; --i >= 0;)
95 Sample* dest = destChannelArray[i]+n;
96 *dest = this->m_state[i].process (*dest, m_transitionFilter);
100 m_remainingSamples -= remainingSamples;
102 if (m_remainingSamples == 0)
103 m_transitionParams = this->getParams();
107 if (numSamples - remainingSamples > 0)
110 for (
int i = 0; i < numChannels; ++i)
111 this->m_design.process (numSamples - remainingSamples,
112 destChannelArray[i] + remainingSamples,
117 void process (
int numSamples,
float*
const* arrayOfChannels)
119 processBlock (numSamples, arrayOfChannels);
122 void process (
int numSamples,
double*
const* arrayOfChannels)
124 processBlock (numSamples, arrayOfChannels);
128 void doSetParams (
const Params& parameters)
130 if (m_remainingSamples >= 0)
132 m_remainingSamples = m_transitionSamples;
137 m_remainingSamples = 0;
138 m_transitionParams = parameters;
141 filter_type_t::doSetParams (parameters);
145 Params m_transitionParams;
146 DesignClass m_transitionFilter;
147 int m_transitionSamples;
149 int m_remainingSamples;