AlexandrY 3 22 октября, 2018 Опубликовано 22 октября, 2018 · Жалоба Обычный фильтр. Фильтры заведомо хуже работают, поскольку основываются на неправильной модели сигнала. Фильтры - это рациональные функции, а нужно искать трансцендентную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 22 октября, 2018 Опубликовано 22 октября, 2018 · Жалоба 3 часа назад, thermit сказал: Вот еще вариант. Это же просто фильтр? И какая у него фазовая задержка? ФЧХ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 22 октября, 2018 Опубликовано 22 октября, 2018 · Жалоба 2 часа назад, jcxz сказал: Это же просто фильтр? И какая у него фазовая задержка? ФЧХ? Не просто. И не фильтр. Смотрите внимательнее и не повторяйте чужих глупостей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 24 октября, 2018 Опубликовано 24 октября, 2018 · Жалоба В 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 сэмплов): Зелёная сплошная - идеальный сигнал (к которому стремимся). Зелёные кружки - обрабатываемые выборки сигнала (количество == iN) с шумом (уровень шума == iNoise). Расположение участка задаётся iGap - в количестве периодов отступа от конца синусоиды. Красная штриховая - результат интерполяции полиномом 2-го порядка с коэффициентами полученными методом наименьших квадратов (для примера). Красные, синие, голубые точки - это вектора y1,y2,y3 полученные Вашим алгоритмом. Если я всё правильно понял и подставил. Как бы совсем не то, что ожидалось. Ни при малом ни при большом числе сэмплов. Попробовал и значительно бОльшие значения длительности периода (iFreq) и количества сэмплов (iN) - результат аналогичный. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 24 октября, 2018 Опубликовано 24 октября, 2018 · Жалоба Ну, значит этот метод вам не подходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 24 октября, 2018 Опубликовано 24 октября, 2018 · Жалоба 20 минут назад, thermit сказал: Ну, значит этот метод вам не подходит. А я его правильно применил? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 24 октября, 2018 Опубликовано 24 октября, 2018 · Жалоба Не знаю. Я перестал понимать что вам надо сделать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 24 октября, 2018 Опубликовано 24 октября, 2018 · Жалоба 26 минут назад, thermit сказал: Не знаю. Я перестал понимать что вам надо сделать. Надо, имея значения зелёных кружков, получить до 2-х новых значения вперёд (вправо по графику) наиболее близких к зелёной кривой. Зелёные кружки идут с фиксированным шагом. И известно, что зелёная кривая похожа на синусоиду (искажённая синусоида). Период кривой (синусоиды) изменяется в широком диапазоне, но минимум её == шаг_зелёных_кружков * 10. Также - скорость изменения периода кривой изменяется в широких пределах, но можно принять что при минимальном периоде скорость изменения периода составляет не более 10% от длительности периода за один период. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 24 октября, 2018 Опубликовано 24 октября, 2018 · Жалоба Не подходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strong 1 25 октября, 2018 Опубликовано 25 октября, 2018 (изменено) · Жалоба Может стоит вернуться к старым и проверенным решениям, типа полиномиальный нерекурсивный ЦФ (FIR) с функциями сглаживания и экстраполяции? Коэффициенты FIR второго порядка (синусоида вполне укладывается в это ограничение): C2e(i) = 3 * A - 6 * B * i + 30 * C * i * i; (схему Горнера включить можно) где A,B,C - коэффициенты, зависящие от размерности FIR и шага экстраполяции (прогнозирования). Почитать о таких расчетах можно в книжке: СИВС "Проектирование специализированных информационно-вычислительных систем". М, "Высшая школа", 1984, под ред. Ю.М. Смирнова. P.S. Не зря же все наши "партнеры" либо закупают системы C-ХХХ, либо боятся их. Изменено 25 октября, 2018 пользователем Strong Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 25 октября, 2018 Опубликовано 25 октября, 2018 · Жалоба 2 минуты назад, Strong сказал: Может стоит вернуться к старым и проверенным решениям, типа полиномиальный нерекурсивный ЦФ (FIR) с функциями сглаживания и экстраполяции? О фильтрах я писал ещё в самом начале. См. выше. Подумайте о ФЧХ фильтра. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strong 1 25 октября, 2018 Опубликовано 25 октября, 2018 · Жалоба 2 минуты назад, jcxz сказал: Подумайте о ФЧХ фильтра. Что об этом думать? Надо это учитывать. Эффективные решения никогда не бывают "в лоб". Все постепенно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 25 октября, 2018 Опубликовано 25 октября, 2018 · Жалоба 6 минут назад, Strong сказал: Что об этом думать? Надо это учитывать. Каким образом? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Strong 1 25 октября, 2018 Опубликовано 25 октября, 2018 (изменено) · Жалоба Последовательное преобразование сигнала, в соответствии с его особенностями. Фильтр + экстраполятор в одном флаконе, отдельная операция - корректор фазы (упреждение). Изменено 25 октября, 2018 пользователем Strong Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 192 25 октября, 2018 Опубликовано 25 октября, 2018 · Жалоба 31 минуту назад, Strong сказал: Последовательное преобразование сигнала, в соответствии с его особенностями. Фильтр + экстраполятор в одном флаконе, отдельная операция - корректор фазы (упреждение). Я завёл данную тему по практическому вопросу, требующему решения. А не для досужих разглагольствований. Невозможно отфильтровать + скорректировать фазу во всём диапазоне частот с точностью до нескольких сэмплов. Потратив при этом менее 400 тактов на сэмпл. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться