2011-01-27 3 views
2

Я разрабатываю плагин VST Audio, который требует, чтобы данные амплитуды извлекались из входящего сигнала, который будет использоваться для настроек скорости в midi-домене.Масштабирование целочисленных значений (от float)

По существу, я получаю значения между 0-1 (float) и должен их преобразовать в 0-127 int.

В настоящее время процесс будет multply значения с плавающей точкой на 100, чтобы дать всю стоимость +3 знаков после запятой, то есть, то вокруг поплавков до Интс, используя слово функции +103,4567685 ИЛИ +005,6778787282

Отсюда я буду() ,

Однако это оставит меня со значениями от 0 до 100; однако мне нужно масштабировать их до 0-127.

Любые предложения о том, как это можно было бы сделать возможным, были бы весьма признательны.

ответ

2

Я думаю, что, должно быть, чего-то не хватает. почему бы не умножить на 127.0 вместо 100?

+0

о да. Я об этом не думал. Я чувствую себя дураком –

-2

Умножьте полученное значение на 1.27 перед использованием floor()?

+0

thankyou! очень ценится –

4

Просто умножьте свое значение на 127 и нанесите его на int. [0,1]*127 => [0,127]

+0

Да, это похоже на хорошую идею. большое спасибо! –

+0

-1: это не отображает все значения правильно - см., Например, Ответ TonyK или ответ Марка R для лучшего решения. –

4

Диапазон преобразования не так просто. В случае масштабирования целочисленного диапазона [-n; n] для плавания, использование наивного подхода простого умножения приводит к тому, что обратное отображение, скорее всего, не будет отображаться в исходные значения. Скажем, у вас есть набор всех чисел в целочисленном диапазоне и набор одинаковой величины в диапазоне с плавающей запятой, наивное отображение не является биективным.

Там хорошая статья об этом и пример кода, для того, как реализовать монотонность и заказные сохранения отображения на http://kaba.hilvi.org/programming/range/index.htm

5

Если взять некоторые из предложений, представленных здесь, и умножить на 127, вы собираетесь найти, что 127 не очень хорошо представлен на вашем выходе. Возможно, это не будет проблемой для вас, но есть небольшое изменение, которое имеет большое значение.

Вы можете подумать, что округление поможет, но это не так. Количество значений в 127 по-прежнему будет вдвое меньше, чем у других значений, и теперь число значений в 0 также будет половиной среднего.

Правильная формула:

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

Вы не можете давать такие советы, не сообщая бедным OP, как получить epsilon! – TonyK

+0

100 казался ему приемлемым, поэтому 127, вероятно, есть/был, однако он, возможно, и не подумал об этом или не заметил! – winwaed

+0

@TonyK, точное значение epsilon не очень важно для большинства приложений реального мира. Вы можете использовать 'FLT_EPSILON' из' limits.h' или 'numeric_limits :: epsilon()' из 'limits' или просто произвольное небольшое число.Я бы не использовал 'numeric_limits :: epsilon()', потому что он действителен только для значения 1.0 и будет слишком мал для 128.0. –

5

Правильный способ сделать это:

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

TonyK прав. Причиной этого является то, что 64 является центральным значением для MIDI, реализация в MIDI-устройствах обычно использует метод выше. – Zuppa

 Смежные вопросы

  • Нет связанных вопросов^_^