分享

让我们利用DSP Builder创建一个中值滤波模块(原创)

 等缘708 2013-01-08

先前我用verilog编写了一个中值滤波模块,这种算法处理因为数据量巨大而且还重复存取,所以比较适合放在FPGA前端来处理,DSP就做小数据有技巧的算法吧。当时写这个模块的时候可真是折腾啊,呵呵,其实不是中值算法难,也不是用verilog表述出来难,难的就是在工程中搭建这个数据链,我们得根据相机的数据流来小心翼翼的存储和放出这些数据,不能阻塞而且要有效率。

我很惊奇dsp builder,真的是个非常好的工具,它让我们从全局来构建我们的模块,而不是掉进了信号的泥潭,这就是我先前用verilog写中值模块的苦恼,你得关注每一个相关的信号,相机的、DSP的,这些繁杂的信号都有可能导致你无法实现效果。而且我们还非常不好测试,这点也绝对的成为了问题,我们需要的测试就是我给一幅图片经过我的模块,出来效果图片!这点很难,FPGA无法提供这么大的RAM给你存,而且取出来也是个麻烦,我们需要可视化!

呵呵,DSP builder果真是一把针对DSP的利器!(这里的DSP是数字信号处理,不是处理器,否则TI会不高兴了,hoho~)。当然了,我们写控制逻辑的时候还是自己手写吧,算法就用dsp builder,如果你用一个纯硬件的头脑在simulink中搭建电路模块,这也是很好的,你真的可以一句代码也不写,呵呵,这真令人惊奇,我是达不到这么胸中有器件,还是行为级的描述描述吧~~

FPGA这个东西,太综合了,正是因为它像一张白纸,你可以随意发挥,随意发挥的结果是你需要太多知识才能发挥,汗~ 你看,你数数这繁多的工具,timequest,signaltap,modelsim,matlab…从工程上说它需要三个方面支持,硬件、算法、软件。

 

说偏了,我只是想说这个工具让我们脱离了泥潭。DSP builder这个组件分两部分,一个是基础库,一个是高级库。现在Altera把大部分精力放在了高级库上,而且有有些IP是需要lincese才能用的。

 

好了,让我们先来了解一下中值算法,google一下吧。我采用的是快速中值滤波,3x3矩阵。这个算法主要功能是去噪,附带会产生模糊的效果。算法如下:

 

图一

先纵列以箭头方向从小到大排序,纵列排好后,再横列以箭头方向从小到大排,最后取45°角方向斜线的三个数取中值。

 

了解了算法之后,编写verilog模块吧。这里需要注意的就是,务必达成流水线处理,我们可以一个时钟节拍就处理完一个三值比较,或者多个时钟完成。一定要注意到相机的数据是流水般过来的,所以我们可以先等几个或者十几个时钟,但是后续必须是流水般出结果。

写好之后,打开matlab&simulink,开始建模,用HDL inport导进去吧。其实也可以自己用dsp builder的组件来搭建这个算法模块,因为我这有个以前写的代码了,所以就直接用:下面7个大的方形模块是verilog导入。

 

图二

因为我的相机是640*480输出的灰阶图像,所以对应着3x3矩阵就是三行数据了。这里IncCount组件作用就是模拟相机数据了,线性递增数据0-63,很简单,可以初步验证一下我写的Compare_3Num模块的作用。示波器观察数据看看:

 

图三

正好是64个数据循环,所以经过中值应该也是对应的,初步效果可以确认了。其实这样观察和Modelsim,SignalTapII观察就是一个样,只见树木不见森林,看着单个单个的值,有点无助~~

体现matlab强大的时候到了,simulink有个两组件From workspace,To workspace。它能把matlab工作间的内容导进dsp builder模块之后在观察框中显示出来。这为我们提供很好的测试方法,特别是图像处理。不过我们需要先写.m脚本,你的去了解几句matlab语言才行~~

建模如下,这里的subsystem就是用图二的模块创建的子系统,From Workspace的simin就是数据入口,从这里把整幅图片的数据导进,To workspace就是数据出口,复位和使能就直接置1了。

 

图四

我们来尝试导入一幅彩色图片,经过我的中值滤波模块之后的效果(第二幅是灰阶图,第三幅是中值滤波后的效果图):

 

图五

经过上面两种测试方法,特别是第二种方法,我们直观的得到了整幅图片的效果,现在进入实战阶段了,导出VHDL代码,加载到工程里,我们希望得到的就是实时的中值滤波效果!

利用signalcompile组件指定器件---编译----export….

 

图六

军工级的代码出现了,呵呵,不包括我写的那段~~~不要看它产生的文件多,占用的资源却是很优化的,而且效率也非常高。

 

这些代码可以直接用的,我的工程是verilog代码,引用VHDL模块直接引用即可,这里的top文件是median6_GN。有了top文件我相信大家都会调用的吧~

 

我的板级可通过网络获取相机的黑白数据,实时显示。PC客户端保存的图片是png格式的,获取个原图:

 

图七

我们写个脚本,运用matla本身的中值函数medfilt2来做一下处理,得到下面的效果:此图是直接在显示的figure里save as..jpg格式(这个图片保存了就这么小,我没缩放过,顺便申明这些图片都被转成jpg格式,博客园不支持bmp上传)

 

图八

好了,我们把matlab导出的中值VHDL代码加进工程,编译出来sof,烧写FPGA,看PC端的实时显示结果,截个图:

 

图九

呵呵,感觉还行,相机热噪点较多,水渍水渍的。和matlab本身的函数处理结果相差不大。这里的图片有一些小黑点,可能是相机帧行信号没控制好,导致无效数据进fifo了,看见了吧,实践中的工程就是还有很多的细节需要完善的!上面的几幅图片都有行偏移,这是PC端的采集软件有点bug,我这里主要是演示图像处理,没有理它。

 

通过这个演示,我们知道了DSP builder能导出可用的硬件代码。matlab给我们提供系统级建模的平台,无需写一句代码也能完成军工级的任务。

 

后记:

我现在用的平台是quartusII12.0 & Matlab2010b,

其实quartusII9.1 & Matlab2009b配合的是很好的,后面我用的时候创建文件用dsp builder的signalTapII组件,发现报错: Matlab Error

Undefined function or method 'eval' for input arguments of type 'double'.

而且没有弹出signalTapII的观察框,这真是件纠结的事情,于是我又怀疑是版本问题了,因为毕竟2009b不是“正室”啊,决定卸载。

找缺氧同学要了12.0版本的quartusII及各组件,花了两个半钟把quartusII9.1 & modelsim & dspbuilder &matlab卸载,换成12.0的各版本配合…这真是下了大决心,换这种软件忐忑啊。

其实,那个报错12.0也会有,而且问题不是软件版本问题,是我有个组件的参数没配置好,直接导致signaltap无法弹出观察框!

 

就这样吧,慢慢就会习惯12.0了~

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多