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

标签 matlab math octave

我想移植这个非常方便的功能uencode Matlabs signal 封装到 C++。

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

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一样平滑,既不是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;

编辑2:这是经过上述修改的函数的图像: uencode function with clipping

关于matlab - 将浮点范围 [-1,1] 映射/量化为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45431837/

相关文章:

matlab - 如何在 matlab 中指定范围并相应地执行函数?

c - Fitzhugh-Nagumo 模型的 C 实现有什么错误?

c++ - 如何优化非线性方程组的解?

java - 可变长度数组的矩阵的组合

matlab - 求三次多项式

matlab - 检查 Matlab 中没有输入参数为空

Matlab:将总和放入函数中

algorithm - 循环的时间复杂度按 log 增加?

linux - 在树莓派上安装 Octave

matlab - Matlab/Octave 中的两个求和计算中哪一个对于行向量是最佳的?