Hi all,

I'm implementing a NLMS filtering code and I'd like to confirm if I'm doing the right thing.

I'm evaluating the basic iterative equations (boldface for vectors, ^T for transposition, L for the order and n the iterations):

**w**(n) = **w**(n-1) + mu * **x**(n)^T * e(n)

e(n) = d(n) -** ****x**(n)***w**(n-1)

**x**(n) = [x(n) x(n-1) ... x(n-L+1)]^T

by means of a for-loop that goes from n=L until n=length(d), after initializing all variables with zeros.

My supposition is that the first computation of **x**(n) occurs when n=L. Is it correct?

Also, I was wondering if I should initialize the error vector with:

e(1:L-1) = d(1:L-1) -> the change I probably have to make

instead of

e(1:L-1) = 0 -> the way my code currently works

Any help is appreciated.

Thanks in advance.

Best regards,

Artur

I typically do this the other way around, i.e.

**x**(n) = [x(n) x(n-1) ... x(n-L+1)]^T

e(n) = d(n) -** ****x**(n)***w**(n)

**w**(n+1) = **w**(n) + mu * **x**(n)^T * e(n)

Then there is no need to initialise the error vector.

You can wait for n to equal L but it shouldn't be necessary.

Thanks for your feedback, andrewstanfordjason.

Considering the sequence of equations that you proposed, what is the range for n?

Are you asking if n starts at zero? If so then yes. I would typically define negative x(i) = 0 (i.e. initialise **x**(0) to be zero)

In this case, I'm implementing NLMS.

So mu = mu0 / (epsilon + var(u)*L),

where var(u) is the input signal variance, L is the order and epsilon is the regularization parameter (I set it as equal to 0.1).

Okay, very good. A different formulation that I haven't seen: variance in place of inner-product of tap input vector.