|
Как интегрировать алгоритм в m файле в симулинк?, Использовать итерационный алгоритм заданый кодом в модели |
|
|
|
Jan 25 2010, 13:43
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Добрый день!
Есть модель выравнивания двух потоков данных, на основе их корреляции в симулинке. В ручном режиме, с помощью фильтров с переменной задержкой и slider gain я могу выровнять потоки в ручную. Но хотелось бы сделать автоматически. Сложность у меня вот в чем. Алгоритм выравнивания поделен на 2 этапа : 1. Поиск средней задержки, на основе поиска максимума корреляционной функции с помощью перебора. 2. Удержания выравнивания с помощью метода градиентного спуска. Кодом такая конструкция описывается элементарно, два цикла, переход из одного в другой по условию. Но вот как перенести это в симулинк? Делать графический аналог (рисовать КА, делать case и т.д.) нет никакого желания, а использование встроенных матлабовских функций ограниченно тем, что от вызова к вызову переменные функции не сохраняются. Переносить всю модель в m файлы тоже не хотелось бы, все таки симулинк вещь более наглядная %) Можно было бы использовать ступенчатую функцию и переключаться между двумя алгоритмами, но во первых время 1 ого этапа может варьироваться (от размера шага), а во вторых коряво это как то %)
Может есть более красивый способ?
Спасибо.
--------------------
|
|
|
|
|
 |
Ответов
|
Jan 29 2010, 12:45
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
С помощью persistent получилось сделать то, что хотел. Конечно не совсем красиво, но тем не менее. Но обнаружил занятный баг, который никак не могу понять почему происходит. В коде есть такое место смены состояния Код delta_delay = 0.5; max_delay = 9; ... if delay < max_delay if value > max_value max_value = value; max_value_delay = delay; end delay = delay + delta_delay; else delay = max_value_delay; state = state + 1; % go to hold state end .. так вот, когда delta_delay = 0.5 смена состояний происходит корректно при delay = 9
а вот когда delta_delay = 0.1 смена состояний происходит при delay = 9.1.
Почему, не понятно, моделька в аттаче %)
--------------------
|
|
|
|
|
Jan 30 2010, 13:13
|

Утомлённый солнцем
     
Группа: Свой
Сообщений: 2 646
Регистрация: 15-07-06
Из: г.Донецк ДНР
Пользователь №: 18 832

|
Да,странная ошибка,пока не нашёл откуда ноги растут... Если вместо 1). Код if (delay < max_delay) поставить Код dx=floor(delay*10+1e-10); if (dx < floor(max_delay*10)) или вместо 2). Код delay = delay + delta_delay; поставить Код delay = delay + floor(delta_delay*10); то всё работает. У целочисленной переменной delay откуда то возникает дробная часть величиной менее 1е-11.Ошибка представления числа вроде должна быть намного меньше.
|
|
|
|
|
Feb 1 2010, 09:51
|
Знающий
   
Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943

|
Цитата(des00 @ Jan 30 2010, 16:20)  вот и я тоже не понял почему 10 раз по 0.1 не равно 1 це %) в принципе на результат функционирования схемы это не влияет, но ошибка занятная %) Скорее всего потому что при преобразовании в двоичный вид 0.1 нельзя точно представить как сумму ряда 2^(-n) - я не проверял. А 0.5 можно - я гарантирую это  Непонятно то, что точность представления double примерно 2^-53=10e-16, а у _Anatoliy получилось 10e-11.
--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
|
|
|
|
|
Feb 1 2010, 12:03
|
Знающий
   
Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943

|
Цитата(_Anatoliy @ Feb 1 2010, 13:39)  Если быть точнее то получается 1е-12. Матлаб дает другую ошибку: Код >> format long eng >> 0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1-1.0
ans =
-111.022302462516e-018
>>
--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
|
|
|
|
Сообщений в этой теме
des00 Как интегрировать алгоритм в m файле в симулинк? Jan 25 2010, 13:43 petrov Несколько параллельно работающих корреляторов на р... Jan 25 2010, 15:13 des00 Цитата(petrov @ Jan 25 2010, 09:13) Неско... Jan 25 2010, 15:45  petrov Цитата(des00 @ Jan 25 2010, 18:45) но в т... Jan 25 2010, 16:02   des00 Цитата(petrov @ Jan 25 2010, 10:02) Непон... Jan 25 2010, 16:35    petrov Цитата(des00 @ Jan 25 2010, 19:35) т.е. е... Jan 25 2010, 17:04     des00 Цитата(petrov @ Jan 25 2010, 11:04) Есть ... Jan 25 2010, 17:08      _Anatoliy Цитата(des00 @ Jan 25 2010, 19:08)
Посм... Jan 26 2010, 06:40       des00 Цитата(_Anatoliy @ Jan 26 2010, 00:40) По... Jan 27 2010, 11:03       _Anatoliy Цитата(Gate @ Feb 1 2010, 14:03) Матлаб д... Feb 1 2010, 13:10 Enthusiast des00, а Вы не пробовали использовать задержку на ... Feb 27 2010, 14:03
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|