Hoe een VRX werkt

Van een brede “foto” van de band naar het geluid in je koptelefoon — een uitleg in gewone taal voor wie geen DSP-achtergrond heeft. Met plaatjes.

Nederlands  ·  English

Het grote idee

Een VRX (virtual receiver, “virtuele ontvanger”) maakt van één brede stroom radio-data in principe zoveel onafhankelijke ontvangers als je wilt. De SDR digitaliseert in één keer een hele band. De server houdt die brede stroom vast en “knipt” er voor elke luisteraar een eigen smal stukje uit — ieder op zijn eigen frequentie, mode en bandbreedte. Niemand zit elkaar in de weg.

Analogie. Stel je een satellietfoto van een hele stad voor. Eén opname, maar honderd mensen kunnen er tegelijk op inzoomen, elk op hun eigen straat. De VRX doet dat met radiospectrum in plaats van met een foto.
Brede IQvan de SDR FFT→ frequenties kanaalkiezen+filteren iFFT→ tijd fijn­tunen(NCO) demod +volume (AGC) geluid→ client
Figuur 1 — De hele keten in één oogopslag. Elk blok wordt hieronder uitgelegd.

Inhoud

1. Van radiogolf naar getallen (IQ)

Een moderne SDR (Software Defined Radio) zet een breed stuk van de band rechtstreeks om in getallen. Per moment meet hij twee waarden, I en Q genoemd. Samen beschrijven die niet alleen hoe sterk het signaal is, maar ook de fase ervan — en juist die fase hebben we straks nodig om frequenties en modulatie te herkennen.

Analogie. I en Q zijn als de x- en y-positie van een wijzer op een klok. Eén getal (alleen sterkte) zegt hoe lang de wijzer is; twee getallen (I én Q) zeggen ook wélke kant hij op wijst. Die richting (fase) is de helft van het verhaal.

2. Het brede, ongefilterde signaal

Het begint met een ongefilterd tijdsignaal, en dat is breed — in ons geval tot wel 1,536 MHz breed. Dat is een snelle stroom I/Q-paren (ruim anderhalf miljoen per seconde) waarin álles zit wat er op dat stuk band te horen is: alle stations door elkaar, sterk en zwak, naast en boven elkaar. Op dit moment is er nog niets uitgefilterd; het is de complete, brede “foto” van de band.

Ons doel: hier straks één smal radiokanaal uit halen (bijvoorbeeld een SSB-signaal van 3 kHz), netjes gefilterd, klaar om te beluisteren. Daarvoor moeten we eerst weten waar de frequenties zitten — en dat is precies wat de FFT doet.

3. De FFT — tijd wordt frequentie

Het brede signaal is een verloop in de tijd. Maar wij willen weten welke frequenties erin zitten — waar de stations staan. Daarvoor gaat het hele signaal door een FFT, die het tijddomein omzet naar het frequentiedomein (precies het beeld van een spectrumanalyzer).

FFT staat voor Fast Fourier Transform (snelle Fourier-transformatie). Fourier is een rekenkundige manier om van het tijddomein naar het frequentiedomein om te zetten. Het is een omzetting naar een andere presentatie: dezelfde informatie, anders weergegeven. Er gaat niets verloren en er komt niets bij — het signaal “in de tijd” en hetzelfde signaal “in frequentie” bevatten exact dezelfde informatie.

Omdat dit een wiskundig rekenmodel is, kost de omzetting wat rekentijd, en je hebt eerst een heel blok samples nodig vóór je kunt rekenen. Dat is de praktische beperking: het kost een klein beetje vertraging (latency).

Analogie. Een prisma splitst wit licht in een regenboog van kleuren. De FFT is het prisma voor radio: ze splitst het signaal in al zijn frequenties. Het licht vóór en ná het prisma is hetzelfde licht — alleen anders gepresenteerd.

Eenzelfde signaal — in de tijd én in frequentie

Een paar bekende signalen, links zoals ze er in de tijd uitzien, rechts hoe diezelfde signalen er in het frequentiedomein uitzien:

in de tijd in frequentie sinusstap blokimpuls zaagtand 1 frequentie veel laag, snel afnemend grondtoon + oneven harmonischen alle frequenties even sterk (vlak) grondtoon + álle harmonischen
Figuur 2 — Hetzelfde signaal, twee presentaties. Een zuivere sinus is één enkele frequentie; een korte impuls bevat juist álle frequenties tegelijk; blok en zaagtand zijn een grondtoon plus een reeks harmonischen. Die korte, krachtige impuls herken je in de praktijk als bliksem / atmosferische ontlading: één heel kort signaal dat alle frequenties tegelijk bevat, en daarom in de waterval als een horizontale streep dwars door de hele band verschijnt.

De uitkomst van de FFT is een rij bins (vakjes), elk voor een smal frequentiebereik. Daarover gaat het volgende hoofdstuk.

Voor de liefhebber: de formules van de FFT en de iFFT

De FFT is een snelle manier om de discrete Fourier-transformatie (DFT) te berekenen. Voor een blok van N complexe samples x[0]…x[N−1] is de heenweg (tijd → frequentie):

X[k] = Σn=0N−1 x[n] · e−j·2π·k·n / N   voor k = 0 … N−1

en de terugweg (frequentie → tijd) is bijna dezelfde som, met een plusteken in de exponent en een deling door N:

x[n] = (1/N) · Σk=0N−1 X[k] · e+j·2π·k·n / N

Elke X[k] is een complex getal (een wijzer, §1): de lengte is hoeveel van frequentie k aanwezig is, de hoek is de fase. Bin k hoort bij frequentie fk = k · Fs / N (met Fs de samplerate); bins boven N/2 tellen als negatieve frequenties (§6).

De kern is de term e−j·2π·k·n/N — via Euler e = cosθ + j·sinθ is dat precies een ronddraaiende wijzer met snelheid k. De FFT vergelijkt het signaal in feite met al die draaisnelheden tegelijk en telt op waar ze “meelopen”. De snelle in FFT is een slim rekenschema dat dit in N·log N stappen doet in plaats van — het efficiëntst als N een macht van 2 is (§8).

In deze keten draait de heen-FFT op de brede blokgrootte Nfft (na vermenigvuldiging met het Hann-venster, §5); na het selecteren/nullen van bins (§7, §9) draait de terug-iFFT op de kleinere maat Nifft (128 of 256).

Eén waarschuwing als je dit naast de broncode legt: de textbook-iFFT hierboven deelt door N, maar de implementatie schaalt met een vaste factor 1/Nfft (niet 1/Nifft). Het uiteindelijke niveau wordt toch door de AGC gezet, dus die exacte schaalfactor is niet kritisch — maar reken er niet klakkeloos 1/N voor.

4. Het spectrum in kleine stukjes (bins)

Omdat we straks scherp willen kunnen filteren, hakken we de hele brede band op in heel kleine frequentiestukjes. Elk stukje heet een bin. In ons geval is één bin 62,5 Hz breed. Hoe kleiner de bin, hoe scherper we later kunnen knippen.

De bin-grootte volgt rechtstreeks uit de FFT-grootte: bin = bandbreedte / aantal FFT-punten. Om die 62,5 Hz over een band van 1,536 MHz te halen, hebben we dus nodig:

1 536 000 Hz ÷ 62,5 Hz = 24 576 FFT-punten → een grote FFT (≈ 24.576 bins)

Dat is dus een grote FFT. (Bij een smallere band — bijvoorbeeld 384 kHz — is het navenant kleiner: 384 000 / 62,5 = 6.144 punten.) De bin-grootte blijft bewust altijd 62,5 Hz, ongeacht de bandbreedte, zodat de rest van de rekenkunde eenvoudig en consistent blijft.

1 bin = 62,5 Hz frequentie →
Figuur 3 — Het spectrum opgedeeld in bins van elk 62,5 Hz.

5. Windowing — de randen afzwakken

De FFT werkt op een blok samples dat we er hard uitknippen. Daarmee springt het signaal aan het begin abrupt van 0 naar zijn eerste waarde, en aan het einde stopt het net zo abrupt weer terug naar 0. Dat zijn twee stappen.

En je zag in §3 al wat een stap volgens Fourier betekent: een brede waaier aan harmonischen (denk aan de stap en het blok in figuur 2). Precies die kunstmatige harmonischen — veroorzaakt door de abrupte randen, niet door het signaal zelf — smeren energie uit over bins die er niet horen. Dat is spectrale lekkage. Hoe groter de waarde waar het blok begint of eindigt, hoe groter de stap en hoe erger de lekkage.

De oplossing: vermenigvuldig het blok met een zachte curve die aan béide randen vloeiend naar 0 loopt (een Hann-venster). Dan is er geen abrupte stap meer aan begin en einde → veel minder kunstmatige harmonischen → een veel schoner spectrum. (Helemaal lekvrij wordt het niet — het venster heeft zelf ook een vorm — maar de lekkage zakt drastisch.)

