Как с помощью fft ускорить звук

от admin

Как с помощью fft ускорить звук

Начинающим: Ссылка на ВВОДНУЮ СТАТЬЮ по AviSynth, другие полезные ресурсы и ПРАВИЛА ЗАДАНИЯ ВОПРОСОВ
Статья про Avisynth на iXBT
Avisynth на русском — сайт Fizick’a с документацией и плагинами

Как задать вопрос по AviSynth, чтобы получить ответ.
1. Задавать вопрос, только если Вы хотя бы несколько минут попытались разобраться сами, и хотя бы заглянули в его русскую документацию, советы по решению проблем ( http://avisynth.org.ru/docs/russian/troubleshooting.htm) или например в данную ветку, или статью по основам. Ответ Вы все равно получите не быстро, и скорее всего по характеру вопроса последует совет посмотреть доки или просто отправят в поиск.
2. На вопрос типа: мне некогда читать всю эту длинную ветку, я страшно занятой, ну-ка бросайте ваши дела и скорей бегите сюда отвечать на вопросы моего величества — будет ответ «А пошел ты . в поиск». На жалобный вариант «сижу на модеме» — будет ответ: нажмите маленькое слово «печать» вверху рядом с номерами страниц, сохраните всю ветку и почитайте отключившись, хотя бы несколько последних страниц, и поищите слова вопроса в этом тексте.
3. Это в частности относится к вопросам типа: А есть ли такая вот функция.
4. Если у Вас не работает (сообщает об ошибке) какая-то команда, или скрипт, в вопросе приведите скрипт полностью, копированием.
5. Сообщите точную (английскую) фразу сообщения об ошибке. Вы можете скопировать текст из окошка сообщения об ошибке VirtualDub в буфер Windows клавишами Ctrl-C и вставить его в текст на форуме клавишами Ctrl-V (или правой кнопкой мыши и т.п.). Или используйте клавиши Alt-PrintSreen, чтобы скопировать окно сообщения как изображение, сохраните в файл в редакторе рисунков и выложите его в интернет.
6. Предварительно лучше попробовать самому убрать (закомментировать) все работающие команды, и оставить минимальный набор команд, который при проверке вызывает эту ошибку (все равно Вас в ответе попросят это сделать).
7. Обязательно сообщите точную версию AviSynth (все равно Вас переспросят, т.к. разные версии имеют особенности).
8. Если ошибка в некотором внешнем плагине, обязательно также сообщите версию данного плагина.
9. Лучше выложить кадрик или небольшой (несколько кадров) проблемный кусочек видео на какой-то интернет сайт, чтобы гуру могли посмотреть его и сказать совет-приговор. Годятся такие сайты как например http://zalil.ru или http://www.mytempdir.com и подобные.
10. Не ждите разумного ответа на вопрос типа «А какой шумоподавитель (скрипт) — самый лучший?», так как даже если бы и существовал суперфильтр, то у него все равно были бы различные настройки, зависящие от типа видео и ваших личных предпочтений. Лучше, если Вы скажете, что вы попробовали, что понравилось, а что не совсем устраивает.

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

Желаем Вам перейти от вопросов к сообщениям об успехах и новинках, ну и к ответам на вопросы новых новичков!

Частотная фильтрация звука.

Работая над сведением проекта, вам обязательно потребуется частотная фильтрация звука. Реализуется она с помощью различных электронных фильтров, встроенных в так называемые цифровые эквалайзеры (equalizers). Рассмотрим в этой статье подробнее что такое фильтрация, какие бывают фильтры и для чего они могут понадобиться на практике.

Частотная фильтрация звука

Фильтрация звука подразумевает процесс обработки электрического звукового сигнала различными фильтрами для изменения его спектрального состава (изменение тембра). Наиболее часто фильтрация применяется: 1) для амплитудно-частотной коррекции сигнала и 2) для полного подавления определенной полосы частот.

Приведём несколько практических примеров:

Бывает, что необходимо устранить мутность в звучании инструмента или тембр аудиосигнала звучит очень назойливо и даже раздражает, а бывает что звуку не хватает верхов и он звучит скучно, нет «воздуха», яркости. Иногда один инструмент звучит неразборчиво и для него необходимо освободить место, в определенной полосе частот. Всё это можно подправить за счёт коррекция амплитудно-частотной характеристики (АЧХ) сигнала.

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

Виды фильтров

FFT фильтр

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

  • Как эффект, создающий экстремальную фильтрацию
  • Для работы с очень узкой и определённой полосой частот. Это не создаст побочных эффектов.
  • FFT фильтр очень бережно относиться к фазе сигнала, поэтому обрабатывая им Вы можете сохранить фазовую информацию.
  • В области низких частот (до 1 кГц). В этой полосе сильные изменения АЧХ FFT фильтром не приведут к очень плохим последствиям.
  • Как легкий эквалайзер. Но большое вмешательство (более 3-5 дБ) уже опасно.

Когда точно не применять:

  • Использовать в качестве основного эквалайзера. Поверьте, для изменения тембра найдутся менее вредные фильтры.
  • Использовать как жесткий обрезной фильтр высоких частот.
  • Работать, ставя максимальный размер FFT. Этот параметр определяется всегда интуитивно.
  • Использовать фильтр несколько раз на одном и том же участке. Лучше все операции объединить в одну.
IIR фильтр

IIR фильтры расшифровывается как Infinite Impulse Response (бесконечная отдача импульса). Бесконечная, потому что теоретически влияние этих фильтров никогда не прекращается, но это только теоретически.

В IIR фильтрах обычно можно найти такие функции как (частота, ширина воздействия, усиление/ослабление в дБ), фильтрация по краям диапазона (high-shelf и low-shelf), ослабления нежелательных сигналов low-pass, high-pass, band-pass.

  • Для уменьшения высоких или низких частот с определенной частоты (high-shelf и low-shelf). Лучше не выше 2-3 порядка.
  • Вырезание определенной частоты (слегка на пару дБ)
  • Фильтрация частот за слышимым диапазоном или в не очень важной области.
  • Изменение тональной окраски звука (лучше также не использовать фильтры высокого порядка)
  • Убрать или погасить резонансы

