Exponential Averaging for Signal and Noise Level for IPW2200

Bill Moss
April 2, 2006

April 2, 2006

The patch discussed in this article was incorporated in ipw2200-1.1.2.


The purpose of this note is to examine alternative models for reporting the wireless statistics for signal and noise level for ipw2200-1.1.1. Thanks to Jean Tourrilhes for suggesting that I look at exponential averaging.

Users typically encouner wireless statistics when using the wireless tools. For example,

iwconfig eth1

IEEE 802.11b  ESSID:"mosswap"
Mode:Managed  Frequency:2.437 GHz  Access Point: 00:01:24:F0:40:5A
Bit Rate=11 Mb/s   Tx-Power=20 dBm
Retry limit:7   RTS thr:off   Fragment thr:off
Encryption key:****-****-****-****-****-****-**   Security mode:open
Power Management:off
Link Quality=69/100  Signal level=-55 dBm  Noise level=-82 dBm
Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
Tx excessive retries:0  Invalid misc:0   Missed beacon:1

IPW2200 Signal and Noise Level

If an access point is in range, the ipw2200 driver will process about 10 beacon packets per second producing unsigned 8 bit integer values for noise level. This happens even when the driver is not associated with an access point. On the other hand, when associated the driver collects one value for signal level about every three seconds. Sliding averages of the 8 most recent values for noise and signal level are maintained by ipw2200-1.1.1. These sliding averages are reported by iwconfig as 'Signal level' and 'Noise level.'

We propose to replace sliding averaging by exponential averaging. Both methods are used to smooth streams of data. Exponential averaging has better temporal characteristics, giving more weight to recent samples. Coding is much simpler and less memory and CPU are required.

Here is a code segment from my patched ipw2200.c which uses the model for exponential averaging presented in the RC filtering article discussed below.

  #define DEPTH_RSSI 8
  #define DEPTH_NOISE 16
  static s16 exponential_average(s16 prev_avg, s16 val, u8 depth)
          return ((depth-1)*prev_avg +  val)/depth;

The division by depth is more efficient if the depth is a power of 2.

Exponential Averaging and RC Filtering

The following article is a good a reference for exponential averaging. This article shows the connections between exponential averaging and RC low pass filtering.


  Data Smoothing: RC Filtering and Exponential Averaging

After some experimentation, I have chosen the DEPTH values



Financial Management

The financial management community also uses exponential averaging. The following article is a good reference.


  Trend Indicator: Exponential Moving Average

In financial management, the model for the n-day exponential moving average (EMA) is

  EMA(t) = ( (n-1)*EMA(t-1) + 2*P(t) )/(n+1)


  n is the number of days used in the average
  EMA(t) is the exponential moving average on day t
  P(t) is the closing price on day t

Model Comparison

Comparing these two ways to represent the exponential moving average, we see that

  DEPTH = (n+1)/2

Comparing the two models for noise level, we have

  16 = DEPTH_NOISE = (n+1)/2  => n = 31

That is, from the financial management perspective, we are averaging 31 noise level samples.

Comparing the two models for signal level, we have

   8 = DEPTH_RSSI = (n+1)/2  => n = 15

That is, from the financial management perspective, we are averaging 15 signal level samples.

Associated Average Noise Level

Here is some interesting noise level data collected in a low noise environment.

  Type of Average               Average Noise

  Sliding averaging                -83 dBm

  Exponential averaging            -86 dBm

The memory requirement and computation load is reduced when using exponential averaging. This reduced load seems to have a good effect on average noise.


The following patch to ipw2200.[ch] implements the above change of averaging method.