Почему PitchDetection лучше работает со свистом?

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

Ссылка на скриншот приложения: https://0110.be/files/photos/392/UtterAsterisk.png

В этой программе 3 раздела:

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

Мне интересно, почему этот код лучше всего работает со свистом?

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

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

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

У меня такое ощущение, что свист создает единую ноту, тогда как крякающий звук (как утка) на самом деле является гармоникой (надеюсь, я понял это правильно: несколько нот смешаны для создания звука).

Строка 151, 152: https://github.com/JorenSix/TarsosDSP/blob/master/src/examples/be/tarsos/dsp/example/UtterAsterisk.java

// add a processor, handle percussion event.
dispatcher.addAudioProcessor(new PitchProcessor(algo, sampleRate, bufferSize, this));

Я полагаю, что PitchProcessor будет обрабатывать только один пик, поскольку он возвращает pitchDetectionResult, который содержит только одну частоту (строка 59): https://github.com/JorenSix/TarsosDSP/blob/master/src/core/be/tarsos/dsp/pitch/PitchDetectionResult.java

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

Спасибо за ваш вклад!

1 ответ

Решение

Кажется вероятным, что ответ прямо здесь.

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

Кажется вероятным, что эти "звуки" являются результатом нескольких тонов, в которых свист (свист человека), вероятно, произведет один тон.

Для сравнения проверьте разницу между звучанием одной ноты (или клавиши), сыгранной на фортепиано, и аккордом (несколькими нотами), сыгранным на фортепиано.

Другой вариант - использовать телефон для получения звука набора (например, нажмите 7) или свист. Телефон воспроизводит звуки DTMF (Dual Tone Blah Blah).

Другие вопросы по тегам