2016-05-07 1 views
0

То, что я пытаюсь достичь, - это отличить отдельные заметки в аудиофайле. Для простоты можно сказать, что несколько нот играют один за другим. Главный вопрос - как определить, когда играется следующая нота?
То, что я уже сделал, - это чтение образцов из аудиофайла и выполнение преобразования Фурье на этих образцах с использованием библиотеки JTransforms. Вот что я получаю:
piano note E.
Затем я вычислил спектр на основе данных, полученных FFT, и вот что я получаю:
piano note E.
Как я понимаю, более крупные «столбцы» на графике - это гармоники, а маленькие - это шум и другие не гармонические обертоны, верно?Различают ноты алгоритм FFT

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

В качестве побочного вопроса, знаете ли вы, какие-нибудь легкие и быстрые библиотеки для визуализации таких данных? Потому что использование JFreeChart для больших наборов данных - настоящая боль для моего процессора.

+2

Если вы хотите идентифицировать музыкальные ноты, вам необходимо выполнить [** определение высоты тона **] (https://en.wikipedia.org/wiki/Pitch_detection_algorithm). Обратите внимание, что шаг - это не то же самое, что частота. Это не то же самое, что частота основного компонента (f0). Читайте на Harmonic Product Spectrum, который является популярным методом определения высоты тона. –

+0

Я считаю, что это связано с обработкой сигналов. Я думаю, вам нужно применить фильтры (как в полосовых фильтрах, чтобы проверить, присутствует ли частота в сигнале). В основном используйте полосовой фильтр для проверки A, B, C, D и т. Д. Использование FFT не позволяет узнать, было ли какое-то конкретное примечание воспроизведено перед другим (по крайней мере, насколько мне известно), поскольку оно основано на частоте. Возможно, вы можете попробовать проверить сигнал (с применением FFT), пока не найдете заметку с использованием (полосовой фильтр), и после этого возьмите еще один образец времени, применяя тот же метод. Не знаю, будет ли это дорогостоящим вычислительным процессом или нет. –

+0

@PaulR Я видел много ваших сообщений о обработке сигналов здесь, в stackoverflow, у вас случается какой-то блог, если вы решили поделиться своими исследованиями в этой области? Могу ли я связаться с вами через что-то другое, чем stackoverflow? В настоящее время я работаю над огромным проектом, который имеет множество подпроектов, связанных с распознаванием тональности, распознаванием речи нейронными сетями и чтением некоторых фрагментов информации в Интернете не очень полезно. –

ответ

1

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

Для воспроизведения заметок (например, музыки) можно сделать что-то подобное, за исключением использования метода определения/оценки высоты тона (вместо простых величин БПФ, которые не являются надежными) на достаточно коротких временных окнах данных.

+0

, что вы подразумеваете под словами _expected burst length_? Длина массива с образцами или временем (например, секунд)? Btw, фильтры Goertzel не очень хороши для моего случая, потому что я пытаюсь найти частоты ** и **, когда происходят эти частоты. –

+0

Длина окна влияет на компромисс между частотным разрешением. Таким образом, более короткое/меньшее временное разрешение (в секундах или образцах, как требуется для более коротких тонов) требует более коротких окон. Фильтр Goertzel с окном идентичен оконному FFT (1 бит, для той же длины окна). – hotpaw2