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

Сами мы не местные, в смысле, я же не математик и понимаю, что мой вопрос может быть из разряда просьбы к френду-программисту "а напиши мне к завтрему с нуля аналог 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) получается ЭТО:



Есть идеи?

Date: 2015-12-26 04:41 pm (UTC)
From: [identity profile] http://users.livejournal.com/taras_/
1. Если не нужна какая-то супер точность, то можно использовать простенькую интерполяцию: http://dspguru.com/dsp/howtos/how-to-interpolate-fft-peak 2. Идеальная интерполяция ДПФ получится, если увеличивать длину сигнала, дополняя его нулями (http://www.dsprelated.com/freebooks/sasp/Spectral_Interpolation.html). Но придется делать fft для более длинных сигналов. 3. Если нужна именно супер точность, то соответствующие методы есть, но я в них не силен. 4. Глядя на функцию Z можно заметить, что (m-k)/N - величина маленькая, значит exp(2pi*j*(m-k)/N) примерно равна 1. То есть знаменатель первого слагаемого очень мал. Если мы не находимся на краю диапазона, когда m+k близко к 0 или N, то вторым слагаемым можно смело пренебречь, после чего задачка решается аналитически.

Date: 2015-12-26 05:15 pm (UTC)
From: [identity profile] psilogic.livejournal.com
Спасибо вам огромное, то что нужно!!!

Обязательно буду пробовать вариант 1.

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

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

Вариант 4 - тоже обязательно попробую! И оформлю на сайте, сославшись на вас как на автора идеи - так что, если хотите увидеть там реальное ФИО вместо taras_, кидайте сюда :)

Date: 2015-12-26 05:22 pm (UTC)
From: [identity profile] psilogic.livejournal.com
[ то вторым слагаемым можно смело пренебречь ]

- а вот это вот не понял, почему пренебречь?

допустим k поcредине в районе N/4, m - там же, тогда exp(-2pi*j*(m+k)/N) ~ exp(-pi*j/2) ~ -j ... э... ну и?

Date: 2015-12-26 06:12 pm (UTC)
From: [identity profile] http://users.livejournal.com/taras_/
[допустим k поcредине в районе N/4, m - там же, тогда exp(-2pi*j*(m+k)/N) ~ exp(-pi*j/2) ~ -j ... э... ну и?]

В знаменателе второго слагаемого будет -j-1, то есть его модуль sqrt(2). Допустим, m-k = 0.5, N = 1000, тогда в модуль знаменателя первого слагаемого

|exp(2pi*j/2000) - 1| = 3.1416e-03

то есть примерно в 450 раз меньше.

Теперь посмотрим на числители. Поскольку exp(2*pi*j*k) = 1 для всех целых k, то

exp(2*pi*j*(m-k)) = exp(2*pi*j*(m+k)) = exp(2*pi*j*m)

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

Если ссылаться, то можно, например, сюда: http://www.tvd-home.ru/

Date: 2015-12-26 06:49 pm (UTC)
From: [identity profile] psilogic.livejournal.com
а, блин, тормозил, не туда смотрел
ещё раз спасибо :)
Page generated Sep. 1st, 2025 01:12 am
Powered by Dreamwidth Studios