Chirp en DeChirp vereenvoudigd voorgesteld¶
Inleiding¶
Deze analyse hoort bij een poging om beter te begrijpen waarom LoRa zo goed werkt. Het doel is om op een eenvoudige manier duidelijk te maken wat er wordt verzonden, wat er door de ontvanger wordt ontvangen, wat het dechirp-proces daarmee doet en hoe de FFT daar uiteindelijk het symbool uit haalt.
Om het duidelijk te houden, wordt een sterk vereenvoudigd voorbeeld gebruikt: een "bandbreedte" van 10 frequentiestappen (0–9), waarbij elk sample 1 seconde duurt. In de praktijk zijn de tijden veel korter (milliseconden) en het aantal samples per symbool veel groter (128–4096), maar het principe blijft hetzelfde.
Het probleem met de simpele tabel¶
Bij mijn eerste poging om LoRa dechirp met een eenvoudige som-tabel te laten zien, gaat het mis zodra er een wrap in de frequentie optreedt. Eerst het geval zonder verschuiving.
Symbool 0 (geen verschuiving) — Werkt¶
Hier zie je links het verzonden signaal: de TX up-chirp.
Daarnaast staat de referentie in de ontvanger: de RX down-chirp die lokaal in de ontvanger wordt gebruikt om het binnengekomen signaal mee te vergelijken.
In dit eenvoudige voorbeeld lopen die netjes tegenover elkaar, waardoor de som constant blijft.
| TX (up) | RX (down) | Som |
|---|---|---|
| 0 | 10 | 10 |
| 1 | 9 | 10 |
| 2 | 8 | 10 |
| 3 | 7 | 10 |
| 4 | 6 | 10 |
| 5 | 5 | 10 |
| 6 | 4 | 10 |
| 7 | 3 | 10 |
| 8 | 2 | 10 |
| 9 | 1 | 10 |
✓ Constante som = 10. Hier werkt het idee "constante som = goed".
Symbool 3 (verschoven) — Faalt na wrap¶
Daarna dezelfde tabel voor de verschoven versie (symbool 3).
Daarbij is het verzonden chirp-signaal niet bij 0 gestart, maar bij 3.
De ontvanger gebruikt nog steeds dezelfde lokale down-chirp referentie om het ontvangen signaal mee te vergelijken:
| TX (start=3) | RX (down) | Som − 10 | Status |
|---|---|---|---|
| 3 | 10 | 3 | ✓ |
| 4 | 9 | 3 | ✓ |
| 5 | 8 | 3 | ✓ |
| 6 | 7 | 3 | ✓ |
| 7 | 6 | 3 | ✓ |
| 8 | 5 | 3 | ✓ |
| 9 | 4 | 3 | ✓ |
| 0 (wrap) | 3 | −7 | ✗ FOUT |
| 1 | 2 | −7 | ✗ FOUT |
| 2 | 1 | −7 | ✗ FOUT |
Na de wrap klopt de berekening niet meer in deze simpele benadering.
Waarom wrapping noodzakelijk is¶
De frequentieband is fysiek begrensd. In dit voorbeeld gebruiken we 10 stappen (0–9), in de praktijk bijvoorbeeld 64 kHz bandbreedte met een vaste kanaalbreedte.
De frequentie mag niet buiten de band omdat:
- Het buiten het toegewezen spectrum zou vallen (illegaal)
- Het andere diensten zou verstoren
- De ontvanger het signaal dan niet kan volgen
Daarom loopt de tijd/positie netjes door (0–9), maar springt de verzonden of ontvangen momentane frequentie terug naar 0 wanneer die voorbij 9 zou gaan: dat is de wrap.
Belangrijk daarbij is dat alleen de zichtbare frequentie binnen de band terugklapt; de onderliggende fase-ontwikkeling van het signaal loopt wiskundig gewoon door.
[!WARNING] Belangrijk: de wrap is een praktische beperking van de frequentieband, niet een echte "reset" van de onderliggende fase-ontwikkeling van het signaal.
De correcte interpretatie¶
De oplossing is om niet naar de som te kijken, maar naar het verschil tussen:
- de frequentie van het ontvangen/verzonden LoRa-signaal op dat moment, en
- de lokale referentiechirp in de ontvanger.
Daarbij moet de TX-frequentie na de wrap wiskundig worden gezien als doorlopend. Dan blijft het verschil constant.
| Positie | TX freq | TX (wiskundig) | RX ref | Verschil |
|---|---|---|---|---|
| 0 | 3 | 3 | 0 | 3 |
| 1 | 4 | 4 | 1 | 3 |
| 2 | 5 | 5 | 2 | 3 |
| 3 | 6 | 6 | 3 | 3 |
| 4 | 7 | 7 | 4 | 3 |
| 5 | 8 | 8 | 5 | 3 |
| 6 | 9 | 9 | 6 | 3 |
| 7 | 0 (wrap) | 10 | 7 | 3 |
| 8 | 1 | 11 | 8 | 3 |
| 9 | 2 | 12 | 9 | 3 |
Het verschil blijft constant = 3, ongeacht de wrap!
Door de TX-frequentie wiskundig "door te tellen" (10, 11, 12, …) zie je dat het verschil met de RX-referentie overal 3 blijft, ook na de wrap.
Met andere woorden: de ontvanger ziet na de dechirp-bewerking steeds hetzelfde frequentieverschil terug. Dat constante verschil is precies wat de FFT als piek terugvindt.
[!NOTE] Let op: dit is een vereenvoudigde voorstelling die bedoeld is om het werkingsprincipe van de dechirp- en FFT-piekdetectie intuïtief te maken; de daadwerkelijke LoRa-implementatie gebruikt een complexere, maar wiskundig equivalente beschrijving.
FFT piekdetectie — Grafische voorstelling¶
De FFT kijkt naar het resultaat nadat het ontvangen signaal met de lokale referentiechirp is gedechirpt.
Zij telt dan in feite hoe vaak elk mogelijk frequentieverschil voorkomt; elk verschil komt in een eigen bin terecht.
Voor symbool 3 leveren alle 10 samples hetzelfde verschil 3 op, dus stapelt alle energie zich in bin 3.
Een bin is letterlijk een "bakje" waarin de energie voor dat specifieke frequentieverschil wordt opgeteld.
Ideaal signaal (geen verlies)¶
Alle 10 samples dragen bij aan bin 3. Bin 3 krijgt daardoor een piekhoogte van 10, de andere bins blijven laag.
FFT Bar Chart: Ideal signal
Met 30% sample verlies¶
Zelfs met 3 gemiste samples blijft de piek bij bin 3 dominant. Het symbool wordt correct gedetecteerd.
FFT Bar Chart: 30% loss
Met ruis/interferentie¶
Ruis en fouten landen in willekeurige bins. Ze zijn verspreid en kunnen de signaalpiek niet overstijgen.
FFT Bar Chart: With noise
Het kernprincipe¶
| SIGNAAL | RUIS |
|---|---|
| Alle samples → dezelfde bin | Fouten → willekeurige bins |
| = GECONCENTREERDE ENERGIE | = VERSPREIDE ENERGIE |
Daarom kan incidentele vervuiling, ruis of sampleverlies de echte signaalpiek meestal niet overstijgen:
het juiste ontvangen symbool concentreert zich na dechirp in één bin, terwijl fouten en ruis juist over meerdere bins verspreid raken.
Hoeveel samples kun je missen?¶
De fouttolerantie hangt af van de Spreading Factor:
| Spreading Factor | Samples per symbool | ~30% verlies tolereerbaar |
|---|---|---|
| SF7 | 128 | ~38 samples |
| SF10 | 1024 | ~307 samples |
| SF12 | 4096 | ~1229 samples |
Daarnaast voegt de Coding Rate (CR) nog extra foutcorrectie toe:
| Coding Rate | Overhead | Fouttolerantie |
|---|---|---|
| CR 4/5 | 25% | Basis |
| CR 4/6 | 50% | Matig |
| CR 4/7 | 75% | Goed |
| CR 4/8 | 100% | Maximaal |
Processing gain — De kracht van LoRa¶
De "magie" van LoRa zit in de processing gain: door het signaal te spreiden over vele samples, kun je signalen detecteren die onder de ruisvloer liggen.
In ons voorbeeld met 10 samples:
- Signaalenergie concentreert in 1 bin
- Ruis verdeelt over 10 bins
- Processing gain ≈ 10× (10 dB)
Bij SF12 met 4096 samples: processing gain ≈ 4096× (36 dB)!
Dit verklaart waarom LoRa verbindingen kan maken die met conventionele radio onmogelijk zouden zijn.
Conclusie¶
De oorspronkelijke tabel-aanpak mislukte omdat:
- Er met een som werd gewerkt in plaats van met een verschil
- De wrap werd gezien als een echte reset, in plaats van een praktische beperking van de frequentieband
- Er werd te veel gekeken naar losse, momentane frequenties, terwijl de ontvanger in werkelijkheid het ontvangen signaal vergelijkt met een lokale referentiechirp, waarna het relevante verschil via de FFT zichtbaar wordt als een piek
De FFT ziet het constante verschil als een duidelijke piek:
- Alle juiste samples stapelen zich in dezelfde bin (signaal)
- Ruis en fouten worden uitgesmeerd over andere bins
- De piek van het signaal blijft daardoor dominant, zelfs bij aanzienlijk sample-verlies
In MeshCore wordt de FFT zo gebruikt als beslisser: na het vergelijken van het ontvangen signaal met de lokale referentie in de ontvanger is de bin met de grootste energie het gedecodeerde symbool. Daardoor blijft de implementatie relatief eenvoudig, goed schaalbaar en robuust tegen fouten.