Это звучит как обработка звуковых сигналов, когда ваш вход 16 данных PCM, ваш выход - 8 бит данных ИКМ, и вы используете удвоения в качестве промежуточного значения.
Однако 8-битные данные волны PCM НЕ просто квантованы, представление представляет собой значения без знака, превышающие 128 нотации. (например, показатели экспоненты хранятся в числах с плавающей запятой)
Поиск наибольшего значения сначала будет не только квантованием, но и масштабированием. Таким образом, в псевдокоде
double dMax = max_of_all_values(); //
...
foreach (dValue in array_of_doubles)
{
signed char bValue = (signed char)((dValue/dMax)*127.0);
}
Вы можете округлить, а не усечение, если вы хотите получить больше точности, но в обработке звука, это как правило, лучше рандомизации порядок усечения или даже формировать его по существу работает алгоритм фильтрации как часть усечение от удвоений до подписанных символов.
Примечание: этот подписанный символ НЕ является правильным, если на выходе представлены 8-битные данные PCM, но поскольку вопросы не требуют особого запроса, я оставил его.
Редактировать: если это необходимо использовать в качестве пиксельных данных, то вы хотите получить значения без знака. Я вижу, что Джеймс уже дал правильный ответ для неподписанных значений, когда вход без знака (значения дБ из нормализованных данных должны быть все отрицательные, фактически)
На моей машине двойной на самом деле 64-битный. – avakar
'double' - 64 бит. 'float' - 32 бит. – LiraNuna
:) Ой, ребята, вы правы. –