Объяснение метода интерполяции Эрмита - PullRequest
2 голосов
/ 22 марта 2011

В настоящее время получил эту награду за то, как повторно выбирать аудиоданные с намерением увеличить высоту .

Многие решения были сделаны, и я должен признать, что яЯ был немного ошеломлен выбором и информацией.

Я был направлен на это решение и нашел этот кусок кода:

public static float InterpolateCubic(float x0, float x1, float x2, float x3, float t)
{
    float a0, a1, a2, a3;
    a0 = x3 - x2 - x0 + x1;
    a1 = x0 - x1 - a0;
    a2 = x2 - x0;
    a3 = x1;
    return (a0 * (t * t * t)) + (a1 * (t * t)) + (a2 * t) + (a3);
}

public static float InterpolateHermite4pt3oX(float x0, float x1, float x2, float x3, float t)
{
    float c0 = x1;
    float c1 = .5F * (x2 - x0);
    float c2 = x0 - (2.5F * x1) + (2 * x2) - (.5F * x3);
    float c3 = (.5F * (x3 - x0)) + (1.5F * (x1 - x2));
    return (((((c3 * t) + c2) * t) + c1) * t) + c0;
}

Это кажется чем-то достаточно простымчто я могу обернуть голову вокруг, но мне интересно, как я могу ввести сумму, на которую я бы хотел увеличить свою высоту звука.Что приводит меня к следующим вопросам:

  1. Аргумент t первого метода принимает число от 0 до 1. Является ли это фактором, с помощью которого я увеличиваю высоту звука?Будет ли это 1 увеличивать шаг на 100% (по сути, вдвое больше скорости)?

  2. Если приведенная выше теория верна, могу ли я ввести коэффициент больше 1?Если нет, то как бы я мог это сделать?

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

Большое вам спасибо.

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

Это функции, которые выполняют следующие действия: учитывая дискретную последовательность выборок, плавно интерполируют между ними. То есть: предположим, что ваши исходные данные равны x (0), x (1), x (2) и т. Д. Вы хотите (скажем) сделать их в 1,234 раза быстрее. Затем вам нужны сэмплы x (0), x (1 / 1.234), x (2 / 1.234), x (3 / 1.234) и т. Д. И вы хотите, чтобы они выглядели как сэмплы из хорошего гладкого сигнала, проходящего через сэмпл очки у вас есть.

Обе эти функции должны использоваться следующим образом. Вы хотите интерполировать между x (n) и x (n + 1). Чтобы получить значение, вы можете вызвать x (n + t), вызвать их с аргументами x (n-1), x (n), x (n + 1), x (n + 2) и t. Когда t = 0, вы получите x (n); когда t = 1, вы получите x (n + 1); Вы не должны (за исключением, возможно, в конце ваших данных) использовать аргументы, которые не находятся между 0 и 1.

Итак, чтобы ускорить или замедлить ваш сигнал, сэмплируйте время от времени [целое число] / [коэффициент скорости]; для каждого времени t возьмите n-1, n, n + 1, n + 2, так что n <= t <= n + 1, и вызовите интерполятор со значениями x (n-1), x (n), x (n + 1), x (n + 2) и тп. И посмотри, как это звучит: -). </p>

1 голос
/ 23 марта 2011

Diagram to illustrate interpolation

Интерполяция - это способ найти новые точки данных между дискретными значениями.

Диаграмма выше показывает пять значений. Х0, Х1, Х2, Х3, Х4. Значения для этих пяти точек известны. Промежуточные значения неизвестны и могут быть аппроксимированы только путем интерполяции из известных точек данных. Различные алгоритмы интерполяции дают разные результаты.

Например, чтобы найти значение красной точки (показано между значениями X1 и X2), мы можем использовать интерполяцию. t указывает точку, которую вы хотите найти. t всегда будет значением от 0 до 1. В этом случае t будет примерно 0,25.

Простейшим методом интерполяции является линейная интерполяция. По сути это то же самое, что рисование прямой линии между двумя точками

Linear Interpolation
y = x1 + (x2 - x1) * t

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

Чтобы понять, что делают эти функции, было бы полезно построить функции в графическом приложении.

Чтобы ответить на ваши вопросы:

  1. t не имеет отношения к высоте звука. Он определяет местоположение промежуточной точки, для которой алгоритм интерполяции рассчитает значение.

  2. NA.

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

...