Когда точно не применять:

  • Лучше не используйте без надобности IIR фильтры высокого порядка. Это может привести к фазовым искажениям.
FIR фильтр

FIR фильтры (Finite Impulse Response) — конечная отдача импульса. Эти фильтры основаны на так называемой свертке. Они наиболее безопасны и надежны, но у них очень трудно управляемые параметры фильтрации и невысокая скорость работы.

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

FIR фильтры можно применять как и где вы хотите, единственное они слишком медленные, в реальном времени работать с ними проблематично.

Какой тип фильтров употребляется в конкретной программе или плагине можно узнать в документации к ним.

Типы фильтров

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

Ограничительные фильтры:

Low Pass (LP) или High Cut (HC) – этот фильтр обрезает все частоты выше заданного значения или оставляет все частоты ниже заданного значения.

High Pass (HP) или Low Cut (LC) – этот фильтр обрезает все частоты ниже заданного значения или оставляет все частоты выше заданного значения.

Частотная фильтрация звука.

Band Pass (BP) – этот фильтр пропускает только определённою полосу частот.

Частотная фильтрация звука.

Shelf -фильтры:

Low Shelf низкочастотный шельфовый (или полочный) фильтр. Компенсирует или уменьшает избыток частот.

Частотная фильтрация звука.

High Shelf высокочастотный шельфовый (или полочный) фильтр. Также компенсирует или уменьшает избыток частот.

Частотная фильтрация звука.

Tilt Shelf – совмещает в себя оба вышеперечисленных фильтра. Он сразу усиливает и ослабляет частоты от заданного значения.

Частотная фильтрация звука.

Фильтр присутствия:

Bell — колокообразный фильтр. Используется для усиления или ослабления выбранного диапазона частот.

Частотная фильтрация звука.

Режекторный фильтр:

Notch фильтр – вырезает определённую полосу частот.

Частотная фильтрация звука.

В следующей статье мы поговорим об основных параметрах фильтров. Так что подписывайтесь на новости .

Похожие записи
Таблица преобразования BPM в Delay

Большинство современных плагинов и аппаратных устройств позволяют устанавливать автоматически задержку (delay) в соответствие с темпом BPM вашего проекта. Но если…

Distortion (Дисторшн, дистошн).

Что такое эффект — distortion? Принцип действия эффекта, применение в проектах, известные исполнители, использующие данный эффект, цифровые и аналоговые устройства…

Phase meters (Фазометры)

Фазометр — полезный прибор для проверки аудиоматериала. Зачем нужен и в каких случаях его употребляют?

Частоты, рекомендуемые для эквализации

Полезно изучать звучание инструментов и быстро находить, эквализировать проблемные области при сведении трека. В этой статье публикуется материал от звукорежиссёра…

Пять легендарных педалей delay, с которыми вы не ошибетесь.

Сейчас на рынке так много отличных устройств задержки, что можно легко потеряться в несметном количестве вариантов. Поэтому мы в New Style…

Минутка "взрослого" программирования: как растягивать звук и как менять тональность.

Ни для кого не секрет, что если воспроизводить звук ускоренно, то изменится и тон его звучания и, разумеется, уменьшится длительность.

Это одно из самых простых преобразований, которые можно сотворить со звуком. Но что делать, если нужно изменить темп воспроизведения звука, но тон оставить прежним? Или наоборот, изменить тон, не трогая длительность?

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

Чтобы было понятнее о чём пойдёт речь далее, небольшая видеозарисовка:

Ясно дело, без хитростей тут не обойдётся. На помощь нам приходит штука, известная как "Быстрое преобразование Фурье" (БПФ, или по-буржуйски FFT: Fast Fourier Transform).
О том как реализовать БПФ, я тут расписывать не буду, благо весь интернет кишит статьями с исходниками. Важно лишь то, что БПФ работает над массивом комплексных чисел и позволяет получить спектр сигнала.

Вот тут я накидал поясняющую картинку:

Я думаю по картинке всё и так понятно, но на всякий случай напишу пояснения:

1. Исходный сигнал разбивается на фрагменты, причём фрагменты перекрываются большей своей частью. Важно подойти к выбору длины каждого фрагмента: если фрагмент будет слишком коротким, то преобразование не затронет низкие частоты звука, не попавшие во фрагмент, если слишком длинным, то появится неприятный трубный звук, из-за того что ухо будет успевать различать изменения внутри фрагментов. Идеальная длительность фрагмента — около 50 мс. Но применение БПФ сильно ограничивает нас выбором длительности фрагментов кратным степени двойки. По моему опыту, для частоты воспроизведения 44100 семплов в секунду наилучший результат получается с фрагментами длиной 2048 сэмплов.

Как говорилось, фрагменты перекрывают друг друга, это значит что каждый последующий цикл преобразования захватывает большую часть исходных данных, уже участвовавших в предыдущих итерациях. Степень перекрытия фрагментов сильно влияет на качество звучания. По моему опыту, хороший результат получается при 16-кратном перекрытии (такое используется в демонстрационном видео), это означает что начала фрагмента для очередного цикла преобразования отстоит на 1/16 длины фрагмента от начала фрагмента прошлого цикла. При длине фрагмента 2048 сэмплов этот шаг составляет 128 сэмплов.

Нетрудно посчитать, что для обработки звука в реальном времени, при таких параметрах потребуется выполнить в районе 345 полных циклов обработки звука ежесекундно.

2. Итак, выбран один из фрагментов исходного звука, с него и начинается цикл преобразований.

3. Поскольку наибольшие ошибки БПФ накапливаются по краям окна, сигнал нужно отфильтровать, уменьшив его амплитуду на краях путём умножения на функцию оконного фильтра.

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

Не вдаваясь в подробности, скажу что хороший результат получается с использованием функции

f(i) = sin((Π / 2) * sin(Π * (i / N))²)

где Π — это пи (3,14159…); N — длина окна, i — номер сэмпла в окне (от 0 до N — 1)

4. БПФ работает над комплексными числами, а исходный сигнал у нас вещественный. Для подготовки массива для преобразования исходный сэмпл просто копируется в вещественную часть комплексного числа, а мнимая часть остаётся нулевой.

Теперь можно выполнять преобразование.

5. Поскольку все мнимые части у нас были нулевыми, полученный спектр получился симметричным. Только мнимая часть в правой половине имеет противоположный знак. Поэтому правую часть спектра можно смело отбросить.

В общем и целом, вещественная часть i-го элемента массива (гармоники) означает амплитуду косинуса частоты 2 * Π * i / N, а мнимая — синуса.

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

6. Для каждой гармоники спектра комплексное число необходимо преобразовать в полярные координаты. Теперь получилась l — амплитуда соответствующей частотной составляющей, и α — смещение фазы, т.е. насколько верхняя точка синусоиды отстоит от начала окна.

7. Представим такую ситуацию: у нас есть длинный протяжный звук, к примеру синусоида. Если частота синусоиды совпадает с частотой одной из гармоник, то на спектре будет присутствовать только эта гармоника, а вот фаза α будет меняться на каждой итерации, в зависимости от того на какую часть синусоиды пришлось начало окна. Не трудно догадаться что разница между фазами в двух соседних итерациях будет постоянной.

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

Представим теперь, что амплитуда гудящей синусоиды нарастает со временем. Теперь растягивание её во времени будет означать интерполяцию значений амплитуд (l), но разница между фазами в двух соседних итерациях опять таки будет изменяться с прежней скоростью.

Собственно эта идея и лежит в основе алгоритма:
1) для каждой гармоники на каждой итерации смотрим скорость изменения фазы — т.е. разницу с фазой из предыдущей итерации.
2) полученное значение скорости прибавляется к значению фазы такой же гармоники из предыдущей итерации выходного спектра, вне зависимости от того ускоряем мы, или замедляем воспроизведение.
3) значение амплитуды гармоники в выходном спектре получается путём интерполяции.

В пункте 2 возможны вариации — например, получать значение скорости фаз также при помощи интерполяции, но суть остаётся неизменной: важную роль играет не фаза, а скорость её изменения, которая воспроизводится в выходном спектре.

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

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

10. Затем выходной сигнал нужно домножить на оконный фильтр. Здесь я использую ту же формулу, что и в п.3, с последующим делением на половину степени перекрытия.

11. Полученный сигнал складывается с учётом степени перекрытия, с результатами предыдущих и последующих итераций

12. Выходной сигнал готов, можно его выводить на аудиоустройство, или сохранять в файл — кому что ближе.

Изменение тона

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

Как с помощью fft ускорить звук

The speed of a video stream can be changed by changing the presentation timestamp (PTS) of each video frame. This can be done via two methods: using the ​ setpts video filter (which requires re-encoding) or by erasing the timestamps by exporting the video to a raw bitstream format and muxing to a container while creating new timestamps.

Note that in the following examples, the audio stream is not changed, so it should ideally be disabled with -an .

raw bitstream method

This method is lossless and apart from changing the timestamps, copies the video stream as-is. Use this if you require no other changes to your input video.

First, copy the video to a raw bitstream format.

Then generate new timestamps while muxing to a container:

Change the value of -r to the desired playback frame rate.

setpts filter

To double the speed of the video with the setpts filter, you can use:

The filter works by changing the presentation timestamp (PTS) of each video frame. For example, if there are two succesive frames shown at timestamps 1 and 2, and you want to speed up the video, those timestamps need to become 0.5 and 1, respectively. Thus, we have to multiply them by 0.5.

Note that this method will drop frames to achieve the desired speed. You can avoid dropped frames by specifying a higher output frame rate than the input. For example, to go from an input of 4 FPS to one that is sped up to 4x that (16 FPS):

To slow down your video, you have to use a multiplier greater than 1:

Smooth

You can smooth out slow/fast video with the ​ minterpolate video filter. This is also known as «motion interpolation» or «optical flow».

Speeding up/slowing down audio

You can speed up or slow down audio with the ​ atempo audio filter. To double the speed of audio:

The atempo filter is limited to using values between 0.5 and 2.0 (so it can slow it down to no less than half the original speed, and speed up to no more than double the input). If you need to, you can get around this limitation by stringing multiple atempo filters together. The following with quadruple the audio speed:

Using a complex filtergraph, you can speed up video and audio at the same time:

With the raw bitstream method example from above, there is no need for a complex filtergraph. You can slow down a 30 fps video and audio at the same time with:

Как выполнить FFT на данных файла WAV?

Я пытаюсь проанализировать качество звука в файле, обнаружив наивысшую частоту (сжатый звук обычно фильтруется с частотой менее 20 кГц).

Я читаю данные файла WAV, используя класс из библиотеки soundstretch, который возвращает сэмплы PCM в виде чисел с плавающей точкой, а затем выполняю FFT для этих сэмплов с помощью библиотеки fftw3. Затем для каждой частоты (с округлением до ближайшего кГц) я суммирую амплитуду для этой частоты.

Поэтому для файла низкого качества, который не содержит частоты выше 16 кГц, я ожидал бы, что амплитуда выше 16 кГц будет отсутствовать или будет очень мала, однако я не получаю ожидаемых результатов. Ниже мой код:

Может компилироваться с: — (вам понадобится библиотека soundtouch и библиотека fftw3)

И вот спектральный анализ файла, на котором я тестирую:

Как вы можете видеть, он работает на частоте 16 кГц, однако мои результаты таковы:

Я ожидаю, что не будет никакой амплитуды на 16 кГц, я делаю это правильно?
Правильный ли мой расчет частоты? (Я отнял у него другой ответ на стеке)
Может быть, это связано с наличием двух каналов, а я не разделяю каналы?

Приветствия за любую помощь, ребята.

Решение

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

Другие решения

