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

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

9 минут назад, _pv сказал:

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

Он меняется быстро только для низких частот. Для высоких - меняется мало. Т.е. когда сигнал имеет частоту близкую к Fs/10, то его частота к концу периода может измениться на <= 10%, а когда он имеет частоту около Fs/1000 то его частота на границах периода может отличаться даже в разы (в худшем случае).

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


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

2 часа назад, jcxz сказал:

 

 

2 часа назад, jcxz сказал:

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

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

При такой нечеткой постановке можно попробовать вейвлеты.

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


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

23 minutes ago, jcxz said:

Он меняется быстро только для низких частот. Для высоких - меняется мало. Т.е. когда сигнал имеет частоту близкую к Fs/10, то его частота к концу периода может измениться на <= 10%, а когда он имеет частоту около Fs/1000 то его частота на границах периода может отличаться даже в разы (в худшем случае).

вам конкретнее без сигналов никто больше ничего сказать не сможет.

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

ну либо МНК с полиномами, но степени и длину подбирать всё равно под сигнал придётся.

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


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

13 hours ago, jcxz said:

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

у вас сигнал меняется по закону Y=sin(X), где Х=wt в радианах.

т.е. Xn+1=Xn+DeltaX; а Y берётся из таблицы синусов.

 

при постоянной w, DeltaX постоянна

при снижении w, DeltaX увеличивается

при повышении w, DeltaX уменьшается

 

Это ФАПЧ.

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


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

Вполне себе работает простейший адаптивный линейный LMS предсказатель с одним комплексным коэффициентом на однотональном сигнале. На картинке: сигнал, предсказание, ошибка предсказания.

linear_prediction.png

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


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

4 часа назад, petrov сказал:

Вполне себе работает простейший адаптивный линейный LMS предсказатель с одним комплексным коэффициентом на однотональном сигнале. На картинке: сигнал, предсказание, ошибка предсказания.

Да, картинки красивые, но какой от них толк???

Мне нужно: формула? || алгоритм? В которые, если подставить N последних сэмплов, то оно выдаст 2 следующих прогнозируемых сэмпла. Всё.

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


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

On 10/18/2018 at 10:53 AM, jcxz said:

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

Если шумов нет, то по трем точкам S1, S2, S3 можно вычислить точное значение частоты и фазы синусоиды, после чего найти нужные значения экстраполяции.

 

Подробнее, тут: https://electronix.ru/forum/index.php?app=forums&amp;module=forums&amp;controller=topic&amp;id=129469&amp;page=3

 

Для значений S1, S2, S3 должно выполняться условие: abs(S1 + S3) < abs(2*S2).

 

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


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

26 минут назад, blackfin сказал:

Если шумов нет, то по трем точкам S1, S2, S3 можно вычислить точное значение частоты и фазы синусоиды, после чего найти нужные значения экстраполяции.

Шумы как раз есть. И могут быть довольно значительного уровня: процентов 10 точно, а может и больше.

