Задача решается во временной или частотной области.
Традиционное грубое решение — во временной. Выбирается некий период, скажем, 20 мс, и из исходного потока с определённым смещением берутся отрывки такой длины, а затем выстраиваются один за другим внахлёст с перекрёстным затуханием. Если смещение при этом будет меньше 20 мс, ты мы замедляем воспроизведение (растягиваем сигнал), если же больше 20 мс, то мы ускоряемся. То есть результат составляется из коротких отрывков, наложенных друг на друга с плавными затуханиями для сохранения уровня. Если рассматривать сферический случай в вакууме, то наилучший результат достигается при периоде, соответствующем темпу фрагмента, если темп вообще есть.
Более изощрённый метод — в частотной области. Производится преобразование Фурье, и получается, грубо говоря, куча синусоид. С растяжением и сжатием синусоид никаких проблем, очевидно, нет. Но надо как-то ещё изменять их уровни. Вот здесь и вступает в дело алгоритм поиска отдельных участков, для которых подходит определение «зацикливаемость». Эти фрагменты растягиваются простым продлением «синусоид», а изменения в уровне размываются во времени.
Во временной области похожий принцип у сэмплеров — в сэмплах есть атака, спад, удержание и затухание. При этом участок «удержание» спокойно можно зациклить, что и делает сэмплер. Только этот участок вручную задаётся, т. к. на сложных формах автоматически определить его сложно. А если это вообще не единичный сэмпл, то сэмплерный способ вообще неприменим, т. к. вместе с базовым сэмплом будет затронут остальной сигнал. А в частотной области применимость такого подхода повышается благодаря разложению сигнала на множество составляющих, причём достаточно простых с точки зрения ВТ.
Это сферическое. Да ещё и в вакууме. На практике же как только не извращаются.
Агы-ы-ы-ы-ы-ы-ы-ы...