Как проще выделить/найти колебания

 

Есть предобработанные данные, известно что центральная часть графика точно содержит колебания с частотой около (она немного "плавает") 1200 и 240

как можно быстро найти их смещения (фазу) ?

мысли крутятся около Фурье, но что-то никак в алгоритм не оформятся и кажется что это из пушки по воробьям :-)


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

на всяк. случай прикладываю табличку CSV, собственно данные - 2 я колонка, (или 3-я, более гладкая - там "соседи" просуммированы)

Файлы:
data.zip  62 kb
 
Maxim Kuznetsov:

мысли крутятся около Фурье, но что-то никак в алгоритм не оформятся и кажется что это из пушки по воробьям :-)

решение вот так сразу не подскажу, но тема интересная!

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

ЗЫ: вот в Вики, что то похожее 
 

Фурье.

Как вариант, если частота известна, то свертка с комплексной гармонической функцией (sin + i cos) дает комплексное число, модуль которого = амплитуда колебания, а фаза которого = фаза сигнала.

 

Есть такой алгоритм Гёрцеля, подобен преобразования Фурье, но только для одной частоты. Здесь на форуме даже его код когда-то был. Если поискать может и найти получится. Он довольно простой, между прочим.

Что-то нашлось - https://www.mql5.com/ru/forum/117594/page18#comment_3135991

 
Еще в природе существует алгоритм MESA - это корреляция к синусоиде, как раз фазу показывает - если 1 - в фазе, -1 - в противофазе и соответственно промежуточные значения.
 

кому интересно или столкнётся со схожей задачей:

оказалось сильно проще

достаточно просуммировать по модулю Х и всё тайное становится явным :-)

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

Когда меньший цикл менее выразителен получается вообще прелесть:


 
Maxim Kuznetsov:

кому интересно или столкнётся со схожей задачей:

оказалось сильно проще

достаточно просуммировать по модулю Х и всё тайное становится явным :-)

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

Когда меньший цикл менее выразителен получается вообще прелесть:


это Вы случайно подобрали формулу и выполнили  свертку последовательностей

 
Igor Makanu:

это Вы случайно подобрали формулу и выполнили  свертку последовательностей

:-)

в таком деле случайностей не бывает.

это всё плоды длительных раздумий и природной лени :-) Лень писать Фурье или ломать зубы об иной вышмат  когда очевидно должно быть более простое решение.

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

 
Maxim Kuznetsov:

достаточно просуммировать по модулю Х и всё тайное становится явным :-)

А что такое "просуммировать по модулю Х"? можете написать формулу или строчку кода?

p.s. что-то ваши циклы не очень-то просматриваются на исходном графике) Вы уверены что ошибок нигде нет?

 
secret:

А что такое "просуммировать по модулю Х"? можете написать формулу или строчку кода?

p.s. что-то ваши циклы не очень-то просматриваются на исходном графике) Вы уверены что ошибок нигде нет?

// псевдокод:

int total=ArraySize(data);

for(int t=0;t<total;t++) {

   modulo[t%PERIOD]+=data[t];

}

 
Maxim Kuznetsov:

// псевдокод:


   modulo[t%PERIOD]+=data[t];

}

Понятней не стало.    А можно  на пальцах эту строчку пояснить, если не сложно.  Кто на ком стоит, то есть что к чему здесь прибавляется и что такое t%PERIOD.

Причина обращения: