CORDIC
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]
ahol értéke úgy van megválasztva, hogy , és .
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 vektorból indulunk ki:

Az első lépés ennek 45°-kal való elfordítása, mely a 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 , ahol .
Formálisabban minden iteráció egy fordítást számít ki, mely a forgatási mátrixszal való szorzását jelenti:
A forgatási mátrixot az alábbi képlet adja meg:
Az alábbi két trigonometriai azonosság felhasználásával:
a forgatási mátrix ez lesz:
Az elfordított vektor () képlete:
ahol és koordinátái. A szögek korlátozása é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:
ahol
és a határozza meg a forgatás szögét: ha pozitív, +1, ellenkező esetben –1.
Minden tényező elhagyható az iterációs folyamatban, majd mind egyszerre alkalmazható mérettényezővel.
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 méretezésével, mely eggyel csökkenti a szorzások számát. Ezenkívül megjegyezhető, hogy[43]
mely lehetővé teszi az algoritmus összetételének további csökkentését. Egyes esetekben nincs korrekció -ra, így mértékű értéknövekedést okozva:[57]
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ó () 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 pozitív, negatív irányba történik a forgatás, ellenkező esetben pozitívba:
értékeit előre kell számítani és tárolni, azonban kis szögek esetén fixpontos jelölésben, csökkentve a táblázatméretet.
Ahogy a fenti illusztrációban is látható, a végső vektor y koordinátája, míg az x koordináta .
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 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. 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: , szemben az egyszerű ismétléssel, ahol . 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 alapú helyiértékes számrendszerre való általánosítása megmutatta, hogy a szinusz, koszinusz, árkusz tangens esetén elég 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 iteráció kell minden i-re, illetve két minden számjegyre, vagyis i minden értékére.[63]
Az área szinusz és koszinusz hiperbolikusz esetén az iterációszám 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 számításával, mely . A BKM algoritmus kissé összetettebb a CORDIC-nál, de nem kell hozzá a K mérettényező.
Jegyzetek
Források
- Sablon:Cite journal (NB. A DIVIC jelentése DIgital Variable Increments Computer. Egyes források tévesen J. M. Parininek nevezik a szerzőt.)
- Sablon:Cite journal
- Sablon:Cite book
- Sablon:US patent ([1])
- Sablon:Cite journal
- Sablon:Cite journal ([2])
- Sablon:Cite journal ([3])
- Sablon:Cite journal ([4])
- Sablon:Cite journal ([5])
- Sablon:Cite journal
- Sablon:Cite book
- Sablon:Cite book
- Sablon:Cite book
- Sablon:Cite book
- Sablon:Cite journal
- Sablon:Cite journal (about CORDIC in TI-58/TI-59)
- Sablon:Cite news
- Sablon:Cite book
- Sablon:Cite book
- Sablon:Cite book
- Sablon:Cite journal
- Sablon:Cite book (x+268 pages)
- Sablon:Cite journal
- Sablon:Cite web
- Sablon:Cite web
- Sablon:Cite journal
- Sablon:Cite web
További információk
- Sablon:Cite web
- Soft CORDIC IP (verilog HDL code)
- CORDIC Bibliography Site
- BASIC Stamp, CORDIC math implementation
- CORDIC implementation in verilog
- CORDIC Vectoring with Arbitrary Target Value
- PicBasic Pro, Pic18 CORDIC math implementation
- Python CORDIC implementation Sablon:Wayback
- Simple C code for fixed-point CORDIC
- Tutorial and MATLAB Implementation – Using CORDIC to Estimate Phase of a Complex Number
- Descriptions of hardware CORDICs in Arx with testbenches in C++ and VHDL
- An Introduction to the CORDIC algorithm
- 50-th Anniversary of the CORDIC Algorithm
- CORDIC-implementációk: fixed point C code for trigonometric and hyperbolic functions, C code for test and performance verification
- ↑ 1,0 1,1 1,2 Sablon:Cite journal
- ↑ 2,0 2,1 Sablon:Cite journal
- ↑ 3,0 3,1 Sablon:Cite journal
- ↑ 4,0 4,1 Sablon:Cite journal
- ↑ 5,0 5,1 5,2 Sablon:Cite journal
- ↑ 6,0 6,1 Sablon:Cite journal
- ↑ Sablon:Cite book (angolul: [6] Sablon:Webarchive)
- ↑ Sablon:Cite web [7] Sablon:Wayback
- ↑ Sablon:Cite book
- ↑ 10,0 10,1 10,2 Sablon:Cite report
- ↑ 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
- ↑ Sablon:Cite journal (Egyes források a szerzőt tévesen P. Z. Perle-nek vagy a lapot Component Designnak nevezik.)
- ↑ 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.)
- ↑ Sablon:Cite journal
- ↑ Sablon:Cite report
- ↑ 16,0 16,1 Sablon:Cite book
- ↑ 17,0 17,1 17,2 17,3 Sablon:Cite web
- ↑ 18,0 18,1 18,2 Sablon:Cite journal ([8], [9])
- ↑ 19,0 19,1 19,2 Sablon:Cite web ([10])
- ↑ 20,0 20,1 Sablon:Cite journal
- ↑ 21,0 21,1 Sablon:Cite web
- ↑ Sablon:Cite web
- ↑ Sablon:Cite journal ([11])
- ↑ Sablon:Cite journal
- ↑ Sablon:Cite web
- ↑ Sablon:Cite web
- ↑ Sablon:Cite web
- ↑ 28,0 28,1 28,2 28,3 Sablon:Cite web
- ↑ Sablon:US patent ([12], [13])
- ↑ Sablon:DE patent ([14])
- ↑ Sablon:Cite book
- ↑ Sablon:Cite book
- ↑ Sablon:Cite journal
- ↑ Sablon:Cite web [15] Sablon:Wayback
- ↑ Sablon:Cite journal [16] Sablon:Wayback
- ↑ Sablon:Cite web [17] Sablon:Wayback
- ↑ Sablon:Cite web [18] Sablon:Wayback
- ↑ Sablon:Cite journal
- ↑ Sablon:Cite journal
- ↑ Sablon:Cite journal
- ↑ Sablon:Cite journal
- ↑ Sablon:Cite book
- ↑ 43,0 43,1 43,2 43,3 43,4 Sablon:Cite book
- ↑ Sablon:Cite book
- ↑ Sablon:Cite journal
- ↑ 47,0 47,1 47,2 Sablon:Cite journal
- ↑ 48,0 48,1 Sablon:Cite journal
- ↑ Sablon:Cite journal
- ↑ Sablon:Cite journal
- ↑ Sablon:Cite web
- ↑ Sablon:Cite web
- ↑ Sablon:Cite web
- ↑ Sablon:Cite web
- ↑ Sablon:Cite web
- ↑ Sablon:Cite web
- ↑ Sablon:Cite journal
- ↑ Sablon:Cite web
- ↑ Sablon:Cite web
- ↑ Sablon:Cite book
- ↑ Sablon:Cite web
- ↑ Sablon:Cite web
- ↑ Sablon:Cite web