GNU Radio – Learning the Basics 1/3
In deze driedelige post gaan we het hebben over GNU Radio. Om nog specifieker te zijn over de GNU Radio Companion. GNU Radio is een framework welke de tools biedt om draadloze signalen te verwerken. De signaalverwerking gebeurt in software i.p.v. in dedicated hardware. Daarom kunnen we de signaalverwerking in een simulatie omgeving uitvoeren of in combinatie met externe hardware waarmee dus een Software Defined Radio gecreëerd wordt. GNU Radio Applicaties noemen we ook wel “flowgraphs”. Deze “flowgraphs” bestaan uit een serie aaneengeschakelde blokken (de dataflow) welke gemakkelijk te her configureren zijn. GNU Radio is volledig in C++ geschreven met als 2e schil een Python laag. Veel modules en GNU Radio applicaties zijn geschreven in Python. Omdat grafisch schuiven met blokken nog handiger is gebruiken we in deze serie de “GNU Radio Companion”. Dit is een grafische interface voor GNU Radio welke het opzetten van een “flowgraph” nog makkelijker maakt.
*Verwacht niet na deze 3 posts alle insights van GNU Radio te hebben. GNU Radio is een zeer uitgebreid framework. In deze 3-delige post help ik je op weg en zorg ik dat je snapt hoe GNU Radio (Companion) werkt.
GNU Radio voert alle signaalverwerkingsprocessen uit. U kunt het gebruiken om applicaties te schrijven die data ontvangen uit of verzenden naar digitale streams. GNU Radio heeft filters, channel codes, synchronisatie elementen, equalizers, demodulatoren, vocoders, decoders, en vele andere elementen (in de GNU Radio jargon noemen we deze elementen blokken), die doorgaans te vinden zijn in de radio-systemen. GNU Radio is software en kan alleen omgaan met digitale gegevens. Normaliter fungeren complexe “baseband monsters” als input data type voor ontvangers en als output data type voor de zenders. Analoge hardware wordt vervolgens gebruikt om het signaal te plaatsen op de gewenste frequentie. Binnen de software kan elk type gegeven worden doorgegeven van het ene blok naar het andere. Denk hierbij aan b.v. bits, bytes, vectoren, bursts en nog veel meer complexe data types.
GNU Radio prijkt met de volgende slogan op zijn homepage “GNU Radio is a Free and Open-Source Toolkit for Software Radio”. Het mooiste aspect van open-source software, en daar is GNU radio geen uitzondering in, is de geweldige, behulpzame en grote community. De community van GNU Radio bestaat uit vooral uit hobbyisten, academici en commerciële radio medewerkers. GNU Radio is niet de meest gemakkelijke software en ik wil hierbij dan ook de community bedankt voor alle hulp en support de ze me de afgelopen jaren geboden hebben. You’re awesome!
Installatie:
De installatie van GNU Radio is ontzettend simpel. Er zijn verschillende packages te verkrijgen voor zowel Linux, Mac als Windows. Ook is het mogelijk om een bootable live CD de downloaden met GNU Radio pre-compiled. Het is mogelijk om de packages te compilen vanaf de source packages. De aanbevolen manier is echter om GNU Radio gewoon te installeren vanuit de pre-compiled binaries. Zowel voor Windows zijn er binaries en ook voor Linux zijn er binaries. Op Linux installeer je GNU Radio het makkelijkste als volgt:
Ubuntu & Debian
apt-get install gnuradio |
Fedora
yum install gnuradio |
Alle uitgebreide installatie instructies zijn te lezen op deze speciale installatie pagina:
http://gnuradio.org/redmine/projects/gnuradio/wiki/InstallingGR
Na de installatie
Na de installatie heb je de beschikking over een aantal (Phyton based) tools. Deze zijn o.a.:
uhd_fft.py
Dit is een spectrum analyzer. Deze analyzer geeft het spectrum weer (op een bepaalde frequentie). Deze spectrum analyzer kan ook gebruikt worden in “waterfall” weergave of als oscilloscoop (meetinstrument om cyclische variaties (trillingen) in de ether te meten).
uhd_rx_cfile.py
Met deze tool heb je de mogelijkheid om een I/Q-sample stream op te nemen (met behulp van een aangesloten UHD-apparaat). Een I/Q signaal is meer dan alleen een 2D presentatie van het signaam. Een I/Q signaal is het hele 3D signaal (geen vlakke representatie maar een 3D signaalschroef). De sample streams worden weggeschreven naar een bestand welke offline kan worden geanalyseerd, met behulp van GNU Radio of andere hulpmiddelen, zoals Octave of Matlab.
uhd_rx_nogui.py
Signalen ontvangen en beluisteren. Deze tool is in staat om AM & FM signalen de demoduleren.
uhd_siggen {} _gui.py
Simple signaal generator welke de meest voorkomende signalen kan genereren zoals sinus (sine), sweep, vierkant (square) en lawaai (noise).
gr_plot * –
Dit is een complete suite van apps die opgeslagen samples in een bestand kan weergeven. Je kunt hiermee een plot maken van de spectra, PSD en het tijd-domein van deze signalen.
Bovenstaande standaard applicaties zijn niet de enige applicaties en op repositories als GitHub kunnen nog veel meer applicaties gevonden worden welke gebruik maken van het GNU Radio Framework. Neem hier maar eens een kijkje: https://github.com/gnuradio.
Zoals al gezegd zijn alle applicaties geschreven in Phyton. Het is dus extreem handig om in ieder geval een basis te hebben in de Phyton programmeertaal zodat je gemakkelijk scripts kunt lezen.
Waar GNU Radio pas echt tot zijn recht komt (en ook voor gemaakt is) is met DPS (Digital Signal Processing). Speciaal hiervoor is de GNU Radio Companion (GRC) geschreven. GRC is een grafische interface bestaande uit blokken. Deze blokken representeren verschillende facetten van een signaalstroom zoals filters en modulators. Deze blokken kun je met elkaar verbinden om op die manier een signaalstroom te simuleren. Naast simulatie kun je het signaal ook verzenden middels SDR hardware of je kunt deze hardware gebruiken om echte signalen op te vangen en te verwerken via de opgemaakte signaalstroom. Het voordeel van GGC is dat je hiervoor geen programmeerkennis nodig hebt. Je kunt zelfs je signaalstroom exporteren naar Phyton zodat je gemakkelijk de codeopbouw van GRC kunt leren.
Ook voor GNU zijn er vele voorbeelden om van te leren. Neem b.v. eens een kijkje op de website van GNU Radio of op de website van OZ09AEC. – http://oz9aec.net/radios/gnu-radio/grc-examples
Wij gaan ook lekker aan de slag met GRC. Laten we eens een kijkje nemen naar de basisfacetten van GRC.
GNU Radio Companion – Interface
Als we GRC starten (in Linux met het commando “gnuradio-companion” dan ziet de interface er als volgt uit:

De interface bestaat dus uit 6 basisonderdelen:
1. Hoofdmenu
2. Toolbar
3. Workspace
4. Library
5. Terminal
6. Import
1. Hoofmenu
In het hoofmenu vinden we diverse belangrijke opties zoals: Opslaan, View aanpassingen, Run commando om de signaal flow te starten, Filter creator en help opties.
2. Toolbar
In de toolbar vinden we de belangrijkste commando’s terug in de vorm van buttons. Denk hierbij aan b.v. Opslaan, Variabele editor, Flow Graph Generator, Execute en Block Search.
3. Workspace
De workspace is het belangrijkste speelvak. In dit gedeelte wordt de flowgraph gemaakt. Hierin worden de blokken geplaatst, opties geselecteerd en blokken gekoppeld.
4. Library
Alle soorten blokken zijn terug te vinden in de library. Vanuit de library kunnen deze blokken in de workspace geplaatst worden.
5. Terminal
De terminal laat zien wat er gebeurt in een flowgraph als deze wordt uitgevoerd.
6. Import
Via het import frame kunnen blokken met variabele waardes aangemaakt en beheerd worden. Via dit frame heb je meteen overzicht op alle variabele waardes in de flowgraph.
GRC Basis
Als basis is het goed om een aantal zaken te onthouden:
1. Gebruik variabele waardes. Op deze manier kun je gemakkelijk op 1 locatie (import pane) alle waardes beheren die kunnen variëren in de flowgraph. Zo kun je de “sample rate” instellen op diverse blokken of deze blokken laten verwijzen naar deze ene variabele. De laatste methode is efficiënter
2. Klik op het vergrootglas in de toolbar zodat er boven de library een zoekbalk verschijnt. Op deze manier kun je gemakkelijk en spel zoeken naar specifieke blokken.

3. Elke flowgraph moet beschikken over de volgende verplichte blokken:
- Options block. In dit blok worden project specifieke opties gezet zoals de titel en de autheur. Er mag slechts 1 options blok per flowgraph voorkomen.
- Source block. Een flowgraph begint altijd met een “source” ofwel de brondata die verwerkt moet worden.
- Sink block. Een sink is meestal het laatste blok in de flowgraph. De sink is de “data output”. Er zijn diverse manieren om de output data te ontvangen. Dit gebeurt middels een sink.
- Throttle block. Een Throttle block is het eerste blok na een willekeurige bron. Dit blok laat alleen een bepaalde hoeveelheid bits naar het volgende blok passeren (dit is geen exacte hoeveelheid, maar een gemiddelde). Het gemiddelde aantal bits die het blok verlaten is de “sample rate”. Zonder Throttle block riskeer je dat de CPU volloopt en alle rekenkracht van de computer verbruikt.
4. Elk block beschikt over een aantal eigenschappen. Deze eigenschappen worden zichtbaar nadat je op de block klikt. Binnen deze eigenschappen werkt men met kleurcodes. De labels en tabbladen kunnen een bepaalde kleur hebben en de velden hebben bepaalde kleuren.
Labels:
- Zwart:
Ingevulde waarde is onveranderd en opgeslagen - Rood:
Ingevulde waarde is aangepast en niet opgeslagen - Blauw:
Ingevulde waarde wordt momenteel aangepast en niet opgeslagen
Tabblad:
- Zwart:
Het tabblad heeft geen missende variabele voor correcte werking van het blok en al deze variabelen zijn opgeslagen - Rood:
Het tabblad mist een verplichte variabele of deze is nog niet opgeslagen

Velden (parameter tags):
- Donkergroen = int_vector:
De groene regels zijn “integer vectors”. Deze velden zijn te vergelijken met integers omdat er alleen hele numerieke waardes in geplaatst kunnen worden. Deze velden worden meteen geparseerd naar de C++ core code. - Groen = int:
De groene “integer” velden kunnen dus gehele numerieke waardes bevatten zoals 1,60 en 2000. - Grijs = id:
De ID code is statisch. Dit veld is niet aan te passen. - Oranje = real / float:
De “real” en “float” velden kunnen numerieke waardes bevatten. Dit kunnen zowel hele (3,40,2000) als gedeelde (1.1, 100.1) waardes zijn. - Paars = string:
String velden kunnen alle soorten letters, cijfers en tekens bevatten. - Wit = Multiline:
Multiline velden zijn “tekst” velden. Deze velden worden niet gecontroleerd en zijn niet primair aan de werking van GNU Radio. Deze velden bestaan uit meerdere regels waarin alle letters, cijfers en tekens geplaatst kunnen worden.

5. Velden (ook integers) kunnen altijd voorzien zijn van een variabele:

6. Velden kunnen voorzien zijn van wildcards:

7. Elk blok bevat een tab met extra uitleg. Dit is de zogenaamde “documentation” tab. Vaak vindt je in de omschrijving een link naar een webpagina met meer uitleg.

Einde deel 1
Met deze tips besluiten we het eerste deel van deze serie. In het tweede deel gaan we de blokken van GNU radio onder de loep nemen en bespreken we de belangrijkste groepen en blokken.