мысли крутятся около Фурье, но что-то никак в алгоритм не оформятся и кажется что это из пушки по воробьям :-)
решение вот так сразу не подскажу, но тема интересная!
у меня почему то сразу вспомнились комплексные числа, если не ошибаюсь, то коэффициент около мнимой единицы и будет угол синуса (или косинуса?)... гуглить нужно,совсем формулы не помню
ЗЫ: вот в Вики, что то похожееФурье.
Как вариант, если частота известна, то свертка с комплексной гармонической функцией (sin + i cos) дает комплексное число, модуль которого = амплитуда колебания, а фаза которого = фаза сигнала.
Есть такой алгоритм Гёрцеля, подобен преобразования Фурье, но только для одной частоты. Здесь на форуме даже его код когда-то был. Если поискать может и найти получится. Он довольно простой, между прочим.
Что-то нашлось - https://www.mql5.com/ru/forum/117594/page18#comment_3135991
кому интересно или столкнётся со схожей задачей:
оказалось сильно проще
достаточно просуммировать по модулю Х и всё тайное становится явным :-)
биения это меньший цикл (он тут явно выражен и кратен большему), смещение/фаза считаются от минимума/максимума.
Когда меньший цикл менее выразителен получается вообще прелесть:
кому интересно или столкнётся со схожей задачей:
оказалось сильно проще
достаточно просуммировать по модулю Х и всё тайное становится явным :-)
биения это меньший цикл (он тут явно выражен и кратен большему), смещение/фаза считаются от минимума/максимума.
Когда меньший цикл менее выразителен получается вообще прелесть:
это Вы случайно подобрали формулу и выполнили свертку последовательностей
:-)
в таком деле случайностей не бывает.
это всё плоды длительных раздумий и природной лени :-) Лень писать Фурье или ломать зубы об иной вышмат когда очевидно должно быть более простое решение.
и кстати общего с приведённой статьей вики не заметил. Просто прямое решение из определений - если в последовательности есть более-менее чёткий цикл N то если её разбить на группы по N (взять по модулю и опцонально просуммировать) то экстремумы будут группироваться и укажут фазу.
достаточно просуммировать по модулю Х и всё тайное становится явным :-)
А что такое "просуммировать по модулю Х"? можете написать формулу или строчку кода?
p.s. что-то ваши циклы не очень-то просматриваются на исходном графике) Вы уверены что ошибок нигде нет?
А что такое "просуммировать по модулю Х"? можете написать формулу или строчку кода?
p.s. что-то ваши циклы не очень-то просматриваются на исходном графике) Вы уверены что ошибок нигде нет?
// псевдокод:
int total=ArraySize(data);
for(int t=0;t<total;t++) {
modulo[t%PERIOD]+=data[t];
}
// псевдокод:
modulo[t%PERIOD]+=data[t];
}
Понятней не стало. А можно на пальцах эту строчку пояснить, если не сложно. Кто на ком стоит, то есть что к чему здесь прибавляется и что такое t%PERIOD.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Есть предобработанные данные, известно что центральная часть графика точно содержит колебания с частотой около (она немного "плавает") 1200 и 240
как можно быстро найти их смещения (фазу) ?
мысли крутятся около Фурье, но что-то никак в алгоритм не оформятся и кажется что это из пушки по воробьям :-)
квадратиком обведена центральная часть, где краевые ошибки уже не сказываются
на всяк. случай прикладываю табличку CSV, собственно данные - 2 я колонка, (или 3-я, более гладкая - там "соседи" просуммированы)