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.
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.
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).
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:
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):
en de terugweg (frequentie → tijd) is bijna dezelfde som, met een plusteken in de exponent en
een deling door 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
ejθ = 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
N² — 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:
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.
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.)
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)
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.
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.
9. In de praktijk: vaste sample-rate + nullen = filter
In de praktijk doen we het nét iets anders, om twee redenen:
- We willen een vaste, nette sample-rate die mooi aansluit op de verdere audioverwerking in de computer.
- We willen de bandbreedte snel kunnen variëren — bijvoorbeeld door in het spectrum de filterrand te slepen.
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.
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.
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.
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.
13. Smalband vs breedband (8 of 16 kHz)
De iFFT-keuze uit §9 bepaalt meteen de audio-samplesnelheid. Twee standen:
- Smalband — 128 bins = 8 kHz: audio tot ~4 kHz, prima voor spraak (telefoonkwaliteit), weinig data.
- Breedband — 256 bins = 16 kHz: audio tot ~8 kHz, duidelijk helderder, ~2× zoveel data.
Dezelfde afweging als altijd: kwaliteit tegenover dataverbruik. Op een bekabeld netwerk is breedband bijna gratis; op een krappe verbinding kies je smalband.
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.
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.
- dB-schaal: sterkte logaritmisch, zodat een fluistering én een kanonschot tegelijk zichtbaar zijn.
- Peak-hold met verval: pieken springen meteen omhoog en zakken daarna rustig weg — rustiger voor het oog.
- Zoom en pan: inzoomen op een stukje band; het beeld centreert rond je afstemfrequentie.
- Filterranden slepen: de doorzichtige balk toont je doorlaatband. Sleep de randen en je stelt direct je bandbreedte in — precies de open bins uit §9.
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.
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.
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.
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.
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:
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):
- De rekenkant is bijna geen beperking. Alles draait in 32-bits drijvende komma; de ~24 bits mantisse geeft rond een gekozen schaal zo'n 144 dB relatieve precisie (de numerieke ruisvloer), zodat de rekenprecisie zelden de eerste grens is. Het echte plafond ligt vóór de channelizer: de ADC/DDC van de SDR (de ANAN heeft een 16-bits ADC ≈ 96 dB momentaan, en in een smal kanaal effectief méér door process-gain).
- De ultieme onderdrukking buiten de band wordt gezet door het venster, niet door het bin-masker. Een sterk signaal nét buiten je doorlaatband lekt via de zijlobben van het Hann-venster (§5) tóch een beetje de doorlaatband in — en wel via de dichtstbijzijnde rand-bin (de laatste meegenomen, niet-genulde bin). Twee dingen om de getallen te lezen: de 0 dB-referentie is het doorlaatniveau (vandaar dBc), en de afstand telt vanaf die bandrand — niet vanaf het bandmidden of 0 Hz (bij SSB ligt de band niet eens symmetrisch rond 0). De eerste zijlob ligt op ~−31 dBc, ~1 bin (62,5 Hz) buiten de rand; daarna zakt het ~18 dB per octaaf, waarbij "octaaf" = verdubbeling van de afstand tot de rand (≈ −49 dBc op 2 bins, −67 op 4, −85 op 8). Een buurman pal naast de band (~−31 dBc) is dus de praktische grens; verder weg zakt het snel.
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).
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:
- De group delay is vlak over de hele doorlaatband: alle frequenties komen even snel door, dus geen fase-vervorming. Een heel steile filterrand geeft nog wél wat na-/voor-rinkeling, maar door de lineaire fase is die symmetrisch — niet de scheve, naar-één-kant uitsmerende vervorming van een analoog of IIR-filter.
- Twee getallen die je niet moet verwarren: de group delay zelf is ongeveer een
halve bloklengte (~8 ms). De totale algoritmische vertraging is groter, want je moet
eerst een heel blok vullen vóór je kunt rekenen:
Nfft / Fs = 1 / binbreedte = 1 / 62,5 Hz ≈ 16 ms. Beide zijn groter dan bij een analoog filter, maar wél constant.
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:
- de flank nóg scherper maken — dichter tegen het ideale rechthoek-masker aan;
- de licht aflopende doorlaatband-rand vlak trekken;
- de stopband ver onder de venster-bodem duwen (echte −60…−80 dB);
- het overgangsgebied precies op maat zetten.
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.
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”.