SDR / WiFi / gr-ieee802-11

During the last week, I worked on the GNU Radio WiFi transceiver gr-ieee802-11 and implemented some features that were on my todo list for quite some time. Since the performance is really good now, I wanted to share my excitement and give some details about the changes.

Interface for Channel Estimation Algorithms

The initial version only came with a proof-of-concept channel estimation algorithm, which interpolated linearly based on the comb pilots. This algorithm is especially bad when using a N210 with a sampling rate of 20MHz as for IEEE 802.11a channels. The problem is that at this sampling rate the N210 has an uncompensated filter and the spectral shape is sinc like. Linear interpolation obviously fails in this case.

Since I assume that channel estimation is the thing where most people want to play with, I implemented a generic interface where people can plugin their stuff. Of course, it’s now also possible to use the long training sequence to get an initial estimate of the channel.

LMS Estimator

Having this generic interface, I implemented the LMS estimator as a first simple algorithm. With LMS the performance increased considerably. However, I also kept the linear interpolator to show how the algorithms can be changed on the fly. To give an idea of the receivers current state, I made a small video in my office, where I receive frames from a Atheros card. In the video I change the modulation and the channel bandwidth.

Long Frames

Andre Puschmann from Ilmenau worked on the maximum frame size. The transceiver had some strange limitations, mainly since the buffers of GNU Radios Tagged Stream blocks were not adjusted properly. Andre figured this out and now we can send and receive 1500 byte frames with any modulation. Very cool!

Short Frames

Initially, the receiver blindly copied a fixed number of samples into the flow graph once a frame was detected. This caused problems with very short frames sent, right after the other, like for example with RTS/CTS. In the current version, the synchronization block always looks for new frames and marks their start with a tag so that subsequent blocks can decode them.

I hope you give new version a try and let me know how it works for you. Have fun!