1

我在 vivado hls 上实现了一个图像处理算法,作为优化的一部分,我试图将浮点表示更改为定点表示。

这是出错的部分

#include <ap_fixed.h>
unsigned char win[3][3];
typedef ap_ufixed<11,8> fix;
struct pixel_f
{
    fix r;
    fix g;
    fix b;
};
pixel_f new_pix;
.
.
.
.
.

new_pix.r = ((fix)(win[1][0] + win[1][2]) / 2)+0.5;

当我尝试执行它时,它给了我一个错误说

demosiac_core.cpp:16:49: error: ambiguous overload for 'operator+' (operand types are 'ap_fixed_base<11, 8, false, (ap_q_mode)5u, (ap_o_mode)3u, 0>::RType<32, 32, true>::div {aka ap_fixed<12, 9, (ap_q_mode)5u, (ap_o_mode)3u, 0>}' and 'double')
   new_pix.r = ((fix)(win[1][0] + win[1][2]) / 2)+0.5;

有人可以帮助我提出与为什么会出错以及可以做些什么来完成这项工作有关的任何建议吗?

提前致谢,

4

1 回答 1

0

查看头文件,问题似乎在于ap_ufixed该类既有一个采用双精度 ie 的构造函数fix::fix(double),又有一个转换为双精度 ie 的运算符fix::operator double()。但它没有定义一个接受修正和双精度的加法运算符,即没有operator+(fix, double).

所以当这样的代码被编译时

fix x = ...;
double y = ...;
fix z = x + y;

编译器不知道是转换yfix并添加两个fix值,还是转换x为双精度值并添加两个double值。编译器错误消息中的歧义指的是什么。

解决方案是准确地说出你想要什么,如果你想添加两个fix值,那么写这个

new_pix.r = ((fix)(win[1][0] + win[1][2]) / 2)+ fix(0.5);

如果你想添加两个double值(似乎不太可能)然后写这个

new_pix.r = (double)((fix)(win[1][0] + win[1][2]) / 2) + 0.5;

或者您可能想完全重写表达式。我不明白为什么这不会像你的代码一样做(得到平均值但四舍五入)但是以更简单和更有效的win[1][0]方式win[1][2]

new_pix.r = (win[1][0] + win[1][2] + 1) / 2;

顺便说一句,似乎定义了采用整数值的运算符,这就是为什么/ 2你的代码中不会导致同样的问题。

于 2020-11-30T07:17:36.827 回答