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!
Build:
make
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.