Table of Contents

FCL, a fast spectrum channelizer

FCL splits wideband spectrum from your SDR into narrowband channels. This is useful for networks that have lots of transmitters side-by-side, like for example FM broadcast, TETRA, Tetrapol and GSM.

It supports everything you would expect from a decent channelizer:

We use a straightforward implementation that is cache- and vector-friendly and we have a sane pthreads scheduler. At least on our computers, FCL is 2 to 5 times faster than the GnuRadio implementation. Hence fcl stands for Fastest Channelizer in Litoměřice.

You can find description of the mathematical principles of the channelizer in Chapter 2 of my thesis.

The following chart compares FCL with GnuRadio 3.7.10. FCL was tuned using the hints below on this page, GnuRadio was profiled using volk_profile. Frequency correction in FCL was disabled.

Practical results: Raspberry Pi 3 + rtl-sdr is able to receive 13 Tetra or Tetrapol channels in real time. As it maxes the usage of CPU and memory, proper cooling is necessary!

Downloads

https://jenda.hrach.eu/gitweb/?p=fcl;a=summary

Usage

Build:

make
On Raspberry Pi, adding “-march=native -mthumb-interwork -mfloat-abi=hard -mfpu=neon -mtune=native” to CFLAGS makes things even faster. Make sure you have correct GCC and core libraries!
It builds .so modules for FIR of lengths 8-24 (where compiler can unroll loops) and one generic. These are loaded dynamically runtime.

Example:

mkfifo /tmp/myout.ch

rtl_sdr -f 90e6 -s 2e6 -g 49 -p 44 - | ./fcl -n 20 -s 13 -f "./fir.py 2e6 55e3 11e3" -c 3,8 -i U8 -o /tmp/myout.ch

i.e. read data as uint8_t, channelize to 20 channels with 20/13 oversample, select channels 3 and 8 (they are interleaved in the output stream, use the GnuRadio Deinterleave block to get them), output to /tmp/myout.ch

The tool listens on localhost:3333 (can be changed with -b and -p) and supports these commands:

There is a convenient wrapper around gnuradio firdes called fir.py.

usage: ./fir.py samplerate passband transition [rcos]
passband/samplerate ... how much of spectrum to pass
transition          ... either transition width in Hz (for non-rcos filter), lower value means higher signal quality and higher computational complexity, or filter length in taps for rcos filter
rcos                ... use root raised cosine filter instead of Hamming window.

There is and example of how to use FCL to receive TETRA in examples/tetra.py. Other examples may follow as we port other brmlab tools to FCL.

Performance hints

Roadmap