2016-08-18 4 views
-1

Функция возвращает дискретных данных в диапазоне от 0 до 128. Я хочу, чтобы преобразовать эти данные в масштабе таким образом, что значение ...Дискретные данные по логарифмической шкале

0 приведет к 0 128 приведет к 128

Значения между ними следует взвешивать таким образом, чтобы меньшее число преобразовывалось «быстрее» в более высокие числа, где более высокое число увеличивалось бы медленнее.

фон: Я хочу сделать метр VU по шкале дБ (-inf до 0дБа), как это (обратите внимание, как расстояния убывают для того же абсолютное изменение в дБ)

L ||||||||||||||||||||    | 
R |||||||||||||||||||||||||||   | 
-inf   -36  -18 -6 -3 0 
0         128 

Как я преобразовать значения, чтобы отразить ширину пика на VU шириной 255 пикселей, например?

ответ

1

Один простого отображения сделать что-то вроде этого

f(x) = b * (log(a + x) - log(a)) 

Он обладает свойством f(0)=0 и небольшое число изменяется быстрее, чем большие числа. Вы можете настроить a, чтобы изменить, насколько он близок к логарифмической кривой (чем ближе, тем ближе). Как только a определяется, b может быть определено путем решения уравнения f(128)=128, что приводит к b=128/(log(128+a)-log(a)).

Идея это f(x)=log(x) идет к -Inf для x=0, так что вы хотите, чтобы компенсировать немного, скажем f(x)=log(a+x), а затем сделать линейное преобразование, чтобы убедиться, [0128] сопоставляется [0,128]: f(x) = k * log(a+x) + b и определения k и b путем решения линейного уравнения f(0)=0 и f(128)=128.

+0

Вау - это было быстро! Боюсь, я не тот журнал. Таким образом, x будет значением, заданным моей функцией, a будет некоторым количеством «настройки», но я не понимаю, как b вступает в игру. Не могли бы вы объяснить? Благодаря! –

+0

Потому что вы хотите 'f (128) = 128' правильно? Если у вас нет 'b', тогда' f (128) = log (128 + a) -log (a) ', поэтому вам нужно' b' масштабировать его. –