jcxz 166 17 октября, 2018 Опубликовано 17 октября, 2018 · Жалоба Имеется последовательность из N отсчётов некоей величины. Sample time - const. Величина изменяется по закону близкому к синусоидальному. Необходимо вычислить ближайшие следующие 1...2 отсчёта последовательности на основании имеющихся N значений. Подскажите - какой алгоритм экстраполяции здесь можно использовать? Желательно не сильно требовательный по ресурсам (выполняться должен в МК с довольно большой частотой отсчётов). В инете почти везде, где идёт речь об экстраполяции, говорят о линейной экстраполяции. Но линейная тут не подходит, так как период сигнала может быть очень малым, он по ТЗ >= 10 отсчётам. Да и о линейной я бы не спрашивал - там всё просто. Может кто подскажет - что именно нужно искать? Или даст ссылку на описание алгоритма или исходники его реализующие? Догадываюсь, что можно прогнать сигнал через ФНЧ, дополнив его в хвосте нулями и получить желаемые отсчёты. Но тогда непонятно как учесть фазовую задержку, которая получится? Ведь частота сигнала заранее неизвестна и может изменяться в широких пределах. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 6 17 октября, 2018 Опубликовано 17 октября, 2018 · Жалоба https://authors.library.caltech.edu/25063/1/S00086ED1V01Y200712SPR003.pdf Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба Вместо линейной можно сделать кубическую или даже 5-й степени. Так же, как интерполяцию. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 44 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба экстраполировать полиномами высокой степени - имхо плохая идея, они в отличии от интерполяции будут погоду показывать. раз сигнал синусоидальный, может завести цифровой осциллятор, его фапчем подгонять под сигнал и брать из него следующие значения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 166 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 10 часов назад, petrov сказал: https://authors.library.caltech.edu/25063/1/S00086ED1V01Y200712SPR003.pdf Я ещё в изначальном сообщении писал, что линейная экстраполяция меня не интересует. Из-за характера сигнала. 3 часа назад, ViKo сказал: Вместо линейной можно сделать кубическую или даже 5-й степени. Так же, как интерполяцию. Я знаю что "можно". Вопрос был о конкретном алгоритме (ссылке на его описание или исходник реализации). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 166 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 1 час назад, _pv сказал: экстраполировать полиномами высокой степени - имхо плохая идея, они в отличии от интерполяции будут погоду показывать. раз сигнал синусоидальный, может завести цифровой осциллятор, его фапчем подгонять под сигнал и брать из него следующие значения. Он только близок к синусоидальному. Часто именно синусоидальный. Но в ряде случаев может иметь синусоидальность на очень ограниченном интервале сэмплов: на высокой частоте (близкой к 10 сэмплам на период) - это может быть даже 1-2 периода сигнала, но на низких частотах за один период частота синусоиды может даже в несколько раз измениться. Т.е. - частота синусоиды может плавно нарастать, и если скажем при 0 градусов она была равна F, то при 359 градусов этого же периода она уже может быть равна F*3. Частота сигнала меняется в очень широких пределах: от почти 0 до 1/10 Fs. Поэтому я и писал, что нужен метод экстраполяции по последним нескольким сэмплам. Пускай даже не очень точный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 9 hours ago, petrov said: https://authors.library.caltech.edu/25063/1/S00086ED1V01Y200712SPR003.pdf Линейное предсказание - это просто экстраполяция рациональной функцией. Т.е в контексте вопроса довольно бредовое предложение Главную синусоиду определяют с помощью Фурье или вычислительно аналогичной корреляции. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 166 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 2 минуты назад, AlexandrY сказал: Линейное предсказание - это просто экстраполяция рациональной функцией. Т.е в контексте вопроса довольно бредовое предложение Главную синусоиду определяют с помощью Фурье или вычислительно аналогичной корреляции. Фурье не поможет - частота сигнала может сильно меняться. За период может измениться в разы. см.выше. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 2 minutes ago, jcxz said: Частота сигнала меняется в очень широких пределах: от почти 0 до 1/10 Fs. Значит надо укорачивать интервалы до отрезков где синусоида меняется в пределах погрешности. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 166 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 3 минуты назад, AlexandrY сказал: Значит надо укорачивать интервалы до отрезков где синусоида меняется в пределах погрешности. Ну хорошо - сделали Фурье. А дальше что? Как следующий сэмпл предсказать? Фурье не подходит ещё по причине больших вычислительных расходов (как писал в исходном сообщении). Ресурсов есть - менее 4800 тактов Cortex-M4F на один сэмпл. Даже лучше ещё эту цифру умножить на ~0.7. Или даже на 0.7 * 0.5 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 8 minutes ago, jcxz said: Фурье не подходит ещё по причине больших вычислительных расходов (как писал в исходном сообщении). Ресурсов есть - менее 4800 тактов Cortex-M4F на один сэмпл. Даже лучше ещё эту цифру умножить на ~0.7. Или даже на 0.7 * 0.5 Для плавающей синусоиды используют PLL - https://www.mathworks.com/help/physmod/sps/ref/sinusoidalmeasurementpll.html Но Фурье боюсь все равно придется задействовать чтобы определить параметы эстиматора с PLL. Не детская это тема. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба По интерполяции здесь было несколько тем. Можно найти. Да и не только здесь. По 4 точкам проводится кубическая кривая. Экстраполяция полиномами, да, будет плоховатой для далеких времен, но нужна ведь рядом с реальными отсчетами. Думаю, сгодится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 166 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 2 часа назад, _pv сказал: экстраполировать полиномами высокой степени - имхо плохая идея, они в отличии от интерполяции будут погоду показывать. Мне не нужно экстраполировать на много отсчётов вперёд. Мне нужно всего 1...2 отсчёта (см. исходное сообщение). А в качестве базы для построения могу использовать много предыдущих сэмплов. Поэтому нужен такой метод, который посмотрев на историю скажем из >= 3 прошлых сэмплов с точностью до +-20% предскажет следующие 1...2 сэмпла. И не потребует слишком много тактов CPU. 33 минуты назад, ViKo сказал: По интерполяции здесь было несколько тем. Можно найти. Да и не только здесь. По 4 точкам проводится кубическая кривая. Экстраполяция полиномами, да, будет плоховатой для далеких времен, но нужна ведь рядом с реальными отсчетами. Думаю, сгодится. Все алгоритмы интерполяции заточены именно на интервал "внутри". Я понимаю, что как-то можно их переделать под интервал "вовне", но для кубических и пр. - затрудняюсь это сделать. Для линейной конечно - без проблем. Поэтому и прошу ссылку на описание где это разложено по шагам. В принципе мне достаточно даже не значения через 1...2 сэмпла, а всего лишь знака - с какой стороны от оси Y , будут находиться сэмплы через некоторое время. Но время желательно иметь возможность задать точно, например: через 1.3 Ts. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 44 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 6 minutes ago, jcxz said: Мне не нужно экстраполировать на много отсчётов вперёд. Мне нужно всего 1...2 отсчёта (см. исходное сообщение). А в качестве базы для построения могу использовать много предыдущих сэмплов. Поэтому нужен такой метод, который посмотрев на историю скажем из >= 3 прошлых сэмплов с точностью до +-20% предскажет следующие 1...2 сэмпла. И не потребует слишком много тактов CPU. если сигнал меняется так быстро смотреть на много предыдущих отсчётов бестолку, они только испорят полином и он улетит непонятно куда, особенно высокой степени. попробуйте постоить параболу по предыдущим трем точкам, потом кубическую по последним четырём, четвертой по пяти, ... начиная с какой-то степени будет становиться только хуже. так эмпирически и подберёте для вашего сигнала нужную степень. потом ещё можно добавить МНК и строить полином не по N+1 последних точек, а по N+2, N+3, ... так подберёте оптимальную длину. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 14 минут назад, jcxz сказал: Все алгоритмы интерполяции заточены именно на интервал "внутри". Я понимаю, что как-то можно их переделать под интервал "вовне", но для кубических и пр. - затрудняюсь это сделать. Для линейной конечно - без проблем. Поэтому и прошу ссылку на описание где это разложено по шагам. Снаружи, как и внутри - точно так же. Проводите кривую через 4 последних точки, смотрите, что будет на месте 5-й и 6-й. Но за 6-ю я не поручусь. :-) Набираете поиск слова "интерполяция" на этом сайте... О, ivana был ник у специалиста по интерполяциям. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться