将浮点范围[-1,1]映射/量化为整数

时间:2017-08-01 07:44:50

标签: matlab math octave

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

uencode可用于将一系列浮点映射到整数,基于2的幂,而不会将它们剪掉。见下图:

matlap uencode plot

我当前的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都没有给我正确的结果

任何想法都赞赏!

1 个答案:

答案 0 :(得分:2)

例如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:这里是具有上述修改功能的图片: uencode function with clipping