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

 
 
 
Reply to this topicStart new topic
> Data форматы при обмене информацией между МАТЛАБом и С (С написанном в CCS под 16-бит fixed point TI DSP)
Саша Z
сообщение Apr 9 2007, 21:52
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Я тут потихоньку осваиваю азы имплементации алгоритмов обработки сигналов с прицелом на старый 16-битный fixed point DSP.

Сейчас поднял тему обмена данными между MATLABом и C кодом (написанным в CCS v.3.3).
Мне дали готовый проэкт состящий из сорса C и 2х ассемблерных вспомагательных сорсов, а так-же 2 MATLABовских файла (m-files). Задача проста - МАТЛАБ генерирует 100 samples синуса, эта data записывается в файл (из МАТЛАБа). Затем в С, читается файл, оперируется samplами синуса и результат сохраняется в выходной файл котрый может читаться МАТЛАБом.

Я так понимаю MATLAB оперирует numerical data в формате 32 бита floating point, так ? При сохранении в файл, читая его (в виде HEX значений) я вижу там хранение по байтовое, т.е. 100 samples синуса дали 400 байт в файле (каждое значение МАТЛАБовского синуса разбито на 4 отдельных, последовательно записанных в файле байта).
При чтении файла в C, вначале содержимое читается в массив типа int размера 400. Затем вызывается ассемблерная рутина которая как я вижу пакует по-байтовое содержимое массива в 16-битные значения в отдельный массив размера 200 значений. Затем данный массив в памяти читается в С в массив типа float размера 100 значений (т.е. как я понимаю каждые последовательные два 16-битных значения формируют цельное 32-битное значение типа float).

Затем, в коде С манипулируют значениями, после чего, во второй ассемблерной рутине, каждое значение обработанного массива разбивается на 4 бытовых значения записываемых в памяти которые затем в коде С читаются как массив 400 значений записываемых байтово в новый файл.
Этот новый файл может читаться МАТЛАБом как numerical data.

Все это до меня "дошло" изучая сорсы С и ассемблера (ну и МАТЛАБа ессно, но там все элементарно) и прогоняя проэкт (в CCS) в debuggerе.

Исходя из этого, сделал для себя выводы насчет которых хотел-бы слышать подтверждение либо опровержение с указанием правильного подхода.
Выводы:

1. МАТЛАБ оперирует с 32х битными значениями (что касается numerical data) в формате float.
2. При прямой записи в файл из МАТЛАБа, числа разбиваются побайтно, т.е. цельное значение в 32 бита разбивается на 4 отдельных, последовательно записываемых байта.
3. При необходимости чтения такого файла в C с последующей обработкой (т.е. мы знаем что в оригиналезначения 32х битные типа float), нужно предварительно скомпоновать их в 16-битные значение.
4. При чтении 16-битных данных в С (из памяти) в массив типа float - считываются 2 последовательных worda и принимаются как цельное 32х битное значение типа float.

Это есть рецепт построения правильного обмена информацией между МАТЛАБом и С когда применяются промежуточные файлы храниения числовой информации.
Это так ? Если не совсем (или совсем не так) - как именно ? Где я ошибаюсь в предположениях ?

Есть ли возможность обмена числовой информацией между МАТЛАБом и С (в CCS с ориентировкой на 16-битные DSP fixed point) напрямую через память, без применения промежуточных файлов ? Если да, то как ?

Заранее благодарен, Саша
Go to the top of the page
 
+Quote Post
Nerozin Vasiliy
сообщение Apr 13 2007, 09:27
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 13-04-07
Из: Ukraine Cremea
Пользователь №: 27 009



Скорее всего такой передачи данных нет. Требуется использование TLC файлов.


--------------------
Никогда не знаешь где тебе повезет
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Apr 13 2007, 12:13
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(Nerozin Vasiliy @ Apr 13 2007, 10:27) *
Скорее всего такой передачи данных нет. Требуется использование TLC файлов.


Спасибо.
А что за TLC файлы ?
Go to the top of the page
 
+Quote Post
Nerozin Vasiliy
сообщение Apr 13 2007, 13:43
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 28
Регистрация: 13-04-07
Из: Ukraine Cremea
Пользователь №: 27 009



Стандартная процедура передачи параметров или данных из МатЛаба в С код производится:
1. Пишется S-функция. Она считает или подготавливает параметры или данные.
2. Пишется прообраз нужного С кода (TLC файл) в который в последствии передадутся данные или параметры, но только в виде нужных констант, нужного типа.

Сообщение отредактировал Nerozin Vasiliy - Apr 13 2007, 13:44


