我想将非常方便的函数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
都没有给我正确的结果
任何想法都赞赏!
答案 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;