缩放整数值(来自float)

时间:2011-01-27 14:56:12

标签: c++ floating-point int scale midi

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

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

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

然后我将使用floor()函数将浮点数舍入为整数。

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

非常感谢任何有关如何实现这一目标的建议。

7 个答案:

答案 0 :(得分:5)

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

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

正确的公式:

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

答案 1 :(得分:5)

这样做的正确方法是:

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

答案 2 :(得分:4)

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

答案 3 :(得分:4)

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

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

答案 4 :(得分:2)

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

答案 5 :(得分:1)

我使用这种有效的解决方法,借助round()函数覆盖所有值。

输出=舍入(ampiezza * 127.5 + 127.5)

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

输出范围从0到255,以127和128为中心

希望这会有所帮助。

答案 6 :(得分:-2)

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