80Mhz bandwidth spectrogram on LimeSDR-mini

This is actually the coolest thing I saw here. Nice work.

We are looking at your code. We only want an adjustable span of <10 MHz. Which part should we modify?

Biggest problem:

Lime fixes this with a dynamically configurable PLL in the FPGA. I had to throw away this system in order to save resources, so in my image the phase shift is constant and works in the range of 80e6 - 40e6.

Next, you also need to tune the amout of taps in the DC-removal and reduce the size of average pooling.
All this needs FPGA work and IMHO it is not worth it. 10M should be solvable in software, i believe even ARM like ODROID XU4 could do it.

Looks pretty good. Any chance of supporting the original limesdr?

Not in my TODO list, but never say never.

One question. Was there any particular reason for not using the LMS7002M’s DC Removal function and implement it in FPGA?

LMS DC-Removal did not work that well for me. I don’t know how it is implemented, but note that the output must be 12-bits - which, according to my experiments, is not sufficient to completely cancel out the DC.

My implementation is based on: https://www.dsprelated.com/showarticle/58.php i.e. two chained moving averages with 1024 taps.

Tested running on PI:

Current draw was around 1.25A@5V. 5’ TFT-Display created some noise in the spectrogram. This was not a problem with HDMI display. OTOH HDMI supports higher resolution, which may cap the CPU if GQRX window is too big (updating the waterfall is expensive).

Also, i have decided to not support the LimeNET-Micro - FPGA designs differ significantly.
I now consider this project ~complete, no major features are expected.


Thanks for this great project. I would like to test alternative visualisation of FFT coming from FPGA. What is the best way to test it :

  • Flash your firmware
  • Use your modified LimeSuite
  • Know how to read FFT (guess a standard way but getting FFT bin instead of I/Q)

As you dockerize it, it is not trivial…Let me know if I am under a right way of using your custom FPGA firmware.

1 Like

I have added a notebook that demonstrates how to do this:

You will use ‘spectrogram --server_only’ - this handles flashing the FPGA, using the modified LimeSuite and starting the SoapySDR server. Then you can connect to the Soapy server as usual. Difference is that you will be reading out FFT frames not IQ samples.

i ordered this Thermal Pad
hope this works good.
any info would be great on the thermal pad leaking and temps you guys are getting.
love the thermal pictures on github.

i took the shielding off the lms7002m and i cant tell you the height dimensions but i took a picture and you can see for yourself.

looks pretty close to the same height as the chip close to the usb connector

i was wondering what could be expected as far as spurs and rf interference if we kept shielding off and put a heatsink directly on the lms7002m and then put the dongle in an altoids case like this one

My experience is that the LMS7 does not need additional cooling, FPGA is the hot-spot. Thus i have always kept the shielding on.

i was checking temps with a hand held lazer gun and the hot spots are right above the fpga but before the gold contacts. i didnt measure on the back side of the board but from what it (looks like) i bet the Local Oscillator is the hot spot.
when i measure all areas on the chips it seems like its on the top edge of the chip (which make no sense) unless its on the bottom side of the board.
which (again) is where the Lo is.

@gasparka It seems the gateware at https://github.com/gasparka/LimeSDR-Mini_GW/blob/master/LimeSDR-Mini_bitstreams/LimeSDR-Mini_lms7_trx_HW_1.2_auto.rpd doesn’t work for me. Is it what I should use?

When I flash the LimeMini with Lime Suite GUI with that gateware, I see the following log:

Connected Control port: LimeSDR-Mini FW:2 HW:0 Protocol:1 GW:0.0 Ref Clk: -0.00 MHz

If I use the automatic FPGA, LimeSDR-Mini_HW_1.2_r1.30.rpd, I see the following logs:

Reference clock 40.00 MHz
Connected Control port: LimeSDR-Mini FW:6 HW:2 Protocol:1 GW:1.30 Ref Clk: 40.00 MHz

I’m using Lime Suite GUI on Win10 x64 from PothosSDR, version 19.04.0-PothosSDR-2019.06.09-vc14-x64

en1gma@M4800:~/.local/bin$ ./spectrogram
2020-09-30 12:20:05.935 | WARNING | main:warn_temperature:15 - Cool your LimeSDR or risk damage!
2020-09-30 12:20:05.973 | INFO | main:docker_pull:20 - Pulling latest docker image…
Using default tag: latest
latest: Pulling from gasparka/spectrogram
Digest: sha256:bc75b4cea042f098e926cc7e4b100c2e8cbbbea5eaeb176a70bb1ac419bb8dc2
Status: Image is up to date for gasparka/spectrogram:latest
2020-09-30 12:20:08.128 | INFO | main:probe_devices:83 - Probing for LimeSDR-Mini devices…
2020-09-30 12:20:10.445 | INFO | main:probe_devices:105 - remote_available=False, local_available=True, local_fpga_ok=True
2020-09-30 12:20:10.445 | INFO | main:docker_start_server_daemon:58 - Starting server daemon…
2020-09-30 12:20:10.677 | INFO | main:docker_start_gqrx:48 - Starting gqrx…
2020-09-30 12:20:10.677 | WARNING | main:warn_temperature:15 - Cool your LimeSDR or risk damage!

  • Starting system message bus dbus
  • Starting Avahi mDNS/DNS-SD Daemon avahi-daemon
    QStandardPaths: error creating runtime directory /tmp/runtime-root: No such file or directory
    No protocol specified
    qt.qpa.screen: QXcbConnection: Could not connect to display :1
    Could not connect to any X display.
    2020-09-30 12:20:10.996 | INFO | main:main:167 - Killing local server…
    2020-09-30 12:20:11.162 | INFO | main:main:170 - Done!

Should I be seeing GQRX open up somewhere? i think im using the snap.
this is a limesdr mini connected directly to my dell i7 laptop usb 3.0 port running ubuntu 20.04.1

just flashed back the 1.30.rpd (programming automatic) from with in limesuite 27.02 (ubuntu amd64 desktop)

would like to try this but cant seem to get it working.
any help would be great.

This looks like a GUI trying to start and failing. How are you logged in? You could also the remote usage, where you also install the software on a 2nd machine for remote display. See:

i just run ~/.local/bin/spectrogram on my ubuntu 20.04 amd64 desktop (laptop with I7-4770) cpu.
i do have access to another laptop which i could remote into but i was thinking i should be able to access the 80mhz spectrogram with gqrx on the laptop which has the limesdr-mini plugged in.
do i need to use an older version of ubuntu?

Laptop 01 = ~.local/bin/spectrogram --server_only
Laptop 02 = ~.local/bin/spectrogram
I dont see gqrx open up.
what is the command to open up gqrx so i can monitor the spectrogram server?

if i run snap-store gqrx on “Laptop 02” and i edit the device strings to “soapy=0,driver=remote,remote:driver=lime” do i need to change sample rate to 80msps?
i try this and i dont think its working as it should.
what size do i set fft in (snap-store gqrx)?

the docker gqrx does not open when i issue the command ‘./spectrogram’ from inside “~.local/bin”

en1gma@M4800:~/.local/bin$ SoapySDRUtil --find

Soapy SDR – the SDR abstraction library


[INFO] [UHD] linux; GNU C++ version 9.2.1 20200304; Boost_107100; UHD_3.15.0.0-2build5

RtApiAlsa::getDeviceInfo: snd_pcm_open error for device (hw:1,0), Device or resource busy.

Found device 0
default_input = False
default_output = False
device_id = 5
driver = audio
label = hw:HDA Intel PCH,0

Found device 1
default_input = False
default_output = False
device_id = 13
driver = audio
label = default

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