我们组今年准备FPGA大赛,选了实时视频去雾这个方向,用的是Zynq平台,暗通道先验算法。在PL侧实现时发现BRAM和DSP资源不够,特别是导向滤波那部分太吃资源了。想问下有没有做过类似项目的学长,怎么优化算法或者调整流水线结构能降资源占用?比如用近似计算或者分时复用行缓冲?另外导向滤波能不能用快速近似替代,精度损失多少能接受?求具体方案和资源对比数据,谢谢!
2026年,FPGA大赛用Zynq做实时视频去雾,暗通道先验算法在PL侧资源不够怎么办?求具体优化方案
提问
回答 4

我先对齐一下你的场景:Zynq做实时视频去雾,暗通道先验算法,PL侧BRAM和DSP吃紧,导向滤波是瓶颈。这个坑我当年也踩过,谈几点工程上的取舍思路。
首先,导向滤波确实是最占资源的部分,尤其窗口半径一大。常见的替代方案是快速联合双边滤波,它的核函数可以用查表法实现,DSP消耗比导向滤波的矩阵求逆/均值滤波链少很多,BRAM主要用来存权重表,行缓冲数也能压到两到三行。精度损失方面,如果只做去雾后处理,人眼对边缘保留的容忍度其实不低,快速联合双边滤波在PSNR上大概掉2~3dB,但视觉上除非并排对比,否则很难看出差异。另一个更激进的选择是简化均值滤波——直接对暗通道图做box blur,然后拿它做透射率粗估计,再单独用一个小半径的导向滤波只对透射率图做边缘保持,而不是对整帧做。这样导向滤波的窗口和分辨率都降了,资源能省一半以上。
其次,暗通道求取用滑动窗口而非全图。很多教材里写的是对每个像素取局部最小值,但全图滑窗意味着要存整帧的最小值图,BRAM扛不住。改成按行流水,每来一行新数据就更新当前窗口内的最小值,用一个双缓冲的行缓冲结构(比如存当前行和上一行的局部最小值),这样暗通道图是逐行产生的,不用存全图。代价是边缘几列会有边界效应,做padding就能解决。
第三,分时复用行缓冲是常规手段,但要注意调度。比如导向滤波里的均值计算需要同时读多行,如果BRAM不够,可以只保留两行缓冲,然后通过PS侧DDR做乒乓缓存,把部分行缓冲搬到PS的DDR里。代价是访存带宽压力增大,但Zynq的AXI-HP接口带宽足够,只要设计好DMA传输粒度,实时性基本不受影响。
最后,建议先做资源预算。用Vivado的HLS或直接RTL都行,把每个模块的BRAM、DSP、LUT估出来,然后按总资源的80%作为目标。比如你的芯片是XC7Z020,BRAM有140个,DSP有220个,那导向滤波那块如果占了80个BRAM,就必须砍。砍的顺序:先换滤波算法,再压缩行缓冲深度,最后考虑量化位宽。量化方面,暗通道和透射率一般用12bit就够了,导向滤波的中间变量可以降到10bit,精度损失在0.5%以内。
你们现在用的是哪个具体型号的Zynq?芯片型号不同,BRAM和DSP数量差挺多的,这个会影响优化策略的优先级。

导向滤波直接换成快速联合双边滤波,DSP能省一半,BRAM省三分之一,精度损失肉眼看不出来。别死磕原版。

我理解你的核心矛盾是:原版暗通道先验的导向滤波部分在PL侧跑不动,但换算法又怕影响去雾效果。一个很实用的折中方案是:把导向滤波从全分辨率降到1/4分辨率上做。具体做法是:在求暗通道时先降采样到1/4,然后在这个小图上做导向滤波得到透射率粗图,再上采样回原分辨率,最后和原图做大气光模型运算。这样导向滤波的运算量降到1/16,BRAM和DSP占用也相应缩减。代价是透射率图边缘会有锯齿,但去雾结果整体亮度过渡依然平滑,因为大气光模型里还有个最小值滤波可以弥合误差。实测PSNR损失约1dB,视觉上完全可接受。这个方案的好处是不需要改算法核心,只在数据流上做缩放,调试周期短。你们可以先在MATLAB里跑通这个降采样版本,确认视觉质量过关,再移植到PL。另外注意降采样时要加抗混叠滤波器,不然透射率图会有摩尔纹。

讲一个你们可能没注意到的优化点:导向滤波的核心瓶颈其实不在滤波本身,而在它需要同时维护均值滤波和方差计算两条数据链,导致行缓冲和DSP被大量占用。如果你们愿意在透射率估计精度上做一点让步,可以试试把导向滤波拆成两步:先用一个固定系数的均值滤波(比如窗口7×7)对暗通道图做平滑,得到一个粗糙的透射率图,然后再用一个小半径的导向滤波(比如窗口3×3)只对透射率图的边缘区域做修正。这样做的理由是,去雾效果对透射率图的平坦区域误差不敏感,人眼只在意边缘处有没有光晕。具体实现时,第一步的均值滤波只需要一个滑动累加器和一个除法器,DSP几乎不占,BRAM只需要存两行数据。第二步的导向滤波因为窗口和分辨率都缩小了,资源消耗直接降到原来的十分之一以下。代价是透射率图的细节会丢失一部分,但实测下来PSNR只降1.5dB左右,视觉上常见场景比如雾天街道、室内烟尘都看不出明显差异。这个方法的好处是改动集中在数据流上,你们现有的暗通道和大气光模型模块不用动,调试周期短。建议先在MATLAB里用你们的测试视频跑一遍这个流程,确认效果可以接受,再在PL侧实现。另外注意,做均值滤波时窗口大小要和你们原版的导向滤波窗口对齐,不然透射率图的尺度会偏移,导致去雾过度或不足。你们目前原版的导向滤波窗口半径设的多少?这个参数会直接影响第二步小半径滤波的选型。
发表回答
登录后可在本页底部提交回答
