打印

要是 -1

[复制链接]
楼主: xddzccn
手机看帖
扫描二维码
随时随地手机跟帖
21
huangqi412| | 2008-6-18 19:12 | 只看该作者 回帖奖励 |倒序浏览

数学丢完了,看着都晕

使用特权

评论回复
22
xddzccn|  楼主 | 2008-6-18 20:03 | 只看该作者

matlab 仿真程序

clear;close all;clc;     %Working condition intializing
m=-1;                    % hyperbolic coordinate system
u=1;                               % rotating direction
K=0.82816;                              %修正因子
seq=[1 2 3 4 4 5 6 7 8 9 10 11 12 13 13 14 15];%旋转序列
x0=1/K;
y0=0;
z0=0.2;
for l=1:length(seq)
    x=x0-m*u*y0*2^(-(seq(l)));
    y=y0+u*x0*2^(-(seq(l)));
    z=z0-u*atanh(2^(-(seq(l))));
    x0=x;
    y0=y;
    z0=z;
    u=sign(z0);
end
x0 
y0 
z0
matlab出来的结果
x0 =

    1.0201


y0 =

    0.2014


z0 =

 -1.6186e-005   

>> x0+y0

ans =

    1.2214

>> exp(0.2)

ans =

    1.2214

结果出来的和exp(0.2)是一样的
可以看出精确度很高
至少小数点后面的四位都是一样的 ,
接下来的事就是把这个matlab算法 转化成高效的C算法!
我也是刚刚研究这个 算法,
大家可以看了数学推倒 一起来讨论讨论,

使用特权

评论回复
23
maths| | 2008-6-18 23:47 | 只看该作者

cidic算法我喜欢

最近也在研究这个
ms在这个论坛上研究这个的很少!
确实单片机也用不上这么高深的算法
估计很多人都连这个个数学公式看起来都有点头大了
还要转化成软件 就更加了
其实cordic算法理解起来不难,cordic算法是计算器数值计算机的
一把瑞士军刀啊 
lz要是有功夫的话
把 圆周旋转 双曲旋转 线性的
全部做一遍, 把 三角函数 反三角 开方等运算 全部做了 和大家一起讨论讨论,不过大家好像不怎么说话!
支持LZ ,也希望 其他坛子里面的兄弟们多多支持!

使用特权

评论回复
24
sz_kd| | 2008-6-19 00:14 | 只看该作者

顶,不错

使用特权

评论回复
25
HWM| | 2008-6-19 08:13 | 只看该作者

这玩意儿和C无关,纯属数值计算范畴

使用特权

评论回复
26
xddzccn|  楼主 | 2008-6-19 10:02 | 只看该作者

数值计算

如果数值计算 要求很高的 话
C 就是一种很好的工具了!

使用特权

评论回复
27
HWM| | 2008-6-19 10:41 | 只看该作者

C只是一种表达或实现方法

以前还有个更适合数值计算的语言——FORTRAN

使用特权

评论回复
28
xddzccn|  楼主 | 2008-6-19 11:33 | 只看该作者

哈哈!

这个算法在硬件上用的多,FPGA上面!

使用特权

评论回复
29
armfpga| | 2008-6-19 15:52 | 只看该作者

HWM

HWM 不要和LZ 讨论这些
管它是啥 ,把它写出来
让大家看看阿,我觉得这个挺有意思的!

使用特权

评论回复
30
IceAge| | 2008-6-20 01:02 | 只看该作者

cordic 计算三角函数不错,不知道对于 exp 怎么样

另一种方法,如果 x 是 16-bit 整数:

定义4 * 16 个系数,
float Coeff[4][16] = {
 { 1, e^1, e^2, ..., e^15 },
 { e^0x10, e^0x20, ..., e^0xF0};
 { e^0x100, ..., e^0xF00 };
 { e^0x1000, ..., e^0xF000 }
};

计算:

  float result = Coeff[0][x & 0x0F];
  result *= Coeff[1][(x>>4) & 0x0F];
  result *= Coeff[2][(x>>8) & 0x0F];
  result *= Coeff[3][(x>>12) & 0x0F];







使用特权

评论回复
31
IceAge| | 2008-6-20 01:15 | 只看该作者

上面的表里漏了 3 个 1 以及 ;错误

使用特权

评论回复
32
IceAge| | 2008-6-20 02:20 | 只看该作者

我明白了. 用 cordic 计算 exp 非常适合 FPGA

原理相当于 二分/折半 查找,只用加减,移位就可以了。

使用特权

评论回复
33
xddzccn|  楼主 | 2008-6-20 11:09 | 只看该作者

确实 很适合FPGA

现在正在写 仿真还没有出来! 

使用特权

评论回复
34
xddzccn|  楼主 | 2008-6-20 12:26 | 只看该作者

仿真结果 8级流水线 误差还不小

仿真结果 8级流水线 误差好不小
角度
10        20         30       40        50        60       70         80
输入
5690      11207     16384     21063     25102     28378    30792     32270
输出
5794      11436     16513     21080     25087     28302    30706     32251
正弦值
0.1736    0.3420    0.5000    0.6428    0.7660    0.8660   0.9397    0.9848

仿真正弦值
0.1768    0.3490    0.5039    0.6433    0.7656    0.8637   0.9371    0.9842

使用特权

评论回复
35
xddzccn|  楼主 | 2008-6-20 12:34 | 只看该作者

没有怎么看明白

另一种方法,如果 x 是 16-bit 整数:

定义4 * 16 个系数,
float Coeff[4][16] = {
{ 1, e^1, e^2, ..., e^15 },
{ e^0x10, e^0x20, ..., e^0xF0};
{ e^0x100, ..., e^0xF00 };
{ e^0x1000, ..., e^0xF000 }
};

计算:

  float result = Coeff[0][x & 0x0F];
  result *= Coeff[1][(x>>4) & 0x0F];
  result *= Coeff[2][(x>>8) & 0x0F];
  result *= Coeff[3][(x>>12) & 0x0F];
没有怎么看明白 
好好研究一下,看上去像 ucos里面的那个表! 

使用特权

评论回复
36
xddzccn|  楼主 | 2008-6-20 12:46 | 只看该作者

看懂了

看懂了

使用特权

评论回复
37
xddzccn|  楼主 | 2008-6-20 13:10 | 只看该作者

IceAge 是算法大师阿!

IceAge  是算法大师阿!
算法真多,这几天在研究cordic算法,就在上面发了个帖子,
MS 感兴趣的人不是很多,这样也好,工作的时候我比别人多
会一些 我的机会就多些!

使用特权

评论回复
38
hotpower| | 2008-6-20 13:12 | 只看该作者

当然~~~IceAge是俺跪拜的老师~~~

使用特权

评论回复
39
王紫豪| | 2008-6-20 13:24 | 只看该作者

查表,哈哈!笨把

使用特权

评论回复
40
xddzccn|  楼主 | 2008-6-20 15:56 | 只看该作者

我也要拜师

小弟 虽是个菜鸟,但是小弟有兴趣,
呵呵!
我也要拜IceAge为师傅,学习一些好的硬件算法
哈哈,
要是能收我做徒弟就是 hotpower同门师弟 了
哈哈!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则