Block processing adaptative notch filter

HernĂ¡n Ordiales December 17, 2010 Coded in C++

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];
				r[n] = ref[i-L];
			acum += wn[n]*r[n]; // interference estimation
		if (k<L)
			out[k] = _oldIn[k]-acum; // ECG signal estimation
			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;