Estoy representando una forma de onda en PHP al reducir la resolución con el codificador cojo y luego dibujar la forma de onda de los puntos de datos resultantes. Actualmente estoy recibiendo imágenes como esta:Representación de forma de onda en PHP - ¿Cómo producir un renderizado más comprimido?
Lo que me gustaría hacer es modificar mi código para que el rango dinámico aparente de la forma de onda es esencialmente 'comprimido'. Para producir una forma de onda que se parece más a esto:
La ecuación Actualmente estoy usando para hacer que la altura de cada punto de datos es el siguiente: -
// 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)
);
siendo la amplitud real definido por la primera línea de este código: -
$v = (int) ($data/255 * $height);
Desafortunadamente, mi habilidad matemática es mala en el mejor de los casos. Lo que necesito hacer es aplicar esencialmente una 'curva' al valor de $ v para que cuando el número de entrada en la ecuación sea más bajo, el resultado resultante sea más alto y a medida que aumente el número de entrada la ecuación reduzca la amplificación hasta que finalmente la entrada llega a 255 la salida también debe ser 255. También la curva debe ser tal que con una entrada de 0 la salida también sea 0.
Pido disculpas si esto no está claro pero estoy encontrando esta pregunta muy difícil de articular con mi limitada experiencia en matemáticas.
Tal vez una representación visual podría ayudar a describir mi intención: -
Cuando el valor de $ v es 0 o 255 la salida de la ecuación debe ser exactamente la entrada (0 ó 255) . Sin embargo, cuando la entrada es un valor intermedio, debe seguir la salida resultante de la curva de arriba. (El anterior fue sólo un dibujo en bruto para ilustrar.)
EDIT:
basado en la solución función 'pow' Alnitiks ahora estoy generando formas de onda que se parece a esto: -
utilizando la ecuación de reemplazo para el $ variable v de la siguiente manera: -
$v = pow($data/255.0, 0.4) * $height;
he tratado subiendo el valor de 0,4, pero el resultado es st no como se esperaba
EDIT 2:
Como solicitó que aquí hay una DataDump prima de mi variable de datos $:
Esto se transfieren en la ecuación para volver $ v antes de ser utilizado para dibujar la forma de onda (Puede ver lo que le hago a la variable $ v en el código original que publiqué arriba. $ height es simple el número de píxeles altos He configurado la imagen para procesar.
Estos datos son una lista de valores separados por comas.Espero que esto ayude. Parece que tu afirmación de que el valor medio es 128 es correcto. Hasta ahora no he podido entender mi corrección por esto. Me temo que es un poco más allá de mi comprensión actual.
+1: No estoy seguro de si esto es estrictamente sobre el tema, pero no me importa ... ¡es divertido! –
Realmente necesitas encontrar la ecuación de esa curva y aplicar un factor de multiplicación; eso es todo lo que se reduce a cuando se deshace del factor diversión. Y podría omitirlo por completo y simplemente crear manualmente una búsqueda de valores conocidos, como sugiere Hakre, si no le importan los valores fraccionarios (lo que parece probable). –
De hecho. Me pregunto si esto debería haber sido publicado en el sitio de matemáticas. Pero estoy seguro de que las respuestas que recibiría de ustedes serían mucho más en mi 'propio' idioma que los matemáticos. :-) – gordyr