Попробовал (Matlab) экстраполировать кубическим сплайном и сплайном Эрмита ('spline', 'cubic'): пока шума нет - всё отлично, но стоит добавить хоть немного шума - график может улететь очень далеко от цели  :(((

Вот на картинке привожу результат своего эксперимента (зелёная - идеальный исходный сигнал; синие кружки - взятые на нём отсчёты с добавленным шумом == 5%; фиолетовая и синяя кривые - результаты интерполяции вышеуказанными сплайнами; после исходных сэмплов я продолжил экстраполяцию ещё на требуемую мне длину в 2 сэмпла). На интервале интерполяции (между взятыми сэмплами) поведение вполне нормальное, но за пределами (экстраполяция) в зависимости от наложившегося шума, график может или примерно следовать как надо, а может (как на картинке ниже) улететь в произвольном направлении. Раз от разу (с разными шумовыми выборками) получается разный результат.  :((((((

matlab_interp1.thumb.png.cceff0fa22c93e0ede1420b71a041951.png

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


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

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

extrapolation.png.7a4bf78a28946a0aa524f4319a050f1e.png

полином (небольшой степени 2 или 3) надо наименьшими квадрадами на все N последних точек натягивать, а не сплайн через них проводить.

ну или сплайн, но smoothed, у которого дополнительно вторая производная ограничена, так что он сглаживает, а не ровно через заданные точки проходит.

http://www.alglib.net/interpolation/leastsquares.php#splinefit

 

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


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

jcxz

Мне нужно: формула? || алгоритм? В которые, если подставить N последних сэмплов, то оно выдаст 2 следующих прогнозируемых сэмпла. Всё.

Просто подставить вряд ли выйдет. Вот вам книжка с формулами:

Адаптивная обработка сигналов. Б. Уидроу, С.Стирнз

Вот моделька с алгоритмом:

adaptive_linear_prediction_2018_10_19.zip

matlab simulink R2016b

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


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

43 minutes ago, petrov said:

Вот моделька с алгоритмом:

adaptive_linear_prediction_2018_10_19.zip

Врядли эта моделька потянет на реальном железе. 

Берем реальное сэмплирование скажем 10 КГц. Реальный шум скажем в десять раз меньше сигнала (синяя линия внизу) и видим что LMS даже усиливает шум (желтая линия внизу)  с некоторых соотношений частоты сигнала к частоте выборки. 

Т.е. тут надо делать слишком высокую частоту выборки. Линейная экстраполяция лучше сработает. 

Capture.PNG

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


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

В 19.10.2018 в 21:36, petrov сказал:

А не могли бы Вы сохранить её в .mdl? У меня matlab2007 и он .slx не открывает.   :(

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


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

jcxz

А не могли бы Вы сохранить её в .mdl? У меня matlab2007 и он .slx не открывает.   :(

Сконвертировал для matlab R2009b.

adaptive_linear_prediction_2018_10_19.zip

 

 

 

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


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

54 минуты назад, petrov сказал:

jcxz

А не могли бы Вы сохранить её в .mdl? У меня matlab2007 и он .slx не открывает.   :(

Сконвертировал для matlab R2009b.

Теперь открывается просто пустой лист.  :(

Уже погонял экстраполяцию наименьшими квадратами. Работает нормально только если известен охватываемый выборкой сэмплов угол: когда угол сравнительно мал - лучше всего работает линейная экстраполяция (polyfit(x,y,1)); если угол больше, около pi/2 то лучше начинает работать polyfit(x,y,1), при дальнейшем увеличении угла лучше работают полиномы с ещё бОльшей степенью. Так что - надо учитывать текущую частоту и выбирать соответствующую степень полинома.

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


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

Вот еще вариант.

close all;
clear all;


x=rand(1,1000);
x=filter(ones(1,8)/8,1,upsample(x,8));
x=wrapToPi(filter(0.2*pi,[1 -1],x));
x=sin(x);
n=randn(1,length(x))*0.033;
x=x+n;%noise

mem=zeros(1,3);
y1=[];
y2=[];
y3=[];
e1=[];
e2=[];
e3=[];
k=0;
for i=1:length(x)-3
    mem=[x(i) mem(1:end-1)];
    e=mem(1)+mem(3)-k*mem(2);
    k=k+e*mem(2)/(0.00000000001+sum(mem.^2));
    d1=-mem(2)+k*mem(1);%first predicted sample
    d2=-mem(1)+k*d1;%second predicted sample
    d3=-d1+k*d2;%and else one predicted sample
    e1=[e1 x(i+1)-d1];%errors
    e2=[e2 x(i+2)-d2];
    e3=[e3 x(i+3)-d3];
    y1=[y1 d1];%extrapolated signals
    y2=[y2 d2];
    y3=[y3 d3];
end;

 

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


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

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...