Jump to content

    

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
10 часов назад, petrov сказал:

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

 

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

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

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

Share this post


Link to post
Share on other sites
1 час назад, _pv сказал:

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

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

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

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

Share this post


Link to post
Share on other sites
9 hours ago, petrov said:

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

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

Share this post


Link to post
Share on other sites
2 минуты назад, AlexandrY сказал:

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

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

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

Share this post


Link to post
Share on other sites
2 minutes ago, jcxz said:

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

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

Share this post


Link to post
Share on other sites
3 минуты назад, AlexandrY сказал:

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

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

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

Share this post


Link to post
Share on other sites
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. 
Не детская это тема.  

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
2 часа назад, _pv сказал:

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
6 minutes ago, jcxz said:

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

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

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

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

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

Share this post


Link to post
Share on other sites
14 минут назад, jcxz сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now