GNU Radio – Learning the Basics 3/3
Wat leuk dat je weer meeleest! Dit is het 3e en laatst postbericht van deze “GNU Radio” serie. Na deel 1 en 2 verwacht ik dat je al een veel beter idee hebt van GNU Radio en zijn oneindige mogelijkheden. In deel 3 gaan we dan ook lekker los met een eigen flowgraph. Laten we snel aan de slag gaan.
In dit voorbeeld gaan we een FM Radio ontvanger bouwen in combinatie met de RTL-SDR dongel. Wat de RTL-SDR Dongel is heb je al kunnen lezen in het vorige hoofdstuk. Maar waarom een FM radio receiver? Het klopt dat dit voorbeeld niet uniek is. Dit voorbeeld laat echter wel heel goed zien wat er allemaal mogelijk is met GNU radio en geeft de mogelijkheid om een aantal belangrijke zaken te benadrukken die essentieel zijn voor de leercurve.
De FM Radio Receiver Flowgraph
Een simpele FM Radio Receiver bestaat uit de volgende elementen:
- Signaalbron (RTL-SDR)
- Frequentie
- Low pass filter (uitfilteren van storende effecten van overlappende frequenties)
- WBFM demodulator (om het FM signaal te demoduleren)
- Resampler (om de input te downsampelen zodat deze overeenkomt met de geluidskaart)
- Volume regulatie
- Audio Output (computer geluidskaart)
Alvorens we starten is het goed om te weten wat de input en de output moet zijn in samples. De output gaan we sturen naar de geluidskaart. Bij voorkeur dus 48000 herts (48KHz). De maximale (stabiele) input van de RTL-SDR is 24000000 hertz. Er wordt dan ook aangeraden om de samplerate in te stellen op 2000000 MS/s.
Met deze blokken ziet de complete FM Radio Receiver flowgraph er als volgt uit:

Laten we de blokken eens stap voor stap doornemen.
1. Allereerst de RTL-SDR Source block. Dit blok is het begin van de flowgraph en dient als inkomende signaalbron. Dit blok ziet er als volgt uit:

De default waardes van dit block kunnen we behouden. Er zijn er echter 3 die ingevuld moeten worden. Namelijk de samplerate. De RTL-SDR kan maximaal 2400000 MS/s aan in stabiele modus en aangeraden wordt dan ook om de samplerate in te stellen op 2000000 (2M). De volgende instelling is de frequentie waar we naar willen luisteren. Ook deze hebben we gedefinieerd in een variabele en is ingesteld op 105.700 MHz (105.7M).
Ook passen we de “Ch0: RF Gain (dB)” aan om het signaal voldoende te versterken zodat het hoorbaar wordt. Aangeraden wordt om de gain op te hogen naar een waarde van 50.
2. Het volgende block is het “Low Pass Filter”:

Het “Low Pass Filter” gebruiken we om ruis van andere kanalen uit te filteren (interferentie). Let op, het Low Pass Filter is geen normale Low Pass Filter als in een gewone radio. Dit Low Pass Filter is als het ware een filter om je hoofdfrequentie heen.
Hier gebruiken we 2 variabelen voor. De cutoff freq optie en de transition width. Deze zijn beide gedefinieerd in een variabele. Onze hele kanaalbreedte is 25000 hertz groot. Dit geven we aan als transition width (25e3). Voor en na de transition band komen een start en een stopband waarbij het signaal sterk versterkt en afzwakt. Deze maken we 75000 hertz (75e3) groot. Alle signalen voorbij deze grenzen worden afgebroken. We hebben dus onze totale bandbreedte (transaction width, startband en stopband) ingesteld op “100000 hertz”.
De samplerate waarmee dit blok werkt is nog steeds de input van de RTL-SDR dongel en dus 2000000. Dit is waarom variabelen zo handig zijn. Als blijkt dat we deze waarde later moeten veranderen dan hoeven we alleen de variabele aan te passen.
Met de “decimation” filter kunnen we het bronsignaal verkleinen. We hoeven niet zoveel samples te verwerken. Het bronsignaal is 2000000 MS/s. Een decimation van 10 betekend dat het bronsignaal 10x verkleind wordt naar 200000 (200 KHz). Alle vervolgblokken verwerken dan op 200 KHz i.p.v. op 2 MHz (2000 KHz).
3. Het 3e belangrijke blok is de “WBFM Receive” block:

