Перейти к содержанию
    

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Спасибо.

А что за TLC файлы ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Изменено пользователем Nerozin Vasiliy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

 

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

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

 

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

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А почему не записывал сразу как flоat?

 

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

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

 

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

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

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

fclose(fid);

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А при чем тут М файл?????

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

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

fopen fclose fread fwrite

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А при чем тут М файл?????

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

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

fopen fclose fread fwrite

 

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

 

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...