1. A legfontosabb modell: egész szám + skálafaktor
A fixpontos ábrázolásban a bitminta önmagában egy egész számot kódol. A „bináris pont” helyét nem a hardver tárolja, hanem a programozó, a fordító, a DSP-könyvtár vagy a dokumentált interfész értelmezi. Emiatt a fixpont lényegében szerződés a kód és a valós érték között.
Ha például F = 7, akkor a kód q = 64 a 64 · 2⁻⁷ = 0.5 értéket jelenti. Ugyanez a bitminta más F mellett más valós szám lenne. Ezt a hallgatók gyakran alulértékelik: a bitminta és az érték között nincs önálló, univerzális kapcsolat.
Rövid analógia
A fixpontos szám olyan, mintha minden értéket milliméterben tárolnék egész számként, de méterként értelmezném vissza.
| Tárolt egész | Skála | Valós érték |
|---|---|---|
1234 | 10⁻³ | 1.234 m |
1234 | 2⁻¹⁰ | 1.205078125 |
2. Q-formátum: hol van a bináris pont?
A Q-formátum a fixpontos értelmezés rövid jelölése. A jelölésben sajnos van szakirodalmi ingadozás, ezért egy kurzusban mindig explicit módon definiálni kell, hogy a jelbitet beleszámoljuk-e. Ebben a tananyagban az alábbi konvenciót használom.
A Δ a legkisebb lépésköz, vagyis a fixpontos rács felbontása. Több törtrészbit finomabb felbontást ad, de ugyanakkora teljes bitszám mellett csökkenti a tartományt.
| Formátum | N | I | F | Tartomány | Lépésköz | Tipikus használat |
|---|---|---|---|---|---|---|
Q0.15 vagy gyakran Q15 | 16 | 0 | 15 | [−1, 0.999969482…] | 2⁻¹⁵ ≈ 3.05·10⁻⁵ | normalizált DSP jel, koefficiens |
Q1.14 | 16 | 1 | 14 | [−2, 1.999938965…] | 2⁻¹⁴ | kisebb túlvezérlési tartalék |
Q7.8 | 16 | 7 | 8 | [−128, 127.99609375] | 2⁻⁸ | szenzoradat, vezérlés |
UQ0.8 | 8 | 0 | 8 | [0, 0.99609375] | 2⁻⁸ | előjel nélküli arány, kitöltési tényező |
Q1.15 jelöléssel 16 bites, előjeles
formátumot értenek, ahol az „1” a jelbitet is magában foglalja. Más forrásoknál a jelbit külön áll,
így Q1.15 17 bitet jelentene. Mérnöki dokumentumban ezért mindig meg kell adni:
N, F, előjelesség, overflow mód, kerekítés módja.
Kétkomplementes aszimmetria
Előjeles kétkomplementes formátumban eggyel több negatív egész kód van, mint pozitív. Emiatt a fixpontos tartomány is aszimmetrikus.
abs(INT_MIN) kétkomplementes egészben nem fér el
ugyanabban a bitszélességben. Ugyanez a jelenség fixpontos kódokra is átöröklődik.
3. Interaktív kvantáló: tartomány, felbontás, hiba
Az alábbi demonstrációban előjeles kétkomplementes fixpontot használok. A bemeneti valós értéket egész kóddá kvantálom, majd ugyanazzal a skálával visszaalakítom. Figyelje meg, hogy a törtrész bitek növelése javítja a felbontást, de szűkíti az ábrázolható tartományt.
Jelölés: s = jelbit, i = egészérték-bit, f = törtrész-bit.
4. Kvantálási és kerekítési hiba
A fixpontos ábrázolás a valós számokat rácspontokra vetíti. A rácspontok távolsága Δ = 2⁻F. Legközelebbi rácspontra kerekítésnél az ideális abszolút hiba legfeljebb Δ/2, amennyiben nem történik overflow vagy szaturáció.
Δ²/12 modell hasznos, de nem törvény. Periodikus, determinisztikus vagy visszacsatolt rendszerekben
a kvantálási hiba korrelálhat a jellel. IIR szűrőkben emiatt limit cycle is kialakulhat.
Csonkolás kontra kerekítés
A csonkolás gyors, de általában torzítást visz a számításba. Audio- és mérőrendszerekben ez hallható, illetve mérhető DC-eltolódást vagy spektrális torzulást okozhat. A kerekítés számításigényesebb, de kisebb és kevésbé torzított hibát eredményez.
Felbontás kontra tartomány
Ugyanazon N bitszám mellett a törtrész bitek növelése nem ingyenes.
| Döntés | Következmény |
|---|---|
| F növelése | finomabb Δ, kisebb kvantálási hiba, szűkebb tartomány |
| F csökkentése | nagyobb tartomány, durvább felbontás |
| N növelése | jobb tartomány vagy felbontás, nagyobb memória/sávszélesség/szorzóigény |
5. Fixpontos aritmetika: az igazi nehézség
A fixpontos számítás nem az összeadásnál, hanem a skálák követésénél válik nehézzé. A bináris pont helye minden művelet után logikailag változhat.
Összeadás és kivonás
Szorzás
Ha két Q0.15 számot összeszorzok, a nyers szorzat skálája Q0.30 jellegű lesz. Ha az eredményt újra Q0.15 formátumban akarom tárolni, akkor 15 bittel jobbra kell skálázni, lehetőleg kerekítéssel és szaturációval.
Interaktív Q0.7 szorzás
8 bites, előjeles, F = 7. A termék skálája először Q14 jellegű, majd visszaskálázom Q7-re.
6. Overflow: wrap-around vagy szaturáció?
Overflow akkor keletkezik, amikor az egész kód nem fér el a rendelkezésre álló bitszélességben. Két alapvető stratégia van: körbefordulás és szaturáció.
| Mód | Mechanizmus | Következmény |
|---|---|---|
| Wrap-around | az eredmény modulo 2ᴺ értelmeződik | gyors, de nagy amplitúdójú, nemlineáris hibát okozhat; audio- és vezérlőrendszerben veszélyes |
| Szaturáció | az érték a min/max határra korlátozódik | fizikailag gyakran értelmezhetőbb, de továbbra is nemlineáris torzítás |
Interaktív overflow-demó
A példa nyers előjeles egész kódokon fut; fixpontos számnál ugyanez történik a skálázott kódokkal.
7. Következmények FIR és IIR szűrőkben
FIR szűrő
FIR szűrőben a fixpontos alapművelet szorzás–összegzés. Ha a bemenet és a koefficiens is Q15, a termék Q30 skálájú. Az akkumulátornak több bit kell, mint a bemenetnek.
IIR szűrő
IIR szűrőnél a hiba veszélyesebb, mert visszacsatoláson keresztül újra belép a rendszerbe. A koefficienskvantálás elmozdítja a pólusokat, a belső állapotok kvantálása pedig önfenntartó kis oszcillációt, azaz limit cycle-t okozhat.
Tipikus DSP-hibák
- Nincs guard bit: az akkumulátor túlcsordul, miközben a végső kimenet még elférne.
- Rossz shift: Q30 terméket Q15 helyett Q14 vagy Q16 skálára visznek vissza.
- Koefficiensszaturáció: a
+1.0Q15-ben nem ábrázolható, ezért 32767 lesz, nem 32768. - Wrap-around szűrőben: ritka túlcsordulás is nagy spektrális torzítást okoz.
- IIR limit cycle: nulla bemenet mellett sem tűnik el teljesen a kimenet.
- Skálázatlan biquad: a kimenet elfér, de egy belső állapot túlcsordul.
8. Fixpontos és lebegőpontos ábrázolás összehasonlítása
A fixpont és a lebegőpont közötti különbség nem pusztán bitszám kérdése. A fixpont állandó abszolút felbontást ad egy előre választott tartományban. A lebegőpont nagy dinamikatartományt és nagyjából relatív pontosságot ad az exponens miatt.
| Szempont | Fixpont | Lebegőpont | Kritikus értelmezés |
|---|---|---|---|
| Felbontás | Állandó abszolút lépésköz: Δ = 2⁻F. | Az érték nagyságával változó abszolút lépésköz; közel állandó relatív pontosság. | Fixpont jó, ha ismert és szűk a jeltartomány; lebegőpont jó, ha széles a dinamikatartomány. |
| Tartomány | Erősen korlátozott, a skálázást kézzel kell megválasztani. | Nagyon nagy tartomány az exponens miatt. | A lebegőpont sok skálázási hibát elfed, de nem szünteti meg a kerekítési hibát. |
| Overflow | Gyakori tervezési probléma; wrap vagy szaturáció. | Túlcsordulás ritkább, de Infinity keletkezhet. |
Fixpontnál explicit overflow-stratégia kell. Lebegőpontnál a kivételeket és NaN-t kell kezelni. |
| Alulcsordulás | A kis érték egyszerűen nullára kvantálódhat. | Subnormal számok és fokozatos alulcsordulás lehetséges. | Fixpontban a kicsi jelek elveszhetnek; lebegőpontban teljesítmény- és pontossági részletek jelentkezhetnek. |
| Hardver | Egész ALU-val olcsó, determinisztikus, energiahatékony lehet. | FPU-val kényelmes és gyors; FPU nélkül drága/lassú lehet. | Hardverfüggő. Általános állításként a „fixpont mindig gyorsabb” hamis. |
| Programozói teher | Magas: skálázás, guard bitek, rounding, saturation. | Alacsonyabb, de numerikus analízis továbbra is kell. | Fixpontnál a hibamodell láthatóbb, de több fegyelmet igényel. |
| Reprodukálhatóság | Bitpontos implementáció jól kontrollálható. | Fordító, FPU mód, asszociativitás és optimalizálás befolyásolhatja. | Biztonságkritikus rendszerekben ez döntő szempont lehet. |
9. Interaktív minitábla: ugyanazok az értékek fixpontban és Float32-ben
A táblázat a fenti Q-formátumot használja. A Float32 oszlop JavaScript Float32Array
átalakítással készül. A cél nem az, hogy a Float32-t „hibátlannak” mutassam, hanem az, hogy láthatóvá váljon:
fixpontban a tartományon kívüli értékek azonnal szaturálódnak vagy körbefordulnak, míg a lebegőpont
sokkal szélesebb tartományban képes reprezentálni.
| x | fixpontos x̂ | fixpontos hiba | Float32(x) | Float32 hiba | megjegyzés |
|---|
10. Gyakorlati tervezési eljárás
- Határozza meg a fizikai tartományt: mekkora lehet a jel maximuma és minimuma normál, illetve worst-case esetben?
- Válasszon előjelességet és bitszámot: előjeles kétkomplementes vagy előjel nélküli formátum?
- Válassza meg F-et: a tartomány még férjen el, a felbontás pedig legyen elég finom.
- Adjon guard biteket: különösen összegzés, FIR akkumulátor és biquad belső állapot esetén.
- Döntsön kerekítésről és overflow-ról: truncation/rounding, wrap/saturation.
- Kvantálja a koefficienseket: ellenőrizze a frekvenciamenetet, pólusokat, zérusokat.
- Végezzen bitpontos szimulációt: nem elég a lebegőpontos modell.
- Validálja célhardveren: fordító, shift, szaturáló utasítás, endianitás és integer promotion is okozhat eltérést.
Mit írok specifikációba?
11. Érdekességek és kevésbé nyilvánvaló következmények
+1 gyakran nem fér el
Q0.15-ben −1 ábrázolható, de +1 nem. A maximális pozitív érték 32767/32768.
A szaturáció nem lineáris
Ha egy szűrőben szaturáció történik, a rendszer már nem lineáris. Emiatt a szuperpozíció nem alkalmazható változtatás nélkül.
A shift kerekítése számít
A jobbra shift csonkolásként viselkedhet. Sok apró csonkolás mérhető torzítássá állhat össze.
Blokk-lebegőpont
Egyes DSP-rendszerek blokkonként közös exponenst használnak. Ez hibrid megoldás fixpont és lebegőpont között.
Dither
Kvantálás előtt kis zaj adható a jelhez, hogy a determinisztikus kvantálási torzítás zajszerűbbé váljon.
Formális bitpontosság
Beágyazott DSP-ben a referencia nem mindig „matematikai valós”, hanem egy bitpontos aranymodell.
12. Ellenőrző kérdések
Miért mondom, hogy a bináris pont nincs eltárolva?
Mert a bitminta csak egész kód. A törtrész bitek számát az értelmezési konvenció, például Q0.15, adja meg. Ugyanaz a kód más F mellett más valós érték.
Mi a különbség a kvantálási hiba és az overflow között?
A kvantálási hiba a rácsra kerekítés kis hibája, tipikusan legfeljebb Δ/2. Az overflow tartományhiba: az érték nem fér el, ezért szaturálódik vagy körbefordul. Ez sokkal durvább hiba lehet.
Miért kell több bit a FIR akkumulátorba?
Mert több szorzatot adunk össze. Még ha minden egyes szorzat el is fér, az összeg nagyobb tartományt igényelhet. Nagyságrendileg ceil(log₂ M) extra bit kell M hasonló nagyságú tag összegzéséhez.
Miért kényesebb az IIR fixpontos implementáció, mint a FIR?
Az IIR visszacsatolt. A kvantálási és kerekítési hiba visszakerülhet a rendszerbe, a koefficienskvantálás pedig elmozdítja a pólusokat. Ez stabilitási és limit-cycle problémákhoz vezethet.
Mikor választanék fixpontot lebegőpont helyett?
Ha a jeltartomány jól ismert, a hardver egész aritmetikára optimalizált, energia- vagy költségkorlát van, illetve bitpontos reprodukálhatóság szükséges. Lebegőpontot választanék, ha széles dinamikatartomány és gyors fejlesztés fontosabb.