Основополагающим требованием БПФ является одинаковое расстояние между образцами и их соответствие.
В вашем случае подача стереосигнала по алгоритму БПФ удваивает количество выборок, не связанных между собой. Математически видно естественную разность фаз между двумя каналами, но, что более важно, две выборки, которые из-за несвязанности могут иметь такую ​​большую разницу, чтобы ошибочно представлять прямоугольную волну (во временной области она будет представлена ​​чрезвычайно высокая скорость нарастания сигнала).
В качестве решения вы должны разделить два канала и выполнить БПФ на одной серии семплов или на двух разных БПФ.
Я не думаю, что могут быть какие-либо проблемы с наложением, потому что это обычно связано с процессом выборки и выполняется с использованием аналогового фильтра, имеющего полосовую частоту < 1/2 частоты дискретизации (фильтр Найквиста или сглаживания). Если эта фильтрация пропущена, практически невозможно удалить призраков (псевдоним спектра) после.

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

Представьте себе идеальную прямоугольную волну. Вы никогда не слышали идеальную прямоугольную волну, потому что для мгновенного перехода источника звука из одного положения в другое потребовался бы источник звука, продолжая толкать частицы воздуха.

Вы также не можете описать прямоугольную волну с конечным числом гармоник. Тем не менее, вы можете тривиально описать прямоугольную волну с любой частотой звука PCM. Поэтому любой источник звука PCM может содержать бесконечное количество гармоник.

То, что вы, вероятно, можете сделать, это просто сесть на верхушку Найквиста и сказать, что если входной аудиосигнал N МГц, то самая высокочастотная часть, которая может быть реальным сигналом, составляет N / 2 МГц; поэтому вы можете повторно сэмплировать входную волну до удвоенной первой частоты, меньшей или равной N / 2 МГц, которая показывает значительный сигнал без потери значимого содержимого.

Изменить скорость звука

Увеличьте или уменьшите скорость воспроизведения любого аудиофайла

  • Google Drive
  • Dropbox
  • Ввести адрес
Изменить скорость онлайн

Что делать, если вы пытаетесь заставить музыку играть быстрее или медленнее? Например, вы выбираете новую мелодию, но с трудом это делаете? Наше онлайн-приложение поможет вам лучше слышать каждую ноту вашей музыки! Или ускорьте звук для создания ремикса или для достижения особого «космического» эффекта.

Любой формат файла

Наш преобразователь скорости звука поддерживает все распространенные форматы аудио и файлов — MP3, FLAC, MP4, AIFF или WAV. Это также поможет вам изменить входной формат вашего музыкального файла — просто выберите нужный формат из списка доступных.

Надежно и надежно

Несмотря на то, что вы загружаете свои файлы в наши онлайн-аудио инструменты, не нужно беспокоиться о конфиденциальности. Мы используем SSL-сертификаты для создания зашифрованного канала между пользователем и сервером. Никто никогда не сможет вмешаться в ваш процесс изменения скорости звука.

Даже большие файлы

Файлы большого размера (до 10 ГБ ) можно загружать в наше онлайн-приложение для обработки музыкальных файлов. Нет необходимости архивировать ваши большие mp3-файлы, чтобы замедлить или ускорить воспроизведение музыки.

Доступ из любого места

К нашему программному обеспечению для управления звуком можно получить доступ из любого места и не требует установки каких-либо плагинов или расширений. Этот онлайн-сменщик темпа используется как онлайн-инструмент для работы с вашими аудиофайлами. Обрабатываемые аудиофайлы могут поступать с URL-адреса, Google Диска, Dropbox и т. Д.

Больше, чем просто изменение скорости

Мы предлагаем другие полезные функции для ваших файлов MP3 — преобразование их в другой формат, изменение высоты звука, обрезку или вырезание музыкальных файлов.

Ускорить или замедлить музыку

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

Скачать файл

Спасибо, что используете Audio Trimmer!

Легкость использования

Audio Speed Changer прост в использовании и подходит для мобильных устройств. Просто загрузите аудиодорожку, выберите настройку темпа и нажмите кнопку «Изменить скорость». Приложение обработает аудио и позволит вам скачать его за считанные секунды!

Поддерживаемые аудиоформаты

  • mp3
  • wav
  • wma
  • ogg
  • m4r
  • 3gpp
  • ape
  • m4a
  • aac
  • amr
  • flac
  • aif
  • opus

Транскрибируйте песни с легкостью!

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

С помощью этого бесплатного онлайн-инструмента вы можете замедлить любую музыкальную дорожку до комфортного темпа и начать играть! Установка программного обеспечения не требуется!

Ускорьте звук так, чтобы это не звучало смешно!

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

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

How to Resample Audio Using FFT or DFT

I’m down sampling voice audio by first performing an FFT, then only taking the parts of the result that I need, and then performing an inverse FFT. However, it’s only working properly when I’m using frequencies that are both power of two, say down-sampling from 32768 to 8192. I perform an FFT on the 32k data, discard the top 3/4 of the data and then perform an inverse FFT on the remaining 1/4.

However, whenever I try to do this with data that doesn’t line up properly one of two things happen: The math library I’m (Aforge.Math) using throws a fit, because my samples are not a power of two. If I try to zero-pad the samples so they become power of twos, it get gibberish out on the other end. I also tried to use a DFT instead, but it ends up being insanely slow (this needs to be done in real time).

How would I go about to zero pad the FFT data properly, both on the initial FFT and the inverse FFT at the end? Assuming I have a sample at 44.1khz that needs to get to 16khz, I currently try something like this, the sample being 1000 in size.

  1. Pad input data to 1024 at the end
  2. Perform FFT
  3. Read the first 512 items into an array (I only need the first 362, but need ^2)
  4. Perform inverse FFT
  5. Read the first 362 items into the audio play buffer

From this, i get garbage out at the end. Doing the same thing but without having to pad at step 1 and 3 due to the samples already being ^2, gives a correct result.

Читать:
Dt 103 схема как подключить пищалку

3 Answers 3

The first step is to verify that both your starting sample rate and your target sample rate are rational numbers. Since they are integers they are automatically rational numbers. If one of them wasn’t a rational number it would still be possible to make the sample rate change, but it is a much different process and more difficult.

The next step is to factor the two sample rates. The starting sample rate, in this case, is 44100, which factors to $2^2*3^2*5^2*7^2$. The target sample rate, 16000, factors to $2^7*5^3$. Thus, to convert from the starting sample rate to the target rate we must decimate by $3^2*7^2$ and interpolate by $2^5*5$.

The previous steps have to be done no matter how you want to resample the data. Now let’s talk about how to do it with FFT’s. The trick to resampling with FFT’s is to pick FFT lengths that make everything work out nicely. That means picking an FFT length that is a multiple of the decimation rate (441, in this case). For the sake of the example, let’s pick an FFT length of 441, though we could have picked 882, or 1323, or any other positive multiple of 441.

To understand how this works it helps to visualize it. You start out with an audio signal that looks, in the frequency domain, something like the figure below. 44.1 kHz sample rate

When you’re done with your processing you want to decrease the sample rate to 16 kHz, but you want as little distortion as possible. In other words, you simply want to keep everything from the picture above from -8 kHz to +8 kHz and drop everything else. That results in the picture below. enter image description here

Please note that the sample rates are not to scale, they are just there to illustrate the concepts.

The beauty of picking an FFT length that is a multiple of the decimation factor is that you can resample simply by dropping portions of the FFT result, and then inverse FFT what is left. In the case of our example you FFT 441 samples of data, which gets you 441 complex samples in the frequency domain. We want to decimate by 441 and interpolate by 160 ($2^5*5$), so we keep the 160 samples that represent the frequencies from -8 kHz to +8 kHz. We then inverse FFT those samples and presto! You have 160 time domain samples that are sampled at 16 kHz.

As you might suspect, there are a couple of potential problems. I will go through each one and explain how you can overcome them.

What do you do if your data is not a nice multiple of the decimation factor? You can easily overcome this by padding the end of your data with enough zeros to make it a multiple of the decimation factor. The data is padded BEFORE it is FFT’ed.

Even though the method I explained is very simple, it is also non-ideal in that it can introduce ringing and other nasty artifacts in the time domain. You can avoid that by filtering the frequency domain data before dropping the high frequency data. You do this by FFT’ing your filter of length $l$, padding your data (before FFT’ing it) with at least $l-1$ zeros (please note that the number of data samples and the number of padding samples must BOTH be a positive multiple of the decimation factor- you can increase the padding length to meet this constraint), FFT’ing the padded data, multiplying the frequency domain data and filter, and then aliasing the high frequency (> 8 kHz) results down into the low frequency (< 8 kHz) results before dropping the high frequency results. Unfortunately, since filtering in the frequency domain is a big topic in its own right, I won’t be able to go into more detail in this answer. I will say, though, that if you filter and are processing the data in more than one chunk, you will need to implement Overlap-and-Add or Overlap-and-Save to make the filtering continuous.

I hope this helps.

EDIT: The difference between the starting number of frequency domain samples and the target number of frequency domain samples needs to be even so that you can remove the same number of samples from the positive side of the results as the negative side of the results. In the case of our example, the starting number of samples was the decimation rate, or 441, and the target number of samples was the interpolation rate, or 160. The difference is 279, which is not even. The solution is to double the FFT length to 882, which causes the target number of samples to also double to 320. Now the difference is even, and you can drop the appropriate frequency domain samples with no problems.

Как с помощью fft ускорить звук

Этим фильтром я и сам часто пользуюсь, когда нужно ускорить видео процесса рисования, стримы или просто какое-то видео, которое затем нужно вставить в видеоредакторе, потому что там обычно ограничения на кратность ускорения.

Для ускорения или замедления видео используется фильтр setpts:
-vf setpts= коэффициент_скорости *PTS
Если коэффициент скорости больше единицы, то видео замедлится, если меньше — ускорится.

Замедлить видео в 5 раз:

Для ускорения можно использовать такой формат:
-vf setpts=PTS/ коэффициент_ускорения
Где коэффициент_ускорения должен быть больше единицы.

Ускорить видео в 4 раза:

Ускорить/замедлить аудио темп Для изменения темпа используется аудиофильтр atempo:
-af atempo= темп
Темп должен быть в пределах 0.5. 100

Как с помощью fft ускорить звук

Большинство сложных алгоритмов цифровой обработка звука сейчас работают с частотной информацией, в то время как в подавляющем большинстве случаев информация представлена в виде зависимости амплитуды от времени (.wav файлы). Для того, чтобы обработать информацию, приходится переводить её в частотный вид, обрабатывать, а затем переводить обратно. Сама обработка здесь пока не затрагивается, описаны лишь общие для всех подобных алгоритмов проблемы разложения сигнала на частотные составляющие.

Оговорюсь сразу — с точки зрения строгой математики — почти всё, что я тут напишу, если не ошибочно, то уж наверняка очень неточно. Это скорее общие рассуждения, чем строгие математические факты, которые при надобности можно прочесть в книжках.

Для разложения сигнал в его частотные составляющие используется дискретное преобразование Фурье. В нашем случае это преобразование переводит N последовательных значений амплитуды сигнала в N/2 +1 пар коэффициентов Re[n], Im[n].

Смысл преобразования в том, что если сложить N/2 +1 функций Re[n] * Sin + Im[n] * Cos, где функции Sin и Cos с периодом, повторяющимся соответственно от 0 (константа) до N/2 раз (0, 1, 2, 3, 4 и т.д. до N/2), то с некоторой степенью точности получится исходная функция — N значений амилитуды.

По формулам приведения можно преобразовать пару коэффициентов — амплитуд Sin и Cos — в другую, более полезную нам пару — амплитуду, перед Sin A[n], и фазу этой синусоиды Ph[n].

Таким образом, можно сказать, что преобразование Фурье переводит N значений амплитуд в N/2 синусоиды (отдельные частоты) с амплитудами A[n] и фазами Ph[n], плюс еще нулевая пара коэффициентов — просто константа (Sin и Cos с постоянным нулевым аргументом), отклонение от нуля.

