def cosine_fun(input):
k = 1.646
bitw = 15
inpLUK = np.zeros(bitw + 1)
x = 1/k
y = 0
z = 0
for j in range(bitw):
tmp = atan(2 ** -(j - 1))
inpLUK[j] = round(tmp / pi * (2 ** bitw - 1))
x = round(x * 2**bitw)
y = round(y * 2 ** bitw)
for i in range(bitw):
if i == 0:
tmp_x = x << 1
tmp_y = y << 1
else:
tmp_x = x >> (i - 1)
tmp_y = y >> (i - 1)
if z > 0:
x = x - tmp_y
y = y + tmp_x
z = z - inpLUK[i]
else:
x = x + tmp_y
y = y - tmp_x
z = z + inpLUK[i]
x_out = x/2**bitw
y_out = y/2**bitw
return x_out, y_out, z
input_angle = 30.0
sign = 0
if input_angle >= 360:
angle = input_angle % 360
elif input_angle < -360:
input_angle = input_angle % -360
if input_angle > 180:
input_angle -= 360
elif input_angle < -180:
input_angle += 360
if input_angle > 90:
input_angle -= 180
sign = 1
if input_angle < -90:
input_angle += 180
sign = 1
angle_out = input_angle
angle_out = angle_out * (pi/180)
x, y, z = cosine_fun(angle_out)
if sign:
x = -x
y = -y
print("cosine({}) = {}".format(input_angle, x))
这是估计余弦的代码。但它并没有按预期工作。有人可以帮我吗?我必须使用定点或浮点来实现它。
我尝试输入为 30 度,输出为 x = 2.23 、z = 1 和 y = -0.00064。但余弦 (30) 的值为 0.15。
问题在于
inpLUK[j]
的计算和 x
的初始值:
k = 0.607252935
bitw = 15
inpLUK = np.zeros(bitw + 1)
x = 1.0
y = 0
x = 0
for j in range(bitw):
tmp = atan(2 ** -(j))
inpLUK[j] = round(tmp * (2 ** bitw))
在您的代码中,
k
设置为1.646
,这是不正确。正确的 CORDIC 增益是 0.607252935
。另外,x
的初始值应该是1.0
,而不是1/k
。
inpLUK[j]
计算也是不正确。正确的计算是round(tmp *(2 ** bitw))
。除以 pi
和减 1
是不必要的,也是不正确。
尝试多关注一些小细节,因为它们会显着影响您的最终结果😉。