Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как интегрировать алгоритм в m файле в симулинк?
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Вопросы системного уровня проектирования
des00
Добрый день!

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

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

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

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


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

Можно ещё свои блоки писать - S-функции.
des00
Цитата(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 например или программа на сях для проца %)
petrov
Цитата(des00 @ Jan 25 2010, 19:35) *
т.е. есть КА, который ждет событий от железа, соответствующим образом их обрабатывает и управляет этим железом. Кодом такой алгоритм описывается элементарно. Но вот реализация его в симулинке, с синхронизацией к окружению у меня вызывает вопрос. Embedded Matlab Function не сохраняет состояния, она каждый раз начинается с начала. Должен же быть какой то механизм в симулинке что бы моделировать такие системы.


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

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

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

спасибо, пороюсь в хелпе насчет них подробнее
_Anatoliy
Цитата(des00 @ Jan 25 2010, 19:08) *


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

спасибо, почти то что надо. попробую использовать.
des00
С помощью 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.
Нажмите для просмотра прикрепленного файла
Почему, не понятно, моделька в аттаче %)
_Anatoliy
Цитата(des00 @ Jan 29 2010, 14:45) *


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

вот и я тоже не понял почему 10 раз по 0.1 не равно 1 це %) в принципе на результат функционирования схемы это не влияет, но ошибка занятная %)
Gate
Цитата(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.
_Anatoliy
Цитата(Gate @ Feb 1 2010, 11:51) *
Непонятно то, что точность представления double примерно 2^-53=10e-16, а у _Anatoliy получилось 10e-11.

Если быть точнее то получается 1е-12.
В процессе вычислений ошибка может накапливаться.
Gate
Цитата(_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

>>
_Anatoliy
Цитата(Gate @ Feb 1 2010, 14:03) *
Матлаб дает другую ошибку:
Код
>> 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

>>


Предлагаю принять к сведению ситуацию и забить.
Enthusiast
des00, а Вы не пробовали использовать задержку на один такт между выходом и входом симулинковского блока? Примерчик прикладываю во вложении.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.