Еще более простой пример, финальный, совсем уж в цифрах: Пусть, например, у нас есть аудио — данные, сэмплированные в 44.1 кГц, и мы, взяв 8 значений (отдельных отсчетов), хотим получить частотное разложение этого участка. В результате у нас получится 5 пар коэффициентов — 4 синусоиды с частотами 22.05 кГц, 16.5 кГц, 11.025 кГц, 5.51 кГц, и синусоида с частотой 0 кГц — то есть константа. Взяв 8 значений, мы можем разложить исходный сигнал на 4 гармоники (синусоиды, частоты). Про константу (нулевую гармонику) на время забудем — её надо просто прибавить при обратном преобразовании, а здесь она нас не интересует.

Взяв 16 отсчетов, мы получим 8 частот. Для 1024 — 512 частот. Шаг между ними, то есть частотное разрешение, составляет, в нашем примере с 44.1 кГц, (22.05 кГц)/ (N/2), или просто (44.1 кГц)/N. Частоты идут от нуля и выше, с этим шагом.

Вычисление дискретного преобразования Фурье можно осуществлять двумя способами. Я не буду описывать ни один из них, скажу лишь, что первый, так называемый стандартный способ, состоит в том, чтобы умножать исходную функцию на синусы и косинусы, суммировать всю дискретную функцию в одно число и записывая результат в коэффициенты. Еще этот метод называют метод корреляций — если очень уж на пальцах, если функция коррелирует с искомым Sin или Cos, (имеет с ними что-то общее), то сумма всех дискретных отсчетов получившегося произведения функций говорит нам, насколько много общего у них было. Тут вас гораздо обстоятельнее просветит любой учебник по математическому анализу для первого курса ВУЗ-а :). Этот способ довольно медленный, и используется только для вычисления небольших преобразований — около десяти-двадцати точек.

Для серьезного ускорения процесса существует хитрый алгоритм — быстрое преобразование Фурье, БПФ, или по английски — FFT. FFT работает с комплексными числами и размерами преобразований, представляющими из себя степень двойки (128, . 1024, 2048 и т.д.). Не стоит однако думать, что FFT — это что-то другое, нежели разложение Фурье. Это абсолютно то же самое, просто в сотни раз быстрее. Комплексные коэффициенты — это не что иное, как просто коэффициенты перед Cos (Im[n]), а действительные — перед Sin. В большинстве современных алгоритмов применяется FFT, поэтому это название прочно закрепилось за всеми алгоритмами, которые раскладывают сигнал на частоты.

Теперь перейдем к свойствам этих преобразований, важных нам. Термин ‘размер преобразования’ (‘FFT size’), или просто ‘размер FFT’ обозначает количество точек исходной функции, с которыми мы работаем. То есть, для размера FFT в 1024 мы должны взять 1024 отсчета.

Непосредственные свойства преобразования:

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

Вообще говоря, перевод сигнала в частотное представление возможен только блоками (окнами). В нашем случае — FFT блоками. Мы делим исходный сигнал на блоки и говорим: в этом блоке имеются такие-то частоты. Вернее, так: его можно получить, сложив такие-то частоты.

Это очень важно понимать: FFT раскладывает функцию не на её гармоники, а на свои гармоники. Допустим, в исходной функции была лишь частота точно 100 Гц, а мы с помощью FFT раскладываем функцию в частоты 96, 99, 102, 105 Гц — как вы думаете, что получится в результате? �� Ничего полезного. FFT по прежнему будет способна полностью точно восстановить исходную функцию, однако полученный нами спектральный состав будет бестолковым:

Как видно, удачный FFT, который полностью ‘попал’ в искомую частоту, дал хороший, правильный, с нашей точки зрения, спектр. Неудачный же — нехороший спектр. Мы можем только догадываться, что в исходном сигнале была сильная частота в примерно 100 Гц. Важно понимать, что при синтезе обоих этих разложений мы получим в точности исходную функцию, несмотря на то, что второе разложение с нашей точки зрения и бестолково.

Вывод из вышесказанного: строго говоря, нельзя трактовать результат разложения как спектр сигнала. Разложение — это просто данные, применив к которым обратное преобразование, можно получить исходную функцию.

А теперь, для смеха и понимания, рассмотрим задачу из жизни — простейший FFT фильтр. �� Исходные данные — как в первом примере, частота 100 Гц. Цель фильтрации — оставить все частоты выше 101 Гц. Алгоритм: обнулить в FFT разложении все частоты ниже 100 кГц включительно, а потом сложить функцию обратно. При удачном FFT разложении (см. выше) результат получается именно такой, какой нам нужно. Но спросите себя, много ли в исходных фонограммах частот, которые точно соответствуют частотам нашего FFT разложения? Да нисколько. Поэтому смотрим, что делает наш фильтр с неудачным FFT разложением: он обнуляет основную частоту, но остаются не обнуленными коэффициенты при 102, 105, 108 и т.д. Гц, которые содержали данные, необходимые для синтеза не представимой в данном разложении частоты 100 Гц. При синтезе после фильтрации эти осколки создадут нечто такое абстрактное с мощностью до 10% той частоты, которую мы фильтруем!

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

Для ликвидации этого неприятного явления применяются так называемые оконные функции. Блок перед FFT разложением помножается на сглаживающую оконную функцию. Простейшая оконная функция — Hamming, имеет примерно такой вид:

Блок после Hamming функции

Поверьте, трудно объяснить, почему воздействие сглаживающей оконной функции улучшает полезность (для нас) спектрального разложения. Я потратил на понимание этого много времени, и не берусь объяснить это в двух словах. Проще просто поверить. Разговор про эту функцию зашел не для понимания её сути, а просто для того, чтобы вы представляли себе, что это такое.

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

К сожалению, второе действие — теперь и удачный FFT стал немного размазанным. Полезных результатов, впрочем, больше, поэтому оконные функции и используются. Разные функции приводят к разным результатам, и все они располагаются в некий спектр, от почти-ничего-не-делания до сильного вмешательства в спектральное разложение. Перечисляю этот спектр известных функций, от самых безобидных до ядреных: Triangular, Hanning, Hamming, Blackman, Welch (распределение Гаусса), Blackman-Harris.

