繁体   English   中英

缩放整数值(来自float)

[英]Scaling of integer values (from float)

我正在设计一个VST音频插件,它需要从输入信号中提取幅度数据,以用于midi域中的速度设置。

本质上,我将接收0-1(浮点数)之间的值,并需要将它们转换为0-127 int。

目前,该过程将浮点值乘以100得到+3小数位的整数值,即103.4567685或005.6778787282

从这里开始,我将使用floor()函数将浮点数舍入到整数。

但是,这将使我的值在0-100之间; 但是,我需要将它们缩放到0-127。

关于如何使这成为可能的任何建议将不胜感激。

如果你采取这里提出的一些建议并乘以127,你会发现你的输出中没有很好地表示127。 也许这对你来说不是问题,但是有一个很小的变化会产生很大的不同。

您可能认为舍入会有所帮助,但事实并非如此。 127处的值的数量仍然只是其他值的一半,现在0的值的数量也将是平均值的一半。

正确的公式:

int amplitude = static_cast<int>(value * (128-epsilon)); // where epsilon is a very small floating point value

正确的方法是:

int amplitude = 128 * value ;
if (amplitude == 128) amplitude = 127 ;

只需将您的值乘以127并将其转换为int [0,1]*127 => [0,127]

范围转换并不那么简单。 在缩放整数范围的情况下[-n; n]浮动,使用简单乘法的朴素方法具有效果,即逆映射可能不会映射到原始值。 假设您已经获得了整数范围内所有数字的集合,以及浮点范围内的一组相同幅度,天真映射不是双射的。

有一篇关于这个和示例代码的好文章,关于如何实现单调和命令保留映射,请访问http://kaba.hilvi.org/programming/range/index.htm

我想我一定错过了什么。 为什么不乘以127.0而不是100?

我使用这个有效的解决方法在round()函数的帮助下覆盖所有值。

输出=圆形(ampiezza * 127.5 + 127.5)

ampiezza是一个带符号的浮点数,范围从-1到+1,输出是8位整数

输出范围为0到255,介于127和128之间

希望这会有所帮助。

在使用floor()之前将结果值乘以1.27?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM