Reply by jai....@gmail.com November 6, 20072007-11-06
That was an excellent explanation, thanks!

 I changed the alpha parameter to my tap size (1024), and then reduced
the Mu parameter to around 2^-10, and it works perfectly!

J

On Nov 6, 11:48 am, emeb <ebromba...@gmail.com> wrote:
> On Nov 5, 7:24 pm, "jai.d...@gmail.com" <jai.d...@gmail.com> wrote: > > > > > I'm running into difficulty implementing the NLMS algorithm, w.r.t. > > step size.. > > > I'm using Matlab to model the algorithm, and here is the core of the > > calculation to update the tap weights: > > > nlms_coeff = af_parms.mu/pwr(i) * en; > > af_parms.state.weights = af_parms.state.weights + xn .* nlms_coeff; > > > - pwr(i) is the calculated signal power for sample 'i' > > - xn is the data samples used for 'L' taps (1024 in this case). > > - I am using step-size of 0.2 > > > Now, the problem arises when I change how pwr(i) is calculated. > > > If I use pwr(i) = xn' * xn , which is essentially the sum of squared > > elements, the algorithm works perfectly. > > > I want to use a power estimate however, described in TI's application > > note spra063.pdf. This uses an IIR filter of the form: > > > pwr(i) = (1-alpha_s)*pwr(i-1) + alpha_s*(wave_src(i)^2); > > > where alpha_s = short-term time constant 1/128, and wave_src(i) is the > > current input sample. > > > If I use this method for pwr(i), the algorithm blows up and spits out > > garbage (really large values). I tried dropping the step size from 0.2 > > to 2^-10, and that didn't seem to make a difference. > > > Plotting the two methods of calculating pwr against eachother, they > > seem to follow the same trend, however the power 'estimate' is > > definitely scaled down by a factor of around 1000. I tried taking this > > into account in adjusting the weights, howevre, it still does not > > work. > > > Any ideas? > > The canonical form of Normalized LMS (NLMS) scales the stepsize by the > power of the tap-input vector to keep the adaptation bandwidth > constant across variations in the input signal, which is exactly what > you're doing when you use xn' * xn. Doing a dot product on a 1024 > element vector is computationally expensive though, so you'd like to > find a simpler way to estimate power. > > When you use the TI power approximation with a simple mag^2 and IIR > filter, you have to choose the alpha_s time constant to constrain the > power calculation to a time period equivalent to the length of the tap- > input vector. Otherwise, you risk discarding the contribution of some > elements, or allowing an influence from elements beyond the current > set. Also, you note a scale difference between the dot product and the > square/filter technique which will certainly affect the value of > af_parms.mu which you use for the two approaches. > > EB
Reply by emeb November 6, 20072007-11-06
On Nov 5, 7:24 pm, "jai.d...@gmail.com" <jai.d...@gmail.com> wrote:
> I'm running into difficulty implementing the NLMS algorithm, w.r.t. > step size.. > > I'm using Matlab to model the algorithm, and here is the core of the > calculation to update the tap weights: > > nlms_coeff = af_parms.mu/pwr(i) * en; > af_parms.state.weights = af_parms.state.weights + xn .* nlms_coeff; > > - pwr(i) is the calculated signal power for sample 'i' > - xn is the data samples used for 'L' taps (1024 in this case). > - I am using step-size of 0.2 > > Now, the problem arises when I change how pwr(i) is calculated. > > If I use pwr(i) = xn' * xn , which is essentially the sum of squared > elements, the algorithm works perfectly. > > I want to use a power estimate however, described in TI's application > note spra063.pdf. This uses an IIR filter of the form: > > pwr(i) = (1-alpha_s)*pwr(i-1) + alpha_s*(wave_src(i)^2); > > where alpha_s = short-term time constant 1/128, and wave_src(i) is the > current input sample. > > If I use this method for pwr(i), the algorithm blows up and spits out > garbage (really large values). I tried dropping the step size from 0.2 > to 2^-10, and that didn't seem to make a difference. > > Plotting the two methods of calculating pwr against eachother, they > seem to follow the same trend, however the power 'estimate' is > definitely scaled down by a factor of around 1000. I tried taking this > into account in adjusting the weights, howevre, it still does not > work. > > Any ideas?
The canonical form of Normalized LMS (NLMS) scales the stepsize by the power of the tap-input vector to keep the adaptation bandwidth constant across variations in the input signal, which is exactly what you're doing when you use xn' * xn. Doing a dot product on a 1024 element vector is computationally expensive though, so you'd like to find a simpler way to estimate power. When you use the TI power approximation with a simple mag^2 and IIR filter, you have to choose the alpha_s time constant to constrain the power calculation to a time period equivalent to the length of the tap- input vector. Otherwise, you risk discarding the contribution of some elements, or allowing an influence from elements beyond the current set. Also, you note a scale difference between the dot product and the square/filter technique which will certainly affect the value of af_parms.mu which you use for the two approaches. EB
Reply by jai....@gmail.com November 5, 20072007-11-05
I'm running into difficulty implementing the NLMS algorithm, w.r.t.
step size..

I'm using Matlab to model the algorithm, and here is the core of the
calculation to update the tap weights:

nlms_coeff = af_parms.mu/pwr(i) * en;
af_parms.state.weights = af_parms.state.weights +  xn .* nlms_coeff;

- pwr(i) is the calculated signal power for sample 'i'
- xn is the data samples used for 'L' taps (1024 in this case).
- I am using step-size of 0.2

Now, the problem arises when I change how pwr(i) is calculated.

If I use pwr(i) = xn' * xn , which is essentially the sum of squared
elements, the algorithm works perfectly.

I want to use a power estimate however, described in TI's application
note spra063.pdf. This uses an IIR filter of the form:

pwr(i) = (1-alpha_s)*pwr(i-1) + alpha_s*(wave_src(i)^2);

where alpha_s = short-term time constant 1/128, and wave_src(i) is the
current input sample.

If I use this method for pwr(i), the algorithm blows up and spits out
garbage (really large values). I tried dropping the step size from 0.2
to 2^-10, and that didn't seem to make a difference.

Plotting the two methods of calculating pwr against eachother, they
seem to follow the same trend, however the power 'estimate' is
definitely scaled down by a factor of around 1000. I tried taking this
into account in adjusting the weights, howevre, it still does not
work.

Any ideas?