Ежу понятно, что после применения любой оконной функции речь уже не идет о том, чтобы просто синтезировать сигнал обратно и получить исходную функцию. Информация с концов блока почти не используется, мы её просто не восстановим. Синтезировать, однако, можно, если пользоваться более хитрыми приемами работы. Тут мы подходим ко второму важному принципу работы с FFT, не очень обязательному при работе с полными блоками, но уже почти обязательному при работе с оконными функциями: блоки FFT обработки должны перекрываться.

Так или иначе, в FFT анализе применяются две технологии. Первая — использование результатов FFT разложения для синтеза лишь центральной части исходной функции. Например, FFT = 1024, но мы используем данные FFT преобразования для обратного синтеза лишь, к примеру, центральных 600 отсчетов, а не всех 1024-х. Соответственно, второй принцип, следующий из этого — исходные FFT блоки тоже должны перекрываться, хотя бы для того, чтобы мы могли исходно синтезировать сигнал обратно. Бывает полезно, однако, перекрывать их еще сильнее, используя усреднение результатов на стыке блоков. Это — обычно тот параметр, который отвечает за качество FFT разложения (и, соответственно, обработки). Но обработки мы пока не касаемся — это тема для отдельного большого разговора.

Продолжаем, однако, с FFT анализом. Вернемся к частотному разрешению. Что же такое, по сути, есть размер FFT блока? Рассмотрим анализ с блоком 65536. Нелишне будет напомнить, что это — более секунды для стандартной частоты дискретизации 44.1 кГц. Разрешение по частотам впечатляет — сетка частот FFT чуть менее одного герца. Одна лишь проблема — информация по частотам усреднена за более чем секунду исходного материала. Но зато, проведя такой анализ, мы можем наверняка сказать, есть ли в этом секундном сигнале частота 50 Гц, или нет — она либо ложится в нашу сетку, либо проходит настолько близко к какой-либо базовой частоте, что мы хорошо разглядим это. А если нас интересует другое? Если частота 50 Гц то появляется, то исчезает за эту секунду, скажем, 10 раз, и нас интересует именно эта динамика — что тогда? А, пардон, например удар тарелочек — мы определили его местоположение с точностью до секунды?? Молодцы мы. В анализе это не очень страшно, но при обработке с помощью FFT может привнести неприятные эффекты. Правда, не такие, о которых вы скорее всего подумали. но это не тема этой статьи.

Взять более мелкий FFT (например, 1024) чтобы увеличить разрешение по времени — не всегда выход. Причина — мы катастрофически теряем частотное разрешение. С FFT = 1024 шаг сетки частот составляет 43 Гц! Это частоты 43, 86, 132 и т.д. Гц — в такой сетке мы ни в жизни не разглядим 50 Гц, так как частоты, допустим, в 60 и 30 Гц войдут в те же гармоники нашей сетки, что и 50. Мы не сможем выделить нужную нам частоту.

Help к любой программе звукообработки скажет нам одну простую истину, которая звучит так: выигрывая в разрешении по времени, мы проигрываем в разрешении по частоте, и наоборот. Это, однако, сильно упрощенная картина. Более того, для голого анализа — даже неверная :-). Дело в том, что вышеописанная проблема имеет простое решение. Ничего не мешает нам взять, допустим, 1000 отсчетов, дополнить их еще 64536 нулями справа и подвергнуть получившуюся штуку разложению с FFT = 65536. Таким образом мы получим большое разрешение и по времени, и по частоте. Побочные эффекты? Лишь уменьшение амплитуды спектра и изменение до неузнаваемости фазовых компонент. Но мы ведь их и так не используем, мы лишь строим спектр! Амплитуду можно поправить, её изменение вычисляется. Вывод: при одном лишь анализе мы можем получить какое угодно разрешение по времени и по частоте одновременно.

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

Еще один прием, если у нас всё же имеется много информации. Перевести сигнал в меньшую частоту дискретизации — например, 8 кГц. В таком случае при FFT = 65536 мы анализируем в одном блоке аж 8 секунд информации, но разрешение по частоте получается почти 0.1 Гц — этого хватит на все практические нужды. Ну, не считая того, что максимальная частота в этом случае — 4 кГц. �� Мы как бы сузили анализируемый диапазон с 22 кГц до 4 кГц, сохранив при этом разрешение.

Однако для обработки сигналов мы не можем использовать такие трюки, поэтому для обработки вышеописанная фраза остается, по сути, аксиомой. Не нерушимым принципом, нет, но обычно — именно таким компромиссом нас всё время будут сдерживать.

Еще немного о разрешении по времени. Допустим, у нас есть блок FFT = 65536, и мы шагаем по исходным данным с огромными перекрытиями — допустим, по 1024. То есть коэффициент перекрытия составляет 64 раза. Кроме того, что это сильно неэффективно, мы всё же получаем увеличение не то чтобы разрешения во времени, но информации о расположении частот во времени. Ведь если на очередном шаге мы получили увеличение содержания частоты 50 Гц — значит, мы либо только что сошли с участка, где её не было, либо вошли в участок, где она появилась. Это неприятное ‘или’, делающее почти бессмысленным наше достижение :-), можно устранить, идя непрерывно с самого начала и собирая статистику.

Собственно, похожие эффекты можно наблюдать при построении сонограммы:


Сонограмма высокого разрешения (по времени)

Для каждого вертикального столбика выполняется FFT небольшим размером (около 256), результаты которого потом представляются в виде более ярких точек на местах более сильных амплитуд. Если расстояние, которое соответствует двум соседним линиям на экране, меньше размера FFT — получается перекрывающаяся сонограмма, которая уже отражает больше информации о времени, чем это возможно просто не перекрывающимися блоками. Как видно, частотные изменения во времени (горизонтальная плоскость) происходят плавно — это результат частичного перекрытия блоков FFT.

Поговорим о спектральном шуме. В принципе такого понятия в природе нет :-). Мы придумали его лишь для того, чтобы проиллюстрировать некоторые неприятные эффекты частотного анализа. Посмотрим на результат типичного FFT = 256 анализа:

Результат единственного FFT

В общем то результат как результат. Однако возьмем одну секунду информации, пройдемся по ней блоками FFT, хотя бы без перекрытия, как это делает CoolEdit, и увидим вот что:

