реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как интегрировать алгоритм в m файле в симулинк?, Использовать итерационный алгоритм заданый кодом в модели
des00
сообщение Jan 25 2010, 13:43
Сообщение #1


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Добрый день!

Есть модель выравнивания двух потоков данных, на основе их корреляции в симулинке. В ручном режиме, с помощью фильтров с переменной задержкой и slider gain я могу выровнять потоки в ручную. Но хотелось бы сделать автоматически. Сложность у меня вот в чем. Алгоритм выравнивания поделен на 2 этапа :
1. Поиск средней задержки, на основе поиска максимума корреляционной функции с помощью перебора.
2. Удержания выравнивания с помощью метода градиентного спуска.
Кодом такая конструкция описывается элементарно, два цикла, переход из одного в другой по условию. Но вот как перенести это в симулинк? Делать графический аналог (рисовать КА, делать case и т.д.) нет никакого желания, а использование встроенных матлабовских функций ограниченно тем, что от вызова к вызову переменные функции не сохраняются. Переносить всю модель в m файлы тоже не хотелось бы, все таки симулинк вещь более наглядная %)
Можно было бы использовать ступенчатую функцию и переключаться между двумя алгоритмами, но во первых время 1 ого этапа может варьироваться (от размера шага), а во вторых коряво это как то %)

Может есть более красивый способ?

Спасибо.


--------------------
Go to the top of the page
 
+Quote Post
petrov
сообщение Jan 25 2010, 15:13
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Несколько параллельно работающих корреляторов на разные задержки, поиск максимального значения, дробная задержка через параболу по трём точкам...
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 25 2010, 15:45
Сообщение #3


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(petrov @ Jan 25 2010, 09:13) *
Несколько параллельно работающих корреляторов на разные задержки, поиск максимального значения, дробная задержка через параболу по трём точкам...

но в таком случае это будет очень далеко от железа, которое я хочу промоделировать. даже такой простой алгоритм должен нормально работать, в последовательном режиме. Планируется запустить его на небольшом проце. Но вот как промоделировать последовательный алгоритм, с сохранением состояния в симулинке мне не понятно %(


--------------------
Go to the top of the page
 
+Quote Post
petrov
сообщение Jan 25 2010, 16:02
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Цитата(des00 @ Jan 25 2010, 18:45) *
но в таком случае это будет очень далеко от железа, которое я хочу промоделировать. даже такой простой алгоритм должен нормально работать, в последовательном режиме. Планируется запустить его на небольшом проце. Но вот как промоделировать последовательный алгоритм, с сохранением состояния в симулинке мне не понятно %(


Непонятно в чём проблема. Cуть алгоритма сможете отладите в симулинке, а уж как потом делать в железе другая задача, ну вот например FFT в симулинке это комбинационная схема, это же не значит что я буду в FPGA делать такую же комбинационную схему.

Можно ещё свои блоки писать - S-функции.
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 25 2010, 16:35
Сообщение #5


Вечный ламер
******

Группа: Модераторы
Сообщений: 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 например или программа на сях для проца %)


--------------------
Go to the top of the page
 
+Quote Post
petrov
сообщение Jan 25 2010, 17:04
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 2 220
Регистрация: 21-10-04
Из: Balakhna
Пользователь №: 937



Цитата(des00 @ Jan 25 2010, 19:35) *
т.е. есть КА, который ждет событий от железа, соответствующим образом их обрабатывает и управляет этим железом. Кодом такой алгоритм описывается элементарно. Но вот реализация его в симулинке, с синхронизацией к окружению у меня вызывает вопрос. Embedded Matlab Function не сохраняет состояния, она каждый раз начинается с начала. Должен же быть какой то механизм в симулинке что бы моделировать такие системы.


Есть в симулинке stateflow как раз для симуляции конечных автоматов, но уж больно тормозная штука(правда давно пробовал может что не понял). Для Embedded Matlab Function(тоже кстати модели подтормаживает) можно память держать снаружи. Ну и S-функции там что угодно можно написать и со временем работать.
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 25 2010, 17:08
Сообщение #7


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(petrov @ Jan 25 2010, 11:04) *
Есть в симулинке stateflow как раз для симуляции конечных автоматов, но уж больно тормозная штука(правда давно пробовал может что не понял).

не люблю я рисование, кодом оно понятнее и ловчее %)
Цитата
Для Embedded Matlab Function(тоже кстати модели подтормаживает) можно память держать снаружи.

делал для простых случаев (одна переменная), работает, но как то это через одно место.... %)
Цитата
Ну и S-функции там что угодно можно написать и со временем работать.

спасибо, пороюсь в хелпе насчет них подробнее


--------------------
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jan 26 2010, 06:40
Сообщение #8


Утомлённый солнцем
******

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



Цитата(des00 @ Jan 25 2010, 19:08) *


Посмотрите здесь ссылка
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 27 2010, 11:03
Сообщение #9


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(_Anatoliy @ Jan 26 2010, 00:40) *
Посмотрите здесь

спасибо, почти то что надо. попробую использовать.


--------------------
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 29 2010, 12:45
Сообщение #10


Вечный ламер
******

Группа: Модераторы
Сообщений: 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.
Прикрепленное изображение

Почему, не понятно, моделька в аттаче %)
Прикрепленные файлы
Прикрепленный файл  test_fsm_R14.zip ( 8.3 килобайт ) Кол-во скачиваний: 23
 


--------------------
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jan 29 2010, 13:59
Сообщение #11


Утомлённый солнцем
******

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



Цитата(des00 @ Jan 29 2010, 14:45) *


завтра гляну
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Jan 30 2010, 13:13
Сообщение #12


Утомлённый солнцем
******

Группа: Свой
Сообщений: 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.Ошибка представления числа вроде должна быть намного меньше.
Go to the top of the page
 
+Quote Post
des00
сообщение Jan 30 2010, 13:20
Сообщение #13


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(_Anatoliy @ Jan 30 2010, 07:13) *
Да,странная ошибка,пока не нашёл откуда ноги растут...
У целочисленной переменной delay откуда то возникает дробная часть величиной менее 1е-11.Ошибка представления числа вроде должна быть намного меньше.

вот и я тоже не понял почему 10 раз по 0.1 не равно 1 це %) в принципе на результат функционирования схемы это не влияет, но ошибка занятная %)


--------------------
Go to the top of the page
 
+Quote Post
Gate
сообщение Feb 1 2010, 09:51
Сообщение #14


Знающий
****

Группа: Свой
Сообщений: 859
Регистрация: 7-04-05
Из: Санкт-Петербург
Пользователь №: 3 943



Цитата(des00 @ Jan 30 2010, 16:20) *
вот и я тоже не понял почему 10 раз по 0.1 не равно 1 це %) в принципе на результат функционирования схемы это не влияет, но ошибка занятная %)

Скорее всего потому что при преобразовании в двоичный вид 0.1 нельзя точно представить как сумму ряда 2^(-n) - я не проверял. А 0.5 можно - я гарантирую это smile.gif
Непонятно то, что точность представления double примерно 2^-53=10e-16, а у _Anatoliy получилось 10e-11.


--------------------
"Человек - это существо, которое охотнее всего рассуждает о том, в чем меньше всего разбирается." (с) С.Лем
Go to the top of the page
 
+Quote Post
_Anatoliy
сообщение Feb 1 2010, 10:39
Сообщение #15


Утомлённый солнцем
******

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



Цитата(Gate @ Feb 1 2010, 11:51) *
Непонятно то, что точность представления double примерно 2^-53=10e-16, а у _Anatoliy получилось 10e-11.

Если быть точнее то получается 1е-12.
В процессе вычислений ошибка может накапливаться.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 1st August 2025 - 20:25
Рейтинг@Mail.ru


Страница сгенерированна за 0.01534 секунд с 7
ELECTRONIX ©2004-2016