Jump to content

    
Sign in to follow this  
AlexZabr

Data форматы при обмене информацией между МАТЛАБом и С (С написанном в CCS под 16-бит fixed point TI DSP)

Recommended Posts

Я тут потихоньку осваиваю азы имплементации алгоритмов обработки сигналов с прицелом на старый 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) напрямую через память, без применения промежуточных файлов ? Если да, то как ?

 

Заранее благодарен, Саша

Share this post


Link to post
Share on other sites

Стандартная процедура передачи параметров или данных из МатЛаба в С код производится:

1. Пишется S-функция. Она считает или подготавливает параметры или данные.

2. Пишется прообраз нужного С кода (TLC файл) в который в последствии передадутся данные или параметры, но только в виде нужных констант, нужного типа.

Edited by Nerozin Vasiliy

Share this post


Link to post
Share on other sites
Стандартная процедура передачи параметров или данных из МатЛаба в С код производится:

1. Пишется S-функция. Она считает или подготавливает параметры или данные.

2. Пишется прообраз нужного С кода (TLC файл) в который в последствии передадутся данные или параметры, но только в виде нужных констант, нужного типа.

 

Большое спасибо, это уже что-то.

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

 

Не совсем понятно насчет прообраза С кода - это обычный С код который пишется в рамках МАТЛАБа ?

А как-же его компилировать ? Я в приципе С пишу в CCS (под TI DSP), как оно завязывается на TLC ?

 

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

 

Спасибо еще раз, Саша

Share this post


Link to post
Share on other sites

Незнаю чето както у вас все сложно.

Всегда пользовался функцией записи чтения файла. Там один из параметров тип числа ставишь его и никаких проблем, в сишной программе ставишь такой же тип. Количество типов под десяток.

Share this post


Link to post
Share on other sites
Незнаю чето както у вас все сложно.

Всегда пользовался функцией записи чтения файла. Там один из параметров тип числа ставишь его и никаких проблем, в сишной программе ставишь такой же тип. Количество типов под десяток.

 

Хмм, черт его знает...

Я записываю в файл коеффициенты фильтров рассчитаные в МАТЛАбе как long (32 бита). В файле я смотрю они хранятся побайтно (т.е. если имеем 100 коеффициентов например, то файл будет содержать 400 отдельных байт (каждые 4 последовательных - один коеффициент).

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

 

В принципе это не проблема, ибо в реальной аппликации коеффициенты будут рассчитываться в самом С, МАТЛАБ уже будет непричем...

Пока это у меня только этап отработки алгоритма - его отдельные куски на hardware...

Share this post


Link to post
Share on other sites
А почему не записывал сразу как flоat?

 

А как ? Я не в курсе...

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

 

str='d:\job\w_butter6'; % для примера

fid=fopen(str,'w+');

count=fwrite(fid,v,'float');

fclose(fid);

 

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

Share this post


Link to post
Share on other sites
А при чем тут М файл?????

Я вообше не пытался использовать М файл.

Сейчас точно синтаксис не помню но команды похожи на си

fopen fclose fread fwrite

 

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

Затем они должны читаться в С (в CCS IDE).

 

МАТЛАБ 7 поддерживает такие-же как в С файловые функции, те что вы и упомянули - я ими-же и пользуюсь в M-файлах (смотрите выше - это кусок кода в М-файле, не в сорсе С, хотя и идентичен).

Share this post


Link to post
Share on other sites

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

смутила фраза.

 

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

 

Тип ты указал float(хотя посмотри хелп возможно есть вариации обозначения).

При такой записи не возникает проблем со считыванием в С (правда пользовался вижуал С)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this