Тональная интерполяция с использованием numpy - PullRequest
1 голос
/ 30 января 2020

У меня есть массив numpy, содержащий 88200 элементов, представляющих 2-секундный аудиосэмпл, сэмплированный с частотой дискретизации 44,1 кГц. Шаг образца предполагается равным 130,8 Гц. Я могу интерполировать аудиоданные и растягивать их в 4-секундный сэмпл, который бы делил половину тона, или сжимать его в 1-секундный сэмпл, который бы удваивал тональность.

Я хочу реализовать скольжение высоты тона (портаменто). То есть какая-то интерполяция, так что шаг начинается с 130,8 Гц и плавно скользит до 261,6 Гц, когда образец заканчивается.

Как я могу сделать это, используя Python и numpy? Я думаю, что смогу справиться с этим, используя функции linspace и interp, но не могу заставить его работать правильно.

1 Ответ

0 голосов
/ 05 февраля 2020

Вот код numpy, который я использовал в итоге:

def slide_sample(arr, v1):
    x_old = np.linspace(0, arr.size, arr.size)
    v0 = 1
    ratio = 2 / (v0 + v1)
    vels = np.linspace(v0, v1, int(arr.size * ratio))
    x_new = np.append([0], np.cumsum(vels))
    return np.interp(x_new, x_old, arr)

arr - это массив сэмплов для скольжения, а v1 - это относительная высота, на которую нужно скользить. Таким образом, slide_sample(arr, 2) уменьшится в два раза, а slide_sample(arr, 0.5) - в два раза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...