Перейти к содержанию
    

Понизить темп аудиосигнала с сохранением тональности

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

 

Нужно понизить темп воспроизведения с сохранением тональности.

 

Как?

 

Нужен алгоритм, желательно на C/C++.

 

Гугл выдаёт готовые программы, нужне сам алгоритм!

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

34 минуты назад, __inline__ сказал:

Нужно понизить темп воспроизведения с сохранением тональности.

Я так понимаю - для симулятора? А зачем понижать? Частоты не сходятся?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 minutes ago, jcxz said:

Я так понимаю - для симулятора? А зачем понижать? Частоты не сходятся?

Для GBA эмулятора.  Выходит 25-30 FPS, вместо нужных 60 FPS.  Звук тарахтит - фрагмент проигрыается дважды, так как  звуковая подсистема требует данные чаще, чем эмулятор успевает заполнить буфер.   Звук там "мягкий" - зависит от растактовок процессора приставки (программные задержки).

 

Сделал ресемплинг, просто растянув отсчёты - темп  понизился, тарахтение исчезло, но и тон снизился , что не нужно.

Хочется чтоб именно был звук как на распев без снижения частоты (tempo stretching with pitch saving)

 

Нашёл пару алгоритмов на гитхабе, но они ппц какие сложные.   Хочется проще...   А что если исходный фрейм повторять дважды, а склеивать  с нахлёстом? Нахлест взять 1/4 длины фрейма.  Начальный и конечный нахлест усреднить...

 

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Начитался теории, приступил к практике.

Алгоритм удлинения аудио-записи с сохранением тона:

1) Делаем ресемплинг - частота снижается, запись удлиняется

2) Делаем БПФ

3) Сдвигаем спектр вверх (для восстановления исходного тона)

4) Делаем обратное БПФ

 

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

 

Оконными функциями пробовал по краям уменьшать амплитуды и с нахлёстом брать, но ниче не выходит пока.

 

Должне быть способ проще растянуть звук с сохранением тона.

 

Однако же, по отсутствию ответов - неужели никто этим не занимался?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Аудиоплеер АIMP умеет замедлять воспроизведение без понижения тональности. Поинтересуйтесь у автора, как. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Простого алгоритма не существует. Объясню, почему. Данные не периодичны в принципе. Перестановка, подстановка, перекрещивание, т.е. комбинаторные операции будут сопровождаться скачками фаз для всех остальных составляющих, кроме основного тона, даже если ее первый и второй кадр состыкованы без скачков фазы. Был бы один синус, например, или любая другая, но одна периодическая, тогда, возможно, упростилось бы. Ваш алгоритм проще вокодера не будет, по ряду причин, 1 - последнему не нужен буфер. Не спец, просто интересуюсь, но мне каацо, что ресурсов не мало понадобится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добавил всё-же звук к эмулятору GBA.  Использовал алгоритм растяжки темпа с сохранением тона.

 

Задача нетривиальная и требует академического кубатуренья.  Хорошо, что уже давно всё проработано. ))

 

За основу взял эту программу (с открытыми исходниками): http://www.surina.net/soundtouch

 

Она  позволяет много чего делать со звуком:  изменять темп с сохранением тона, подымать тон с сохранением темпа, ресемплинг, вычисления BPM.  Куча фильтров-интерполяторов: Шеннона, Кубический, Линейный.  Антиалиасинговый фильтр.

 

Темп звука в эмуляторе  растягивается в 2...3 раза (30 - 20 FPS), при этом тональность остаётся той же.

 

Видео:  https://www.youtube.com/watch?v=ulLPALpHOGk

 

 

Свой вариант билда сорцов прикрепил ниже:

 

sound_stretch.rar

 

Отлаживал алгоритм конечно же на ПК вначале

Изменено пользователем repstosw

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...