【问题标题】:Mapping/Quantizing floating point range [-1,1] to integers将浮点范围 [-1,1] 映射/量化为整数
【发布时间】:2023-03-26 07:34:02
【问题描述】:

我想将非常方便的函数 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 都没有给我正确的结果。

任何想法表示赞赏!

【问题讨论】:

标签: matlab math octave


【解决方案1】:

例如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: 这是经过上述修改的函数的图像:

【讨论】:

  • 不错。您愿意将该代码贡献给 Octave 信号包吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2013-04-29
相关资源
最近更新 更多