harde knip — begint op +1, eindigt op −1 +1 −1 grote stap grote stap grote stappen → sterke harmonischen → lekkage Hann-window → scherp, geen lekkage tijd → tijd →
Figuur 4 — Links: 5,5 golven die op +1 beginnen en op −1 eindigen. Het blok start dus met een grote stap van 0 naar +1 en stopt met een grote stap van −1 naar 0; grote stappen = sterke harmonischen = veel lekkage. Rechts: het Hann-venster zwakt béide randen vloeiend naar 0 af → geen abrupte stap, veel minder lekkage.
In ThetisLink. Zowel de audio-channelizer als het spectrumbeeld gebruiken een Hann-venster. De audio-channelizer overlapt opeenvolgende blokken voor 50% (zie §14); het spectrumbeeld overlapt nog sterker — ~87,5% (een hop van ⅛ blok) — voor een vloeiender beeld.
Voor de liefhebber: waarom het spectrumbeeld zóveel overlapt

Het venster zwakt de blokranden naar 0 af, dus een gebeurtenis die nét bij een rand valt, telt in dát blok bijna niet mee. Door 8× zo vaak een FFT te maken (a) valt elk stukje signaal in mínstens één blok dicht bij het midden — volle weging, niets gaat structureel verloren — en (b) krijg je veel meer watervalregels per seconde: vloeiender beeld én fijnere tijd-resolutie, zodat korte pieken (CW-punten, een bliksem-impuls, een diepe fade) niet gemist worden. Het spectrumbeeld hoeft — anders dan de channelizer — geen audio te reconstrueren, dus die extra overlap mag puur voor het beeld; de enige prijs is wat meer rekenwerk.

6. Eén complexe FFT (I én Q)

Veelgestelde vraag. Gaat dit allemaal in één FFT?

Ons tijdsignaal is complex: het bestaat uit I én Q samen (I + jQ, §1). Daarom gebruiken we een complexe FFT — die verwerkt I en Q samen in één bewerking.

En of je het nu implementeert als twee gewone (reële) FFT's — één voor I en één voor Q — of als één complexe FFT, maakt voor het eindresultaat niets uit: de uitkomst is exact hetzelfde, mits je de twee uitkomsten correct combineert (de I-uitkomst plus j × de Q-uitkomst). Alleen de implementatie verschilt; de complexe FFT is simpelweg de natuurlijke, compacte vorm voor een complex (I/Q) signaal.

Waarom we sowieso I én Q nodig hebben: alleen mét beide kan de FFT positieve en negatieve frequenties uit elkaar houden — de frequenties boven en onder het afstempunt apart zien. Met alleen de sterkte (één reëel getal) wordt het spectrum symmetrisch en kun je links en rechts van het midden niet onderscheiden; voor een SDR is dat onbruikbaar, want daar staan verschillende stations.

Analogie. Met alleen sterkte weet je hoe hard iemand roept, maar niet of het van links of rechts komt. Met I én Q hoor je het verschil tussen links en rechts — tussen frequenties boven en onder het midden.

7. Je wilt maar een klein stukje

Na de FFT hebben we heel veel kleine stukjes spectrum (bins). Maar je bent maar in een heel klein deel geïnteresseerd: één radiokanaal. Een SSB-signaal is bijvoorbeeld zo'n 3 kHz breed — dat zijn maar een handvol bins (3000 / 62,5 ≈ 48 bins) uit de vele duizenden.

Alle andere bins willen we kwijt. Hoe we van die paar gewenste bins weer hoorbaar geluid maken, zien we nu.

8. De iFFT — terug naar geluid

Frequenties kun je niet horen; we moeten terug naar een signaal in de tijd. Dat doet de inverse FFT (iFFT): precies de omgekeerde bewerking van de FFT. We nemen alléén de bins die we willen horen en stoppen die in een iFFT.

De iFFT rekent het efficiëntst als je een 2-macht aantal punten neemt (32, 64, 128, 256, …). Dus: neem het aantal bins dat je wilt horen en rond dat naar boven af naar de dichtstbijzijnde 2-macht. Dat is het minimale idee; in de praktijk kiest ThetisLink om praktische redenen een iets ruimere, vaste maat — waarom dat handig is lees je in §9.

