2015-11-13 597 views
-1

我讀了一兩篇關於CORDIC的文章,但並不完全理解它。然而,我從互聯網上下載了一個使用這種算法計算指數函數的代碼。它非常有用,並且幫助我在FPGA上推動功能的指數項。但現在我正在嘗試編寫一份報告,但我無法解釋CORDIC部分如何工作,而且我無法涉及通用CORDIC算法。 PLZ幫助我,並提前謝謝你。不能理解用於計算指數函數的CORDIC算法

function fx = exp_cordic (x, n) 
a_length = 25; 

    a = [ ... 
    1.648721270700128, ... 
    1.284025416687742, ... 
    1.133148453066826, ... 
    1.064494458917859, ... 
    1.031743407499103, ... 
    1.015747708586686, ... 
    1.007843097206488, ... 
    1.003913889338348, ... 
    1.001955033591003, ... 
    1.000977039492417, ... 
    1.000488400478694, ... 
    1.000244170429748, ... 
    1.000122077763384, ... 
    1.000061037018933, ... 
    1.000030518043791, ... 
    1.0000152589054785, ... 
    1.0000076294236351, ... 
    1.0000038147045416, ... 
    1.0000019073504518, ... 
    1.0000009536747712, ... 
    1.0000004768372719, ... 
    1.0000002384186075, ... 
    1.0000001192092967, ... 
    1.0000000596046466, ... 
    1.0000000298023228 ]; 
    e = 2.718281828459045; 

    x_int = floor (x); 
% 
% Determine the weights. 
% 
    poweroftwo = 0.5; 
    z = x - x_int; 

    for i = 1 : n 
    w(i) = 0.0; 
    if (poweroftwo < z) 
     w(i) = 1.0; 
     z = z - poweroftwo; 
    end 
    poweroftwo = poweroftwo/2.0; 
    end 
% 
% Calculate products. 
% 
    fx = 1.0; 

    for i = 1 : n 

    if (i <= a_length) 
     ai = a(i); 
    else 
     ai = 1.0 + (ai - 1.0)/2.0; 
    end 

    if (0.0 < w(i)) 
     fx = fx * ai; 
    end 

    end 
% 
% Perform residual multiplication. 
% 
    fx = fx    ... 
    * (1.0 + z  ... 
    * (1.0 + z/2.0 ... 
    * (1.0 + z/3.0 ... 
    * (1.0 + z/4.0)))); 
% 
% Account for factor EXP(X_INT). 
% 
    if (x_int < 0) 

    for i = 1 : -x_int 
     fx = fx/e; 
    end 

    else 

    for i = 1 : x_int 
     fx = fx * e; 
    end 

    end 

    return 
end 

和我做了一些修改,並刪除了一些代碼,並試圖使其更簡單,它的工作,我不知道我做了什麼,以及爲什麼它仍然是工作!!!!

a = [ ... 
    1.648721270700128, ... 
    1.284025416687742, ... 
    1.133148453066826, ... 
    1.064494458917859, ... 
    1.031743407499103, ... 
]; 


    e = 2.718281828459045; 

    x_int = floor (x); 
    z = x - x_int; 
    fx = 1.0; 
    for i = 1 : n 
    if (2^(-i) < z) 
    z=z-2^(-i); 
     fx = fx * a(i); 
    end 
    end 

    if (x_int < 0) 
    for i = 1 : -x_int 
     fx = fx/e; 
    end 
    else 

    for i = 1 : x_int 
     fx = fx * e; 
    end 
    end 

    return 
end 

回答

1

這使用了公知的事實,即

exp(x+y)=exp(x)*exp(y) and a^(x*y)=(a^x)^y. 

輸入數x首先被分解成整數和小數部分x = x_int + zx_int的指數可以很容易地通過任何整數功率算法來計算,所提出的算法相當次優。

的因子的表是用於在其二進制表示

z = z[1]/2+z[2]/4+z[3]/8+… 

小數部分,其中z[i]要麼01。然後,第一循環計算

exp(1/2)^z[1] * exp(1/4)^z[2] * exp(1/8)^z[3]*… 

其中第二冪是讀取作爲

(z[i]==1) ? exp(1/2^i) : 1 

即,只與z[i]==1因素是實際存在於產物中。

+0

非常感謝你的時間。這非常有用。有沒有更好的方法來計算整數部分?謝謝 –

+0

尋找各種分而治之的算法。實質上,遞歸基於'a^n =(a ^(n div 2))^ 2 * a ^(n mod 2)',其中最後一個因素再次被實現爲條件乘法。 – LutzL

+0

非常感謝你和plz檢查你的LinkedIn配置文件。 –