SIFT--FPGA实现之幅值和幅角计算模块

来源:互联网 发布:校园网络拓扑结构图 编辑:程序博客网 时间:2024/05/16 11:54

     该模块的实现,让我走了许多弯路,开始在看文献和文章里面说的都是用cordic算法去做,然后我发现xilinx的IP核里面有这个cordic算法的IP,而且还有求反正切和开方根运算sqrt,让我开心不已,就冒失的跟领导说了,这块很快就搞定了,SIFT用FPGA实现很快就要做完了,结果等我去用IP核的时候,仿真发现不对,开方根只能处理整数和小数开方根运算,而且整数开方根运算误差很大,小数开方根运算还必须输入在0-2之间,瞬间很崩溃,就找怎么实现开方运算,找到文献说有非冗余开方这个方法可以,也看到有篇文献是这么做的,我的乖乖,差点走错道了,想啊 这么做不太好,就用IP核搞反正切运算,发现也不行啊,仿真也不对啊,看手册,发现输入只能是-1到1之间,又无语了。不知道怎么做了,又去找开方运算,发现cordic算法能做开方运算,慢慢查,发现cordic算法都能搞定,这会就开始搞cordic算法,刚开始一头雾水,看那些公式还有图形旋转啊,各种晕,后来发现本文分享的博客,关于cordic算法的,写的很通俗易懂,相当好,才有了了解,但是里面说了cordic算法能求反正切也能求开方根运算,而且是乘个系数补偿回来就好了。

    我把系数乘回去结果不对,又查资料,找到双模式CORDIC算法的fpga实现这篇文章,才解开所有谜题,cordic算法旋转模式求cos和sin,向量模式求幅值和幅角也就是反正切。里面的系数还有放大,1度用多少表示,等等,都明确了,写了verilog代码,看了C语言的,cordic算法是如此的简单粗放。C只需要一个for循环而已,FPGA实现也可以使用for循环,但是不建议那么用,for循环也能综合,但是会造成时间延迟,分开写电路会消耗资源,但是时间快些,所以要自己权衡了。

  现在从高斯滤波模块出来的数据到梯度计算模块再到幅值和幅角计算模块。就都做完了,幅值和幅角计算模块可以参考下面的框图:



这是华中科技大学一篇博士论文里面的,感谢这位师兄的帮助。谢谢!到此sift的FPGA实现已经完成了一大半的工作了。剩下的可以在dsp上实现这样简单点,也可以在FPGA上实现,我要做的是继续在FPGA上实现。加油吧!骚年!!

0 0
原创粉丝点击