Het resultaat is de informatie van uitsluitend dat stukje frequentie, weer omgezet naar een tijdsignaal — het vertrouwde I/Q-signaal. Netjes gefilterd tot ongeveer de band die je wilde horen, én met een veel lagere sample-rate (want we gingen van miljoenen bins terug naar een paar honderd). De FFT + iFFT samen doen dus meteen ook de decimatie: het terugbrengen van de hoge IQ-snelheid naar een lage audiosnelheid.

Analogie. De FFT haalt de regenboog uit het licht; de iFFT voegt de overgebleven kleuren weer samen tot één bundel. Omdat we bijna alle kleuren eruit filterden, komt er een smal, schoon signaal uit: precies het station waar je naar luistert.

9. In de praktijk: vaste sample-rate + nullen = filter

In de praktijk doen we het nét iets anders, om twee redenen:

Daarom nemen we niet exact “de bins die we willen horen”, maar een vast aantal bins dat overeenkomt met bijvoorbeeld 8 kHz. Dat is méér spectrum dan ons interesseert, maar de sample-rate ligt nu vast op 8 kS/s. (8000 / 62,5 = 128 bins → een iFFT van 128 punten, en dat is meteen een keurige 2-macht.)

Vervolgens zetten we in die iFFT nullen op alle frequenties die we niet willen horen. Wat overblijft is in de tijd een keurig tot ~3 kHz gefilterd signaal, én tegelijk een constante sample-rate van 8 kS/s. Het op nul zetten ís dus het filter — vlijmscherp, want we knippen exact op bin-grenzen.

Wil je een breder of smaller stukje horen? Dan vul je simpelweg meer of minder nullen op de juiste plek in de iFFT. Méér bins open = bredere doorlaat; meer nullen = smaller. Zo verander je je bandbreedte direct, zonder iets aan de sample-rate te veranderen.

de 128-bins iFFT (= 8 kHz, vaste rate) — USB-voorbeeld open (~3 kHz) op nul (weg) frequentie → = draaggolf (0 Hz), op index 0 (links)
Figuur 5 — Een vaste iFFT (hier 128 bins = 8 kHz). De doorlaat grenst aan de draaggolf (0 Hz, links): bij USB hou je de bins net erboven (de laagste audiofrequenties) en nul je de rest. Méér of minder nullen = bredere of smallere bandbreedte. (LSB is het spiegelbeeld aan de andere kant; AM houdt beide.)
In ThetisLink. De iFFT is 128 bins in smalband (= 8 kHz) of 256 bins in breedband (= 16 kHz). Je sleept de filterranden op het spectrum; de client/server vertalen dat naar “hoeveel bins open” (in stapjes van 62,5 Hz). SSB houdt één zijband open, AM/FM beide.

10. Fijntunen onder de bin (de NCO)

Eén probleem: bins liggen op een vast raster van 62,5 Hz. Maar een SSB-station staat bijna nooit precies op zo'n rasterpunt — en 62,5 Hz ernaast klinkt een stem al duidelijk te hoog of te laag. We moeten dus fijner kunnen afstemmen dan het bin-raster toelaat.

Analogie. De bins brengen je naar het dichtstbijzijnde parkeervak (op 62,5 Hz). Maar je wilt voor de déur staan. De NCO is het laatste stukje lopen: hij schuift het signaal nog dat kleine restje op (tot op een fractie van een Hz).
bin bin bin dichtstbijzijnde bin gewenste frequentie NCO schuift dit restje (≤ 31 Hz) frequentie →
Figuur 6 — De bin brengt je vlakbij; de NCO schuift het laatste restje (maximaal een halve bin).

Een NCO (numerically controlled oscillator) is in feite een klein, perfect zuiver toontje dat we tegen ons signaal aan vermenigvuldigen. Daardoor verschuift het hele signaal precies zoveel Hz als we willen — vloeiend, zonder klikken, en met willekeurig fijne precisie.

11. Demodulatie — geluid uit het signaal halen

We hebben nu een schoon, smal I/Q-signaal op de juiste frequentie. Demodulatie haalt daar het hoorbare geluid uit, en dat gaat per mode net even anders, omdat de informatie er anders in verstopt zit.

SSB (USB / LSB) — gewoon de echte kant

Bij enkelzijband zit de spraak rechtstreeks in het signaal zodra het naar nul-frequentie is geschoven (dat deden de bin-selectie en de NCO al). Het geluid is simpelweg het reële deel van het signaal. Bovenste (USB) of onderste (LSB) zijband bepaalde je al door te kiezen wélke bins je hield.

AM — de omhullende aflezen

Bij AM zit de informatie in de sterkte (amplitude). We meten de grootte van het signaal — de omhullende — en trekken de constante draaggolf (DC) eraf, zodat alleen de spraak/muziek overblijft.

FM — hoe snel de fase draait

Bij FM zit de informatie in de frequentie: de zender duwt de frequentie heen en weer met het geluid mee. Frequentie is “hoe snel de fase draait”. We meten van sample tot sample hoeveel de fase verdraaide — dat verschil ís het geluid.

AM: lees de omhullende de oranje omhullende (boven + onder) raakt de pieken — dát is het geluid tijd → FM: hoe snel draait de wijzer snelle draai = hoge toon, trage = lage toon
Figuur 7 — AM: het geluid is de omhullende (oranje). FM: het geluid is hoe snel de fase-wijzer ronddraait.
In ThetisLink. Ondersteund: USB, LSB, AM, SAM en FM. SSB = reële deel, AM = grootte, FM = fase-verschil tussen opeenvolgende samples. SAM houdt — net als AM — beide zijbanden, maar leest niet de omhullende af: het neemt het reële deel (een coherente detector) en trekt een langzaam meelopende DC-waarde af. Dat geeft minder vervorming dan gewone AM, mits je netjes op de draaggolf staat (deze implementatie heeft nog geen automatische draaggolf-tracking/PLL).

12. AGC — automatisch volume

Het ene station is keihard, het andere fluistert. De AGC (automatic gain control) regelt het volume automatisch bij: zwakke signalen worden versterkt, sterke teruggenomen, zodat alles op een prettig, gelijkmatig niveau in je koptelefoon komt.

Analogie. Als geluidsman bij een interview: springt iemand hard uit, dan draai je snel terug (“attack”); valt het stil, dan draai je rustig weer op (“decay”). De AGC doet dat automatisch — hier snel terug (10 ms) en langzaam op (500 ms), zodat een korte piek niet meteen alles dempt.

13. Smalband vs breedband (8 of 16 kHz)

De iFFT-keuze uit §9 bepaalt meteen de audio-samplesnelheid. Twee standen:

Dezelfde afweging als altijd: kwaliteit tegenover dataverbruik. Op een bekabeld netwerk is breedband bijna gratis; op een krappe verbinding kies je smalband.

In ThetisLink. Eén schakelaar in de client zet de RX-audio — de Thetis-ontvangst en de VRX-kanalen — op smal- of breedband (alleen ontvangst; zenden blijft breedband). De latency blijft gelijk; alleen de hoeveelheid data verandert.

14. Overlap-add — naadloos geluid

We verwerken het signaal in blokjes. Plak je die zomaar achter elkaar, dan hoor je bij elke naad een klikje — zeker omdat het window de randen al afzwakte (§5). Oplossing: laat elk blok voor de helft overlappen met het vorige en tel ze op. Waar het ene blok uitdooft, komt het volgende op — samen een gladde, ononderbroken stroom.

som = constante, naadloze audio tijd hop = ½ blok 1 blok (N samples)
Figuur 8 — Overlap-add gebeurt in de tijd: de horizontale as is tijd, niet frequentie. Opeenvolgende, afgezwakte audioblokken (elk een Hann-venster, §5) starten telkens na een halve bloklengte, overlappen dus 50% en worden opgeteld. Waar het ene blok uitdooft, komt het volgende op — de som is een vlakke, naadloze audiostroom.

15. Het spectrum- en watervalbeeld

Het mooie plaatje in de client — het spectrum (energie per frequentie) en de waterval (datzelfde, over tijd naar beneden schuivend) — komt uit een aparte, veel hoger-resolutie FFT. De audio heeft kleine, snelle blokjes nodig (lage vertraging); het beeld juist grote blokjes (scherpe resolutie). Twee verschillende afwegingen, twee aparte FFT's.

Analogie. Het spectrum is een momentopname (een staafdiagram van “hoeveel signaal waar”); de waterval is een tijdlijn die naar beneden schuift, zodat je een korte piep van seconden geleden nog terugziet.

16. Signaalsterkte — de S-meter

Hoe sterk is een signaal? De basis is verrassend eenvoudig: het vermogen (de “power”) van een complex sample is I² + Q² — de lengte van de wijzer in het kwadraat (denk terug aan de klok-analogie uit §1). Hoe langer de wijzer, hoe sterker het signaal.

Voor een heel kanaal meet je niet één sample, maar tel je het vermogen van alle bins binnen je doorlaatband op — de fijne spectrum-bins uit §15 (niet de grovere audio-bins van §9). Die som is de sterkte van precies dat kanaal — signaal én ruis samen, binnen je filter. Dat is meteen mooi: zet je je filter smaller, dan meet je minder ruis mee.

vermogen van de bins in de band → optellen → dBm frequentie → S135 7S9 +20+40+60 S9 = −73 dBm
Figuur 9 — De sterkte van een kanaal = het opgetelde vermogen van de bins in de doorlaatband, omgezet naar dBm en afgebeeld op de vertrouwde S-schaal.

Omdat signalen een enorm bereik beslaan (van een fluistering net boven de ruis tot een oorverdovend station), gebruiken we — net als bij geluid — een logaritmische schaal: dB, en in dit geval dBm (vermogen t.o.v. 1 milliwatt). Radioamateurs lezen dat af als S-units: op HF is S9 = −73 dBm, en elke S-unit lager is 6 dB zwakker. Boven S9 telt men verder in dB (“S9 + 20 dB”).

Eén ding nog: de FFT geeft een relatief vermogen (een getal zonder absolute eenheid). Om daar een echte dBm van te maken, moet de schaal geijkt worden. Dat gebeurt met een vaste kalibratie-offset, zodat de afgelezen waarde overeenkomt met de werkelijke signaalsterkte. En om te voorkomen dat de meter nerveus trilt, wordt de waarde gemiddeld (en/of de piek even vastgehouden) — net als het trage mechaniek van een ouderwetse naald-S-meter.

In ThetisLink. Voor de VRX-kanalen rekent de client zelf de S-meter uit: hij integreert het vermogen van de ontvangen spectrum-bins binnen de doorlaatband, zet dat met een vaste (empirisch geijkte) offset om naar dBm, en past meterballistiek toe — snelle attack, traag verval, plus een korte piek-hold. De gewone hoofd-RX (RX1/RX2) heeft zijn eigen route: daar levert de server een kant-en-klare waarde.

17. Waarom dit zo krachtig is — één FFT, veel ontvangers

Het echte voordeel van deze methode komt naar voren zodra je veel verschillende, onafhankelijke signalen tegelijk wilt horen.

De klassieke manier: elke ontvanger krijgt zijn eigen dure high-speed downconverter en filters — fysieke hardware, per ontvanger opnieuw. Tien luisteraars = tien keer die dure keten. Dat loopt snel uit de hand en schaalt slecht.

Deze methode draait het om: je rekent de grote FFT maar één keer uit en deelt die. Elke luisteraar haalt er met een kleine iFFT zijn eigen smalle stukje uit. En dat stukje eruit halen kost — in verhouding tot die ene grote FFT — heel weinig rekenwerk. Het dure deel doe je dus één keer; elke extra luisteraar daarna is bijna gratis.

één grote FFT — alle bins, gedeeld door iedereen frequentie → kleine iFFT kleine iFFT kleine iFFT luisteraar 13,630 LSB luisteraar 23,700 USB luisteraar 33,800 AM
Figuur 10 — Het principe: één keer de grote FFT rekenen; daarna tapt elke luisteraar met een eigen kleine, goedkope iFFT zijn stukje af — elk op een andere frequentie, mode en bandbreedte.

Daarom schaalt deze methode zo goed: al het zware werk zit in die ene grote FFT, en élke extra luisteraar daarna is bijna gratis. Wil je honderd mensen tegelijk, elk op hun eigen frequentie, laten meeluisteren? Dan reken je nog steeds maar één grote FFT — niet honderd dure ontvangstketens. Dáár zit de kracht van deze aanpak.

Terug naar de satellietfoto. Je maakt die ene dure foto één keer. Honderd mensen erop laten inzoomen kost daarna bijna niets — precies zoals één FFT honderd goedkope iFFT-uitsnedes voedt.
In ThetisLink (TL2). Dit is het principe dat de methode zo krachtig maakt bij heel veel gelijktijdige gebruikers. TL2 zelf gebruikt het bescheidener: er is één VRX per ontvanger — VRX1 op VFO-A (RX1) en VRX2 op VFO-B (RX2). Meerdere clients kunnen wél naar dezelfde VRX meeluisteren, maar delen dan de instellingen van dat kanaal. De schaalbaarheid hierboven is de ruimte die deze architectuur biedt, niet een limiet die nu al is opgezocht.

18. Filtereigenschappen in detail

