Увеличение высоты звука с использованием различного значения - PullRequest
1 голос
/ 20 апреля 2011

Хорошо, это немного математики и вопроса о DSP.

Допустим, у меня есть 20 000 сэмплов, которые я хочу сэмплировать на другом шаге. Например, в два раза выше нормы. Используя Интерполированный кубический метод, найденный здесь Я бы установил мои новые значения индекса массива, умножив переменную i на итерации на новый шаг (в данном случае 2.0). Это также установило бы мой новый массив образцов на 10000. Поскольку интерполяция удваивается по скорости, ей требуется только половина времени для завершения.

Но что, если я хочу, чтобы моя высота звука менялась на протяжении всей записи? По сути, я бы хотел, чтобы он медленно увеличивался с нормальной скорости в 8 раз быстрее (при отметке 10 000 выборок), а затем вернулся к 1,0. Это была бы дуга. У меня такие вопросы:

Как рассчитать, сколько сэмплов будет в конечном звуковом треке?

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

Имейте в виду, это не для вывода живого звука, а для преобразования записанного звука. Я в основном работаю в Си, но не знаю, насколько это актуально.

Я знаю, что это, вероятно, сложно, поэтому, пожалуйста, не стесняйтесь спрашивать разъяснения.

Ответы [ 2 ]

3 голосов
/ 20 апреля 2011

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

f(x) = 1 + 7/2*(1 - cos(2*pi*x/y))

Где y - количество выборок в результирующем треке.

Он начинается с 1 для x=0, увеличивается до 8 для x=y/2, а затем уменьшается до 1 для x=y.

Вот как это выглядит для y=10: plot 1 + 7/2*(1 - cos(2*pi*x/10)) from 0 to 10

Теперь нам нужно найти значение y в зависимости от z, исходного количества выборок (в данном случае 20 000, но давайте будем общими).Для этого мы решаем интеграл 1 + 7/2 (1-cos (2 pi x / y)) dx от 0 до y = z .Решение - y = 2*z/9 = z/4.5, красивое и простое:)

Поэтому для входа с 20 000 выборок вы получите 4 444 выборки на выходе.

Наконец, вместо умножения выводаИндекс по значению шага, вы можете получить доступ к исходным сэмплам, как это: output[i] = input[g(i)], где g является интегралом вышеуказанной функции f:

g(x) = (9*x)/2-(7*y*sin((2*pi*x)/y))/(4*pi)

Для y=4444, это выглядиткак это:

plot (9*x)/2-(7*4444*sin((2*pi*x)/4444))/(4*pi) from 0 to 4444

1 голос
/ 20 апреля 2011

Чтобы не получить псевдонимов в результате, вам также потребуется фильтр нижних частот до или во время интерполяции, используя либо фильтр с переменной частотой перехода ниже, чем половина локальной частоты дискретизации, либо с фиксированной частотой среза. более чем в 16 раз ниже текущей частоты дискретизации (для 8-кратного увеличения высоты тона). Это потребует более сложного интерполятора, чем кубический сплайн. Для достижения наилучших результатов вы можете попробовать оконный интерполятор ядра sinc с переменной шириной.

...