Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kurs_12-12-19.docx
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
175.25 Кб
Скачать

1. Определение периода частоты основного тона

Первым делом, алгоритм определяет период частоты основного тона сигнала с помощью алгоритма FAST-Autocorrelation. Он использует факт того, что для наличия периодичности у частоты основного тона сигнала, он должен вести себя периодично, даже он не имеет строгого периода. Сигнал разбивается на некоторое количество окон, каждое длится всего несколько миллисекунд. Этого достаточно для того, чтобы определить хотя бы два периода, а, следовательно, определить частоту окон.

2. Поиск периода

Каждый разделен на окна сегмент коррелируется «внутри» себя для определения длины периода. Это происходит с помощью свертки (как математической функции, показывающей схожесть одной функции с отражённой и сдвинутой копией другой) сигнала с самим собой с увеличивающимся сдвигом t. В итоге мы получаем автокорреляционную функцию:

Для дискретных сигналов конечной длины она выглядит как сумма произведений значения сигнала и его же, но со сдвигом по времени:

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

3. Оптимизация алгоритма

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

  • частота окна должна быть близка к частоте предыдущего окна;

  • первый минимум соответствует периоду, так что больше минимумов не нужно.

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

Как только частота будет найдена для каждого окна, составляется частотный вектор (по одной частоте для каждого окна) и мы возвращаемся к процессу коррекции.

4. Желаемая частота основного тона

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

Итак, у нас уже есть векторы периода частоты основного тона и длина каждой ноты. Эти векторы предполагают такой формат:

  • Частоты: основная частота в герцах (1 на ноту).

  • Длительности: временной промежуток, не зависящий от частоты дискретизации (1 на ноту).

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

Теперь, когда у нас есть частота для каждого сэмпла, мы можем нарезатьвесь сигнал в окна так же, как мы сделали с входным сигналом. Для каждого диапазона окна мы просто берем частотные колебания в этой области (с такой небольшой длиной окно не разделится больше, чем на две ноты) и говорим, что это и есть желаемая частота в данном окне.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]