jcxz 183 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 9 минут назад, _pv сказал: если сигнал меняется так быстро смотреть на много предыдущих отсчётов бестолку, Он меняется быстро только для низких частот. Для высоких - меняется мало. Т.е. когда сигнал имеет частоту близкую к Fs/10, то его частота к концу периода может измениться на <= 10%, а когда он имеет частоту около Fs/1000 то его частота на границах периода может отличаться даже в разы (в худшем случае). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tanya 4 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 2 часа назад, jcxz сказал: 2 часа назад, jcxz сказал: ОЧастота сигнала меняется в очень широких пределах: от почти 0 до 1/10 Fs. Поэтому я и писал, что нужен метод экстраполяции по последним нескольким сэмплам. Пускай даже не очень точный. При такой нечеткой постановке можно попробовать вейвлеты. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 23 minutes ago, jcxz said: Он меняется быстро только для низких частот. Для высоких - меняется мало. Т.е. когда сигнал имеет частоту близкую к Fs/10, то его частота к концу периода может измениться на <= 10%, а когда он имеет частоту около Fs/1000 то его частота на границах периода может отличаться даже в разы (в худшем случае). вам конкретнее без сигналов никто больше ничего сказать не сможет. попробуйте PLL цифровому осциллятору, ну или даже как в DDS, просто бегайте по таблице синуса, если на низкой частоте фазовая автоподстройка будет дурить из-за того что за один период частота меняется в несколько раз, можно попробовать сделать его адаптивным, оценивать текущую частоту и исходя из этого менять полосу для pll. ну либо МНК с полиномами, но степени и длину подбирать всё равно под сигнал придётся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 24 18 октября, 2018 Опубликовано 18 октября, 2018 · Жалоба 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 уменьшается Это ФАПЧ. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 6 19 октября, 2018 Опубликовано 19 октября, 2018 · Жалоба Вполне себе работает простейший адаптивный линейный LMS предсказатель с одним комплексным коэффициентом на однотональном сигнале. На картинке: сигнал, предсказание, ошибка предсказания. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 183 19 октября, 2018 Опубликовано 19 октября, 2018 · Жалоба 4 часа назад, petrov сказал: Вполне себе работает простейший адаптивный линейный LMS предсказатель с одним комплексным коэффициентом на однотональном сигнале. На картинке: сигнал, предсказание, ошибка предсказания. Да, картинки красивые, но какой от них толк??? Мне нужно: формула? || алгоритм? В которые, если подставить N последних сэмплов, то оно выдаст 2 следующих прогнозируемых сэмпла. Всё. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
blackfin 14 19 октября, 2018 Опубликовано 19 октября, 2018 · Жалоба On 10/18/2018 at 10:53 AM, jcxz said: Поэтому я и писал, что нужен метод экстраполяции по последним нескольким сэмплам. Пускай даже не очень точный. Если шумов нет, то по трем точкам S1, S2, S3 можно вычислить точное значение частоты и фазы синусоиды, после чего найти нужные значения экстраполяции. Подробнее, тут: https://electronix.ru/forum/index.php?app=forums&module=forums&controller=topic&id=129469&page=3 Для значений S1, S2, S3 должно выполняться условие: abs(S1 + S3) < abs(2*S2). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 183 19 октября, 2018 Опубликовано 19 октября, 2018 · Жалоба 26 минут назад, blackfin сказал: Если шумов нет, то по трем точкам S1, S2, S3 можно вычислить точное значение частоты и фазы синусоиды, после чего найти нужные значения экстраполяции. Шумы как раз есть. И могут быть довольно значительного уровня: процентов 10 точно, а может и больше. Попробовал (Matlab) экстраполировать кубическим сплайном и сплайном Эрмита ('spline', 'cubic'): пока шума нет - всё отлично, но стоит добавить хоть немного шума - график может улететь очень далеко от цели :((( Вот на картинке привожу результат своего эксперимента (зелёная - идеальный исходный сигнал; синие кружки - взятые на нём отсчёты с добавленным шумом == 5%; фиолетовая и синяя кривые - результаты интерполяции вышеуказанными сплайнами; после исходных сэмплов я продолжил экстраполяцию ещё на требуемую мне длину в 2 сэмпла). На интервале интерполяции (между взятыми сэмплами) поведение вполне нормальное, но за пределами (экстраполяция) в зависимости от наложившегося шума, график может или примерно следовать как надо, а может (как на картинке ниже) улететь в произвольном направлении. Раз от разу (с разными шумовыми выборками) получается разный результат. :(((((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_pv 52 19 октября, 2018 Опубликовано 19 октября, 2018 · Жалоба подозреваю что матлабовский spilne строит отдельный полином третьей степени между каждыми двумя точками, естественно он будет сразу же улетать при экстраполяции, так как граничные условия от шума на последнем отрезке какие попало. полином (небольшой степени 2 или 3) надо наименьшими квадрадами на все N последних точек натягивать, а не сплайн через них проводить. ну или сплайн, но smoothed, у которого дополнительно вторая производная ограничена, так что он сглаживает, а не ровно через заданные точки проходит. http://www.alglib.net/interpolation/leastsquares.php#splinefit Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 6 19 октября, 2018 Опубликовано 19 октября, 2018 · Жалоба jcxz Мне нужно: формула? || алгоритм? В которые, если подставить N последних сэмплов, то оно выдаст 2 следующих прогнозируемых сэмпла. Всё. Просто подставить вряд ли выйдет. Вот вам книжка с формулами: Адаптивная обработка сигналов. Б. Уидроу, С.Стирнз Вот моделька с алгоритмом: adaptive_linear_prediction_2018_10_19.zip matlab simulink R2016b Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 2 19 октября, 2018 Опубликовано 19 октября, 2018 · Жалоба 43 minutes ago, petrov said: Вот моделька с алгоритмом: adaptive_linear_prediction_2018_10_19.zip Врядли эта моделька потянет на реальном железе. Берем реальное сэмплирование скажем 10 КГц. Реальный шум скажем в десять раз меньше сигнала (синяя линия внизу) и видим что LMS даже усиливает шум (желтая линия внизу) с некоторых соотношений частоты сигнала к частоте выборки. Т.е. тут надо делать слишком высокую частоту выборки. Линейная экстраполяция лучше сработает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 183 22 октября, 2018 Опубликовано 22 октября, 2018 · Жалоба В 19.10.2018 в 21:36, petrov сказал: adaptive_linear_prediction_2018_10_19.zip matlab simulink R2016b А не могли бы Вы сохранить её в .mdl? У меня matlab2007 и он .slx не открывает. :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
petrov 6 22 октября, 2018 Опубликовано 22 октября, 2018 · Жалоба jcxz А не могли бы Вы сохранить её в .mdl? У меня matlab2007 и он .slx не открывает. :( Сконвертировал для matlab R2009b. adaptive_linear_prediction_2018_10_19.zip Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 183 22 октября, 2018 Опубликовано 22 октября, 2018 · Жалоба 54 минуты назад, petrov сказал: jcxz А не могли бы Вы сохранить её в .mdl? У меня matlab2007 и он .slx не открывает. :( Сконвертировал для matlab R2009b. Теперь открывается просто пустой лист. :( Уже погонял экстраполяцию наименьшими квадратами. Работает нормально только если известен охватываемый выборкой сэмплов угол: когда угол сравнительно мал - лучше всего работает линейная экстраполяция (polyfit(x,y,1)); если угол больше, около pi/2 то лучше начинает работать polyfit(x,y,1), при дальнейшем увеличении угла лучше работают полиномы с ещё бОльшей степенью. Так что - надо учитывать текущую частоту и выбирать соответствующую степень полинома. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
thermit 1 22 октября, 2018 Опубликовано 22 октября, 2018 · Жалоба Вот еще вариант. 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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться