A Little Background on Pre-Cog

For those of you who are not familiar with the work…  I developed a GNU Radio library called pre-cog in this past Fall.  This was originally prepared for a tutorial on cognitive radio at DySPAN 2012.  The pre-cog framework was built as a demonstration of a few capabilities of GNU Radio and the Ettus Research USRP.  Some of these capabilities:

SDR Pre-Cog

Software-Based Packet Radio with GNU Radio, gr-extras, and my framework, “pre-cog”

  1. USRP Timed-commands and tuning functionality (useful for  things like frequency hopping)
  2. Timed-streaming with
  3. GNU Radio  – Stream-tags
  4. GNU Radio – Python blocks
  5. GNU Radio – Async. Message Passing

In short, I was trying to show that it is possible to implement both PHY and MAC functions within GNU Radio, while taking advantage of advanced driver features of the USRP family.  Some would argue that MAC functions don’t belong in GNU Radio.  On some occasions I might agree.  However, I still think there is some value to integrating this in GNU Radio, and in-turn, GNU Radio Companion.  The main appeal is the ability to modify things in a graphical environment, which makes it easy for students and tinkerers to experiment with different access schemes (CSMA, TDMA, FHSS, etc), physical layer designs, and MAC-layer functions.  Essentially, I’d like to create PHY/MAC  “Legos”.

What it looks like now…

I did my best to modularize my blocks, but include enough functionality in each block to create clean and easy-to-understand applications.  The simplest example is a half-duplex, single-carrier CSMA radio with ARQ.  This can be seen in this video:

There are also blocks available to implement TDMA and FHSS.  These PHY blocks can replace the CSMA PHY.  The same is true for the MAC layer blocks.  Currently there is only the “Simple MAC” block.

Next Steps and What I’d Like to Accomplish

After proving the basic idea through this simple framework, and talking to a few people, I’ve decided that it may be worth more effort.  The community has provided some indication that a more thorough implementation would be valuable.  Here’s an obvious list of improvements/changes:

  1. Update the blocks to use new PDUs in GNU Radio
  2. Re-write blocks in C++
  3. Come up with a cleaner mechanism to pass meta-data around.
  4. Improve documentation and examples.  Make some tutorials.

My ultimate goal here is to spend my time producing something valuable for the community.  Thus, I’ve typed up this post to solicit feedback from any students, professors or hackers using the framework.  What should change from an architectural standpoint?  What blocks and functions are most useful for you?  In general, what should I be doing differently?

Also, most importantly… pre-cog is an awful name.. What should I call the official project once I’ve kicked it off?

You can connect with me through my social media links (to the right), or at jmalsbury.personal@gmail.com.