2008-09-17 5 views
40

Я бы хотел написать простое приложение C# для контроля линейного аудио и дать мне текущее (ну, скользящее среднее) удары в минуту.Удары в минуту от аудиовхода в реальном времени

Я видел this gamedev article, и это абсолютно не помогло. Я прошел и попытался реализовать то, что он делал, но он просто не работал.

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

+0

Другая статья, которая может быть интересна для вас ... [http://werner.yellowcouch.org/Papers/bpm04/](http://werner.yellowcouch.org/Papers/bpm04/) Вы можете найти существующие Библиотеки обнаружения BPM: [http://www.mmartins.com/mmartins/bpmdetection/bpmdetection.asp](http://www.mmartins.com/mmartins/bpmdetection/bpmdetection.asp) ... и C# BPM здесь: [http://adionsoft.net/bpm/](http://adionsoft.net/bpm/) – sachaa 2008-09-20 18:31:01

+1

2 названия: Эрик Д. Шейер Масатака. Получите их в Google, они написали об обнаружении биений (в реальном времени и в автономном режиме). Очень интересный материал. Кроме того, как побочный элемент, я думаю, помимо обнаружения биений вас может заинтересовать бит-предсказание *. – Led 2009-05-30 23:58:41

+0

Я считаю, что у вас есть необходимые алгоритмы. также, много интересных алограмм для машинного обучения для большего удовольствия! есть пример в учебных программах/примерах, если я правильно помню. accord.net – user3791372 2017-05-23 23:52:42

ответ

6

Это отнюдь не простая проблема. Я постараюсь дать вам обзор.

Что вы могли бы сделать что-то вроде следующего:

  1. Вычислить среднее (среднеквадратическое) громкость сигнала над блоками, скажем, 5 мс. (Никогда не делал этого раньше, я не знаю, какой будет хороший размер блока.)
  2. Возьмите преобразование Фурье «заблокированного» сигнала, используя алгоритм FFT.
  3. Найдите компонент в преобразованном сигнале, который имеет наибольшую величину.

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

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

+0

1. Вычислить среднюю (среднеквадратичную) громкость сигнала над блоками, скажем, 5 миллисекунд. (Никогда не делал этого раньше, я не знаю, какой будет хороший размер блока.) 2. Возьмите преобразование Фурье «заблокированного» сигнала, используя алгоритм БПФ. 3. Найдите компонент в преобразованном сигнале, который имеет наибольшую величину. Я не могу понять, почему вы сначала rms-сигнал, и почему это делается на блоках (поскольку FFT обычно работает на окнах сигнала в любом случае). Кроме того, БПФ даст вам сигнал, смещенный в область с энергетическим временем, так что это действительно то же самое, что и firs – 2008-09-17 09:11:32

8

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

Рядом с проверкой будут попадания хитов. Вам нужно будет это сделать. «Трещина» от ловушки составляет около 1,5 кГц из памяти, но вам нужно обязательно закрепить это.

Следующей задачей было бы разработать алгоритм для фанковых ударов. Как бы вы запрограммировали поиск бита 1? Я думаю, вы будете отслеживать предыдущие удары и использовать шаблон, соответствующий чему-то другому. Таким образом, вам, вероятно, понадобится несколько баров, чтобы точно найти ритм. Тогда есть проблемы с синхронизацией, такие как 4/4, 3/4, 6/8, ничего себе, я не могу себе представить, что потребуется для этого точно! Я уверен, что это будет стоить серьезных денег для аудио-аппаратных/программных компаний.

+0

, и, вероятно, именно поэтому окончательный ответ (не говоря уже о образцах кода!) Так сложно найти в Google;) – GONeale 2014-10-27 02:44:31

15

Существует отличный проект под названием «Танцующие обезьяны», который процедурно генерирует шаги танца DDR от музыки. Большая часть того, что она делает, основана на (обязательно очень точном) анализе бит, и их проектная статья подробно описывает различные алгоритмы обнаружения биений и их пригодность для выполнения задачи. Они включают ссылки на оригинальные статьи для каждого из алгоритмов. Они также опубликовали код Matlab для своего решения. Я уверен, что между ними вы сможете найти то, что вам нужно.

все это доступно здесь: http://monket.net/dancing-monkeys-v2/Main_Page

26

Вычислить powerspectrum с скользящего окна FFT: Возьмите 1024 образцов:

double[] signal = stream.Take(1024); 

Поток его алгоритма FFT:

double[] real = new double[signal.Length]; 
double[] imag = new double[signal.Length); 
FFT(signal, out real, out imag); 

Вы получит реальную часть и мнимую часть. НЕ выбрасывайте мнимую часть. Сделайте то же самое с реальной частью, что и воображаемая. Хотя верно, что мнимая часть pi/2 не соответствует фазе реального, она все еще содержит 50% информации о спектре.

EDIT:

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

for (i=0; i < real.Length; i++) real[i] = real[i] * real[i]; 

Аналогично для мнимой части ,

for (i=0; i < imag.Length; i++) imag[i] = imag[i] * imag[i]; 

Теперь у вас есть спектр мощности для последних 1024 образцов. Где первая часть спектра - это низкие частоты, а последняя часть спектра - это высокие частоты .

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

double bassIntensity = 0; 
for (i=8; i < 96; i++) bassIntensity += real[i]; 

Теперь сделать то же самое еще раз, но переместить окно 256 образцов, прежде чем вычислить новый спектр. Теперь вы закончите вычисление bassIntensity для каждых 256 выборок.

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

Удачи вам!

0

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

1

Прежде всего, то, что производит Hallgrim, не является функцией спектральной плотности мощности. Статистические периодичности в любом сигнале могут выводиться через автокорреляционную функцию. Преобразование Фурье автокорреляционного сигнала представляет собой спектральную плотность мощности. Доминирующие пики в PSD, отличные от 0 Гц, будут соответствовать эффективной периодичности в сигнале (в Гц) ...

 Смежные вопросы

  • Нет связанных вопросов^_^