--------------------
Никогда не знаешь где тебе повезет
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Apr 13 2007, 14:13
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(Nerozin Vasiliy @ Apr 13 2007, 14:43) *
Стандартная процедура передачи параметров или данных из МатЛаба в С код производится:
1. Пишется S-функция. Она считает или подготавливает параметры или данные.
2. Пишется прообраз нужного С кода (TLC файл) в который в последствии передадутся данные или параметры, но только в виде нужных констант, нужного типа.


Большое спасибо, это уже что-то.
Я правда не знаком с S-функциями, но наверно о ней есть инфа в матлабовском хелпе - почитаю.

Не совсем понятно насчет прообраза С кода - это обычный С код который пишется в рамках МАТЛАБа ?
А как-же его компилировать ? Я в приципе С пишу в CCS (под TI DSP), как оно завязывается на TLC ?

Поищу инфу насчет TLC в матлабовком хелпе тоже...

Спасибо еще раз, Саша
Go to the top of the page
 
+Quote Post
anton
сообщение Apr 14 2007, 09:50
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 622
Регистрация: 31-07-04
Пользователь №: 422



Незнаю чето както у вас все сложно.
Всегда пользовался функцией записи чтения файла. Там один из параметров тип числа ставишь его и никаких проблем, в сишной программе ставишь такой же тип. Количество типов под десяток.
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Apr 14 2007, 15:40
Сообщение #7


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(anton @ Apr 14 2007, 10:50) *
Незнаю чето както у вас все сложно.
Всегда пользовался функцией записи чтения файла. Там один из параметров тип числа ставишь его и никаких проблем, в сишной программе ставишь такой же тип. Количество типов под десяток.


Хмм, черт его знает...
Я записываю в файл коеффициенты фильтров рассчитаные в МАТЛАбе как long (32 бита). В файле я смотрю они хранятся побайтно (т.е. если имеем 100 коеффициентов например, то файл будет содержать 400 отдельных байт (каждые 4 последовательных - один коеффициент).
Перед тем как читать их в C в массив типа float, приходится прогонять их побайтово в ассемблере компануя по words (по 16 бит), затем С, вследствии заявленного типа float, читает это и стыкует каждые два последовательных wordа в один long (т.е. в 32 бита цельное значение). Таким образом и получаю в конечном массиве в С коеффициенты float в 32 бита такие как они и были в МАТЛАБе.

В принципе это не проблема, ибо в реальной аппликации коеффициенты будут рассчитываться в самом С, МАТЛАБ уже будет непричем...
Пока это у меня только этап отработки алгоритма - его отдельные куски на hardware...
Go to the top of the page
 
+Quote Post
anton
сообщение Apr 14 2007, 17:48
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 622
Регистрация: 31-07-04
Пользователь №: 422



А почему не записывал сразу как flоat?
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Apr 14 2007, 17:55
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(anton @ Apr 14 2007, 18:48) *
А почему не записывал сразу как flоat?


А как ? Я не в курсе...
Я просто пишу в файл из m-file как будто в С:

str='d:\job\w_butter6'; % для примера
fid=fopen(str,'w+');
count=fwrite(fid,v,'float');
fclose(fid);


как мне указать каким типом писать данные (в m-filе) ?
Go to the top of the page
 
+Quote Post
anton
сообщение Apr 17 2007, 18:22
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 622
Регистрация: 31-07-04
Пользователь №: 422



А при чем тут М файл?????
Я вообше не пытался использовать М файл.
Сейчас точно синтаксис не помню но команды похожи на си
fopen fclose fread fwrite
Go to the top of the page
 
+Quote Post
Саша Z
сообщение Apr 17 2007, 18:33
Сообщение #11


Знающий
****

Группа: Свой
Сообщений: 921
Регистрация: 6-04-07
Из: Israel
Пользователь №: 26 822



Цитата(anton @ Apr 17 2007, 19:22) *
А при чем тут М файл?????
Я вообше не пытался использовать М файл.
Сейчас точно синтаксис не помню но команды похожи на си
fopen fclose fread fwrite


Дык данные обрабатываются в МАТЛАБе (посредством М-файл кодов) и соотв. их него и пишутся в файл.
Затем они должны читаться в С (в CCS IDE).

МАТЛАБ 7 поддерживает такие-же как в С файловые функции, те что вы и упомянули - я ими-же и пользуюсь в M-файлах (смотрите выше - это кусок кода в М-файле, не в сорсе С, хотя и идентичен).
Go to the top of the page
 
+Quote Post
anton
сообщение Apr 19 2007, 11:40
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 622
Регистрация: 31-07-04
Пользователь №: 422



Извени показалось что ты используешь запись переменных сессии матлаба.
смутила фраза.

как мне указать каким типом писать данные (в m-filе) ?

Тип ты указал float(хотя посмотри хелп возможно есть вариации обозначения).
При такой записи не возникает проблем со считыванием в С (правда пользовался вижуал С)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 07:52
Рейтинг@Mail.ru


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