Форма волны рендеринга в PHP - Как произвести более сжатый рендеринг?

Я визуализирую форму волны в PHP, понижая ее дискретизацию с помощью хромого кодировщика, а затем рисую форму волны из полученных точек данных. В настоящее время я получаю такие изображения:

enter image description here

Я бы хотел изменить свой код так, чтобы видимый динамический диапазон формы волны был по существу «сжат».Чтобы создать сигнал, который выглядит примерно так:

enter image description here

Уравнение, которое я в настоящее время использую для визуализации высоты каждой точки данных, выглядит следующим образом: -

 // 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.

Прошу прощения, если это неясно, но мне очень трудно сформулировать этот вопрос с моим ограниченным математическим опытом.

Возможно, визуальное представление поможет описать мои намерения: -

enter image description here

Когда значение $ v равно 0 или 255, выход уравнения должен быть точно входным (0 или 255). Однако, когда вход представляет собой промежуточное значение, оно должно следовать за результирующим выходом кривой выше. (приведенный выше был только приблизительным рисунком для иллюстрации.)

РЕДАКТИРОВАТЬ:

На основе решения функции «pow» Alnitiks я теперь генерирую формы сигналов, которые выглядят следующим образом: -

enter image description here

Используя уравнение замены для $ v следующая переменная: -

 $v = pow($data / 255.0, 0.4) * $height;

Я попытался увеличить значение 0,4, но результат все еще не такой, как задумано.

РЕДАКТИРОВАТЬ 2:

В соответствии с запросом, вот необработанный дамп данных моей переменной $ data:

Необработанные данные

Это передается в уравнение для возврата $ v перед использованием для рисования формы волны (вы можете посмотрите, что я делаю с переменной $ v в исходном коде, который я опубликовал выше. $ height - это просто количество пикселей в высоту, которое я установил для рендеринга изображения.

Эти данные представляют собой список значений, разделенных запятыми. Надеюсь, это поможет . Похоже, ваше утверждение о том, что среднее значение равно 128, является правильным. До сих пор мне не удавалось осмыслить ваше исправление для этого. Боюсь, это немного выходит за рамки моего текущего понимания.

11
задан gordyr 3 January 2012 в 20:22
поделиться