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

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

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

Может ли кто-нибудь помочь мне узнать, что из них обоих? Мой электронный адрес: sismetic_chaos@hotmail.com. Мне действительно нужна помощь, я застрял на 3 дня, не кодируя или вообще ничего не делая, пытаясь понять, но я не понимаю.

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

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

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

Ответы [ 5 ]

3 голосов
/ 09 сентября 2010

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

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

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

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

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

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

3 голосов
/ 09 сентября 2010

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

Одна вещь, которую вы можете сделать, этоиспользуйте обнаружение пиков, чтобы идентифицировать «всплески» громкости, которые обычно возникают при «пониженных частотах» музыки.Если вы можете идентифицировать понижающие ритмы, то вы можете использовать ресурс, такой как bpmdatabase.com , чтобы найти темп песни.Темп покажет вам, как быстро мигать, а обнаруженные пики - когда начать мигать.Попросите ваше приложение контролировать ваши вспышки, чтобы убедиться, что они обычно появляются одновременно с пиком (если два начинают расходиться, темп может измениться в середине песни).

Это может звучать просто,но это на самом деле очень нетривиальная вещь для реализации.Возможно, вы захотите прочитать этот вопрос для получения дополнительной информации.Там есть несколько качественных ссылок в ответах.

Если я полностью неверно истолковываю то, что вы пытаетесь сделать, и вам нужно сделать БПФ для чего-то другого, то вы можете посмотреть на использование одного изсуществующие библиотеки FFT, чтобы сделать тяжелую работу за вас.Вот некоторые примеры: FFTW и KissFFT .

0 голосов
/ 09 сентября 2010

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

Например, может *Чтобы сделать 1004 * с использованием FFT - и того, как конкретная реализация FFT была интегрирована в приложение Qt, взгляните на это сообщение в блоге , которое описывает демонстрацию анализатора спектра, которую я разработал.Код для демонстрации поставляется с самим Qt, в каталоге demos / spectrum .

0 голосов
/ 09 сентября 2010

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

Проверьте этот похожий пост: здесь

Мне потребовалось около трех недель, чтобы понять математику, лежащую в основе БПФ, а затем еще неделю, чтобы написать что-то на языке Matlab, используя эти концепции. Если вы разочарованы через три дня, не пытайтесь свернуть свои собственные.

Надеюсь, это полезный совет, а не обескураживающий.

-Брайан Дж. Стинар-

0 голосов
/ 09 сентября 2010

Звучит так, будто вы пытаетесь заставить свой визуализатор как-то мигать на экране музыкой.Я не думаю, что вычисление БПФ поможет вам здесь.В любой момент времени будет много одновременных частотных компонентов по всему звуковому спектру (примерно от 20 Гц до 20 кГц).Но вы, вероятно, будете гораздо больше заинтересованы в музыкальном темпе (удары в минуту - больше как 5 Гц или ниже), и это нигде не будет отображаться в БПФ необработанного аудиосигнала.

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

Конечно, более сложные визуализации вполне могут использовать преимущества БПФ, но не того, который вы описываете.*

...