Я обрабатываю форму волны в PHP, понижая ее с помощью хромого кодировщика, а затем вытягивая форму волны из результирующих точек данных. В настоящее время я получаю изображения следующим образом:
Что бы я хотел сделать, это изменить мой код, чтобы кажущийся динамический диапазон формы сигнала был по существу "сжат". Чтобы создать форму волны, которая выглядит более как это:
Уравнение, которое я использую для отображения высоты каждой точки данных, выглядит следующим образом: -
// draw this data point
// relative value based on height of image being generated
// data values can range between 0 and 255
$v = (int) ( $data / 255 * $height );
// don't print flat values on the canvas if not necessary
if (!($v / $height == 0.5 && !$draw_flat))
// draw the line on the image using the $v value and centering it vertically on the canvas
imageline(
$img,
// x1
(int) ($data_point / DETAIL),
// y1: height of the image minus $v as a percentage of the height for the wave amplitude
$height * $wav - $v,
// x2
(int) ($data_point / DETAIL),
// y2: same as y1, but from the bottom of the image
$height * $wav - ($height - $v),
imagecolorallocate($img, $r, $g, $b)
);
При фактической амплитуде, определяемой первой строкой этого кода: -
$v = (int) ( $data / 255 * $height );
К сожалению, мой математический навык в лучшем случае беден. То, что мне нужно сделать, по существу, применяет "кривую" к значению $v, так что, когда число, вводимое в уравнение, меньше, результирующий выход выше, а при увеличении входного числа уравнение уменьшает усиление до тех пор, пока, наконец, вход достигает 255, выход также должен быть 255. Также кривая должна быть такой, чтобы при вводе 0 выход был также 0.
Я извиняюсь, если это не ясно, но я очень быстро нахожу этот вопрос, чтобы сформулировать его с ограниченным математическим опытом.
Возможно, визуальное представление поможет описать мое намерение: -
Когда значение $v равно либо 0, либо 255, выход уравнения должен быть точно входом (0 или 255). Однако, когда вход представляет собой значение между ними, он должен следовать результирующему выходу кривой выше. (приведенное выше было лишь приблизительным рисунком для иллюстрации.)
EDIT:
Основываясь на решении функции "pow" от Alnitiks, я теперь генерирую сигналы, которые выглядят так: -
Используя уравнение замены для переменной $v следующим образом: -
$v = pow($data / 255.0, 0.4) * $height;
Я попытался повысить значение 0.4, но результат все еще не так, как предполагалось.
ИЗМЕНИТЬ 2:
В соответствии с запрошенным здесь представляет собой исходный datadump моей переменной $data:
Это передается в уравнение, чтобы возвращать $v перед тем, как его использовать для рисования формы волны (вы можете видеть, что я делаю с переменной $v в исходном коде, который я разместил выше. $height - просто число пикселей, высокое у меня есть установите изображение для рендеринга.
Эти данные представляют собой разделенный запятыми список значений. Надеюсь, это поможет. Похоже, ваше утверждение о том, что среднее значение равно 128, является правильным. До сих пор я не мог задуматься об этом. Я боюсь, что это немного превышает мое нынешнее понимание.