Het “WBFM Receive” block is de feitelijke demodulator welke het signaal demoduleert volgens FM modulatie zodat het signaal leesbaar / hoorbaar wordt. Dit block heeft weinig opties. Het enige wat we in kunnen stellen (in general) is de Quadrature Rate en de Audio Decimation. De Quadrature Rate is de waarde waarmee de demodulator moet werken en moet dus overeenkomen met de output van het vorige blok. Aangezien we decimation hebben toegepast in het vorige blok is dit geen 2000000 meer maar 200000.
Audio Decimation: het uiteindelijke geluid welke we uit de geluidskaart van de computer sturen is 48KHz. We kunnen hier het signaal verder verdelen naar deze 48KHz maar in dit geval plaatsen we een resampler na dit block. Waarin we dit regelen. We laten de Audio Decimation dan ook op 1 staan.
4. Het 4e blok is de hiervoor besproken resampler waarin we het signaal gaan downsampelen zodat deze goed gelezen kan worden door de geluidskaart in de computer. Hierin gaan we het huidige signaal terugbrengen naar 1 kHz en dat signaal gaan we verdubbelen naar 48 kHz zodat de geluidskaart overweg kan met de frequentie. Dit doen we met de “Decimation” en Interpolation” blokken. Bij “Decimation” gaan we het huidige signaal (200 kHz) verdelen naar 1 (dus delen met 200). En bij “Onterpolation” vervoudigen we dit signaal met 48 zodat we een output signaal van 48 kHz overhouden.

5. In principe zijn we nu klaar en hebben we een gedemoduleerd signaal waarmee de geluidskaart overweg kan. Echter is dit signaal nog erg zacht en is het nodig om het volume te verhogen. Dit kunnen we doen met een “Multiply Const” block.

Het volume in bovenstaande voorbeeld wordt 1x versterkt (aangegeven door de variabele). We kunnen hier later mee spelen om het volume te regelen.
6. Ons laatste blok in deze simpele flowgraph is de audio sink, ofwel het eindsignaal.

We maken hier gebruik van een gewone “Audio Sink” wat betekend dat het geluid naar de geluidskaart gestuurd wordt. Aangezien de meeste geluidskaarten overweg kunnen met een samplerate van 48 kHz en ons signaal op dit moment ook 48 kHz is stellen we de audio sink in op deze frequentie.
Op dit moment is de “play” button nog niet beschikbaar wat betekend dat er nog een fout zit in de flowgraph. Deze kunnen we dus nog niet afspelen:

Het probleem zit hem in de omlijnde blokken. Als we goed kijken geeft de WBFM Receive block een “Float 32” output en werkt de resampler met een “Complex Float 32” input. Dit zien we aan de kleuren van de connectors. Onder “Help” bevind zich een legenda waarin de kleuren gespecificeerd staan:

De Audio Sink verwacht ook een Float 32 input. We kunnen dus de datatypes van de 2 tussenliggende blokken gaan aanpassen van blauw naar oranje. Dit kunnen we doen door in het blok het IO Type aan te passen van “Complex” naar “Float”:

Makkelijker is nog om het blok te selecteren zodat er een lichtblauw lijntje omheen komt te staan en met de omhoog / omlaag pijltjestoetsen het IO Type aan te passen.

Nu alle datatypes op elkaar aansluiten kunnen we de flowgraph afspelen.

