Линейная аппроксимация логарифмической кривой

Я пытаюсь декодировать временной код, который использует аппроксимированную логарифмическую кривую (см. рисунок). Это не настоящая логарифмическая кривая, а состоит из линейных кривых.

Например, когда временной код показывает 822496, реальное время составляет 2793 мс. Я напечатал кривую и нашел точки останова, когда начинается новая линейная кривая:

Линейная аппроксимация журнала

milliseconds => timecode
2793ms => 822496
6844ms => 906195
...
510982ms => 1408395

Новая линейная кривая начинается примерно через каждые 83700 значений тайм-кода. В настоящее время я расписываю настоящую логарифмическую кривую, но я хотел бы знать, как это сделать с линейными кривыми, если быть более точным.

У меня вопрос: как мне найти формулу для расчета реального времени (мс) из моего тайм-кода с использованием как можно более близких линейных кривых?

Логарифмическая функция для аппроксимации этой кривой (подгонка по контрольным точкам):

y = log x * 119900 - 167700

person Ilyssis    schedule 18.09.2013    source источник


Ответы (1)


Какой язык? В Java я бы построил NavigableMap (TreeMap) временного кода -> в реальном времени, а затем искал floorEntry( timecode), чтобы найти ближайшую запись.

Конечно, вам нужно будет рассчитать / эмпирически определить соответствие и построить карту; либо все заранее, либо наращивание экстентов по требованию.

Одна вещь, которая неясна в вашем вопросе ... можете ли вы точно перепроектировать расчет тайм-кода, или это просто приближение, и вы собираетесь искать точную позицию оттуда?

person Thomas W    schedule 19.09.2013
comment
Я использую экшенскрипт. Но я полагаю, что не имеет значения, на каком языке. Значения считываются с «экрана», так что это не точные значения, но очень близкие. - person Ilyssis; 19.09.2013
comment
Похоже, у Google есть TreeMap в ActionScript, или вы можете просто отсортировать массив и написать двоичный поиск для поиска. См.: code.google.com/p/as3-commons. - person Thomas W; 19.09.2013
comment
Я полагаю, должно быть математическое решение для использования линейных кривых для аппроксимации логарифмической кривой ... но то, что я нашел, очень математическое :) - person Ilyssis; 19.09.2013
comment
Ничего сложного, это просто пропорциональность по прямой! Если T — это временной код, а R — это реальное время, и у вас есть линейный сегмент (T0, R0) до (T1, R1), то ваши fraction=(Tx - T0) / (T1 - T0) и Rx=fraction * (R1 - R0) + R0. - person Thomas W; 19.09.2013
comment
Подумайте об этом так: T1-T0 или R1-R0 — это ширина в тайм-коде и реальном времени, T0 и R0 — это начало в тайм-коде и в реальном времени, все, что вам нужно вычислить, — это дробная часть от 0 до 1 масштабирование вашего Tx между этими T0 и T1. Такая дробь (пропорция), очевидно, рассчитывается путем вычитания начала, а затем деления на ширину. Обратный процесс, чтобы спроецировать дробь на R в реальном времени. - person Thomas W; 19.09.2013
comment
Я знаю, как вычислить линейную функцию, но я не хочу их жестко закодировать. Кривая уходит в бесконечность :) - person Ilyssis; 19.09.2013
comment
Нет, я предлагал программный расчет линейной интерполяции после того, как бинарный поиск нашел соответствующий сегмент. - person Thomas W; 19.09.2013