如何在GenExpr中创建可复用的通用卷积器?
在GenExpr中复用卷积代码的解决方案
核心限制与思路
GenExpr确实不支持直接传递缓冲区引用作为函数参数,但可以通过预处理器宏或Gen~子抽象实现代码复用,避免重复粘贴冗余代码。
方法一:使用GenExpr预处理器宏(最直接高效)
GenExpr支持C风格的预处理器宏,你可以把卷积逻辑封装成宏,调用时仅需传入不同的缓冲区名称即可。
实现步骤:
- 定义宏,将目标缓冲区和核作为宏参数:
#define SHARPEN_CONVOLVE(buf_x, buf_y, output_x, output_y) \ int len_buf = dim(buf_x); \ float kernel[5] = {-1, -2, 7, -2, -1}; \ int kernel_offset = 2; /* 5点核的固定偏移,无需计算 */ \ for (i = 0; i < len_buf; i += 1) { \ float sumX = 0; \ float sumY = 0; \ for(j = 0; j < 5; j += 1) { \ int j_buf = i + j - kernel_offset; \ if (j_buf >= 0 && j_buf < len_buf) { \ sumX += peek(buf_x, j_buf) * kernel[j]; \ sumY += peek(buf_y, j_buf) * kernel[j]; \ } \ } \ poke(output_x, sumX, i); \ poke(output_y, sumY, i); \ }
- 在需要的位置调用宏,传入不同的输入输出缓冲区:
// 处理第一组手势数据 SHARPEN_CONVOLVE(TeCoeffsX, TeCoeffsY, SharpenedTeX, SharpenedTeY) // 处理第二组手势数据 SHARPEN_CONVOLVE(HandDataX, HandDataY, SharpenedHandX, SharpenedHandY) // ... 剩余6组缓冲区同理调用即可
方法二:封装为Gen~子抽象(更模块化)
如果需要更清晰的代码结构,可以把卷积逻辑做成独立的Gen~子补丁,通过参数化缓冲区实现复用。
实现步骤:
- 创建独立的Gen~补丁(例如命名为
sharpen_convolve.gen),在代码面板中声明参数化的输入输出缓冲区:
// 外部传入的输入缓冲区 buffer input_x buffer input_y // 外部传入的输出缓冲区 buffer output_x buffer output_y // 初始化锐化核 float kernel[5] = {-1, -2, 7, -2, -1}; int len_buf = dim(input_x); int kernel_offset = 2; for (i = 0; i < len_buf; i += 1) { float sumX = 0; float sumY = 0; for(j = 0; j < 5; j += 1) { int j_buf = i + j - kernel_offset; if (j_buf >= 0 && j_buf < len_buf) { sumX += peek(input_x, j_buf) * kernel[j]; sumY += peek(input_y, j_buf) * kernel[j]; } } poke(output_x, sumX, i); poke(output_y, sumY, i); }
- 在主Max补丁中,通过
gen~对象加载该子补丁,并通过@buffer属性指定不同的输入输出缓冲区:
// 第一组数据处理实例 gen~ @file sharpen_convolve.gen @buffer input_x TeCoeffsX @buffer input_y TeCoeffsY @buffer output_x SharpenedTeX @buffer output_y SharpenedTeY // 第二组数据处理实例 gen~ @file sharpen_convolve.gen @buffer input_x HandDataX @buffer input_y HandDataY @buffer output_x SharpenedHandX @buffer output_y SharpenedHandY
额外优化:简化核的声明
原代码中用多次poke初始化核的方式可以直接替换为数组初始化,让代码更简洁易读,如上述示例所示。
内容的提问来源于stack exchange,提问作者Matt Creighton
相关产品推荐
相关产品推荐

