CORDIC

Innen: testwiki
Ugrás a navigációhoz Ugrás a kereséshez

A CORDIC („coordinate rotation digital computer”), más néven Volder-algoritmus vagy számjegyenkénti módszer, cirkuláris CORDIC (Jack E. Volder),[1][2] lineáris CORDIC, hiperbolikus CORDIC (John Stephen Walther)[3][4] és általánosított hiperbolikus CORDIC (GH CORDIC) (Yuanyong Luo et al.),[5][6] egyszerű, hatékony módszer trigonometriai, hiperbolikus függvények, négyzetgyökök, szorzások, osztások, valamint tetszőleges alapú exponenciális függvények és logaritmusok számítására, mely jellemzően alkalmanként 1 számjeggyel nagyobb pontosságot ad, így a CORDIC egy számjegyenként haladó algoritmus. A CORDIS és hasonló álszorzás-, álosztás- vagy tényezőkombinációs módszerek általában elérhető hardveres szorzó nélkül (például egyszerű mikrokontrollerekben és FPGA-kban) használatos, mivel hozzá csak összeadás, kivonás, bitenkénti eltolás és keresési táblák kellenek. Így ez egy eltoló-összeadó művelet. A CORDIC-ot gyakran használják lebegőpontos számábrázoláshoz, ha a célplatform korlátozott költség vagy tárhely miatt nem rendelkezik hardveres szorzóval.

Története

Hasonló módszereket írt le Henry Briggs 1624-ben[7][8] és Robert Flower 1771-ben,[9] de a CORDIC alacsony komplexitású processzorokra optimalizált.

A CORDIC-ot 1956-ban fogalmazta meg[10][11] Jack E Volder a Convair aeroelektronikai részlegénél a B–58 navigációs számítógépének analóg feloldójának cseréjére egy pontosabb, gyorsabb valós idejű digitális megoldásra.[11] Így a CORDIC-ot nvezik néha digitális feloldónak.[12][13]

Volder kutatását a CRC Handbook of Chemistry and Physics 1946-os kiadásában szereplő alábbi képlet inspirálta:[11]

KnRsin(θ±φ)=Rsin(θ)±2nRcos(θ),KnRcos(θ±φ)=Rcos(θ)2nRsin(θ),

ahol φ értéke úgy van megválasztva, hogy tg φ=2n, és Kn:=1+22n.

Kutatása egy belső technikai jelentéshez vezetett, melyben a CORDIC algoritmust javasolták szinusz- és koszinuszfüggvények megoldására, valamint egy vele rendelkező kezdeti számítógépet.[10][11] Itt a hiperbolikus forgatás, logaritmusok és exponenciális függvények számításának módosított CORDIC algoritmusokkal való megoldásáról is szó volt.[10][11] A CORDIC szorzásra és osztásra való használatát is ekkor fogalmazták meg.[11] A CORDIC elvein alapulva Dan H. Daggett, Volder munkatársa a bináris és a binárisan kódolt decimális (BCD) közti átváltási algoritmusokat javasolt.[11][14]

1958-ban a Convair elkezdte egy bemutató rendszer építését radarrögzítést igénylő problémák megoldására, melynek neve CORDIC I volt, melyet 1960-ban Volder nélkül fejeztek be, aki elhagyta a társaságot.[1][11] A több célra használható CORDIC II A (stacionárius) és B (repülő) modelleket Daggett és Harry Schuss készítették el és építették 1962-ben.[11][15]

Volder CORDIC algoritmusát nyilvánosan 1959-ben írták le,[1][2][11][13][16] emiatt többek közt a Martin Orlando, a Computer Control, a Litton, a Kearfott, a Lear-Siegler, a Sperry, a Raytheon és a Collins Radio navigációs számítógépeibe is ez került.[11]

