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

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

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

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

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

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

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


person Sismetic    schedule 08.09.2010    source источник
comment
Если у вас нет опыта работы с DSP, это может быть очень сложно. Я бы порекомендовал проверить бесплатную онлайн-книгу на dspguide.com. Это то место, где я начал много лет назад, когда меня попросили сделать что-нибудь с DSP без предварительного опыта. Однако, если у вас нет математического образования, чтобы понять это, вам нужно сначала поработать над этим.   -  person Justin Peel    schedule 09.09.2010
comment
Я не понимаю, что вы имеете в виду под музыкой (это будут частоты ... Вы имеете в виду, что есть доминирующая частота, и вы хотели бы определить, что это за доминирующая частота?   -  person mtrw    schedule 09.09.2010
comment
Ну, я не знаю, как это сказать, потому что английский не мой родной язык, я имел в виду вот что: youtube.com/watch?v=5tJGS2WKidY&feature=related   -  person Sismetic    schedule 09.09.2010
comment
Не думаю, что у меня есть математическое образование, но я хорошо разбираюсь в математике, и мне это нравится, но мне всего 17 лет, а последняя вещь, связанная с математикой, которую я видел (кроме чисел), было где-то 2-3 года назад, так что я ржавый   -  person Sismetic    schedule 10.09.2010


Ответы (5)


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

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

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

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

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

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

person Mike Seymour    schedule 09.09.2010
comment
А как определить пики? - person Sismetic; 09.09.2010
comment
@Sismetic: Один простой способ - отслеживать среднюю амплитуду и искать образцы, которые значительно больше среднего и больше, чем все другие образцы на небольшом расстоянии (скажем, 100 мс) от них. Вы можете получить лучшие результаты, выпрямляя сигнал (делая отрицательные образцы положительными), сглаживая его (с помощью фильтра нижних частот) и ища атаки (внезапное увеличение амплитуды), но это более сложно. - person Mike Seymour; 09.09.2010
comment
А как мне получить образцы? Извините, я НАСТОЯЩИЙ новичок - person Sismetic; 10.09.2010
comment
@Sismetic: извините, я понятия не имею, как получить аудиопоток; это полностью зависит от того, что вы используете для воспроизведения звука. Вы говорите, что сделали плеер - можете ли вы как-нибудь извлечь из него аудиоданные? - person Mike Seymour; 11.09.2010
comment
Я понятия не имею, как это сделать - person Sismetic; 11.09.2010

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

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

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

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

person bta    schedule 08.09.2010
comment
Я нашел библиотеку FFTW, но я не понял приседания: P, мне нужно только знать, когда мигать экран, и мне нужно мигать экран несколько раз в секунду - person Sismetic; 09.09.2010
comment
@ Sismetic - Если это все, что вы пытаетесь сделать, не беспокойтесь о БПФ. Взгляните на некоторые ссылки в другом вопросе SO, который я связал, для некоторых описаний того, как подойти к проблеме (в частности, статья GameDev). - person bta; 09.09.2010
comment
@bta - Я не думаю, что определение ритма, как в BPM, - это то, что я ищу, потому что это не в музыке. Я буду применять это, по крайней мере, не обычную музыку, такую ​​как Three Days Grace, Bon Jovi или что-то в этом роде. Это похоже на частоты, которые делаются в цифровом формате, и не используют бас, гитару или что-то в этом роде. Это как звук, издаваемый на очень низкой частоте, чтобы ввести вас в состояние (например, сонливость или активность). Сложно описать словами, но надеюсь, что правильно выразился - person Sismetic; 10.09.2010
comment
@ Sismetic - Если вы используете чистые тональные частоты, то ваша работа действительно проста. Частота звука измеряется в циклах в секунду, и если вы хотите мигать одновременно с тоном, вы должны мигать с той же скоростью. Никаких расчетов не требуется. Обратите внимание, что экран, вероятно, не может обновляться быстрее, чем 60-72 Гц, поэтому, если ваш тон более высокий, чем этот, вы захотите использовать некоторую гармонику этого тона (разделите частоту на степень 2, пока не получите число в пределах частота обновления экрана). - person bta; 10.09.2010
comment
И как мне получить тон (я имею в виду программно, потому что каждая другая частота тона будет воспроизводиться с разными циклами в секунду, не так ли?) Для каждой частоты тона, которая будет воспроизводиться (по одной за раз) Что такое гармоника? - person Sismetic; 11.09.2010
comment
Я предполагал, что вы уже знали, какие тона будете использовать. Как вы генерируете эти тона, не зная их высоты или частоты? - person bta; 11.09.2010
comment
Я нет, мой отец, приложение для меня, чтобы я играл на уже сгенерированном тоне, и я думаю, мне нужно было бы получить частоту тона - person Sismetic; 15.09.2010
comment
Будет ли ваше приложение всегда использовать одни и те же заранее сгенерированные тональные сигналы или они будут каждый раз разными? Если вы повторно используете тональные сигналы, будет намного проще использовать существующий инструмент для измерения их частоты и программирования результата в вашем приложении, чем кодировать детектор высоты тона. - person bta; 15.09.2010
comment
Каждый раз они будут разными. Вы знаете инструмент, который измеряет частоту? Если да, то не могли бы вы объяснить мне, как использовать его в приложении (я вообще не знаю, как использовать плагины или что-то другое, я никогда этого не делал)? Извините за несвоевременный ответ :( - person Sismetic; 20.09.2010
comment
Нет простого способа объяснить, как это сделать в вашем приложении. Я научился делать это на курсе DSP в колледже, но, судя по вашему поступлению, я не думаю, что у вас есть математическая подготовка, чтобы делать это прямо сейчас. Вот почему я пытался найти другой способ решения проблемы, который не предполагал бы никакой работы с DSP. Попробуйте проработать книгу на dspguide.com и посмотрите, достаточно ли у вас математического опыта, чтобы пройти хотя бы разделы «Основы» и «Основы» (13 глав или около того). Если вы можете следовать математике из этой книги, вы должны выучить все, что вам нужно знать. - person bta; 20.09.2010
comment
Хорошо, я попытаюсь прочитать это в Интернете, так как оно кажется крайне важным. Я пытался напечатать его, но он был по главам, и я не думал, что это очень важно, я ошибался. Спасибо за помощь, человек - person Sismetic; 21.09.2010

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

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

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

person Jim Lewis    schedule 08.09.2010
comment
И как я могу обнаружить пиковое значение в реальном времени? - person Sismetic; 09.09.2010
comment
@Sismetic: Пожалуйста, не поймите это неправильно, но я думаю, вам может понадобиться базовое руководство по обработке звука, а не простой ответ или фрагмент кода, который подошел бы для переполнения стека. bta разместила несколько хороших ссылок - просмотрите оттуда, и вы найдете полезную информацию, хотя и не обязательно на C ++. То, что вы пытаетесь сделать, довольно сложно для начинающего программистского проекта ... удачи! - person Jim Lewis; 09.09.2010
comment
Спасибо, Джим, я знаю, что это довольно сложно, но мой отец оставил его, это действительно мой первый проект, примерно через 3 месяца после начала изучения C ++, но я уверен, что это последняя проблема, с которой я думаю, что столкнусь, потому что все остальное у меня выполнено из (видимо). Спасибо за ответ, я ценю это - person Sismetic; 09.09.2010

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

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

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

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

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

person Brian Stinar    schedule 08.09.2010
comment
Вы можете привести мне практический пример того, как это реализовать? - person Sismetic; 09.09.2010
comment
Если бы я был в вашей ситуации, я бы начал возиться с системой плагинов Vamp. Глядя на это, похоже, что у них есть метод, который принимает аудиодорожку и методы выборки в качестве входных данных и возвращает вам (среди прочего) структуру данных темпа, которая включает удары в минуту, и какой-то механизм синхронизации для соотнесите темп (ы) с моментами времени на звуковой дорожке. Однако мне очень жаль, что у меня нет готового рабочего примера. - person Brian Stinar; 09.09.2010
comment
Спасибо, я загляну в плагин Vamp - person Sismetic; 10.09.2010

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

Чтобы увидеть пример того, что можно сделать с помощью БПФ - и того, как конкретная реализация БПФ была интегрирована в приложение Qt, взгляните на это сообщение в блоге, в котором описывается разработанная мной демонстрация анализатора спектра. Код для демонстрации поставляется вместе с Qt в папке demos / Spectrum каталог.

person Gareth Stockwell    schedule 09.09.2010
comment
Я видел это, и красные полосы справа - ТОЧНО то, что я хочу. Я просматриваю код, чтобы увидеть, как они это сделали: P Ty за подсказку - person Sismetic; 10.09.2010
comment
Красная полоса справа отображается классом LevelMeter. Он отображает два сигнала: уровень сигнала RMS с небольшим сглаживанием; и недавний пиковый уровень сигнала с наложенным спадом с течением времени. Учтите, что этот сигнал не даст вам точного измерения темпа ударов, поскольку он обычно содержит слишком много шума. Чтобы определить темп музыки, вам потребуется более сложная обработка, как указано в других ответах. - person Gareth Stockwell; 13.09.2010
comment
О, спасибо, что сказали мне, где найти эту конкретную деталь. Большое спасибо, ваше было самым полезным, насколько я сегодня нашел (хотя все сообщения тоже были очень полезными). - person Sismetic; 15.09.2010