AlexZabr 0 9 апреля, 2007 Опубликовано 9 апреля, 2007 · Жалоба Я тут потихоньку осваиваю азы имплементации алгоритмов обработки сигналов с прицелом на старый 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) напрямую через память, без применения промежуточных файлов ? Если да, то как ? Заранее благодарен, Саша Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VasNer 0 13 апреля, 2007 Опубликовано 13 апреля, 2007 · Жалоба Скорее всего такой передачи данных нет. Требуется использование TLC файлов. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 13 апреля, 2007 Опубликовано 13 апреля, 2007 · Жалоба Скорее всего такой передачи данных нет. Требуется использование TLC файлов. Спасибо. А что за TLC файлы ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VasNer 0 13 апреля, 2007 Опубликовано 13 апреля, 2007 (изменено) · Жалоба Стандартная процедура передачи параметров или данных из МатЛаба в С код производится: 1. Пишется S-функция. Она считает или подготавливает параметры или данные. 2. Пишется прообраз нужного С кода (TLC файл) в который в последствии передадутся данные или параметры, но только в виде нужных констант, нужного типа. Изменено 13 апреля, 2007 пользователем Nerozin Vasiliy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 13 апреля, 2007 Опубликовано 13 апреля, 2007 · Жалоба Стандартная процедура передачи параметров или данных из МатЛаба в С код производится: 1. Пишется S-функция. Она считает или подготавливает параметры или данные. 2. Пишется прообраз нужного С кода (TLC файл) в который в последствии передадутся данные или параметры, но только в виде нужных констант, нужного типа. Большое спасибо, это уже что-то. Я правда не знаком с S-функциями, но наверно о ней есть инфа в матлабовском хелпе - почитаю. Не совсем понятно насчет прообраза С кода - это обычный С код который пишется в рамках МАТЛАБа ? А как-же его компилировать ? Я в приципе С пишу в CCS (под TI DSP), как оно завязывается на TLC ? Поищу инфу насчет TLC в матлабовком хелпе тоже... Спасибо еще раз, Саша Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
anton 0 14 апреля, 2007 Опубликовано 14 апреля, 2007 · Жалоба Незнаю чето както у вас все сложно. Всегда пользовался функцией записи чтения файла. Там один из параметров тип числа ставишь его и никаких проблем, в сишной программе ставишь такой же тип. Количество типов под десяток. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 14 апреля, 2007 Опубликовано 14 апреля, 2007 · Жалоба Незнаю чето както у вас все сложно. Всегда пользовался функцией записи чтения файла. Там один из параметров тип числа ставишь его и никаких проблем, в сишной программе ставишь такой же тип. Количество типов под десяток. Хмм, черт его знает... Я записываю в файл коеффициенты фильтров рассчитаные в МАТЛАбе как long (32 бита). В файле я смотрю они хранятся побайтно (т.е. если имеем 100 коеффициентов например, то файл будет содержать 400 отдельных байт (каждые 4 последовательных - один коеффициент). Перед тем как читать их в C в массив типа float, приходится прогонять их побайтово в ассемблере компануя по words (по 16 бит), затем С, вследствии заявленного типа float, читает это и стыкует каждые два последовательных wordа в один long (т.е. в 32 бита цельное значение). Таким образом и получаю в конечном массиве в С коеффициенты float в 32 бита такие как они и были в МАТЛАБе. В принципе это не проблема, ибо в реальной аппликации коеффициенты будут рассчитываться в самом С, МАТЛАБ уже будет непричем... Пока это у меня только этап отработки алгоритма - его отдельные куски на hardware... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
anton 0 14 апреля, 2007 Опубликовано 14 апреля, 2007 · Жалоба А почему не записывал сразу как flоat? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 14 апреля, 2007 Опубликовано 14 апреля, 2007 · Жалоба А почему не записывал сразу как flоat? А как ? Я не в курсе... Я просто пишу в файл из m-file как будто в С: str='d:\job\w_butter6'; % для примера fid=fopen(str,'w+'); count=fwrite(fid,v,'float'); fclose(fid); как мне указать каким типом писать данные (в m-filе) ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
anton 0 17 апреля, 2007 Опубликовано 17 апреля, 2007 · Жалоба А при чем тут М файл????? Я вообше не пытался использовать М файл. Сейчас точно синтаксис не помню но команды похожи на си fopen fclose fread fwrite Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexZabr 0 17 апреля, 2007 Опубликовано 17 апреля, 2007 · Жалоба А при чем тут М файл????? Я вообше не пытался использовать М файл. Сейчас точно синтаксис не помню но команды похожи на си fopen fclose fread fwrite Дык данные обрабатываются в МАТЛАБе (посредством М-файл кодов) и соотв. их него и пишутся в файл. Затем они должны читаться в С (в CCS IDE). МАТЛАБ 7 поддерживает такие-же как в С файловые функции, те что вы и упомянули - я ими-же и пользуюсь в M-файлах (смотрите выше - это кусок кода в М-файле, не в сорсе С, хотя и идентичен). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
anton 0 19 апреля, 2007 Опубликовано 19 апреля, 2007 · Жалоба Извени показалось что ты используешь запись переменных сессии матлаба. смутила фраза. как мне указать каким типом писать данные (в m-filе) ? Тип ты указал float(хотя посмотри хелп возможно есть вариации обозначения). При такой записи не возникает проблем со считыванием в С (правда пользовался вижуал С) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться