Удары в минуту от аудиовхода в реальном времени

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

43
задан Helder Pereira 18 August 2017 в 07:45
поделиться

5 ответов

Вычислите powerspectrum с раздвижным окном FFT: Возьмите 1 024 образца:

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

Канал это к Алгоритму бпф:

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

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

РЕДАКТИРОВАНИЕ:

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

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];

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

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

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

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

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

Удачи!

26
ответ дан user3728501 26 November 2019 в 23:02
поделиться

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

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

15
ответ дан Nick Johnson 26 November 2019 в 23:02
поделиться

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

рядом с проверкой были бы хиты ловушки. У Вас был бы к EQ этот. "Трещина" от ловушки составляет приблизительно 1.5 кГц из памяти, но необходимо было бы определенно пропустить этого.

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

8
ответ дан Dan Harper 26 November 2019 в 23:02
поделиться

Это ни в коем случае не легкая проблема. Я попытаюсь дать Вам обзор только.

то, Что Вы могли сделать, является чем-то как следующее:

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

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

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

6
ответ дан Thomas 26 November 2019 в 23:02
поделиться

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

0
ответ дан 26 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: