Обновить
58

Пользователь

51
Подписчики
Отправить сообщение

Не исключаю, что если задействовать векторные инструкции процессора (как в FFTW), то возможно достичь большей скорости вычислений на тех же объёмах.

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

магическим математическим смыслом

Меня очень цепляет этот загадочный смысл. Не могу строго объяснить эти во многом интуитивные формулы и почему алгоритм работает, но он работает и весьма точно!)

---

Используемая вами реализация FFT, кстати, на больших размерах будет врать из-за накопления ошибок в роторе.

Вместо умножений там можно возводить в степень, будет чуть медленнее, но, предположительно, точнее

	//rotor *= rotorBase;
	rotor = Complex.Pow(rotorBase, i + 1);

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

Когда один человек начинает резко ломать картину мира другому, то другой зачастую начинает её защищать вплоть до ухода в иллюзии или игнорирование, поэтому важно быть в таких делах тактичнее и помягче ;)

Вот интересная иллюстрация про разные картины мира

Самое главное — не надо сидеть и смотреть ковёр, замкнувшись в своей проблеме. Почти всегда проблема может быть решена правильным подбором препаратов.

Хоть раз в жизни повидав, как чудесно расцветают ковры под психоделиками, по-новому проникаешься темой узоров и орнаментов в разных культурах... кто знает, может быть, отчасти поэтому людям свойственно позалипать на ковры в периоды душевной меланхолии.

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

Вещества могут лишь поддержать в напряжённые периоды, временно придать мотивации и сил, успокоить, снять некоторые барьеры и распутать клубки мыслей, дойти до глубинных мотиваций, подсказать неожиданные пути решения. Но только сам человек волен своим трудом и терпением проработать и преодолеть душевные трудности, вновь обрести вкус к жизни!

Спасибо, что глянули! Там в методе EnumeratePeaks небольшая ошибочка закралась.

Вместо

		var count = spectrum.Count / 2 - 3;

нужно

		var count = spectrum.Count - 3;

тогда высокочастотные компоненты не обрезаются. Подправлю это!

Для работы с плотными спектрами рекомендуется уплотнить шаг частотной решётки либо путём понижения частоты дискретизации, либо увеличением размера выборки. Например, для частоты 16000 Гц и длины выборки в 1024 отчсёта шаг решётки составляет 15.625 Гц, а длительность 64 мс, для комбинаций 8000/1024 и 16000/2048 уже 7.8125 Гц и 128 мс.

Тогда на ваших данных погрешности по частоте не превышают 0.2 Гц.

спойлер
F = 899.91 Hz, M = 0.99, P = 0.73
F = 949.90 Hz, M = 1.01, P = 0.79
F = 1000.00 Hz, M = 1.00, P = 0.78
F = 1050.13 Hz, M = 1.01, P = 0.77
F = 1100.10 Hz, M = 0.99, P = -0.34

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

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

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

То есть открывается большая свобода действий по обработке сигнала...

Спасибо, верно подметили!

Не совсем корректно выразил мысль: скажем, у нас есть выборка из 1024 отсчётов, передискретизируем её с частотой в два раза выше, чтобы получить уже 2048 отсчётов. При этом размер выборки и спектральное разрешение удвоится, но временная длительность выборки останется прежней.

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

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

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

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

Но для моих задач точности хватало, поэтому такими экспериментами не занимался. Проект же развивается на энтузиазме, мне просто интересно разбираться в этой теме, поэтому делюсь результатами в открытом доступе :)

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

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

Да, в открытом доступе есть реализации гитарных тюнеров на основе автокорреляции, но и они не лишены недостатков.

В статье представлен рабочий код, так что от «конкурентов» и альтернатив ожидается того же ;)

Добавлен раздел «песочница» со ссылкой на онлайн-компилятор, где можно самому пощупать алгоритм и поиграть с входными данными сигнала.

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

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

Например, если музыкант играет на клавишном инструменте, то программа должна показывать с достаточно высокой точностью, на какие клавиши он сейчас нажимает.

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

Код содержит все ключевые формулы.

:)

Добавил ссылку в разделе «песочница» на онлайн-компилятор с реализацией алгоритма, где можно его исследовать на различных сигналах.

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

В заключительной части статьи добавлен раздел ПЕСОЧНИЦА, который содержит ссылку на реализацию алгоритма ФАИ в онлайн-компиляторе, где можно можно поиграть с ним на различных сгенерированных сигналах

Ничего автор не добывает.

Алгоритм в результате наоборот убирает избыточную и малозначимую информацию, с довольно высокой точностью реконструируя идеальный сигнал.

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

Но... Чем вам C# не угодил? Это современнный (не побоюсь этого слова, передовой) язык программирования широкого предназначения. Синтаксически близок к Java, во многих аспектах опережает её, также есть немало общих черт с C++.

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

:)

Для распознавания нот банк узкополосных фильтров с выделением огибающей через преобразование Гильберта будет точнее.

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

«распознавание нот» и «тюнер для музыкальных инструментов» — это совершенно разные задачи

Тюнер - это точное распознование одной наиболее значимой ноты в сигнале, то есть частный случай более общей задачи по точному распознованию множества нот.

Ну а поскольку восстановление исходного сигнала в задачи автора не входило, то это у него и не получится.

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

Да, это неоднозначное восстановление с потерями, но и преимущество для определённых задач.

Лучший и худший - понятия довольно относительные, которые зависят от критериев оценки.

Первоочередная цель при создании приложения Solfeggio - точное распознавание нот из звуковых сигналов в режиме реального времени. С этой задачей ФАИ справляется на уровне автокорреляционных тюнеров для музыкальных инструментов, при этом в вычислительном плане метод не требователен к ресурсам.

Возможно, существуют ещё более совершенные подходы для решения подобного рода задач, но мне они не известны.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность