提高具有等距输入的 2D 直接查找表的性能嵌入式 C

问题描述

我在使用具有等距输入的直接查找表进行 2D 插值时缺乏性能。

目标是找到表 z(x,y) 中的 4 个值 (z00,z01,z11,z10) 分别对应输入 x 和 y 的两个最接近的值,(x0

例如以下查找:

                                              x
                        
y 1 2 3
4 20 23 29
6 35 37 43
8 47 50 55

由以下数组表示:

const f32 lookup {20,35,47,23,37,50,29,43,55}

此外,连同数组的定义,一个结构提供以下数据以允许更有效的查找:

 lowest_x = 1;
 lowest_y = 4;
 step_x = 1;
 step_y = 2;
 length_x = 3;
 length_y = 3;

该算法最耗时的部分是找到与输入 x 和 y 前后值的交集对应的索引。

我目前的方法是按如下方式计算它们:

鉴于 x0 和 y0 是指数的倍数:

index_x0 = u32 ((x-lowest_x)/step_x);

index_y0 = u32 ((y-lowest_y)/step_y);

那么 x0,x1,y0 和 y1 是:

x0 = lowest_x + index_x0 * step_x ;
x1 = x0 + step_x ;
y0 = lowest_y + index_y0 * step_y ;
y1 = y0 + step_y ;

查找 z(x,y) 的 4 个必要值是:

   z00_index = index_x0*length_y0+index_y0;

    z00= lookup[z00_index]
    z01= lookup[z00_index+1]
    z10= lookup[z00_index+length_y0];
    z11= lookup[z00_index+length_y0+1];

然后将二维插值作为 x 沿 y0 和 y1 的两次插值和 y 的一次插值执行:

zxy0 = (x1-x)/(x1-x0)*z00 + (x-x0)/(x1-x0)*z10;

zxy1 = (x1-x)/(x1-x0)*z01 + (x-x0)/(x1-x0)*z11;

z = (y1-y)/(y1-y0)*zxy0 + (y-y0)/(y-y0)*zxy1;

关于如何改进这一点有什么建议吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)