Volder Malcolm McMillannel együtt kívánta megépíteni az Athenát, mely egy bináris CORDIC algoritmust használó fixpontos számológép lett volna.[17] A terveket a Hewlett-Packardnak mutatták be 1965 júniusában, de nem fogadták el.[17] Azonban McMillan David S. Cochrannek (HP) bemutatta Volder algoritmusát, és mikor Cochran később Volderrel találkozott, egy hasonló módszert mutatott be, melyet John E. Meggitt (IBM)[18] javasolt álszorzásnak és álosztásnak nevezve 1961-ben.[18][19] Meggitt módszere a 10-es alap használatát javasolta[18] a 2-es helyett, melyet Volder CORDIC-ja használt. Ez egy decimális CORDIC-prototípus 1966-os ROM-olható logikai implementációjának az előzménye volt a Hewlett-Packardnál,[20][19] mely Thomas Osborne prototipikus Green Machine-jéből származik, mely négyfunkciós, lebegőpontos számológép, melyet DTL logikával alkotott meg[17] 1964 decemberében.[21] Ez a Hewlett Packard első tudományos funkciókkal rendelkező számológépének, az 1968. márciusi HP 9100A-nak az előzménye volt, melynek ugyanez évben kezdődött a sorozatgyártása.[17][21][22][23]

Mikor a Wang Laboratories felfedezte, hogy a HP 9100A hasonló módszert használt, mint a korábbi LOCI–1 (1964. szeptember)[24] és LOCI–2 (1965. január)[25][26] Logarithmic Computing Instrument számológép,[27] sikertelenül vádolták a Hewlett-Packardot An Wang szabadalmának sértéséért 1968-ban.[19][28][29][30]

John Stephen Walther, a Hewlett-Packard dolgozója az algoritmust általánosította egy „egységes CORDIC” algoritmussá 1971-ben, lehetővé téve hiperbolikus és exponenciális függvények, logaritmusok, szorzások, osztások és négyzetgyökök számítását.[31][3][4][32] A trigonometriai és hiperbolikus függvények CORDIC-programrészeinek kódja nagyrészt közös lehet.[28] Ezután 1972-ben megjelent az első tudományos hordozható számológép, a HP-35.[28][33][34][35][36][37] A hiperbolikus CORDIC-on alapulva Yuanyong Luo és társai javasolták az általános hiperbolikus CORDIC (GH CORDIC) használatát tetszőleges alapú logaritmusok és exponenciális függvényekhez 2019-ben.[5][6][38][39][40] Elvileg a hiperbolikus CORDIC a GH CORDIC speciális esete.[5]

Eredetileg a CORDIC-ot csak bináris számrendszerben alkották meg, és bár Meggitt javasolta a decimális rendszer használatát az álszorzáshoz, a decimális CORDIC iránt kevés érdeklődés volt néhány további évig, így Hermann Schmid és Anthony Bogacki még 1973-ban is újdonságként tekintettek rá,[16][13][41][42][43] és csak később derült ki, hogy a Hewlett-Packard már 1966-ban létrehozta.[11][13][20][28]

A decimális CORDIC a hordozható számológépekben gyakori,[13] melyek nagy része binárisan kódolt decimális számrendszert használ a bináris helyett. E be- és kimeneti változás nem változtatja meg a CORDIC alap számítási algoritmusait. A CORDIC jól használható hordozható számológépekben, ahol az alacsony költség – így a kevés kapu – fontosabb a sebességnél.

A CORDIC-ot használja az ARM-alapú STM32G4, az Intel 8087,[43][44][45][46][47] a 80287,[47][48] az 80387[47][48] és a 80486[43] koprocesszor-sorozat, továbbá a Motorola 68881[43][44] és a 68882 bizonyos lebegőpontos utasításokhoz, különösképp az FPU alrendszer kapuszámának és összetettségének csökkentésére.

Alkalmazások

A CORDIC eltolást és összeadást használ bizonyos számításokhoz, például trigonometriai, hiperbolikus és logaritmikus függvényekhez, valós és komplex szorzásokhoz, osztáshoz, négyzetgyökszámításhoz, lineáris rendszerek megoldásához, sajátértékbecsléshez, szinguláris értékek felbontásához, QR-felbontáshoz stb. Így a CORDIC többek közt jel-, kép-, robotikában és 3D-grafikában is használatos általános tudományos és technikai számításokon kívül.[49][50]

