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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Вычислите 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. Когда бас тих, у Вас нет удара и когда это громко, у Вас есть удар.
Удачи!
Существует превосходный проект под названием Танцующие Обезьяны, который процедурно генерирует шаги танца DDR от музыки. Значительная часть того, что это делает, на основе (обязательно очень точна) анализ удара, и их статья проекта вдается в большое количество подробностей, описывающих различные алгоритмы обнаружения удара и их пригодность к задаче. Они включают ссылки на исходные бумаги для каждого из алгоритмов. Они также опубликовали код matlab для своего решения. Я уверен, что между теми можно найти то, в чем Вы нуждаетесь.
Это все доступно здесь: http://monket.net/dancing-monkeys-v2/Main_Page
Не то, чтобы у меня есть подсказка, как реализовать это, но с точки зрения звукотехники необходимо было бы отфильтровать сначала. Басовые хиты барабана были бы первыми для проверки. Фильтр низких частот, который дает Вам что-либо приблизительно под 200 Гц, должен дать Вам довольно четкое изображение басового барабана. Логический элемент мог бы также быть необходим для очистки любая помеха от других инструментов с гармониками тот низко.
рядом с проверкой были бы хиты ловушки. У Вас был бы к EQ этот. "Трещина" от ловушки составляет приблизительно 1.5 кГц из памяти, но необходимо было бы определенно пропустить этого.
следующая проблема состояла бы в том, чтобы разработать алгоритм для броских ударов. Как Вы программно нашли бы удар 1? Я предполагаю, что Вы отслеживали бы предыдущие удары и использовали бы то или другое сопоставления с образцом. Так, Вам, вероятно, были бы нужны несколько панелей для точного нахождения удара. Тогда там синхронизирует проблемы как 4/4, 3/4, 6/8, ничего себе, я не могу вообразить то, что потребовалось бы, чтобы делать это точно! Я уверен, что это стоило бы немного серьезных денег к аудио аппаратным средствам/компаниям-разработчикам программного обеспечения.
Это ни в коем случае не легкая проблема. Я попытаюсь дать Вам обзор только.
то, Что Вы могли сделать, является чем-то как следующее:
преобразование Фурье А является в основном способом вычислить силу всех частот, существующих в сигнале. Если Вы сделаете это по "заблокированному" сигналу, частота удара, надо надеяться, будет самой сильной.
, Возможно, необходимо применить фильтр сначала, чтобы сфокусироваться на определенных частотах (как бас), которые обычно содержат большую часть информации о BPM.
Простой способ сделать это состоит в том, чтобы сделать, чтобы пользователь коснулся кнопки в ритме с ударом и считал количество касаний разделенным к этому времени.