Смешение двух функций, одна из которых обратная

Позвольте мне сначала объяснить идею. Фактический математический вопрос находится под скриншотами. Для музыкальных целей я создаю алгоритм грува, в котором позиции событий переводятся с помощью математической функции F (X). Позиции нормализуются внутри диапазона канавок, поэтому я в основном имею дело со значениями между нулем и единицей (что значительно упрощает формирование кривых канавок — единственное ограничение — x'>=0). Этот алгоритм канавки принимает любое положение события, а также работает путем фильтрации статических заметок из структуры данных, такой как дорожка заметок на временной шкале. Для фильтрации событий в определенном диапазоне (размер аудиоблока) мне нужна обратная функция грува, чтобы найти ноты на дорожке и преобразовать их в пространство грува. Все идет нормально. Оно работает!

введите здесь описание изображения

введите здесь описание изображения

Вкратце: я использую обратную функцию для того, чтобы она зеркально отображалась на (y=x). Так что я могу подставить значение x и получить y. Этот y, очевидно, можно подключить к обратной функции, чтобы снова получить первый x.

Проблема: теперь я хочу иметь возможность смешивать канавку с другой, но обычный линейный (подсказка-подсказка) код смешивания ведет себя не так, как я ожидал. Чтобы упростить задачу, я сначала попытался смешать y=x.

B(x)=alpha*F(x) + (1-alpha)*x;
iB(x)=alpha*iF(x) + (1-alpha)*x;

Для альфа=1 мы получаем полную кривую. Для альфа=0 мы получаем прямую линию. Но для альфы между 0 и 1 B(x) и iB(x) больше не зеркально отражены (близко, но недостаточно), F(x) и iF(x) все еще зеркально отражены.

Есть ли решение для этого (помимо квантования кривой на отрезки)? Любая тема, на которую я должен обратить внимание?


person And Mic    schedule 25.08.2011    source источник
comment
Подожди... ты тот самый Андре Мишель, который построил тональную матрицу? Если это так, то спасибо за создание такого замечательного приложения!   -  person templatetypedef    schedule 26.08.2011
comment
Ну да и спасибо. Я предполагаю, что решение является аппроксимацией уравнения с переключением x, y. Я бы хотел, чтобы математика была более надежной.   -  person And Mic    schedule 26.08.2011
comment
я добавил встроенные изображения. Не могли бы вы объяснить больше, не полагаясь на такие термины, как грув и бленд (это означает интерполяцию?)? возможно, комментируя изображения? похоже, у вас есть две функции из [0,1]->[0,1], которые вы комбинируете линейным образом, и вы хотите обратное?   -  person andrew cooke    schedule 26.08.2011
comment
Под groove я подразумеваю любую функцию, которая переводит события. Под смешиванием я подразумеваю интерполяцию от функции A к функции B.   -  person And Mic    schedule 26.08.2011
comment
Возможно, эта блок-схема может немного прояснить ситуацию. Эта последовательность важна для моей реализации: X › F(X) › Сделайте что-нибудь с F(X) › invF(X) › X, где X — значение от 0 до 1. Теперь представьте себе наличие двух таких цепочек [A ,B] и я хочу плавно интерполировать результаты от A до B. Крайне важно, чтобы любой шаг интерполяции между ними следовал верхнему правилу (все еще обладая обратными свойствами).   -  person And Mic    schedule 26.08.2011
comment
Давайте посмотрим, правильно ли я понимаю: у вас есть две функции канавки F(x) и G(x), которые обе принимают значения от 0 до 1, когда x находится между 0 и 1, и обратные значения этих функций — iF(x) и iG(x). Теперь вы создаете новую функцию B(x) = alpha*F(x) + (1-alpha)*G(x) и вам нужно найти обратную этой функции через iF(x) и iG(x)? Если это так, я думаю, вы могли бы задать этот вопрос на математическом сайте, возможно, параллельно с этим вопросом здесь. Они могут сказать вам, существует ли полезная математическая процедура.   -  person David Z    schedule 26.08.2011
comment
Хорошо, я думаю, что искал какое-то волшебство, чтобы сделать преобразование моего уравнения менее ужасным. По сути, мне просто нужно поменять местами x и y и снова преобразовать в y. Это приемлемо для интерполяции от более простых уравнений к y=x. Но я искал общий подход к объединению двух более сложных уравнений. Похоже, это действительно сложная задача. files.andre-michelle.com/temp/simpler.png   -  person And Mic    schedule 26.08.2011


Ответы (2)


вы комбинируете две функции, f(x) и g(x), так что y = a f(x) + (1-a) g(x). и зная некоторые y, a, f и g, вы хотите найти x. по крайней мере, это то, что я понимаю.

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

вы хотите найти x такой, что y = a f(x) + (1-a) g(x). другими словами, когда 0 = a f(x) + (1-a) g(x) - y.

поэтому давайте определим r (x) = a f (x) + (1-a) g (x) - y и найдем «ноль» этого. начните с предположения посередине, x_0 = 0,5. вычислить x_1 = x_0 - r(x_0) / r'(x_0). повторение. если вам повезет, это быстро сойдется (если нет, вы можете подумать об определении функций относительно y = x, что вы, кажется, уже делаете, и попробовать еще раз).

см. википедию

person andrew cooke    schedule 25.08.2011

Эта задача, вообще говоря, не может быть решена алгебраически.

Рассмотрим, например

y = 2e^x (инверсия x = log 0.5y)

а также

y = 2x (инверсия x = 0.5y).

Смешивание их вместе с весом 0,5 дает y = e^x+x, и хорошо известно, что здесь невозможно найти x, используя только элементарные функции, даже несмотря на то, что было легко найти обратную сторону каждой части.

Вы захотите использовать численный метод для аппроксимации обратного, как обсуждалось Эндрю выше.

person user168715    schedule 25.08.2011