码电路的阿明
毕设做这个方向挺有挑战性的,但做好了会很有亮点。DBSCAN在CPU上跑就很吃资源,主要是邻域查询(range query)那步太耗时了,在FPGA上硬搬软件算法肯定不行。
核心思路是把算法‘打碎’、‘重组’,用硬件喜欢的方式来做。
第一,数据预处理和量化。点云数据一般是浮点数,直接处理面积太大。可以先做体素化(voxelization)或者二维平面网格化,把连续空间离散成一个个小格子。这样邻域搜索就变成了查周围几个固定格子,搜索复杂度从O(N)降到了O(1)。虽然损失了一点精度,但对聚类结果影响通常可接受,这是用精度换速度的经典操作。
第二,流水线化整个处理流程。FPGA最擅长的就是这个。可以把流程拆成:数据输入缓存 -> 空间索引构建(比如网格映射) -> 核心点判断 -> 聚类扩张。每一级都可以流水,同时处理多帧数据或者一帧数据的不同部分。记得用双缓冲(ping-pong buffer)来衔接流水线各级,避免阻塞。
第三,近邻搜索加速。这是大头。除了用网格,还可以考虑用Z-order曲线(Morton Code)对点进行排序和线性存储,这样空间上靠近的点在存储上也靠近,能提高缓存命中率。在硬件上可以设计一个专用的近邻查找单元,它内部集成了网格查找表,一次能并行查询一个点周围多个网格内的所有点。
第四,算法层面的近似与简化。DBSCAN有两个参数:eps和MinPts。在硬件上,可以先用更简单的算法(比如基于固定半径的密度预筛选)过滤掉明显是噪声的点,减少需要精细处理的数据量。或者用两级聚类,第一级在FPGA上用简化算法快速出粗结果,第二级把粗结果送到CPU上用标准DBSCAN精修。
关于参考资料,建议去IEEE Xplore搜“FPGA clustering lidar”或“hardware acceleration DBSCAN”。我记得有篇论文叫“A Real-Time FPGA-Based Architecture for DBSCAN Clustering Using Euclidean Distance”可以参考其架构。开源项目的话,在GitHub上搜“FPGA point cloud clustering”能找到一些基于HLS(高层次综合)的简单例子,虽然不一定是DBSCAN,但数据流和近邻搜索的设计思路是相通的。
最后注意,毕设时间有限,别追求一步到位。可以先在MATLAB或Python上验证简化算法的效果,然后用HLS写C++代码做原型,最后再考虑是否要优化成Verilog/VHDL。优先保证功能正确和实时性,再考虑极致优化。祝你顺利!
