我正在备赛2026年FPGA大赛,打算用安路FPGA做实时AI图像去雾,暗通道先验算法里导向滤波的窗口大小对BRAM消耗影响很大。网上说窗口选15×15效果不错,但BRAM直接爆了。窗口选7×7能省资源但雾霾残留明显。有没有大佬分享下具体怎么根据FPGA资源去权衡窗口大小?或者用流水线优化行缓冲深度来省BRAM?求真实经验,别光理论。
2026年FPGA大赛,用国产安路FPGA做实时AI图像去雾,暗通道先验算法中导向滤波的窗口大小怎么选最省BRAM?
5 个回答

窗口大小本质上是在赌你片内BRAM够不够换片外DDR带宽。安路高端系列有硬DDR控制器,15×15爆BRAM就果断把行缓冲做到DDR里,付出几个cycle的latency换BRAM,比赛里没人会说你错。7×7残留明显说明你暗通道透射率估计那块精度不够,别死磕窗口,回头调一下最小值滤波的半径或者加个guided filter的epsilon。

我去年用安路EG4系列做过类似项目,15×15导向滤波单是行缓冲就要15行图像数据,720p灰度图一行的缓冲就是720字节,15行要10800字节,安路中端芯片BRAM块一般是18Kb或者9Kb,换算下来消耗十几块BRAM很正常,加上其他模块确实容易爆。我的做法是窗口改到11×11,然后配合双边滤波做后处理去雾霾残留,效果比单纯7×7好很多,BRAM消耗控制在8块以内。另外流水线优化行缓冲深度有个技巧:导向滤波的均值计算其实可以用滑动窗累加器代替全窗口缓存,这样行缓冲只需要1行而不是窗口高度行,但代价是逻辑资源增加。如果你逻辑资源有余而BRAM紧张,这是个不错的trade-off。安路工具链里看资源占用报告很方便,建议先跑一个最小系统把各模块独立资源摸清楚,再慢慢加窗口尺寸。追问一句:你的图像分辨率是多少?720p和1080p对BRAM压力差很多。

不用非得在窗口大小一棵树上吊死。暗通道先验的导向滤波本质是边缘保持平滑,你可以用近似算法替代,比如用快速双边网格或者递归滤波。安路FPGA有DSP硬核资源,递归滤波用乘加器做IIR结构,BRAM只存几行系数表,几乎不占行缓冲。代价是精度稍微下降但比赛演示完全够用,雾霾残留比7×7好。我建议你先在PC上把算法流程改成递归版本验证效果,再移植到安路平台。如果坚持用导向滤波,那窗口大小选9×9配合上采样——对低分辨率图做滤波再放大,BRAM省一半多。

我建议你换个角度:别只在窗口大小上纠结,先看看安路芯片的BRAM块配置。不同型号的芯片BRAM块大小不一样,有的18Kb有的9Kb,同样15×15窗口在不同芯片上消耗的块数差很多。如果你选的是高性价比的EG4系列,15×15确实容易爆,但如果你换成PH1系列或者更高端的,BRAM块数多而且每块容量大,窗口开到15×15可能完全扛得住。所以第一步不是调窗口,是先查你选的芯片型号跟BRAM总量,算一下15×15需要多少行缓冲,再按芯片的BRAM块大小折算成块数,看看还剩多少给其他模块。如果剩得少,再考虑降窗口或者换芯片。你目前定的是安路哪个具体型号?

其实省BRAM还有个被很多人忽略的招:把导向滤波的均值计算改成积分图结构。传统做法是存窗口高度行缓冲,每来一个新像素就把整行数据读出来做滑动平均,行缓冲数量和窗口高度成正比。积分图的做法是只存一行的积分值,然后做四次查表就能求出任意矩形区域的均值,行缓冲只需要一行,BRAM直接降到原来的窗口高度分之一。代价是积分图对位宽要求高一些,毕竟积分值累加容易溢出,需要额外多两三位,但安路DSP做加法很快,逻辑资源多花一点换BRAM省一大截,非常划算。不过积分图有个坑:如果你图像边界不做特殊处理,边缘几列像素的积分值会不准,需要在输入阶段补一圈镜像填充,这个填充逻辑写不好会多耗几cycle latency。建议你先在Matlab把积分图版本跑通,验证下边界处理的效果,再移植到安路平台。追问一句:你目标分辨率是1080p还是720p?分辨率不同,行缓冲的绝对字节数差很多,选择策略也不一样。
发表回答
登录后可在本页底部提交回答