Comparison to GNU Radio

Both GNU Radio and LuaRadio are frameworks for flow graph signal processing. Many of the concepts regarding flow graphs and blocks in LuaRadio imitate or are inspired by GNU Radio.

However, LuaRadio differs from GNU Radio in many respects:


LuaRadio is not a GNU Radio replacement, but rather an alternative inclined more towards scripting and prototyping, emphasizing fast, compilation-free block development.


GNU Radio tends to have a large size footprint. A typical binary GNU Radio installation weighs in at over 100 MB. When the installation includes development support, the boost development headers and numerous other libraries and tools (gsl, blas, swig, orc, etc.) can add another 100 MB or more.

GNU Radio also has a large compilation footprint, in terms of time and dependencies. Compilation of the GNU Radio framework and its modules is generally slow, and can be temperamental due to its dependency on boost. Compiled versions of GNU Radio modules and applications can break in complex ways when the underlying GNU Radio or boost runtimes are updated. These modules and applications may require routine re-compilation — sometimes in a particular order — to be linked correctly with the updated libraries and each other.

LuaRadio’s total footprint is on the order of 1 MB and its blocks require no compilation. LuaRadio has zero dependencies for non-real-time applications, and may otherwise use liquid-dsp or VOLK for acceleration in real-time applications. liquid-dsp shares LuaRadio’s affinity for minimal dependencies and making software-defined radio more accessible to embedded Linux platforms.


GNU Radio is licensed GPL v3, a copyleft license.

LuaRadio is licensed MIT, a more permissive license.


GNU Radio blocks are typically written in C++, and tend to have a lot of boilerplate for building, Python binding, graphical editor binding, and testing. This is mitigated with tooling, i.e. the gr_modtool, but to some, this may contribute to the opaqueness of the framework. See the GNU Radio Out-of-tree Modules guide and Blocks Coding guide for examples of the block development flow and block skeletons.

GNU Radio C++ blocks naturally require compilation before they can be used in a flow graph, which affects the ease of their iteration. C++ blocks sometimes use a custom form of string templating (e.g., despite being written in C++, to code generate support for multiple data types. C++ blocks are usually bound to Python with SWIG, which generates usable, but unnatural bindings. Blocks can also be written in pure Python (see the Working with GNU Radio in Python tutorial), and though they are limited in performance compared to C++ blocks, do provide an avenue for more rapid prototyping. Altogether, the uninitiated may still find GNU Radio block development shrouded in boilerplate and esoterica. For examples of typical GNU Radio blocks, see the source code of one of the third-party modules on CGRAN.

GNU Radio does not support creating custom first-class data types for serialization between blocks, but blocks may exchange Protocol Data Units (PDUs) with Tagged Streams, which demarcate the boundaries of the structured data, or use asynchronous Message Passing, which pass data out-of-band of flow graph streams.

LuaRadio blocks are written in pure Lua, have substantially less boilerplate, and require no compilation or bindings. With LuaRadio, the convenience of scripting applies to both defining flow graphs and developing blocks. For examples of typical LuaRadio blocks, see the Creating Blocks guide.

LuaRadio supports creating custom first-class data types based on fixed-size C structures or variable-sized Lua objects for serialization between blocks. This makes it easy and natural to create blocks that produce structured data, e.g. decoded packets. See the custom types section of Creating Blocks for examples.

Compare and contrast GNU Radio and LuaRadio blocks in their source trees: GNU Radio, LuaRadio.


Type Signatures

GNU Radio’s I/O signature system is limited to matching sizes of types (e.g. sizeof(gr_complex)) in block connections, whereas LuaRadio’s type signature system is safer and more flexible. Types in block connections are matched explicitly in LuaRadio, and input types can also be specified by a function predicate. For example, the JSONSink block can accept any data type that implements to_json().

GNU Radio blocks can only support one type signature each, which pushes the problem of block type differentiation to the users. GNU Radio has developed a rich nomenclature for annotating their block names with their type signature, using obscure suffixes like _cc and _ff, e.g. multiply_cc, multiply_ff, fir_filter_ccc, fir_filter_ccf, fir_filter_fff — scroll through the GNU Radio Sphinx documentation for more examples.

On the other hand, LuaRadio blocks can support multiple type signatures. For example, the MultiplyBlock and FIRFilterBlock can accept both complex-valued and real-valued input/output types, and the framework will automatically differentiate the correct type signature based on the block’s connections in a flow graph. This helps with code reuse and consolidation, as well as ease of use in defining flow graphs.

Sample Rate Propagation

GNU Radio requires users to manually specify the sample rate of every block that needs it. This can be alleviated by defining common sample rates in variables that are shared among blocks, but ultimately is still error prone. Some blocks require normalized parameters (e.g. angular frequency), which also obligates users to compute the correct normalization.

LuaRadio automatically propagates sample rates between all blocks. This reduces the amount of configuration needed by blocks, and any frequency parameters that are required can be specified in units of hertz. It also allows for a suite of convenience blocks that automatically perform sample rate dependent initialization, e.g. the LowpassFilterBlock, whose parameters are just number of taps and a cutoff frequency in hertz.


LuaRadio’s small footprint allows it to be wholly embeddable in applications. See the Embedding LuaRadio guide for more details and examples.


Generally speaking, LuaRadio performance is on the same order as GNU Radio performance. In computationally expensive blocks, like filters, LuaRadio has matching or slightly better performance to GNU Radio. In other cases, LuaRadio may range from 30% to 80% the performance of GNU Radio, but this is typically for blocks that are already in the very high throughput territory, e.g. hundreds to thousands of megasamples per second on an Intel i5 CPU. In a few cases, LuaRadio performance exceeds GNU Radio performance.

While LuaRadio performance is more than adequate for real-time SDR projects, GNU Radio still performs better than LuaRadio overall. If performance is your priority, then you should use GNU Radio.

See the Benchmarks page for empirical benchmarks on both LuaRadio and GNU Radio across several platforms.

Future infrastructure improvements and additional library acceleration will help LuaRadio close the performance gap.


GNU Radio has a larger community, more blocks, more hardware support, and a more mature codebase.

LuaRadio does not have a graphical flow graph editing tool, like the GNU Radio Companion (GRC).

GNU Radio currently has some more efficient signal processing blocks, like polyphase filters, or filters with integrated translation and decimation, but these can be added to LuaRadio as needed.