我正在设计一个VST音频插件,需要从输入信号中提取幅度数据,以用于midi域中的速度设置。
基本上,我将接收0-1(浮点数)之间的值,需要将它们转换为0-127 int。
目前,该过程将浮点值乘以100得到+3小数位的整数值,即103.4567685或005.6778787282
然后我将使用floor()函数将浮点数舍入为整数。
然而,这将使我的值在0-100之间;但是,我需要将它们缩放到0-127。
非常感谢任何有关如何实现这一目标的建议。
答案 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?