Отметьте обнаружение начала

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

31
задан Björn Lindqvist 31 January 2019 в 16:09
поделиться

5 ответов

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

alt text

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

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

простое решение А состоит в том, чтобы использовать несколько парадоксально именованное сжатие ( не сжатие MP3 - это - что-то еще полностью ) на Вашем волновом файле сначала. Сжатие по существу сглаживает скачки в Ваших аудиоданных и затем усиливает все так, чтобы больше аудио было около максимальных значений. Эффект на вышеупомянутый образец был бы похож на это (который показывает, почему имя "сжатие", кажется, не имеет никакого смысла - на аудиооборудовании, которое это обычно маркируется "громкость"):

alt text

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

В кодировании условий, файл WAV, загруженный в память, является по существу просто массивом двухбайтовых целых чисел, где 0 не представляет сигнала и 32,767, и-32 768 представляют пики. В его самой простой форме пороговый алгоритм обнаружения только запустился бы при первом образце и прочитал бы массив, пока он не находит значение больше, чем порог.

short threshold = 10000;
for (int i = 0; i < samples.Length; i++)
{
    if ((short)Math.Abs(samples[i]) > threshold) 
    {
        // here is one note onset point
    }
}

На практике это работает ужасно, так как нормальное аудио имеет все виды переходных скачков выше данного порога. Одно решение состоит в том, чтобы использовать рабочую среднюю мощность сигнала (т.е. не отмечайте запуск, пока среднее число последних n образцов не выше порога).

short threshold = 10000;
int window_length = 100;
int running_total = 0;
// tally up the first window_length samples
for (int i = 0; i < window_length; i++)
{
    running_total += samples[i];
}
// calculate moving average
for (int i = window_length; i < samples.Length; i++)
{
    // remove oldest sample and add current
    running_total -= samples[i - window_length];
    running_total += samples[i];
    short moving_average = running_total / window_length;
    if (moving_average > threshold)
    {
        // here is one note onset point 
        int onset_point = i - (window_length / 2);
    }
}

Все это требует, чтобы много тонкой настройки и проигрывания вокруг с настройками заставили это находить положения запуска файла WAV точно, и обычно какие работы для одного файла не будут работать очень хорошо над другим. Это - очень трудная и not-perfectly-solved проблемная область, которую Вы выбрали, но я думаю, что здорово, что Вы занимаетесь им.

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

alt text

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

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

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

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

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

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

, О, и довольно важный: термин "сжатие" здесь не относится к сжатию стиля MP3 .

Обновление снова: вот простая функция, которая делает нединамическое сжатие:

public void StaticCompress(short[] samples, float param)
{
    for (int i = 0; i < samples.Length; i++)
    {
        int sign = (samples[i] < 0) ? -1 : 1;
        float norm = ABS(samples[i] / 32768); // NOT short.MaxValue
        norm = 1.0 - POW(1.0 - norm, param);
        samples[i] = 32768 * norm * sign;
    }
}

, Когда параметрический усилитель = 1.0, эта функция не будет иметь никакого эффекта на аудио. Большие значения параметрического усилителя (2.0 хорошо, который придаст нормализованному различию квадратную форму между каждым образцом и макс. пиковым значением) произведут больше сжатия и более громкое полное (но дрянной) звук. Значения под 1,0 произведут эффект расширения.

Еще один, вероятно, очевидный факт: необходимо записать музыку в маленьком, non-echoic комната, так как эхо часто берется этим алгоритмом как фантомные примечания.

Обновление: вот версия StaticCompress, который скомпилирует в C#, и explicity бросает все. Это возвращает ожидаемый результат:

public void StaticCompress(short[] samples, double param)
{
    for (int i = 0; i < samples.Length; i++)
    {
        Compress(ref samples[i], param);
    }
}

public void Compress(ref short orig, double param)
{
    double sign = 1;
    if (orig < 0)
    {
        sign = -1;
    }
    // 32768 is max abs value of a short. best practice is to pre-
    // normalize data or use peak value in place of 32768
    double norm = Math.Abs((double)orig / 32768.0);
    norm = 1.0 - Math.Pow(1.0 - norm, param);
    orig = (short)(32768.0 * norm * sign); // should round before cast,
        // but won't affect note onset detection
}

Извините, мой счет знаний на Matlab 0. При регистрации другого вопроса на том, почему функция Matlab не работает как ожидалось, этому ответить (просто не я).

50
ответ дан 27 November 2019 в 22:05
поделиться

То, что Вы хотите сделать, часто называют WAV к midi (Google "wav к midi"). Было много попыток этого процесса, с переменными результатами (обратите внимание, что начало является одной из трудностей; полифония намного более трудна иметь дело с). Я рекомендовал бы запуститься с полного поиска стандартных решений и только запустил бы работу самостоятельно, если нет ничего приемлемого там.

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

Другой ответ: да, я сделал большую обработку цифровых сигналов (см. программное обеспечение на моем веб-сайте - это - синтезатор программного обеспечения бесконечной речи, записанный в VB и C), и я интересуюсь помощью Вам с этой проблемой. Часть WAV к midi не является действительно настолько трудной концептуально, она просто заставляет его работать надежно на практике, это твердо. Обратите внимание, что начало просто устанавливает порог - ошибки могут быть легко скорректированы вперед или назад вовремя компенсировать различия в нападении примечания. Обнаружение подачи намного легче сделать на записи, чем оно должно сделать в режиме реального времени и включает просто реализацию стандартной программы автокорреляции.

4
ответ дан 27 November 2019 в 22:05
поделиться

Необходимо посмотреть MIRToolbox - он записан для Matlab и встроил детектор начала - он работает вполне прилично. Исходный код является GPL'd, таким образом, можно реализовать алгоритм в любых работах языка для Вас. Какой язык Ваш производственный код собирается использовать?

4
ответ дан 27 November 2019 в 22:05
поделиться

эта библиотека центрируется вокруг аудио маркировки:

aubio

aubio является библиотекой для аудио маркировки. Его функции включают сегментацию звукового файла перед каждым из его нападений, выполнения обнаружения подачи, ответвления удара и создания потоков midi от живого аудио. Название aubio происходит от 'аудио' с опечаткой: несколько ошибок записи, вероятно, будут найдены в результатах также.

и мне везло с ним для обнаружения обнаружения и подачи начала. Это находится в c, но существуют обертки большого глотка/Python.

также, у автора библиотеки есть PDF его тезиса на странице, которая имеет большую информацию и фон о маркировке.

3
ответ дан 27 November 2019 в 22:05
поделиться

Вы могли попытаться преобразовать сигнал wav в график амплитуды против времени. Затем способ определить последовательное начало состоит в том, чтобы вычислить пересечение касательной в точке перегиба возрастающего фланга сигнала с осью X.

-1
ответ дан 27 November 2019 в 22:05
поделиться
Другие вопросы по тегам:

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