LINUX.ORG.RU

Опознать алгоритм


0

2

Помогите понять что тут происходит. Алгоритм получен в результате реверс-инжениринга, так что есть неясности. Это кусок синтезатора фортепиано.

На входе есть массив arr = [261.4508114, 261.5063567, 261.6451613] - это частота основного тона ноты с небольшой расстройкой (в данном случае это нота C4).

и пара чисел t0 = 199.1735851 и t1 = -0.00705058376. Первое высчитывается сложным образом по таблицам, второе - плавно изменятется в зависимости от основной частоты в пределах от 0 до -0.08 радиан.

Алгоритм выглядит так:

avg = sum(arr) / length(arr);

t[i] = 1 - arr[i] / avg;
a[i] = (t[i]+1) / (avg * 2);
b[i] = t[i] * (partial) * pi;	// partial - номер гармоники (1 для основного тона).

Далее составляются полиномы (правое число - это свободный член, дальльше идут по увеличению степени): P0 = {a[0], b[0]}, P1 = {a[1], b[1]}, P2 = {a[2], b[2]}, Px = {a[1] b[2]}.

Далее считаются полиномы A0 = P1*P2 + P0*P2 + P0*P1 и A1 = P0*P1*Px;

Из всего этого считается полином Z = t0*A1*exp(j*t1) - j*A0, где t0, t1 - константы (см.выше), A0, A1 - полиномы, j - мнимая единица.

Далее ищутся корни полинома Z, действительная часть которых имеет смысл частоты, а минмая - скорости затухания данной гармоники.

Есть ощущение, что это какой-то стандартный алгоритм.

В общем случае, для любой длинны массива A0 считается как сумма произведений всех полиномов, только из каждого из произведений один исходный полином выкинут, Px всегда состоит из элементов {a[N-2], b[N-1]}, A1 - это произведение последнего члена в A0 на Px.

★★★★

Последнее исправление: alexru (всего исправлений: 1)

Вам точно волновой синтез нужен? Он же звучит мегапаршиво. Погуглите по таблично-волновому.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Это реверс того самого pianoteq-а, он звучит лучше настоящего инструмента, так что все в порядке.

alexru ★★★★
() автор топика
Ответ на: комментарий от Eddy_Em

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

alexru ★★★★
() автор топика

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

alexru ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.