我在 PHP 中通过使用 lame 编码器对其进行下采样来渲染波形,然后从结果数据点中绘制波形。我目前收到这样的图像:
我想做的是修改我的代码,以便波形的明显动态范围基本上是“压缩的”。要生成看起来更像这样的波形:
我目前用来渲染每个数据点高度的方程式如下:-
// 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)。但是,当输入是介于两者之间的值时,它应该遵循上面曲线的结果输出。(以上只是一个粗略的图来说明。)
编辑:
基于 Alnitiks 'pow' 函数解决方案,我现在正在生成如下所示的波形:-
使用 $v 变量的替换方程如下:-
$v = pow($data / 255.0, 0.4) * $height;
我已经尝试提高 0.4 的值,但结果仍然不符合预期。
编辑2:
这里要求是我的 $data 变量的原始数据转储:
这被传递到方程中以在用于绘制波形之前返回 $v(您可以在上面发布的原始代码中看到我对变量 $v 所做的事情。$height 很简单,我设置了图像的高像素数渲染。
此数据是逗号分隔的值列表。我希望这有帮助。看来您断言平均值为 128 是正确的。到目前为止,我一直无法理解您对此的更正。恐怕这有点超出我目前的理解。