Hardver

Az algoritmust az Apollo-program holdjárójában is alkalmazták az azimut és a holdmodultól való távolság számításához.[51][52] A CORDIC az Intel 8087 matematikai koprocesszorban (1980) is használatos volt, így nem kellett hardveres szorzás.[53]

A CORDIC általában gyorsabb más módszereknél hardveres szorzó nélküli rendszerekben (például mikrokontrollerekben) vagy ha a támogatott funkciókhoz szükséges kapuk száma minimalizálandó (például FPGA-ban vagy ASIC-ben). A CORDIC gyakori az FPGA-fejlesztésben, például a Xilinx Vivadójában, míg egy hatványsoros változat nem a specificitása miatt, vagyis a CORDIC számos különböző függvényt képes kiszámítani (általános célú), míg egy hatványsorokat végző hardveres szorzó csak a függvényt tudja számítani, melyre tervezték.

Az STM32G4 sorozat, valamint az STM32H7 MCU-sorozat néhány tagjában CORDIC-modul van, melyek néhány vegyes jeles alkalmazást gyorsítanak, például a felhasználói felület grafikáját és a vektorirányítást. Bár nem oly gyors, mint egy hatványsoros közelítés, a CORDIC gyorsabb a táblázatalapú implementációk, például az ARM CMSIS vagy a C szabványkönyvtárak interpolációjánál.[54] Bár az eredmények kissé pontatlanabbak lehetnek, ugyanis a CORDIC-modulokban csak 20 bit pontosság érhető el az eredményben. Például az ARM-hoz képest lévő teljesítménykülönbség nagy részét a teljes lebegőpontos pontosság (24 bit) interpolációs algoritmus költségei okozzák, melyhez viszonyított relatív hiba érhető el.[55] További előny, hogy a CORDIC modul koprocesszor, így más processzorfeladatokkal párhuzamosan futhat.

A Taylor-sorok hátránya, hogy bár abszolút hibájuk kicsi, a relatív hiba nem viselkedik egyszerűen.[56] Más polinomiális megközelítések, például a minimax közelítőalgoritmus mindkét hiba korlátozására megfelelők.

Szoftver

Számos, csak egész számokat kezelő processzorú rendszer a CORDIC-ot használja bizonyos mértékig a lebegőpontos számábrázoláshoz való könyvtárakhoz. Mivel a legtöbb modern, általános célú processzorban van lebegőpontos regiszter gyakori műveletekkel, például összeadással, kivonással, szorzással, osztással, szinusszal, koszinusszal, négyzetgyökkel, 10-es alapú és természetes logaritmussal, a CORDIC implementáció szinte fölösleges. Csak mikrokontrollerekben és speciális biztonsági és időkorlátos szoftverek esetén használatos gyakran a CORDIC.

Módszerek

Forgatásos módszer

A CORDIC számos különböző függvény számítására használható. E magyarázat megmutatja a CORDIC rotációs módú használatát egy szög szinuszának és koszinuszának számításához, feltéve, hogy a szög radiánban van megadva, és formátumban. Egy β szög szinuszának vagy koszinuszának megadásához az adott szögnek megfelelő pont y vagy x koordinátája kell. CORDIC esetén a v0 vektorból indulunk ki:

v0=[10].
Folyamatban lévő CORDIC algoritmus illusztrációja

Az első lépés ennek 45°-kal való elfordítása, mely a v1 vektort adja meg. A további iterációk az egyik vagy a másik irányba forgatják a vektort egyre kisebb lépésekkel a kívánt szög eléréséig. A szögek értékei γi=arctg 2i, ahol i=0,1,2,.

Formálisabban minden iteráció egy fordítást számít ki, mely a vi Ri forgatási mátrixszal való szorzását jelenti:

vi+1=Rivi.

A forgatási mátrixot az alábbi képlet adja meg:

Ri=[cos(γi)sin(γi)sin(γi)cos(γi)].

