《MATLAB代做_FPGA代做hslogicFPGA滤波设计说明.docx》由会员分享,可在线阅读,更多相关《MATLAB代做_FPGA代做hslogicFPGA滤波设计说明.docx(11页珍藏版)》请在第一文库网上搜索。
1、一I渺小的,。首先简单的使用MAT1AB进行仿真验证一下:中值滤波:对图像进行3*3的滤波,这里中值滤波的本质就是对邻近区域内3*3区域计算均值,这里,我们使用自己编写的程序(不使用MAT1AB自带的中值滤波函数)来仿真,仿真结果如下所示:,原始图像带噪声图像中值滤波图像SAD模版匹配跟踪算法:模版匹配算法的基本公式为:U-I1(z,)=叭川,为i)-T(iJ)i-O/aO然后得到R中最小的值,则作为匹配区域,即识别的目标。因为这里要求中要求13*13的模版大小,因为整个算法是个固定模板的模板匹配算法。这里后来是用来了你提供的那个球的视频,你是用SSD算法,我这里用SAD进行仿真,仿真效果如下
2、所示:,您,您上面的两个部分合起来,仿真效果如下所示:X下面介绍一下在FPGA中设计这两个模块,并提供测试:3*3中值滤波器在FPGA中,3*3中值滤波器的基本构架如下所示:,这里,在实际中,由于FPGA搜索九个数据的中间值是非常复杂的,通常的做法就是采用中值滤波快速算法,具体如下所示:从上面的结构可知,中值滤波器分三级进行计算,其中每级之间通过D触发器来稳定时序。然后整个模块的计算需要4个时钟周期的延迟。另外一方面,由于在FPGA中,图像即以串行保存在存储器中,而中值滤波需要每次输入9个数据进行滤波,所以这里需要一个地址控制器,用来控制输入图像像素值。在实际中:*(*.j+1)X(M-I)X
3、aJ)X(1j】)(i*jx(i1j)(i+.jn这九个数,其对应的地址分别为:AddressAddress+1Address+2Address+800Address+1+800Address+2800Address+1600Address+1+1600Address+2+1600因为你的数据是600*800,所以,总地址为480000,但是,在仿真阶段,这里设置那么大,显然没法进行,因此,这里测试图像我们使用的大小为60*80,总地址为4800这九个数,其对应的地址分别为:AddressAddress+1Address+2Address+80Address+1+80Address+2+80A
4、ddress+160Address+1+160Address+2+160上面说到的参数,在veri1og中都是可调的。修改parameters.v文件即可调用。然后,我们使用一章测试图片进行测试,使用MAT1AB产生带早上的图片,并转化为串行格式(在FPGA中,图像即以串行保存在存储器中),作为测试源进行仿真。仿真之后,将FPGA中保存得到的Rec.1x1文件复制出来,运行view.m这个MAT1AB文件,mode1sim和MAT1AB运行后期对应的结果分别如下所示:1141HJkijvS/1S1U/test_meda_tops/o_address322/test_mfetops/o_enab
5、1eOSt1t一1.一IM/test_me(ia_tops/o_enab1e1StO/test_meda_tops/o_frame_f1agStO/testjnede_tops/o_Wrte_Address0;/test_meda_tops/Images158FPGA中图像仿真效果:原始图像带噪声图像FPGA滤波之后图像MAT1AB下仿真效果:从上面的对比可知,FPGA中值滤波的功能是正确的。SAD模板匹配跟踪算法的实现:这个算法的基本运算过程如下所示:这里,需要说明的时候,由于你要求的模板大小只有13*13,所以,一般只适合适用在目标较小的情况下使用,这里我们使用如下的测试图片作为测试。根据
6、公式:“1M-JK()=!f(%i+i)-T(i)i070这里,我们将13*13模板保存到一个BRAM中,以串行方式保存,然后从图像地址中读取数值和模板做差运输(根据实际情况不同,这里需要更换模板内容)。运行MAT1AB文件gen.m分别产生模板数据文件和测试图片数据文件。这个部分的地址产生方式和上面的类似,也是以矩阵形式产生的,具体地址变化如下所示:地址的控制以13*13模板进行下去。具体为:Address,Address+1,Address+W,Address+1+W,Address+12+W,Address+12*W,Address+1+12*W,Address+12+12*W,这个部分
7、的仿真效果如下所示:messagesrII:/test_TEST_SAD/i_dkO/test_TEST_SAD/i_rstO,/test_TEST_SAD/i_images_enO/test_TEST_SAD/o_images_en_input/test_TEST_SAD/o_address_input/test_TE5T_SAD/o_images/test_TEST_SAD/o_mb,Aest_TEST_SAD/o_SADStOO103OO=市hq-SUiaMa11ik1ak.bBIRr/test_TEST_5AD/o_SAD_ready,Aest_TEST_SAD/o_SAD_C1k/t
8、est_TEST_SAD/o_min /test_TEST_SAD/oJndex /test_TEST_SAD/o_enStOStO2454556St10155-14556从上面的仿真可知,SAD值最大为245,地址为4556.4556对应的图像行列分别为28行,76列。这和MAT1AB仿真的结果相似。下面的仿真是通过搜索到的最小值,获得白色边框,从而完成定位。使用同样的方法,将仿真后的数据保存到处,用MAT1AB显示,仿真效果如下所示:97if(i_images_en=1,b1)98begin99o_enab1e1=1;100o_enab1e2=o_enato1e1;101o_enab1e3
9、=o_enab1e2;102o_enab1e4=o_enab1e3;103o_images_en_input1;以及image_position.v这个中的isbox的延迟,主要这些延迟在实际中需要测试外部存储器到内部的实际延迟而定,这里你需要自己调整一下。3*3中值滤波和SAD模板匹配跟踪整合的实现:前面,我们已经单独对中值流波和SAD算法进行了FPGA实现,下面,我们将这两个模块整合起来,这两个部分的整合构架如下所示:P由于,在实际中,所处理的图像维度较大,我们都需要将每个步骤的处理的中间结果保存到存储器中,然后在后一级处理的时候,再通过寻址来处理。所以在上面的中值滤波和SAD算法的整合的
10、时候,我们需要将中间处理结果保存下来,合理设计地址产生算法和时序以及合理布局流水,从而大大节约算法资源占用。这个部分的程序在第三个文件夹下。首先,回顾一下两个部分合起来的MAT1AB仿真,效果如下所示:一颗给小的,整个系统的连续帧仿真如下所示:火estTE5knTES17WwtTESTjsStftwtTE5To.workJ.e5tTESTojwKJMstTEST,OjWCdJwtTESToJmwtTESTo-Addre.AtTEST/ojnedeosSToJrw.AeStTES”o_Wrtte_.estTESTo.We,.AwtTEST/oJcM9e.AwtTEST/oJmage.Mrt1ES
11、JAddrewESToj5ADestTEST.5AOj.wtTE5ToSAD.CkAtTEST/ojnr)wtTESTo.mdexRwuESTfojxMrtwseTESTojenwtTESToJsboxATTEST,OJmd9.wtTESThd1cstTKTM2RbVGSftj【00111pocoooooooo卜;如二Q1】:0ox)COOwxoTOStOs惠咖0二OJ-MJJJJooco3ccooccoo00000000StOOoCWCoOoax)CmStOOjjjjCOjj:COjJjjWWWWWWWftftftOOaWCOOOcokOJCCODQCOOCOJO;bn;III1Oj1Cuj
12、CI1W1h山Ih1由山山IiIIII;III对OoUQKX1皿%30。10。电1陋导入MAT1AB成像效果如上所示:中值滤波和SAD算法整合:我这里本想把模块加入到你的程序中了,但是我没找到类似isstart相似的使能信号,这个你根据你的测试情况,当完成一帧数据保存到DDR之后,产生一个使能给我的模块就好了。另外也没有找到多余的地址接口,也就是说你的内部没有留好对应的一些接口。所以给你写了一份较为详细的整合说明。这里我暂时是把程序复制在了你的模块中,但具体的接口如何接,你根据我们下的说明从你自己的模块中给出来。这个部分见第四个文件夹,这里由于最后你还需要自己做部分的调试所以这里我们对这个部分
13、的整合也做一定的说明和补充:首先,在第三部,我们得到了一个完整的系统,丫PUOIIICCAA.VQcmTESTCrEST.v)jImages_DDR_Test_u-Images-DDR-;RAM.DDR.u1-RAM_DDR(RAM_DDR.x.工RAM-DDR.u2-RAM.DDR(RAM.DDR.x“IVContro11ers-Contro11er(COntvjiImage_Process_u-Image-Processvjmedia_tops_u-media_tops(SAD_tops_u-SAD_tops(SAD-上面的Image.Process!就是这个完整的系统,其余为仿真需要加入的配合模块,这里首先对整合需要做的调整进行说明。114115116117118119120121122(i_isStart),(o_uork_1eve11),(o_vork_1eve12),(o_work_1eve13)注意,这里临时存储单元,就是用存放中间过程处理的图像数据,如果资源允许,则使用内部块RAM,这样控制时序非常方便,否则则需要输出到外部存储器。你到手程序之后,肯定还需要自己结合实际的摄像头输入进行调试,所以这里我先给你说明一下我设计的这个模块的整体构