In §9 zagen we dat “bins op nul zetten” neerkomt op filteren. Maar wat voor filter krijg je dan precies? Hieronder de eigenschappen die je ook in een ontvanger-specificatie tegenkomt — filtervorm, dynamisch bereik en group delay — met de getallen erbij. Dit is verdieping; voor het grote verhaal heb je het niet nodig.

Filtervorm en steilheid

Het selecteren van bins is een rechthoekig masker in het frequentiedomein: een bin doet volledig mee (×1) of helemaal niet (×0). De filterrand ligt dus op een raster van één bin:

bin­breedte = Fs / Nfft = 1.536.000 / 24.576 = 62,5 Hz

De maskerkeuze zelf is kraakhard, maar de werkelijke overgang wordt mede bepaald door de hoofdlob van het Hann-venster (§5): die is ~1–2 bins breed, dus de flank loopt over zo'n 60–125 Hz. (Het is dezelfde venstereigenschap die ook de stopband-bodem zet — zie de volgende paragraaf.) Voor een SSB-filter van 2,4 kHz is dat een overgangsgebied van maar ~3–5% van de doorlaatbreedte — veel steiler dan een kristal- of mechanisch filter in een klassieke ontvanger (overgang vaak 10–30%).

Die overgang is in Hz ongeveer constant (die ~bin), ongeacht hoe breed je filter staat. Voor brede filters ligt de shape factor (verhouding van de breedte bij een diep niveau tot die bij −6 dB) daardoor heel dicht bij 1 — bijna een ideale rechthoek. Voor een heel smal filter (CW, bijv. 300 Hz) wordt diezelfde vaste ~62,5 Hz-flank een grotere fractie van de doorlaat, en loopt de shape factor als verhouding op — al blijft de flank in Hz even steil.

Dynamisch bereik en ultieme onderdrukking

Twee dingen begrenzen het dynamisch bereik (amplitude-bereik):

Wil je dieper onderdrukken, dan is dat de klassieke venster-afweging: een Blackman-Harris- venster haalt ~−90 dB zijlobben, maar de hoofdlob (en dus het overgangsgebied) wordt ~2× zo breed. Steiler én dieper tegelijk vraagt simpelweg méér rekenlengte — een groter venster, een grotere FFT, of een lang FIR; gratis gaat het niet (zie de figuur).

0−30−60 −90−120−150 dBc (t.o.v. doorlaat) −6−5−4 −3−2−1 0+1+2+3 frequentie t.o.v. afstempunt (kHz) — 1 bin = 62,5 Hz doorlaatband (LSB, 3 kHz: −3…0 kHz) 32-bit reken-/quantisatieruis ~−145 dBc bins buiten de rand: 1:−31 2:−49 4:−67 8:−85 … ideaal masker resultante
Figuur 11 — De filterrespons voor een concreet LSB-kanaal van 3 kHz, met het afstempunt (de draaggolf) op 0 kHz. LSB ligt onder de draaggolf, dus de doorlaatband loopt van −3 tot 0 kHz; voor het gemak valt de bovenste bandrand precies op 0 Hz (links −6 kHz, rechts +3 kHz). De resultante (blauw) is vlak op 0 dBc in de band; op elke rand zakt hij de werkelijke Hann-cascade af: ~−31 dBc op 1 bin (62,5 Hz) buiten de rand, daarna ~18 dB per octaaf — dus −49 op 2 bins, −67 op 4, −85 op 8, −103 op 16… — doorzakkend tot de 32-bit reken-/quantisatieruisvloer (~−145 dBc), de echte ondergrens (níét de eerder voor het gemak getekende −60). De x-as is frequentie t.o.v. het afstempunt; 1 bin = 62,5 Hz, en 3 kHz = 48 bins. Het ideale masker (grijs) is de perfecte rechthoek.

De FFT/iFFT-methode geeft dus zeer scherpe filtering, maar met een vaste vorm (rechthoekig bin-masker + Hann-skirt). Een aanvullend FIR is alleen zinvol als je juist een andere vorm nodig hebt — bijvoorbeeld een bewuste passband-helling, een matched/raised-cosine-vorm voor datamodes, of een notch in de band. Steiler maken kan in principe ook, maar alleen met een zeer groot FIR (honderden taps), niet met een eenvoudige. Voor luisteren naar SSB, AM en FM is een vlakke, scherpe band precies wat je wilt, dus een aanvullend FIR is hier niet nodig.

Group delay — vlak, zoals een lineair-fase FIR

