Block processing adaptative notch filter
Block processing implementation for an adaptative notch filter that uses the Steepest Descent algorithm.
Source code snippet is for CLAM framework, but the core processing uses standard vectors.
bool Do(const Audio& input, const Audio& reference, Audio& output)
{
const unsigned size = input.GetSize();
const DataArray& in = input.GetBuffer();
const DataArray& ref = reference.GetBuffer();
DataArray& out = output.GetBuffer();
const unsigned M = mConfig.GetFilterLength();
const TData mu = mConfig.GetStep();
const unsigned L = M-1;
std::vector<TData> &wn = _filterCoef;
TData r[M];
for (unsigned k=0;k<size;k++)
{
TData acum = 0.;
for (unsigned n=0, i=k;n<M;n++,i++)
{
if (i<L)
r[n] = _oldRef[i];
else
r[n] = ref[i-L];
acum += wn[n]*r[n]; // interference estimation
}
if (k<L)
out[k] = _oldIn[k]-acum; // ECG signal estimation
else
out[k] = in[k-L]-acum; // ECG signal estimation
for (unsigned n=0;n<M;n++) wn[n]+=mu*r[n]*out[k]; // new filter taps
}
for (unsigned k=0;k<L;k++)
{
_oldRef[k] = ref[size-L+k];
_oldIn[k] = in[size-L+k];
}
return true;
}