Частоты и амплитуды звукового файла в C#

Я пытаюсь создать программу, которая получает различные «ноты» в звуковом файле (WAV или MP3) и может получать частоту и амплитуду каждого из них. Я искал это, и, конечно, есть проблема различения отдельных «нот» в музыкальном файле, который не является MIDI, но кажется, что что-то в этом роде можно сделать с помощью NAudio или DirectSound. Любые идеи?

Спасибо!


person bramco    schedule 09.09.2012    source источник
comment
Здесь действительно есть две проблемы: чтение файла (простое) и извлечение заметок (сложное). Возможно, вам будет проще использовать функции анализа звука в Matlab или Mathematica.   -  person Chris Laplante    schedule 09.09.2012


Ответы (1)


То, что вы просите сделать, чрезвычайно сложно.

Первым шагом будет преобразование вашего аудио из временной области в частотную область. То есть вы берете несколько образцов и выполняете преобразование Фурье (реализованное в вашем программном обеспечении как БПФ).

Затем вы начинаете решать, что вы называете нотой или нет. Это не так просто, как выбрать самую громкую из частот! Разные инструменты имеют разный тембр, который создается различными гармониками. Если бы у вас была песня только о синусоидах, это было бы намного проще. Однако вы обнаружите, что начнете видеть заметки, где ваше ухо говорит вам, что их не существует.

Теперь в игру вступает психоакустика. Люди вполне могут «слышать» ноты, которые даже не имеют основного тона. Это особенно верно в музыкальном контексте. Если я возьму тромбон и начну играть гамму вниз, в какой-то момент основной тон исчезнет или почти исчезнет. Однако вы по-прежнему будете воспринимать эту шкалу как нисходящую, тогда как на самом деле основной звук практически исчез. В этот момент все становится действительно сложно.

Чтобы ответить на ваш вопрос, начните с БПФ. Возможно, этого достаточно для ваших нужд. Если нет, начните читать значительное количество технической литературы по этому вопросу.

person Brad    schedule 09.09.2012
comment
Как лучше всего реализовать БПФ? Я видел много упоминаний об этом, и я (отчасти) знаю, что это такое, но я не знаю, с чего начать. По сути, я хочу создать своего рода программу музыкальной визуализации, которая реагирует на амплитуду и частоту различных событий в песне (нот). - person bramco; 09.09.2012
comment
Очевидно, что это будет действительно продвинутая техника, но я хотел посмотреть, можно ли реализовать упрощенную версию. - person bramco; 09.09.2012
comment
Однако для монофонического отслеживания высоты тона БПФ НЕ лучший способ. aubio.org имеет несколько лучших реализаций. - person Bjorn Roche; 10.09.2012
comment
.Net C# имеет встроенные функции для БПФ и цифровых фильтров. Я изучаю. - person Sadat Rafi; 07.04.2020