psilogic: (wpriz)
psilogic ([personal profile] psilogic) wrote2015-12-26 03:59 pm

Вопрос математикам

Я тут пытаюсь оптимизировать свой алгоритм анализа спектра. И походу опять вылез вопрос с решением одной хитрой системы уравнений. Я её сейчас решаю численно, методом последовательных приближений. Что медленно. Но, возможно есть более прямое решение? Если френды-математики смогут что-то посоветовать хотя бы в какую сторону копать, буду благодарен и напишу благодарность и ссылочку на вас в соответствующем материале на сайте.

Сами мы не местные, в смысле, я же не математик и понимаю, что мой вопрос может быть из разряда просьбы к френду-программисту "а напиши мне к завтрему с нуля аналог Microsoft Word". А, может, наоборот - решение на поверхности, а я его в упор не вижу, так как не математик.

Итак.

Дана вот такая функция Z(m,φ,k) =


где
N - целое, положительное, известно
k - целое от 0 до N/2, известно
m - действительное, превосходящее k не более, чем на 1, неизвестная
φ - действительное (фаза) от -пи до +пи, неизвестная
j - мнимая единица,
Z(m,φ,k) - комплексная функция.
Цель - найти m,φ

Известно отношение модулей |Z(m,φ,k)|/|Z(m,φ,k+1)|, известны комплексные фазы (аргументы) Z(m,φ,k) и Z(m,φ,k+1).
Сейчас я численно решаю систему
|Z(m,φ,k)|/|Z(m,φ,k+1)| = A
Arg(Z(m,φ,k+1)) = B
- путем попеременного варьирования m,φ

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

Иллюстрация: нота ля-бемоль в музыкальной записи с частотой дискретизации 44100 Гц. В исходном сигнале - единственная гармоника в районе 415 Гц и амплитудой 10000, а в результате преобразования Фурье (N = 1000) получается ЭТО:



Есть идеи?

[identity profile] metaclass.livejournal.com 2015-12-26 01:16 pm (UTC)(link)
https://en.wikipedia.org/wiki/Pitch_detection_algorithm
тут названия алгоритмов в frequency domain

[identity profile] psilogic.livejournal.com 2015-12-26 01:19 pm (UTC)(link)
Ага, я в курсе, даже нашел один интересный метод, но к этой задачке он прямого отношения не имеет.

[identity profile] metaclass.livejournal.com 2015-12-26 01:44 pm (UTC)(link)
Все pitch-tracking алгоритмы с точностью до fft bin что-ли определяют?

Сходу приходят в голову всякие идеи вроде найти первый и второй максимумы на fft и между ними искать частоту максимума или половинным делением (но тогда надо придумать функцию которая монотонно зависит от положения максимума между бинами) или попытаться определить ширину и количество лепестков (sin x/x) а из них - таблично искать положение максимума. Но это все надо экспериментировать.

[identity profile] psilogic.livejournal.com 2015-12-26 02:59 pm (UTC)(link)
[ Все pitch-tracking алгоритмы с точностью до fft bin что-ли определяют? ]

насчет всех не скажу, а обычный fft находит с точностью до (sample rate/N)

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

[identity profile] psilogic.livejournal.com 2015-12-26 03:01 pm (UTC)(link)
есть еще такой алгоритм
берут ДВА fft для соседних участков
потом смотрят, как изменилась фаза одной гармоники
и на основании изменения фазы сразу получают уточненную частоту

но это надо именно два последовательных fft иметь