Az alábbi két trigonometriai azonosság felhasználásával:

cos(γi)=11+tan2(γi),sin(γi)=tan(γi)1+tan2(γi),

a forgatási mátrix ez lesz:

Ri=11+tan2(γi)[1tan(γi)tan(γi)1].

Az elfordított vektor (vi+1=Rivi) képlete:

[xi+1yi+1]=11+tan2(γi)[1tan(γi)tan(γi)1][xiyi],

ahol xi és yi vi koordinátái. A γi szögek korlátozása tgγi=±2i értékekre a tangenssel való szorzás cserélhető a kettő hatványával való osztásra, mely egy bitekkel való eltolás. A kifejezés ezzé válik:

[xi+1yi+1]=Ki[1σi2iσi2i1][xiyi],

ahol

Ki=11+22i,

és a σi határozza meg a forgatás szögét: ha γi pozitív, σi +1, ellenkező esetben –1.

Minden Ki tényező elhagyható az iterációs folyamatban, majd mind egyszerre alkalmazható K(n) mérettényezővel.

K(n)=i=0n1Ki=i=0n111+22i,

melyet előre kiszámít és táblázatban vagy konstansként tárol fix számú iteráció esetén. Ez a javítás megtehető előre is a v0 méretezésével, mely eggyel csökkenti a szorzások számát. Ezenkívül megjegyezhető, hogy[43]

K=limnK(n)0,6072529350088812561694,

mely lehetővé teszi az algoritmus összetételének további csökkentését. Egyes esetekben nincs korrekció K-ra, így A mértékű értéknövekedést okozva:[57]

A=1K=limni=0n11+22i1,64676025812107.

Elegendően sok iteráció után a vektor szöge közel lesz a kívánt β szöghöz. A legtöbb általános célhoz 40 iteráció (n=40) elegendő a helyes eredményhez 10 tizedesjegyig.

Ezután az egyetlen megmaradt feladat, hogy a forgatásnak minden iterációban pozitív vagy negatív irányba kell történnie (σ értékének választása), mely az egyes iterációkban történő elfordulás számításával és annak a kívánt szögből való kivonásával, majd a szükséges β szöghöz való közelítéssel tehető meg: ha βn+1 pozitív, negatív irányba történik a forgatás, ellenkező esetben pozitívba:

β0=β
βi+1=βiσiγi,γi=arctan(2i).

γn értékeit előre kell számítani és tárolni, azonban kis szögek esetén arctg γn=γn fixpontos jelölésben, csökkentve a táblázatméretet.

Ahogy a fenti illusztrációban is látható, sinβ a végső vn vektor y koordinátája, míg az x koordináta cosβ.

Vektormódszer

A fent leírt forgatásos algoritmus bármilyen vektort el tud forgatni bármilyen –90 és +90° közti szöggel. A forgatás iránya függ βi előjelétől.

A vektoros művelet az algoritmus kis módosítását igényli. Egy vektorral kezdődik, melynek x koordinátája pozitív, y koordinátája tetszőleges. Az egymást követő forgatások célja a vektor x tengelyre való forgatása (azaz az y koordináta 0-ra módosítása). Minden lépésben y értéke meghatározza a forgatás irányát. βi végső értéke a teljes forgásszög, x végső értéke az eredeti vektor nagysága K-val méretezve. A vektormódszer hasznos Descartes-koordinátákról polárkoordinátákra váltáshoz.

Megvalósítások

Szoftveres példa (MATLAB)

Alább a CORDIC egy MATLAB/GNU Octave-megvalósítása látható, mely nem függ transzcendens függvényektől, kivéve táblázatok előszámításában. Ha az iterációk száma előre meg van határozva, a második táblázat konstansra cserélhető. A MATLAB dupla pontosságával és a format long kimenetével az eredmények pontossága nagyjából 48 iterációig nő.

function v = cordic(alpha,iteration)
% This function computes v = [cos(alpha), sin(alpha)] (alpha in radians)
% using iteration increasing iteration value will increase the precision.