Обратите внимание на пики около 8.5 и 11 кГц, мы никогда не разглядели бы их при одиночном анализе. То, что мешало нам разглядеть это — спектральный шум, непостоянство спектральных коэффициентов. Усредненная картина иногда гораздо более информативна. CoolEdit, однако, не использует другого, часто более полезного метода усреднения — анализ большими блокам (FFT порядка 8192), чтобы потом сгладить сам спектр. Исходно, этот спектр жутко шумный:

Однако содержит всю интересную нам информацию — холмики на 8.5 и 11 кГц, хорошо видную только при его сглаживании. К сожалению, картинку показать не могу, придется поверить на слово :-). Усреднять один спектр порой гораздо более полезно в том случае, если нас интересуют эффекты высокого частотного разрешения. Мы можем иметь всего три секунды информации и желать узнать спектральный пик с точностью в 1 Гц — то есть нам нужно FFT = 65536. Из трех секунд мы можем либо получить один FFT, усреднив (сгладив) его спектр, либо вынуждены будем посчитать с десяток FFT с перекрытием, усреднив их спектры между собой — а это уже гораздо более медленная операция.

FFT анализатор SoundForge может сглаживать спектры и усреднять их между собой, а также идти с заданными перекрытиями. CoolEdit — лишь усреднять спектры, идя без перекрытий.

Это пожалуй всё, что я счел возможным в двух словах рассказать о FFT анализе. Эта страничка, собственно, является предисловием к статьям в гораздо более практической плоскости — например, о FFT обработке (фильтрация, шумоподавление, и т.д.). Чтобы каждый раз не тыкаться в основы, они один раз описаны здесь, и более эти вопросы мною не затрагиваются.

Как изменить скорость видео с помощью ffmpeg?

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

использовать setpts согласно документации:

видео действительно ускоряется, однако готовый файл имеет 625 кадров в секунду и, как следствие, не воспроизводится ни одним плеером;

урезать частоту кадров с помощью фильтра fps:

в итоге первые 1/25 времени ролик воспроизводятся как и ожидается, а последующие 24/25 времени отображается последний кадр видео — общая длительность видео оказалась равна исходной, несмотря на изменение скорости;

сделать финт ушами и поменять фильтры местами (надеялся ускорить 1fps видео до 25 кадров):

в итоге получилось дёрганое непонятно что с непонятно какой частотой кадров (хотя VLC формально заявляет 25 кадров, на деле там похоже что-то переменное);

урезать частоту кадров опцией -r:

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

Помощь с БПФ (быстрые преобразования Фурье) и / или DSP

Я пытаюсь сделать экранное приложение, которое мигает экраном в соответствии с музыкой (на которой будут частоты, такие как частоты заживления и т.д.). Я уже сделал плеер и знаю, как заставить экран вспыхивать, но мне нужно сделать вспышку экрана супер быстрой в соответствии с музыкой, например, если музыка ускорится, экранная вспышка начнет мигать быстрее. Я понимаю, что я бы достиг этого с помощью FFT или DSP (так как мне нужно знать только, когда частота поднимается с нескольких Гц, скажем, 20, чтобы изменить цвет, создавая экранную вспышку).

Но я обнаружил, что не понимаю НИЧЕГО, даже меньше пытаюсь реализовать его в своем приложении.

Может кто-нибудь помочь мне узнать, кто из них? Моя электронная почта [email protected] Мне действительно нужна помощь, я застрял, как 3 дня, не кодируя и ничего не делая, пытаясь понять, но я не знаю.

PS: Мое приложение написано на С++ и Qt.

PS: Спасибо, что нашли время, чтобы прочитать это и готовность помочь.

Изменить: спасибо всем за ответы, проблема пока не решена, но я ценю все ответы, я не думал, что получаю так много ответов и информации. Спасибо вам всем.

5 ответов

Это сложная проблема, требующая больше, чем БПФ. Я кратко опишу, как я реализовал обнаружение биений, когда писал программное обеспечение для профессионального DJ-оборудования.

Прежде всего, вам нужно сократить объем данных, с которыми вы имеете дело, поскольку есть только два или три бита в секунду, но десятки тысяч образцов. Вам также нужно будет посмотреть на разные диапазоны частот, поскольку некоторые типы музыки несут темп в басовой линии, а другие — в перкуссии или других инструментах. Поэтому передайте сигнал через несколько полосовых фильтров (я выбрал 8 фильтров, каждый из которых покрывает одну октаву, от низких низких до высоких высоких частот), а затем уменьшает каждый диапазон, усредняя мощность более нескольких сотен образцов.

Каждые несколько секунд у вас будет тысяча выборок в каждой группе. Ваш следующий инструмент — автокорреляция, чтобы идентифицировать повторяющиеся шаблоны в музыке. Пики автокорреляции говорят вам, какой бит более или менее вероятен; но вам нужно будет составить несколько эвристик, чтобы сравнить все диапазоны частот, чтобы найти ритм, в котором вы можете быть уверены, и избежать ошибочных синкопий. Если вы справитесь с этим, тогда у вас будет разумная догадка о темпе, но я не буду думать о фазе (то есть, когда бы вспышка экрана).

Теперь вы можете посмотреть на сглаженную версию аудиоданных для пиков, некоторые из которых, вероятно, будут соответствовать битам. Изначально ищите самый сильный пик в течение нескольких секунд и воспринимайте это как прилив. В сочетании с темпом, который вы оценили на первом этапе, вы можете предсказать, когда произойдет следующий удар, и измерьте, где вы действительно видели что-то вроде удара, и скорректируйте свою оценку, чтобы более точно соответствовать данным. Вы также можете поддерживать уровень уверенности в зависимости от того, насколько хорошо предсказанные удары соответствуют измеренным пикам; если это слишком низкое, затем перезапустите обнаружение удара с нуля.

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

Или для простого эффекта визуализации вы можете просто обнаружить пики и зажечь экран для каждого из них; он, вероятно, будет выглядеть достаточно хорошо.

Похожие публикации