Dit is een sterke troef van de methode. Het bin-masker is reëel (een bin telt mee of niet — een getal zonder fasedraai), het Hann-venster is symmetrisch, en de NCO is een zuivere frequentieverschuiving (alleen fase-rotatie, geen amplitude). Samen voegen die geen scheve fase toe: in de doorlaatband is de respons lineair in fase — net als een FIR-filter. Gevolg:

Een klassiek ontvangerfilter (kristal, mechanisch, of een IIR-DSP-filter) heeft juist een lage absolute vertraging, maar vertoont een group-delay-piek rond de bandranden — de fase loopt daar niet netjes lineair, wat transiënten uitsmeert. De FFT-methode ruilt dat om: een iets hogere maar vlakke vertraging, zonder fase-vervorming. Voor luisteren naar SSB, AM en FM is die vertraging onhoorbaar; de vlakke fase hoor je juist als een schoon, “strak” geluid.

Optioneel: een FIR achter de iFFT

De bin-selectie geeft al een steile, bijna-rechthoekige doorlaat, maar de exacte vorm wordt bepaald door het venster (een licht aflopende rand en een zijlob-niveau dat pal naast de band op ~−31 dB ligt en daarbuiten ~18 dB/octaaf zakt). Wil je de overdracht een nauwkeurig gespecificeerde vorm geven, dan kun je achter de iFFT een FIR-filter zetten. Dat is relatief goedkoop, want na de iFFT draait alles op de lage uitgangsrate (8 of 16 kHz). Zo'n FIR zou kunnen:

Maar daar zit een afweging in. Een symmetrische (lineair-fase) FIR houdt de group delay vlak; een scherpere flank kost dan meer taps — dus meer latency. Wil je scherper zonder die extra vertraging, dan moet je de lineaire fase opgeven en krijg je (net als bij een klassiek analoog- of kristalfilter) group-delay-vervorming aan de bandranden terug. Kortom: scherpte staat tegenover vlakke fase/latency — een bewuste ontwerpkeuze. Het blijft het bekende recept: grove kanaalselectie + decimatie met de FFT, fijne vormgeving met een FIR.

In ThetisLink. De huidige keten gebruikt een Hann-analysevenster met 50% overlap-add en het rechthoekige bin-masker — geen extra FIR en geen synthesevenster. Voor amateur-SSB/AM/FM is die respons ruim voldoende; de steile flanken (~62,5 Hz overgang) en de vlakke group delay komen er gratis bij. Een nabewerkende FIR is de logische knop als ooit een textbook-exacte doorlaatvorm of diepere stopband nodig is.

Tot slot — alles samen

Eén breed tijdsignaal (tot 1,536 MHz) gaat door een grote complexe FFT en wordt in bins van 62,5 Hz uiteengelegd; we houden alleen de bins van het gewenste kanaal en zetten de rest op nul (= filteren); een vaste iFFT (128/256 bins) zet dat terug naar een I/Q-tijdsignaal met constante sample-rate; de NCO schuift het precies op frequentie; per mode demoduleren we het; de AGC regelt het volume; en als compacte, met Opus gecomprimeerde audio gaat het naar de client. Omdat dit per luisteraar een eigen uitsnede is, kunnen veel mensen tegelijk en onafhankelijk binnen dezelfde band luisteren.

En het is helaas niet gratis. De FFT en iFFT kosten rekentijd die met de afmeting meegroeit (ongeveer evenredig — strikt genomen N·log N). Maar de vertraging zit vooral elders: je moet eerst een heel blok samples verzamelen vóór je kunt rekenen, en hoe fijner je het spectrum uitsplitst (smallere bins), hoe langer dat blok moet zijn. Fijn frequentiedetail en lage latency trekken dus aan elkaar — de klassieke tijd-frequentie-afweging. (In deze keten ligt die vast op 62,5 Hz per bin ≈ 16 ms blok; een hogere DDC-rate maakt de FFT groter en de blik breder bij hetzelfde detail en dezelfde latency, maar kost meer rekenkracht.) Er moet dus altijd een balans worden gevonden tussen vertraging (latency) en spectrumdetail — precies de afweging die in dit hele verhaal steeds terugkomt.

Dat is, in een notendop, hoe een VRX van radiogolf tot geluid komt. Wil je weten hoe dat geluid (plus het spectrum, de S-meter en alle knoppen) vervolgens over het netwerk bij je client komt? Dat staat in het zusterdocument “Van server naar client”.