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

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

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

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


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

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

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

Это же просто фильтр? И какая у него фазовая задержка? ФЧХ?

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


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

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

Это же просто фильтр? И какая у него фазовая задержка? ФЧХ?

Не просто. И не фильтр. Смотрите внимательнее и не повторяйте чужих глупостей.

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


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

В 22.10.2018 в 21:54, thermit сказал:

Не просто. И не фильтр. Смотрите внимательнее и не повторяйте чужих глупостей.

Во-первых: я ни за кем не повторяю, а высказываю своё предположение. И "фильтр" потому что вычисления похожи.

Во-вторых: как применить то что Вы написали? Попробовал по-всякому, результат - только мусор.

Пробовал так:

 

 

clear all;
iFreq = 60;    %кол-во сэмплов сигнала на период синусоиды
iGap = .55;    %фазовый отступ последнего сэмпла от конца синусоиды
iN = 35;       %кол-во сэмплов участка синусоиды для расчёта сплайна
iNoise = 0.1; %уровень шума; диапазон: 0...1
xBegin = 0; xEnd = 2; %угол начала и конца интервала синусоиды (в периодах синусоиды)
x0 = linspace(xBegin,xEnd,10000); %xBegin:(xEnd-xBegin)/10000:xEnd;
y0 = sin(x0*2*pi);
x = xEnd-(iN-1)/iFreq-iGap:1/iFreq:xEnd-iGap;
y = sin(x*2*pi);
rand('twister', sum(100*clock));
for i = 1:1:length(y);
    a = rand; %fprintf(1, '%f\n', a);
    y(i) = y(i) + (a * 2 - 1) * iNoise;
end;
xx = linspace(xEnd-iGap-(iN-1)/iFreq, xEnd-iGap+2/iFreq, 800);
q1 = polyfit(x,y,1); yy_q1 = polyval(q1,xx);
q2 = polyfit(x,y,2); yy_q2 = polyval(q2,xx);
q3 = polyfit(x,y,3); yy_q3 = polyval(q3,xx);
q4 = polyfit(x,y,4); yy_q4 = polyval(q4,xx);
q5 = polyfit(x,y,5); yy_q5 = polyval(q5,xx);
q6 = polyfit(x,y,6); yy_q6 = polyval(q6,xx);

mem=zeros(1,3); y1=[]; y2=[]; y3=[]; e1=[]; e2=[]; e3=[]; k=0;
for i=1:length(y)-3;
    mem=[y(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 y(i+1)-d1];%errors
    e2=[e2 y(i+2)-d2];
    e3=[e3 y(i+3)-d3];
    y1=[y1 d1];%extrapolated signals
    y2=[y2 d2];
    y3=[y3 d3];
end;
x123 = x(1:length(y1));
plot(x0,y0,'g',x,y,'og',xx,yy_q2,':r',x123,y1,'.r',x123,y2,'.b',x123,y3,'.c');

 

 

Результаты (для разных длин выборок 15 и 35 сэмплов):

iFreq60_iN15.thumb.png.32252fea338078fef072b4993f01607a.pngiFreq60_iN35.thumb.png.556da69a8080a1619a1565f2069249f2.png

Зелёная сплошная - идеальный сигнал (к которому стремимся).

Зелёные кружки - обрабатываемые выборки сигнала (количество == iN) с шумом (уровень шума == iNoise). Расположение участка задаётся iGap - в количестве периодов отступа от конца синусоиды.

Красная штриховая - результат интерполяции полиномом 2-го порядка с коэффициентами полученными методом наименьших квадратов (для примера).

Красные, синие, голубые точки - это вектора y1,y2,y3 полученные Вашим алгоритмом. Если я всё правильно понял и подставил. Как бы совсем не то, что ожидалось. Ни при малом ни при большом числе сэмплов. Попробовал и значительно бОльшие значения длительности периода (iFreq) и количества сэмплов (iN) - результат аналогичный.

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


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

20 минут назад, thermit сказал:

Ну, значит этот метод вам не подходит.

А я его правильно применил?

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


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

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

Не знаю. Я перестал понимать что вам надо сделать.

Надо, имея значения зелёных кружков, получить до 2-х новых значения вперёд (вправо по графику) наиболее близких к зелёной кривой. Зелёные кружки идут с фиксированным шагом. И известно, что зелёная кривая похожа на синусоиду (искажённая синусоида). Период кривой (синусоиды) изменяется в широком диапазоне, но минимум её == шаг_зелёных_кружков * 10.

Также - скорость изменения периода кривой изменяется в широких пределах, но можно принять что при минимальном периоде скорость изменения периода составляет не более 10% от длительности периода за один период.

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


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

Может стоит вернуться к старым и проверенным решениям, типа полиномиальный нерекурсивный ЦФ (FIR) с функциями сглаживания и экстраполяции?

Коэффициенты FIR второго порядка (синусоида вполне укладывается в это ограничение):
C2e(i) = 3 * A - 6 * B * i + 30 * C * i * i; (схему Горнера включить можно)
где A,B,C - коэффициенты, зависящие от размерности FIR и шага экстраполяции (прогнозирования).

Почитать о таких расчетах можно в книжке:
СИВС "Проектирование специализированных информационно-вычислительных систем".
М, "Высшая школа", 1984, под ред. Ю.М. Смирнова.

P.S.
Не зря же все  наши "партнеры" либо закупают системы C-ХХХ, либо боятся их.

Изменено пользователем Strong

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


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

2 минуты назад, Strong сказал:

Может стоит вернуться к старым и проверенным решениям, типа полиномиальный нерекурсивный ЦФ (FIR) с функциями сглаживания и экстраполяции?

О фильтрах я писал ещё в самом начале. См. выше. Подумайте о ФЧХ фильтра.

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


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

2 минуты назад, jcxz сказал:

 Подумайте о ФЧХ фильтра.

Что об этом думать? Надо это учитывать. Эффективные решения никогда не бывают "в лоб".

Все постепенно.

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


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

6 минут назад, Strong сказал:

Что об этом думать? Надо это учитывать.

Каким образом?

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


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

Последовательное преобразование сигнала, в соответствии с его особенностями.

Фильтр + экстраполятор в одном флаконе, отдельная операция - корректор фазы (упреждение).

Изменено пользователем Strong

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


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

31 минуту назад, Strong сказал:

Последовательное преобразование сигнала, в соответствии с его особенностями.

Фильтр + экстраполятор в одном флаконе, отдельная операция - корректор фазы (упреждение).

 

Я завёл данную тему по практическому вопросу, требующему решения. А не для досужих разглагольствований.

Невозможно отфильтровать + скорректировать фазу во всём диапазоне частот с точностью до нескольких сэмплов. Потратив при этом менее 400 тактов на сэмпл.

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


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

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

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

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

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

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

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

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

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

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