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

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

|
Цитата(petrov @ Jan 25 2010, 10:02)  Непонятно в чём проблема. смотрите суть алгоритма на псевдокоде вот в чем Код max_value = 0; max_value_delay = 0; for (int i = min_delay; i < max_delay; i = i + delta_delay) { set_correlation_delay(i); wait_correlation_count_ready(); value = get_corelation_value(); if (value > max_value) { max_value = value; max_value_delay = i; } } set_correlation_delay(max_value_delay); for (;;){ wait_correlation_count_ready(); hill_climb_algorithm(); } т.е. есть КА, который ждет событий от железа, соответствующим образом их обрабатывает и управляет этим железом. Кодом такой алгоритм описывается элементарно. Но вот реализация его в симулинке, с синхронизацией к окружению у меня вызывает вопрос. Embedded Matlab Function не сохраняет состояния, она каждый раз начинается с начала. Должен же быть какой то механизм в симулинке что бы моделировать такие системы. Цитата ну вот например FFT в симулинке это комбинационная схема, это же не значит что я буду в FPGA делать такую же комбинационную схему. тут несколько иная задача. В случае FFT будет математическая эквивалентность, а в мне нужна логическая эквивалентность, которую можно описать простым языком. Как КА на Verilog например или программа на сях для проца %)
--------------------
|
|
|
|
|
Jan 25 2010, 17:08
|
Вечный ламер
     
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453

|
Цитата(petrov @ Jan 25 2010, 11:04)  Есть в симулинке stateflow как раз для симуляции конечных автоматов, но уж больно тормозная штука(правда давно пробовал может что не понял). не люблю я рисование, кодом оно понятнее и ловчее %) Цитата Для Embedded Matlab Function(тоже кстати модели подтормаживает) можно память держать снаружи. делал для простых случаев (одна переменная), работает, но как то это через одно место.... %) Цитата Ну и S-функции там что угодно можно написать и со временем работать. спасибо, пороюсь в хелпе насчет них подробнее
--------------------
|
|
|
|
|
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.
--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|