-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
非常感謝你的時間。這非常有用。有沒有更好的方法來計算整數部分?謝謝 –
尋找各種分而治之的算法。實質上,遞歸基於'a^n =(a ^(n div 2))^ 2 * a ^(n mod 2)',其中最後一個因素再次被實現爲條件乘法。 – LutzL
非常感謝你和plz檢查你的LinkedIn配置文件。 –