我想移植这个非常方便的功能uencode
Matlabs signal
封装到 C++。
uencode
可用于根据 2 的幂将一定范围的 float 映射到整数,而不会将它们剪掉。请参见下图:
我当前的相同函数的 Octave 实现(我想稍后将其移植到 C++):
1;
function ret = uencode (u, n)
val = power(2, n) - 1;
ret = ((u / 2) * val) + (val / 2);
endfunction
u = -1:0.01:1;
y = uencode(u, 2);
plot(u, y, '..');
grid on
它产生了正确的范围,但是,我很难让步骤像uencode
一样平滑,既不是round
,也不是floor
,也不是ceil
给了我正确的结果。
任何想法表示赞赏!
最佳答案
例如floor
来执行您想要的操作,未舍入的输出范围应该是从 0 到几乎 4,而不是从 0 到 3。以下代码(在 Matlab 中测试)可以执行您想要的操作。
function ret = uencode (u, n)
% output range
val = power(2,n) - 1;
% map input to output
ret = (u+1)*(val+1)/2;
% truncate to integer
ret = floor(ret);
% handle u~1
ret(u > (1-1e-12)) = power(2,n) - 1;
end
由于输入范围现在映射到 [0,4],输入 u=1 将给出 4 作为输出,因此最后一个表达式将任何足够接近 1 的值(此处在 1e-12 内)设置为最大输出值.
编辑:用以下内容替换最后一个表达式,以正确处理 [-1,1] 范围之外的输入。
% handle u out of range
ret(u >= 1) = power(2,n) - 1;
ret(u <= -1) = 0;
关于matlab - 将浮点范围 [-1,1] 映射/量化为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45431837/