Перейти к содержанию

    

Экстраполяция синусоидальной последовательности отсчётов.

Имеется последовательность из N отсчётов некоей величины. Sample time - const. Величина изменяется по закону близкому к синусоидальному. Необходимо вычислить ближайшие следующие 1...2 отсчёта последовательности на основании имеющихся N значений.

Подскажите - какой алгоритм экстраполяции здесь можно использовать? Желательно не сильно требовательный по ресурсам (выполняться должен в МК с довольно большой частотой отсчётов). В инете почти везде, где идёт речь об экстраполяции, говорят о линейной экстраполяции. Но линейная тут не подходит, так как период сигнала может быть очень малым, он по ТЗ >= 10 отсчётам. Да и о линейной я бы не спрашивал - там всё просто.

Может кто подскажет - что именно нужно искать? Или даст ссылку на описание алгоритма или исходники его реализующие?

Догадываюсь, что можно прогнать сигнал через ФНЧ, дополнив его в хвосте нулями и получить желаемые отсчёты. Но тогда непонятно как учесть фазовую задержку, которая получится? Ведь частота сигнала заранее неизвестна и может изменяться в широких пределах.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

https://authors.library.caltech.edu/25063/1/S00086ED1V01Y200712SPR003.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вместо линейной можно сделать кубическую или даже 5-й степени. Так же, как интерполяцию. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

экстраполировать полиномами высокой степени - имхо плохая идея, они в отличии от интерполяции будут погоду показывать.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
10 часов назад, petrov сказал:

Я ещё в изначальном сообщении писал, что линейная экстраполяция меня не интересует. Из-за характера сигнала.

 

3 часа назад, ViKo сказал:

Вместо линейной можно сделать кубическую или даже 5-й степени. Так же, как интерполяцию. 

Я знаю что "можно". Вопрос был о конкретном алгоритме (ссылке на его описание или исходник реализации).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
1 час назад, _pv сказал:

экстраполировать полиномами высокой степени - имхо плохая идея, они в отличии от интерполяции будут погоду показывать.

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

Он только близок к синусоидальному. Часто именно синусоидальный. Но в ряде случаев может иметь синусоидальность на очень ограниченном интервале сэмплов: на высокой частоте (близкой к 10 сэмплам на период) - это может быть даже 1-2 периода сигнала, но на низких частотах за один период частота синусоиды может даже в несколько раз измениться. Т.е. - частота синусоиды может плавно нарастать, и если скажем при 0 градусов она была равна F, то при 359 градусов этого же периода она уже может быть равна F*3. Частота сигнала меняется в очень широких пределах: от почти 0 до 1/10 Fs.

Поэтому я и писал, что нужен метод экстраполяции по последним нескольким сэмплам. Пускай даже не очень точный.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
9 hours ago, petrov said:

Линейное предсказание - это просто экстраполяция рациональной функцией. Т.е в контексте вопроса довольно бредовое предложение  

Главную синусоиду  определяют с помощью Фурье или вычислительно аналогичной корреляции. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 минуты назад, AlexandrY сказал:

Линейное предсказание - это просто экстраполяция рациональной функцией. Т.е в контексте вопроса довольно бредовое предложение  

Главную синусоиду  определяют с помощью Фурье или вычислительно аналогичной корреляции. 

Фурье не поможет - частота сигнала может сильно меняться. За период может измениться в разы. см.выше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 minutes ago, jcxz said:

Частота сигнала меняется в очень широких пределах: от почти 0 до 1/10 Fs.

Значит надо укорачивать интервалы до отрезков где синусоида меняется в пределах погрешности. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
3 минуты назад, AlexandrY сказал:

Значит надо укорачивать интервалы до отрезков где синусоида меняется в пределах погрешности. 

Ну хорошо - сделали Фурье. А дальше что? Как следующий сэмпл предсказать?

Фурье не подходит ещё по причине больших вычислительных расходов (как писал в исходном сообщении). Ресурсов есть - менее 4800 тактов Cortex-M4F на один сэмпл. Даже лучше ещё эту цифру умножить на ~0.7. Или даже на 0.7 * 0.5

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
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. 
Не детская это тема.  

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По интерполяции здесь было несколько тем. Можно найти. Да и не только здесь. По 4 точкам проводится кубическая кривая. Экстраполяция полиномами, да, будет плоховатой для далеких времен, но нужна ведь рядом с реальными отсчетами. Думаю, сгодится. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
2 часа назад, _pv сказал:

экстраполировать полиномами высокой степени - имхо плохая идея, они в отличии от интерполяции будут погоду показывать.

Мне не нужно экстраполировать на много отсчётов вперёд. Мне нужно всего 1...2 отсчёта (см. исходное сообщение). А в качестве базы для построения могу использовать много предыдущих сэмплов. Поэтому нужен такой метод, который посмотрев на историю скажем из >= 3 прошлых сэмплов с точностью до +-20% предскажет следующие 1...2 сэмпла. И не потребует слишком много тактов CPU.

33 минуты назад, ViKo сказал:

По интерполяции здесь было несколько тем. Можно найти. Да и не только здесь. По 4 точкам проводится кубическая кривая. Экстраполяция полиномами, да, будет плоховатой для далеких времен, но нужна ведь рядом с реальными отсчетами. Думаю, сгодится. 

Все алгоритмы интерполяции заточены именно на интервал "внутри". Я понимаю, что как-то можно их переделать под интервал "вовне", но для кубических и пр. - затрудняюсь это сделать. Для линейной конечно - без проблем.

Поэтому и прошу ссылку на описание где это разложено по шагам.

В принципе мне достаточно даже не значения через 1...2 сэмпла, а всего лишь знака - с какой стороны от оси Y ,  будут находиться сэмплы через некоторое время. Но время желательно иметь возможность задать точно, например: через 1.3 Ts.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
6 minutes ago, jcxz said:

Мне не нужно экстраполировать на много отсчётов вперёд. Мне нужно всего 1...2 отсчёта (см. исходное сообщение). А в качестве базы для построения могу использовать много предыдущих сэмплов. Поэтому нужен такой метод, который посмотрев на историю скажем из >= 3 прошлых сэмплов с точностью до +-20% предскажет следующие 1...2 сэмпла. И не потребует слишком много тактов CPU.

если сигнал меняется так быстро смотреть на много предыдущих отсчётов бестолку, они только испорят полином и он улетит непонятно куда, особенно высокой степени.

попробуйте постоить параболу по предыдущим трем точкам, потом кубическую по последним четырём, четвертой по пяти, ... 

начиная с какой-то степени будет становиться только хуже. так эмпирически и подберёте для вашего сигнала нужную степень.

потом ещё можно добавить МНК и строить полином не по N+1 последних точек, а по N+2, N+3, ... так подберёте оптимальную длину.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
14 минут назад, jcxz сказал:

Все алгоритмы интерполяции заточены именно на интервал "внутри". Я понимаю, что как-то можно их переделать под интервал "вовне", но для кубических и пр. - затрудняюсь это сделать. Для линейной конечно - без проблем.

Поэтому и прошу ссылку на описание где это разложено по шагам.

Снаружи, как и внутри - точно так же. Проводите кривую через 4 последних точки, смотрите, что будет на месте 5-й и 6-й. Но за 6-ю я не поручусь. :-)

Набираете поиск слова "интерполяция" на этом сайте...

О, ivana был ник у специалиста по интерполяциям.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти