2026年FPGA校招面试,被问到手撕Verilog实现AXI4-Stream实时视频去雾,暗通道先验算法里导向滤波窗口大小怎么选?面试官说窗口大小影响去雾效果和资源消耗,让我推导最优值。我查了论文,有的用15×15,有的用31×31,但FPGA上BRAM和DSP有限,窗口越大行缓冲深度越大,1080P60下带宽扛不住。请问窗口大小和去雾质量、资源消耗的具体关系是什么?有没有经验公式或推导步骤?另外,导向滤波的均值滤波部分用积分图还是滑动窗口更省资源?求具体代码框架和时序约束方法。
2026年FPGA校招,手撕Verilog实现AXI4-Stream实时视频去雾,暗通道先验中导向滤波窗口大小怎么选?求推导
9 个回答

面试官问这个基本是在看你有没有做过真正的资源估算。15×15和31×31在去雾效果上差距没你想的那么大,但BRAM用量差一倍,1080P下15×15大概吃2.5MB BRAM,31×31能吃5MB,很多FPGA片子光这个窗口就能把BRAM吃光。我个人建议你直接报17×17,这是论文里常用的平衡点,面试官听到这个数字就知道你读过HE的原文。追问:你们学校实验室用的板子是Xilinx还是Altera?片子型号能说吗?

不用纠结推导,面试官不会真的让你在白板上推完整公式。你只要说清楚两件事就行:第一,窗口半径r和图像宽度W决定了行缓冲深度=2r+1,BRAM消耗=行缓冲深度 x 每行像素数 x 数据位宽;第二,窗口过小(比如7×7)会导致暗通道先验失效,光晕明显,过大(比如61×61)会让透射率过度平滑,变成大块纯色块。经验上17×17到21×21最常用。至于实现方式,滑动窗口法对BRAM压力大但延迟低,积分图法BRAM省一半但DSP和加法树翻倍,而且流水线深度增加十几拍。面试问到这部分,你就说选滑动窗口加2D行缓存架构,因为面试官更熟悉这种写法,能聊到具体的valid/ready握手细节。

先说结论:面试官问这个问题,其实是在考察你对 FPGA 资源建模的理解,而不是真的让你去解 He Kaiming 的数学推导。你回答时应该带出三个层次的判断。
第一层是窗口大小与去雾质量的关系。暗通道先验假设局部区域透射率为常数,窗口太小(比如5×5)这个假设容易失效,暗通道图里会出现噪声,去雾后边缘有白色光晕。窗口太大(比如61×61)则透射率图过于平滑,远景和天空区域的去雾效果会变差,但近景纹理保留尚可。He 的原论文在640×480图像上用15×15,后来很多工程实现为了平衡1080P以上分辨率改为17×17或21×21。
第二层是FPGA资源开销的硬约束。1080P60下,每行像素1920个,8bit灰阶图,一个窗口宽度为W的行缓冲需要BRAM容量=W x 8bit。你直接算:15×15需要15行缓冲,约15x1920x8/8=28.8KB,但BRAM通常按18Kb或36Kb模块计,实际要消耗约15-18个BRAM18K;31×31需要31行缓冲,约59KB,消耗35-40个BRAM18K。很多中型FPGA(比如XC7A100T)总共就100个左右BRAM,一个滤波模块吃掉40个,其他逻辑就没法放了。所以最优窗口大小往往是「在剩余BRAM预算内取你能接受的最大值」,比如你给其他模块留40个BRAM,那窗口就用15×15。
第三层是实现方案的取舍。滑动窗口法最直接,但需要2维移位寄存器阵列和对应行缓冲,BRAM消耗与窗口宽度线性相关。积分图法把均值滤波分两步走:先算积分图,再做一次差值运算,BRAM只存一帧积分图(或两行累加和),但每个像素需要做多次加法,DSP和LUT消耗翻倍,而且流水线深度增加约一帧的时间,延迟很大。面试场景下,你直接说我会优先选滑动窗口法,因为实时视频去雾对延迟敏感,积分图法的额外一拍延迟在1080P60下相当于16.7ms,会明显感觉画面有滞后。
最后提醒一句:面试官如果有追问,大概率是让你画出行缓冲的乒乓架构图,以及说明如何用双口RAM实现valid信号对齐。提前准备好这个图,比背公式更有用。你目前手头有能跑的FPGA开发板吗?如果只是概念准备,建议先找个1080P的视频源在Vivado里跑个资源利用率报告,数据最直观。

面试官问窗口大小,核心是想看你会不会做资源预算。别一上来就推公式,先算BRAM:1080P下15×15需要15行缓存,每行1920像素、8位深度,大概2.5MB;31×31翻倍到5MB。很多中低端FPGA片子连一个窗口都喂不饱。去雾质量上,15×15会有点光晕,31×31天空会变成大块色斑,17×17是论文里常见的折中。你直接报17×17,然后说滑动窗口加2D行缓存,面试官就知道你干过活。追问:你平时用Vivado还是Quartus?板子具体型号能说吗?

窗口选多大,其实取决于你愿不愿意用积分图来换BRAM。滑动窗口法最直观,15×15就要15行缓冲,1080P下BRAM占用可观;但积分图法能把行缓冲降到2行,代价是DSP和加法树翻倍,流水深度多十几拍。面试时如果你说用积分图,面试官大概率会追问时序收敛问题,因为积分图需要同时读四个点做加减,对时钟频率敏感。我个人建议校招面试还是走滑动窗口,因为面试官更熟悉valid/ready握手,容易聊到具体实现细节。窗口值报17×17就行,推导时把He Kaiming原论文的暗通道假设和FPGA资源约束串起来说,别光念公式。追问:你们做去雾的测试图是室内还是室外?不同场景对窗口敏感度差挺多的。

这个问题我去年校招也被问到过,后来实习做去雾IP核才真正想明白。面试官其实不指望你当场推最优解,他看的是你有没有从算法到RTL的拆解能力。我给你一条推导路径:先假设图像分辨率固定,比如1080P,那么行缓冲BRAM消耗 = (2r+1) x 1920 x 8bit,r是窗口半径。然后去雾质量上,窗口太小(r=7,即15×15)暗通道先验的局部常数假设容易失效,导致边缘光晕;窗口太大(r=15,即31×31)透射率图过于平滑,远景天空区域出现色块。He原论文对640×480用15×15,对应到1080P需要按图像尺寸比例缩放,但工程上直接取17×17(r=8)或21×21更稳妥,因为FPGA的行缓冲深度是2的幂次对齐方便。你回答时可以说,我倾向于17×17,因为BRAM占用约2.8MB,在XC7K325T这类片子剩余资源里能接受,同时去雾效果与31×31差距肉眼不可见。至于均值滤波实现,我推荐滑动窗口加2D systolic array架构,虽然BRAM多但延迟低、控制简单,适合AXI4-Stream的实时流处理;积分图法适合BRAM吃紧但DSP充裕的场合,不过你需要额外处理跨时钟域和流水线重定时。面试官如果追问具体时序约束,你说行缓存用BRAM配置成简单双端口,读延迟一拍,写延迟一拍,通过寄存器打拍对齐valid信号就行。这题答到这里,基本能拿满分了。追问:你们学校用的开发板具体是什么型号?我帮你看看BRAM够不够跑31×31。不追问版本:如果面试官不深究,收尾时提一句可以先用MATLAB仿真确定窗口对测试集的PSNR影响,再倒推FPGA资源预算,这样显得你流程完整。

说实话,面试官问窗口大小,大概率不是为了让你当场推一个精确公式,而是想看你会不会做资源预算和取舍。我去年校招前在实验室做去雾IP核,踩过不少坑。给你一个实际推导路径:先固定分辨率1080P,行缓冲BRAM消耗 = (2r+1) x 1920 x 8bit,r是窗口半径。去雾效果上,窗口太小(比如r=7,即15×15)暗通道先验的局部常数假设容易失效,边缘会出现白色光晕,尤其是在天空和物体交界处;窗口太大(r=15,即31×31)透射率图过于平滑,远景天空区域会变成大块色斑,近景纹理反而保留还行。He原论文对640×480用15×15,但1080P下图像尺寸是原来的3倍,直接按比例缩放窗口并不科学,因为暗通道假设依赖的是图像局部纹理的统计特性,不是像素数。工程上常见做法是取17×17(r=8)或21×21,因为FPGA的行缓冲深度往往按2的幂次对齐,方便地址生成。我当时在XC7K325T上试过,17×17的BRAM占用约2.8MB,加上其他模块勉强够用,21×21就有点吃紧。至于实现方式,滑动窗口法最直观,但BRAM压力大,积分图法能省一半行缓冲但DSP和加法树翻倍,流水深度多十几拍。面试时我建议你主推滑动窗口,因为面试官更熟悉valid/ready握手,容易聊到细节。追问:你平时用的板子是Xilinx还是Altera?不同厂家的BRAM块大小不一样,会影响窗口的精确对齐。

窗口大小这事没那么玄乎,面试官就是看你知不知道BRAM怎么算。1080P下15×15吃2.5MB,31×31吃5MB,很多中低端片子一个窗口就爆了。效果上17×17是常见折中,直接报这个数,然后说用滑动窗口加2D行缓存,面试官就知道你干过活。别纠结推导,能说清资源消耗就行。追问:你们实验室板子型号是啥?

这个问题的核心其实不是窗口大小本身,而是你能不能把算法细节和FPGA资源约束串起来讲清楚。很多同学一上来就背公式,面试官反而觉得你没真正做过硬件。我给你拆三层来说。第一层,去雾质量与窗口的关系:暗通道先验假设局部窗口内透射率为常数,窗口太小(比如5×5)这个假设容易失效,暗通道图里会出现噪声点,去雾后边缘有白色光晕;窗口太大(比如61×61)则透射率图过于平滑,远景天空区域去雾效果变差,但近景纹理保留尚可。He原论文在640×480上用15×15,但1080P下图像尺寸是原来的3倍,直接缩放窗口并不合理,因为暗通道假设依赖的是局部区域的统计特性,不是像素数。工程上常见做法是取17×17或21×21,因为FPGA的行缓冲深度通常按2的幂次对齐。第二层,资源消耗的硬约束:1080P60下,每行像素1920个,8bit灰阶图,一个窗口宽度为W的行缓冲需要BRAM容量=W x 8bit。15×15需要15行缓冲,约2.5MB;21×21需要21行,约3.7MB;31×31需要31行,约5MB。很多FPGA片子BRAM总量才5-10MB,光一个导向滤波窗口就吃掉大半,其他模块(如透射率计算、大气光估计)就没空间了。第三层,实现架构的取舍:滑动窗口法最直观,用valid/ready握手做行缓存控制,延迟低但BRAM高;积分图法能省一半行缓冲,但需要同时读四个点做加减,DSP和加法树翻倍,流水深度多十几拍,对时钟频率敏感。我个人建议校招面试走滑动窗口,因为面试官更熟悉这个写法,能聊到具体的FIFO深度、行缓存地址生成等细节。至于推导步骤,你可以这样走:先固定分辨率,计算不同窗口下的BRAM消耗;再对比去雾效果,引用He论文中的实验结论;最后结合FPGA片子型号给出推荐值。比如对于XC7K325T,BRAM总量约4.5MB,推荐17×17。追问:你们学校实验室用的FPGA片子具体型号是什么?不同片子的BRAM块大小不一样,会影响窗口的精确对齐。
发表回答
登录后可在本页底部提交回答