Проверьте наличие определенного c звука (вход: микрофон) - PullRequest
2 голосов
/ 04 февраля 2020

Моя проблема : в настоящее время у меня есть звуковой файл, содержащий указанный c записанный мной звук. Я хочу иметь возможность распознавать, когда этот звук воспроизводится снова в течение более 2 секунд. Громкость не имеет значения для меня, я хочу быть в состоянии распознать, когда эта конкретная нота c играет. Например, файл содержит запись ноты A (la), и если я сыграю ноту A на пианино рядом с микрофоном, Raspberry Pi напечатает «правильно» или что-то в этом роде. У меня возникают проблемы с распознаванием заметки, и предыдущие исследования предложили найти частоту / использовать функцию БПФ, но я не смог ее выяснить. Вы рекомендуете какие-либо библиотеки, которые я должен использовать, чтобы реализовать это?

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

1 Ответ

1 голос
/ 05 февраля 2020

Вы действительно хотите использовать что-то вроде FFT, которое предлагают numpy и scipy. Идея состоит в том, что вы собираете буфер входа микрофона, накладываете на него БПФ, а затем попытаетесь найти, является ли самая мощная частота той ноты, которую вы ищете. Существует таблицы , которые могут сказать вам, какова частота каждой ноты.

По сути, вы делаете спектрограмму .

Если вы хотите порядок операций:

  1. Строительная шкала частот:
    1. Определите шкалу частот, используя np.fft.fftfreq (N соответствует длине вашего буфера)
  2. Создание таблицы заметок
    1. Establi sh Какая частота принадлежит какой ноте (используйте ссылку)
    2. Определение погрешности
  3. Идентификационные заметки (эта часть в общем oop)

    1. Собрать сигнал в буфер выбранного размера

    2. Применить FFT

    3. Найти наибольшее значение в частотной области

    4. Искать соответствующую заметку в диапазоне ошибок при поиске таблица

Полезные функции:

Numpy FFT

Numpy FFTFREQ

Numpy ARGMAX

Другие полезные вопросы:

Поддерживать вход потокового микрофона в Python

...