if alpha < -pi/2 || alpha > pi/2
    if alpha < 0
        v = cordic(alpha + pi, iteration);
    else
        v = cordic(alpha - pi, iteration);
    end
end

% Initialization of tables of constants used by CORDIC
% need a table of arctangents of negative powers of two, in radians:
% angles = atan(2.^-(0:27));
angles =  [  ...
    0.78539816339745   0.46364760900081   0.24497866312686   0.12435499454676 ...
    0.06241880999596   0.03123983343027   0.01562372862048   0.00781234106010 ...
    0.00390623013197   0.00195312251648   0.00097656218956   0.00048828121119 ...
    0.00024414062015   0.00012207031189   0.00006103515617   0.00003051757812 ...
    0.00001525878906   0.00000762939453   0.00000381469727   0.00000190734863 ...
    0.00000095367432   0.00000047683716   0.00000023841858   0.00000011920929 ...
    0.00000005960464   0.00000002980232   0.00000001490116   0.00000000745058 ];
% and a table of products of reciprocal lengths of vectors [1, 2^-2j]:
% Kvalues = cumprod(1./sqrt(1 + 1j*2.^(-(0:23))))
Kvalues = [ ...
    0.70710678118655   0.63245553203368   0.61357199107790   0.60883391251775 ...
    0.60764825625617   0.60735177014130   0.60727764409353   0.60725911229889 ...
    0.60725447933256   0.60725332108988   0.60725303152913   0.60725295913894 ...
    0.60725294104140   0.60725293651701   0.60725293538591   0.60725293510314 ...
    0.60725293503245   0.60725293501477   0.60725293501035   0.60725293500925 ...
    0.60725293500897   0.60725293500890   0.60725293500889   0.60725293500888 ];
Kn = Kvalues(min(iteration, length(Kvalues)));

% Initialize loop variables:
v = [1;0]; % start with 2-vector cosine and sine of zero
poweroftwo = 1;
angle = angles(1);

% Iterations
for j = 0:iteration-1;
    if alpha < 0
        sigma = -1;
    else
        sigma = 1;
    end
    factor = sigma * poweroftwo;
    % Note the matrix multiplication can be done using scaling by powers of two and addition subtraction
    R = [1, -factor; factor, 1];
    v = R * v; % 2-by-2 matrix multiply
    alpha = alpha - sigma * angle; % update the remaining angle
    poweroftwo = poweroftwo / 2;
    % update the angle from table, or eventually by just dividing by two
    if j+2 > length(angles)
        angle = angle / 2;
    else
        angle = angles(j+2);
    end
end

% Adjust length of output vector to be [cos(alpha), sin(alpha)]:
v = v * Kn;
return

endfunction

A kétszer kettes mátrixok szorzása egyszerű eltolásokkal és összeadásokkal végezhető el.

    x = v[0] - sigma * (v[1] * 2^(-j));
    y = sigma * (v[0] * 2^(-j)) + v[1];
    v = [x;y];

Javában a Math osztályban van egy ilyen eltolást végző scalb(double x,int scale) metódus,[58] C-ben van ldexp függvény,[59] az x86 processzorosztályban pedig van fscale lebegőpontos művelet.[60]

Példa Pythonban

from math import atan2, sqrt, sin, cos, pi, radians

ITERS = 16
theta_table = [atan2(1, 2**i) for i in range(ITERS)]

def compute_K(n):
    """
    Compute K(n) for n = ITERS. This could also be
    stored as an explicit constant if ITERS above is fixed.
    """
    k = 1.0
    for i in range(n):
        k *= 1 / sqrt(1 + 2 ** (-2 * i))
    return k

def CORDIC(alpha, n):
    K_n = compute_K(n)
    theta = 0.0
    x = 1.0
    y = 0.0
    P2i = 1  # This will be 2**(-i) in the loop below
    for arc_tangent in theta_table:
        sigma = +1 if theta < alpha else -1
        theta += sigma * arc_tangent
        x, y = x - sigma * y * P2i, sigma * P2i * x + y
        P2i /= 2
    return x * K_n, y * K_n

if __name__ == "__main__":
    # Print a table of computed sines and cosines, from -90° to +90°, in steps of 15°,
    # comparing against the available math routines.
    print("  x       sin(x)     diff. sine     cos(x)    diff. cosine ")
    for x in range(-90, 91, 15):
        cos_x, sin_x = CORDIC(radians(x), ITERS)
        print(
            f"{x:+05.1f}°  {sin_x:+.8f} ({sin_x-sin(radians(x)):+.8f}) {cos_x:+.8f} ({cos_x-cos(radians(x)):+.8f})"
        )

Kimenet

$ python cordic.py
  x       sin(x)     diff. sine     cos(x)    diff. cosine
-90.0°  -1.00000000 (+0.00000000) -0.00001759 (-0.00001759)
-75.0°  -0.96592181 (+0.00000402) +0.25883404 (+0.00001499)
-60.0°  -0.86601812 (+0.00000729) +0.50001262 (+0.00001262)
-45.0°  -0.70711776 (-0.00001098) +0.70709580 (-0.00001098)
-30.0°  -0.50001262 (-0.00001262) +0.86601812 (-0.00000729)
-15.0°  -0.25883404 (-0.00001499) +0.96592181 (-0.00000402)
+00.0°  +0.00001759 (+0.00001759) +1.00000000 (-0.00000000)
+15.0°  +0.25883404 (+0.00001499) +0.96592181 (-0.00000402)
+30.0°  +0.50001262 (+0.00001262) +0.86601812 (-0.00000729)
+45.0°  +0.70709580 (-0.00001098) +0.70711776 (+0.00001098)
+60.0°  +0.86601812 (-0.00000729) +0.50001262 (+0.00001262)
+75.0°  +0.96592181 (-0.00000402) +0.25883404 (+0.00001499)
+90.0°  +1.00000000 (-0.00000000) -0.00001759 (-0.00001759)

Hardveres példa

A logikai kapuk száma a CORDIC-hoz nagyjából egy szorzóéhoz hasonló, mivel mindkettőben összeadás és eltolás szükséges. A szorzó- vagy CORDIC-alapú megvalósítás választása kontextusfüggő. Két valós és képzetes rész (Descartes-koordináták) által meghatározott komplex szám szorzása 4 szorzást igényel, de a polárkoordináták által meghatározott komplex számoké elvégezhető CORDIC-kal is, különösen ha a számok nagyságrendje nem számít (egy komplex vektor egységkörön lévő vektorral való szorzása forgatást eredményez). A CORDIC-ot gyakran használják telekommunikációs áramkörökben, például digitális lekonvertálókban.

Dupla iterációs CORDIC

Vlagyimir Bajkov két publikációjában[61][62] javasolta a dupla iterációs módszert az árkusz szinusz, az árkusz koszinusz, a természetes logaritmus, az exponenciális és a hiperbolikus függvények számítására. A dupla iterációs módszer, szemben a klasszikus CORDIC módszerrel, ahol az iterációs lépésszám mindig változik, a dupla iterációs módszerben az iteráció sorszáma kétszer ismétlődik, egyszer változik. Így az iterációk sorszámai: i=0,0,1,1,2,2, szemben az egyszerű ismétléssel, ahol i=0,1,2. A dupla iterációs módszer biztosítja a módszer konvergenciáját az argumentumok változásának érvényes tartományában.

A CORDIC konvergenciaproblémák tetszőleges R alapú helyiértékes számrendszerre való általánosítása megmutatta, hogy a szinusz, koszinusz, árkusz tangens esetén elég R1 iteráció minden i értékre, vagyis az eredmény minden számjegyére. A természetes logaritmus, exponenciális, szinusz, koszinusz és área tangens hiperbolikusz esetén R iteráció kell minden i-re, illetve két R1 minden számjegyre, vagyis i minden értékére.[63]

Az área szinusz és koszinusz hiperbolikusz esetén az iterációszám 2R minden i, vagyis minden számjegy esetén.

Kapcsolódó algoritmusok

A CORDIC eltoló-összeadó algoritmus, ahogy a logaritmus- és exponenciálisfüggvény-számító algoritmus, melyek Henry Briggs művében szerepelnek. További, sok elemi függvény számítására használható algoritmus a BKM algoritmus, mely a logaritmust és az exponenciális függvényt általánosítja a komplex síkba. Például a BKM felhasználható valós x radiános szög szinuszának és koszinuszának számításra eix számításával, mely cosx+isinx. A BKM algoritmus kissé összetettebb a CORDIC-nál, de nem kell hozzá a K mérettényező.

Jegyzetek

Sablon:Jegyzetek

Források

További információk

Sablon:Nemzetközi katalógusok

  1. 1,0 1,1 1,2 Sablon:Cite journal
  2. 2,0 2,1 Sablon:Cite journal
  3. 3,0 3,1 Sablon:Cite journal
  4. 4,0 4,1 Sablon:Cite journal
  5. 5,0 5,1 5,2 Sablon:Cite journal
  6. 6,0 6,1 Sablon:Cite journal
  7. Sablon:Cite book (angolul: [6] Sablon:Webarchive)
  8. Sablon:Cite web [7] Sablon:Wayback
  9. Sablon:Cite book
  10. 10,0 10,1 10,2 Sablon:Cite report
  11. 11,00 11,01 11,02 11,03 11,04 11,05 11,06 11,07 11,08 11,09 11,10 11,11 Sablon:Cite journal
  12. Sablon:Cite journal (Egyes források a szerzőt tévesen P. Z. Perle-nek vagy a lapot Component Designnak nevezik.)
  13. 13,0 13,1 13,2 13,3 13,4 Sablon:Cite book (a reprint egy része hibásan lehetett nyomtatva, ahol a 115–146. oldal hibás.)
  14. Sablon:Cite journal
  15. Sablon:Cite report
  16. 16,0 16,1 Sablon:Cite book
  17. 17,0 17,1 17,2 17,3 Sablon:Cite web
  18. 18,0 18,1 18,2 Sablon:Cite journal ([8], [9])
  19. 19,0 19,1 19,2 Sablon:Cite web ([10])
  20. 20,0 20,1 Sablon:Cite journal
  21. 21,0 21,1 Sablon:Cite web
  22. Sablon:Cite web
  23. Sablon:Cite journal ([11])
  24. Sablon:Cite journal
  25. Sablon:Cite web
  26. Sablon:Cite web
  27. Sablon:Cite web
  28. 28,0 28,1 28,2 28,3 Sablon:Cite web
  29. Sablon:US patent ([12], [13])
  30. Sablon:DE patent ([14])
  31. Sablon:Cite book
  32. Sablon:Cite book
  33. Sablon:Cite journal
  34. Sablon:Cite web [15] Sablon:Wayback
  35. Sablon:Cite journal [16] Sablon:Wayback
  36. Sablon:Cite web [17] Sablon:Wayback
  37. Sablon:Cite web [18] Sablon:Wayback
  38. Sablon:Cite journal
  39. Sablon:Cite journal
  40. Sablon:Cite journal
  41. Sablon:Cite journal
  42. Sablon:Cite book
  43. 43,0 43,1 43,2 43,3 43,4 Sablon:Cite book
  44. 44,0 44,1 Sablon:Cite journal
  45. Sablon:Cite book
  46. Sablon:Cite journal
  47. 47,0 47,1 47,2 Sablon:Cite journal
  48. 48,0 48,1 Sablon:Cite journal
  49. Sablon:Cite journal
  50. Sablon:Cite journal
  51. Sablon:Cite web
  52. Sablon:Cite web
  53. Sablon:Cite web
  54. Sablon:Cite web
  55. Sablon:Cite web
  56. Sablon:Cite web
  57. Sablon:Cite journal
  58. Sablon:Cite web
  59. Sablon:Cite web
  60. Sablon:Cite book
  61. Sablon:Cite web
  62. Sablon:Cite web
  63. Sablon:Cite web