Spectrogram (80MHz bandwidth) accelerator for LimeSDR
Switch branches/tags
Nothing to show
Clone or download
Latest commit 45e214c Nov 15, 2018
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.idea intergrate new gateware Sep 15, 2018
doc add new gif demos Sep 27, 2018
driver update docs Sep 27, 2018
gui improve docs Sep 27, 2018
README.md improve wording Nov 15, 2018
build.py update docs Sep 27, 2018

README.md

Spectrogram (80MHz bandwidth) accelerator for LimeSDR

Turning on WiFi on a handset:

alt text

Or turning on Bluetooth:

alt text

Block diagram:

alt text

Average-pooling reduces the noise of the spectrogram and downsamples the USB bandwidth to 2.5MB/s, which allows remote deployment by using SoapySDR-Remote on RaspberryPi3.

NOTE: LimeSDR-Mini needs to have a cooling solution, see below for an example.

Running the driver on ARM devices

Install Docker:

curl -fsSL https://get.docker.com | sh

For the first time, flash the FPGA (drop the ':arm' tag to run on non-ARM devices):

docker run -it --privileged gasparka/spectrogram_driver:arm LimeUtil --fpga=LimeSDR-Mini_GW/LimeSDR-Mini_bitstreams/LimeSDR-Mini_lms7_trx_HW_1.2_auto.rpd

You can always restore the default image by running:

docker run -it --privileged --net=host gasparka/spectrogram_driver:arm LimeUtil --update

Note that you need to power-cycle the Lime after the FPGA programming, this is a LimeSuite bug #216.

Next, start the SoapySDR-Remote server:

docker run -it --privileged --net=host gasparka/spectrogram_driver:arm

Test that the server is discoverable on a client machine:

~> SoapySDRUtil --find="driver=remote"
######################################################
## Soapy SDR -- the SDR abstraction library
######################################################

Found device 0
  addr = 24607:1027
  driver = remote
  label = LimeSDR Mini [USB 3.0] 1D40EC49F23932
  media = USB 3.0
  module = FT601
  name = LimeSDR Mini
  remote = tcp://192.168.1.136:55132
  remote:driver = lime
  serial = 1D40EC49F23932

See the Demo Notebook on how to access the server, control the SDR and plot the spectrogram.

Tested on:

  • ODROID-XU4
  • RaspberryPi3 - Pi was powered from a USB3 port, Lime connected to USB2 port of Pi.

Realtime GUI

Python GUI that plots the FFT frames from the remote diver in real-time.

Run (add ':arm' to run on ARM devices-slow!):

docker run -it --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" gasparka/spectrogram_gui

Tip: Use 'Space' to pause the stream.

Accuracy vs floating-point model

Accelerator is implemented mostly in 18-bit fixed-point format, thus it might be interesting to compare the accuracy against 64-bit floating-point model.

High power input signal:

alt text

The 'phantom' peak at -5MHz is the leakage of the peak at 15MHz. This happens only when a high power is concentrated into one FFT bin and is due to the 9-bit twiddle factors used in the FFT core

Low power input signal:

alt text

Accelerator can detect low power input signals, but the accuracy vs floating-point model is degraded due to the input having only ~2 bits of useful information - using SDR gains improves the situation.

Cooling the LimeSDR-mini

Using a '~2mm thermal pad' and a piece of metal:

alt text alt text

Using small heatsinks wont cut it: https://discourse.myriadrf.org/t/rpi3-heat-sinks-on-limesdr-mini/3523

Sources

Gateware sources:

https://github.com/gasparka/LimeSDR-Mini_GW/tree/fpga_fft/LimeSDR-Mini_lms7_trx/src/fft

There is also a fork of LimeSuite that enables oversampling and has various hacks related to the custom FPGA image:

https://github.com/gasparka/LimeSuite/tree/fpga_fft