将浮点范围[-1,1]映射/量化到整数
我想将非常方便的函数uencode
Matlabs signal
封装到C++中。将浮点范围[-1,1]映射/量化到整数
uencode
可用于将浮点范围映射到基于2的幂的整数,而不会将其截断。见下面的图片:
我目前的倍频实现相同的功能(这是我希望以后移植到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;
太棒了!谢谢,这很好! – Leandros
不错。你愿意将该代码贡献给Octave信号包吗? –
,你会不得不看看UUENCODE补丁倍频锻造信号? http://savannah.gnu.org/support/download.php?file_id=30815 – Andy
@我没有。我只注意到uencode没有在信号中实现。感谢您的链接! – Leandros