Mapping/Quantizing 浮点数范围 [-1,1] 到整数

Mapping/Quantizing floating point range [-1,1] to integers

我想将非常方便的函数 uencode Matlabs signal 包移植到 C++。

uencode 可用于根据 2 的幂将一定范围的浮点数映射到整数,而不会将它们剪掉。见下图:

我当前的相同功能的 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 一样流畅,roundfloorceil 都没有给我正确的结果。

任何想法表示赞赏!

例如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;

EDIT2: 这是经过上述修改后的函数图像: