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
一样流畅,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;
EDIT2: 这是经过上述修改后的函数图像:
我想将非常方便的函数 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
一样流畅,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;
EDIT2: 这是经过上述修改后的函数图像: