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

问题描述:

我想将非常方便的函数uencode Matlabs signal封装到C++中。将浮点范围[-1,1]映射/量化到整数

uencode可用于将浮点范围映射到基于2的幂的整数,而不会将其截断。见下面的图片:

matlap uencode plot

我目前的倍频实现相同的功能(这是我希望以后移植到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都不会给我正确的结果。

任何想法赞赏!

+0

,你会不得不看看UUENCODE补丁倍频锻造信号? http://savannah.gnu.org/support/download.php?file_id=30815 – Andy

+0

@我没有。我只注意到uencode没有在信号中实现。感谢您的链接! – Leandros

例如, 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

+0

太棒了!谢谢,这很好! – Leandros

+0

不错。你愿意将该代码贡献给Octave信号包吗? –