Složitější aritmetické operace SČS Ing. Jakub Št astný, Ph.D. 1 1 stastnj1@seznam.cz FPGA Laboratoř/Laboratoř zpracování biologických signálů Katedra teorie obvodů FEL ČVUT Technická 2, Praha 6, 166 27 http://amber.feld.cvut.cz/fpga 21. května 2014
Varování Pozor! Tato verze přednášky obsahuje materiál třetích stran. Je určena pouze k internímu použití a vystavení na WWW stránkách Laboratoře biologických signálů, Katedry teorie obvodů ČVUT FEL, Praha!
1 Složitější funkce Druhá odmocnina Logaritmus Goniometrické funkce
Motivace druhá odmocnina vědeckotechnické výpočty (nemáme to rádi, ale lidé to chtějí :-) ), multimediální a grafické výpočty (velikost vektoru) logaritmus převádí složité na jednodušší operace harmonické funkce všude kolem nás
Druhá odmocnina
Výpočet druhé odmocniny triviální metoda y = x jedoduchý algoritmus 1 y = 0 2 if y y > x, konec a x = y 1 3 y = y + 1, goto 2 nevhodné póóóómalééééé
Výpočet druhé odmocniny triviální metoda 2 y = x pozorování: = (x + 1) 2 x 2 = x 2 + 2x + 1 x 2 = 2x + 1 příklad: 1 = 1 2,1 + 3 = 2 2,1 + 3 + 5 = 3 2,... N 1 x=0 (2x + 1) = N2 odhad hodnoty x 1 y = 0, acc = 0 2 if acc > x, konec a x = y 1 3 acc = acc + 2y + 1, y = y + 1, goto 2 stále póóómaléééé, ale už bez násobení pro odmocninu z 32 bitového čísla potřebuji až 65536 kroků!
Výpočet druhé odmocniny triviální metoda 3 může mi pomoci rozklad po řádech příklad: druhá odmocnina z 32 bit. čísla, y = x krok 1 1 x MSB = x 65536, určím y MSB = x MSB 2 x MSB < 65536, takže maximálně 256 kroků 3 y LSB = y MSB 256, protože 65536 = 256 krok 2 y LSB použiji jako startovací hodnotu pro iterativní algoritmus, v dalších max. 256 krocích najdu přesnou hodnotu celkem cca 512 kroků max. místo 65536! lze urychlit rozkladem na více základů (historie ENIAC implementace odmocniny) stále pomalé, ale už lepší pro celá čísla, ale desetinná čísla mohu škálovat ( 2 2N a potom /2 N )
Babylónská metoda poprvé zdokumentována v práci Herona Alexandrijského ( 10-70 n.l.) začínáme s odhadem y 0 opakujeme postup dokud se y i 1 y i+1 = 1 2 (y i + x y i ) významně mění" jednoduchá myšlenka druhá odmocnina musí být někde mezi aktuálním odhadem a x y i počet platných číslic se zdvojnásobuje v každé iterace (důkaz za domácí úkol)
Technika bisekce triviální postup začínáme s odhadem intervalu např. < y 0D, y 0H >=< 0, x > opakujeme postup dokud se velikost y ih y id významně mění" 1 pokud je ( 1 2 (y id + y ih )) 2 > x, použij jako další odhad intervalu < y i+1d, y i+1h >=< y id, ( 1 2 (y id + y ih )) > 2 pokud je ( 1 2 (y id + y ih )) 2 <= x, použij jako další odhad intervalu < y i+1d, y i+1h >=< ( 1 2 (y id + y ih )), y ih > počet platných dvojkových smíst roste o jedno v každé iteraci pomalý výpočet...
Krátké opakování Newtonovy metody řešíme rovnici f(x) = 0 iteračním postupem zanebdáváme zde podmínky pro konvergenci! začínáme s x 0 které je dostatečně blízko" počátku opakujeme postup dokud se x i významně mění" 1 spočteme tečnu v bodě f(x i ) a určíme průsečík s osou x 2 tento průsečík bude lepší aproximací správného řešení použijeme jako x i+1 lze odvodit vztah x i+1 = x i f(x i) f (x i )
Výpočet druhé odmocniny iterační metoda 1 y = x řešíme numerickým řešením rovnice y 2 x = 0 Newtonovou metodou tedy y i+1 = y i f(y i) f (y i ) po dosazení dostaneme iterační vzorec y i+1 = 1 2 ( x y i + y i )), y 0 > 0 v každém kroku zhruba získáme dvojnásobek platných míst metoda je nepraktická, protože obsahuje dělení všimněte si: je to vlastně babylónská metoda (ovšem Heron samozřejmě neznal Newtonovu metodu)
Výpočet druhé odmocniny iterační metoda 2, princip Abychom se vyhnuli nutnosti dělit při výpočtu, nalezneme přibližnou hodnotu 1 x a pomocí algoritmu pro převrácenou hodnotu určíme x. y = x, řešíme numerickým řešením rovnice 1 x = 0 y 2 Newtonovou metodou tedy y i+1 = y i f(y i) f (y i ) po dosazení dostaneme iterační vzorec y i+1 = 1 2 y i(3 xy 2 i )), 0 < y 0 < 3 x
Výpočet druhé odmocniny iterační metoda 2, analýza chyby y = x, pokud je y i = 1 x (1 + δ) lze odvodit, že 1 y i+1 = 1 2 x (1 + δ)(1 2δ δ 2 ) necht y i = y i x podíly chyb y i a y i+1 lze určit jako y i y i+1 = 2 δ 1 3+δ např. pro δ = 0.01 je y i y i+1 66 a y i+1 má cca 66 menší chybu, než y i opět cca 2 více desetinných míst v každém kroku
Logaritmus
Proč logaritmus? převod násobení na sčítání log 2 (A B) = 2 (log 2(A)+log 2 (B)) dělení na odečítání! vhodné pro práci s extrémně velkými (x!) a malými (Πα i, α i < 1) čísly pracujeme obvykle s dvojkovým logaritmem
Obecný princip použití tabulky pro interpolaci 0 f(x 0 ) + f(x 1) f(x 0 ) x 1 x 0 (x a x 0 ) f(x a ) =
Přibližný výpočet segmentací na úseky počítáme logaritmus log 2 (y) čísla y z intervalu < 0; 2 N > najdeme i takové, aby 2 i y < 2 i+1 (potom jistě i log 2 (y) < i + 1), nepotřebuji ani tabulku zpřesnění lineární aproximací: log 2 (y) log 2 (2 i ) + log 2(2 i+1 ) log 2 (2 i ) 2 i+1 2 i (y 2 i ) = = i 1 + y2 i, zde se dělí jen 2 i výhodné! příklad pro 8 bit. číslo y = 105 64 y < 128, i = 6 log 2 (y) 5 + 105/64 = 6.64, přesná hodnota je 6.71 pro násobení potřebujeme určit dva logaritmy, součet a posléze odlogaritmovat výsledek (postup opačný k uvedenému) max. chyba výsledku násobení 11.6%, logaritmus lze dále zpřesnit
Goniometrické funkce
Výpočet hodnoty goniometrické funkce algoritmus s náhodným přístupem" cíl: pro zadaný úhel určit hodnotu sin, cos,... různé techniky vhodné pro HW i SW realizaci aplikace obvyklé výpočty generování spojitého průběhu cíl: generovat spojitý průběh harmonické funkce, rychle, přesně algoritmus s náhodným přístupem" lze použít, ale není to často výhodné naopak, speciální algoritmy pro generování nejsou použitelné pro výpočet s náhodným přístupem" aplikace generování průběhů (měření, buzení, digitální komunikace)
Tabulková metoda v reálném čase neprovádíme ideálně žádné výpočty přesnost nepřímo úměrná velikosti tabulky lze interpolovat (potom časově náročnější) velikost tabulky obvykle 2 N uložíme hodnoty pro jeden kvadrant ROM triviální hardwarová implementace y,+ +,+ 180 α α α 180, 0 360 α +, x
Expanze řad Taylorův rozvoj vhodné spíše pro softwarovou implementaci Taylorova řada f(x) = f (n) (x 0 ) n=0 n! (x x 0 ) n Taylorův rozvoj sinu sin(x) = x x3 3! + x5 5! x7 7! +... cos(x) = sin(x + π 2 ) přímočará implementace například v C přesnost volím tak, že řídím počet sčítaných členů na intervalu x < π/2;π/2 > konverguje rychleji než na zbytku číselné osy, takže je vhodné úhel transformovat do tohoto intervalu další techniky aproximace Čebyševovými polynomy, Newton, Lagrange, spline interpolace, atd. použitelné i na obecné funkce
Interpolace a aproximace i pro jiné funkce Taylorův rozvoj
CORDIC co je to? COordinate Rotation Digital Computer technika výpočtu hodnot goniometrických funkcí s malými nároky na hardware použitelné i pro širší škálu problémů: cyklometrické funkce, převod pravoúhlých souřadnic na polární, hyperbolické a hyperbolometrické funkce, logaritmus, exponenciála, absolutní hodnota a fáze komplexního čísla, a další.
CORDIC základní myšlenka hledám x = r cosβ, y = r sin β y znám x 1 = r cos α, y 1 = r sin α 2 β = α + ϕ 0 β ϕ 1 α 1 x x 2 = r cosβ = r cos(ϕ + α) = r cosϕcos α r sin ϕ sin α, y 2 = r sin β = r sin(ϕ + α) = r sin ϕ cos α + r cosϕsin α x 2 = x 1 cosα i+1 y 1 sin ϕ = cos ϕ(x 1 y 1 tan ϕ) y 2 = x 1 cosα i+1 + y 1 sin ϕ = cos ϕ(x 1 + y 1 tan ϕ)
CORDIC základní myšlenka y i+1 α i+1 i chci zjistit cos α a sin α, α < 0; 90 > intuitivně rotace vektoru po krocích až do dosažení cílové pozice 0 α 1 + α 2 +... + α i r x x i+1 = cos α i+1 (x i y i tan α i+1 ), y i+1 = cos α i+1 (x i + y i tan α i+1 ) použijeme tabelované hodnoty α i+1 spolu s jejich tangenty
CORDIC tabulka hodnot x i+1 = cos α i+1 (x i y i tan α i+1 ), y i+1 = cos α i+1 (x i + y i tan α i+1 ) Volím α i aby tanα i = 1 2 i 1 redukce množství násobení Počet hodnot v tabulce daný žádanou přesností vyjádření α α α = α 0 ± α 1 ± α 2... ± α N 1 i tanα i α i cos α i 0 1.0000 45.00 0.7071 1 0.5000 26.57 0.8944 2 0.2500 14.04 0.9701 3 0.1250 07.13 0.9923 4 0.0625 03.58 0.9981 5 0.0313 01.79 0.9995 6 0.0156 00.90 0.9999.... N 1 2 (N 1)......
CORDIC tabulka hodnot, příklad α α = α 0 ± α 1 ± α 2... ± α N 1 α = 38 i tan α i α i cosα i ± α i 0 0 1.0000 45.00 0.7071 00.00<38,+ 45.00 1 0.5000 26.57 0.8944 45.00>38,- 18.43 2 0.2500 14.04 0.9701 18.43<38,+ 32.47 3 0.1250 07.13 0.9923 32.47<38,+ 39.60 4 0.0625 03.58 0.9981 39.60>38,- 36.02 5 0.0313 01.79 0.9995 36.02<38,+ 37.81 6 0.0156 00.90 0.9999 37.81>38,+ 38.71
CORDIC iterační výpočet α α = α 0 ± α 1 ± α 2... ± α N 1 rekurentní vztah x i+1 = cos α i+1 (x i y i tan α i+1 ), x 0 = 1, y 0 = 0 y i+1 = cosα i+1 (x i ± y i tan α i+1 ) násobení tan α i+1 je nyní jen bitový posuv násobení cos α i+1 budeme během iterace ignorovat, použijeme rekurentní vztah x i+1 = (x i y i tan α i+1 ), y i+1 = (x i ± y i tanα i+1 ) výsledek pak bude třeba na konci vynásobit faktorem K = cosα 0 cosα 1...cosα N 1, ten je ale konstantní dokud je konstantní počet kroků lze ho předpočítat dopředu funguje pro α < 0; 90 >
CORDIC rozšíření na celou kružnici y,+ 180 α α α 180, 0 +,+ 360 α +, x
Goniometrické funkce generování
Použití IIR filtru rezonátor s póly na jednotkové kružnici y[n] = a 1 y[k 1] a 2 y[k 2] + b 0 x[k] b 0 = A sin(ω), a 1 = 2 cos(ω), a 2 = 1 ω = 2πf f s výhoda extrémně jednoduché nevýhoda postupná akumulace numerických chyb (kvantovací efekty) ničí" kvalitu generované sinusovky
DDS vlastnosti Direct Digital Synthesis Výhody vysoké frekvenční rozlišení (až µhz) malé fázové zkreslení jednoduchá hardwarová implementace žádné ustalování systému rychlé změny frekvence v tabulce lze mít libovolnou periodickou funkci Nevýhody pro velkou šířku pásma potřebuji rychlý hardware pro velkou šířku pásma bude vysoká spotřeba energie může být problém s odezvou (rychlostí) DA převodníku
Přímá číslicová syntéza základní princip Figure copied from http://www.cs.washington.edu/homes/diorio/talks/invitedtalks/mtt97/index.html
DDS akumulátor Fazovy prirustek Faze harmonicke generuje fázovou informaci; frekvence přetékání určuje f out generovaná frekvence je f out = FP f clk 2 N počet bitů akumulátoru dává rozlišení ve frekvenci frekvenční krok f = f clk 2 N pro f clk = 100MHz a N = 32 př. f = 23mHz
DDS akumulátor změnou fázového přírůstku řídím změnu frekvence okamžitě, bez přechodového děje při změně frekvence spojitá funkce (fáze se nemění) jednoduché generování například FSK signálu (alternace dvou fázových přírůstků)
DDS konvertor fáze amplituda přesnost konverze jen taková, aby zkreslení výstupu bylo určeno hlavně DA převodníkem a následným zpracováním (nemá smysl být přesnější, než umožňuje analogový výstupní díl!) můžeme použít libovolný algoritmus s náhodným přístupem" mimořádně vhodná je tabulková implementace (LUT, Look Up Table)
DDS LUT konvertor fáze amplituda výstup akumulátoru fázová informace má N bitů teoreticky potřebuji 2 N položek v paměti, budu indexovat fází a vyčtu hodnotu sin stačí mi jen 2N 4 symetrie harmonické po kvadrantech, mírná komplikace s obracením znamének (ale žádný problém) někdy může mít i méně položek (velké rozlišení čítače kvůli malému frekvenčnímu kroku, malé rozlišení generované sinusovky kvůli horšímu analogovému výstupnímu dílu a DA převodníku) zmenšení počtu položek lze dosáhnout například interpolací
DDS LUT konvertor fáze amplituda další možnost redukce velikosti tabulky goniometrickými identitami sin(ϕ) = sin(α 2 L + β) = sin(α 2 L ) cos(β) + cos(α 2 L ) sin(β) rozdělím fázi na dvě slova, F = F MSB 2 L + F LSB vytvořím dvě tabulky hodnot sin o 2N L 4 a 2L 4 prvcích podle identity složím dohromady výslednou hodnotu menší tabulky (pro N = 16 místo 16384 položek v jedné tabulce pro L = 8 stačí 64 a 64 položek!), snadný výpočet bez podmíněných operací dílčí tabulky zřejmě musí být s větší šířkou slova