Je hoort nu de ingestelde zender.
Flowgraph uitbreiden
Nu dit werkt kunnen we nog een aantal dingen doen om deze flowgraph te verbeteren. We gaan 2 zaken inbouwen, namelijk een slider waarmee we de frequentie kunnen regelen een waterfall view zodat we de frequentieband kunnen bekijken binnen een tijdsframe. Dit doen we als volgt:
Allereerst starten we met de slider voor de frequentie.
We kiezen hiervoor het element “WX GUI Slider”. We kiezen het WX type en niet het QT type omdat we in ons “options” block aangegeven hebben dat de “Generate Options” van het type “WX GUI” zijn.

Deze hoeft niet op een specifieke plaatst toegevoegd te worden want deze is gewoon aanwezig en niet afhankelijk van de flowgraph. Het feit dat er een GUI block aanwezig is zorgt ervoor dat je tijdens het uitvoeren van de flowgraph een GUI slider element te zien krijgt welke gekoppeld is aan een variabele (in dit geval de frequentie variabele). Het is sowieso altijd fijn om tijdens het uitvoeren van een flowgraph iets te zien.
Voeg de slider in en geef deze de volgende opties:

Het ID passen we aan naar een logische naam. Deze hebben we later nog nodig.
De waardes moeten in dit geval overeenkomen met frequenties. Als “Default waarde” vullen we de frequentie in die we net statisch ingesteld hadden (105.7M). Als minimum waarde pakken we de onderkant ven de frequentieband (80M) en als maximumwaarde de bovenkant (120M).
Tip: Je kunt ook nullen invoeren met de “e code”. E3 zijn 3 nullen en e6 zijn 6 nullen. Dus als je 105700000 in moet vullen kun je ook 1057e5 gebruiken.
Vervolgens kopiëren we het ID en voeren we deze in bij de frequentie variabele.

Als we de flowgraph nu uitvoeren zien we het volgende:

We kunnen nu met de slider wisselen tussen frequenties
Om de frequenties nog inzichtelijk maken gaan we een waterfall toevoegen. Om dit te doen voegen we het block “WX GUI Waterfall Sink” toe. Dit is een “sink” block welke dus ook de binnengekomen data behandeld als eindstation (en dus niet doorstuurt naar een ander blok). Deze sink geeft de waterfall als output. Dit blok is echter wel afhankelijk van de flowgraph. De waterfall view kan namelijk verschillen als deze op een ander punt in de flowgraph wordt ingevoegd. Het is daarom aan te raden om deze direct aan de output van de bron te koppelen.
Voeg het “WX GUI Waterfall Sink” block toe en koppel deze aan de output van het source blok. Dit ziet er dan als volgt uit:

Als we nu de flowgraph uitvoeren hebben we al een eigen applicatie die er als volgt uitziet:

De gehele FM receiver ziet er als volgt uit:

We kunnen hier nog veel aan deze flowgraph meer aan toevoegen en finetunen. Dit basismodel is echter een goed voorbeeld van hoe je een flowgraph maakt en de uitgebreide range aan opties die de GNU Radio Companion ons biedt om te spelen met radiogolven.
Mocht je dit model nog verder willen bewerken in Python dan klik je op de “Generate the flow graph” button om het bestand “top_block.py” te genereren. Dit is je gehele flowgraph omgezet in phyton code:

Download hier deze volledige flowgraph als *.grc en als *.py bestand.
Conclusie
Ik hoop dat ik je na deze 3 delen een goed inzicht heb kunnen geven in de mogelijkheden van GNU Radio Companion. Deze prachtige tool is een must-have voor iedere radio liefhebber. De mogelijkheden zijn vrijwel eindeloos en de fantastische community brengt deze tool echt tot leven.
Hopelijk heb ik je wat kunnen leren of heb ik wat vragen weg kunnen nemen. Vond je deze serie interessant laat me dat dan weten. Reageer op deze post, deel hem op je social media kanaal en vertel het voort.
Bij interesse maak ik graag nog een geavanceerde serie over GNU Radio Companion! Tot ziens.