Создание дополнения для SMath Studio

Аватара пользователя
viacheslavmezentsev
Сообщения: 6
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Доброго.

Нашёл вашу библиотеку интересной в плане расширения возможностей математической программы SMath Studio в плане проектирования цифровых фильтров. Там пока есть всёго одна функция: FIR Filter Design .

Сама программа написана на c# и дополнения к ней также должны быть созданы на базе .Net. Однако, существует возможность подключать код на C/C++. У меня есть богатый для этого опыт. Основная цель - это иметь возможность использовать функции библиотеки без "программирования".

Есть вопросы. Я так понимаю, что в репозитории лежит самодостаточный набор исходников? Вижу там исходники на доисторическом фиксированном фортране. Есть ли какие подводные камни, если я хочу поменять компилятор на MSVC? У меня есть опыт сборки кода на фортране, тем более, что сейчас появился Intel one API для этого, встраиваемый в Visual Studio.
Т.е. правильно ли я понимаю, что для сборки мне нужно отдельно собрать код на фортране для двух библиотек (BLAS и LAPACK), а затем подключить их для сборки самой библиотеки? Существует ли в коде какая-то специфика расширений синтаксиса от gnu C компилятора?

Мне в результате нужен набор из двух dll (32 и 64 разрядные), которые не имеют никаких "лишних" зависимостей. Функции из этих библиотек через специальный "переходник" будут подключены к математической программе. В принципе, lib файлы также подойдут. Пока попробую создать сборочное окружение самостоятельно (смешанное решение в Visual Studio).

ПС. Всё собрал как хотел, простой пример с вызовом функции из библиотеки работает. К сожалению, немножко сложновато вышло. Фортрановский код собирается при помощи современного intel компилятора из oneAPI. Таким образом получается 3 библиотеки: libblas(32|64), liblapack_complex(32|64) и liblapack_double(32|64). Далее подсовываю их в проект libdspl, но у меня он на C++/CLI. Осталось "обернуть" нужные мне функции и вызывать обёртки из .Net.

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1078
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение Бахурин Сергей »

Ну так и есть. Сначала собираются фортрановские либы линейной алгебры. После из них линкуются функции в dll. В результате получается самодостаточная dll с возможностью динамической линковки.

Аватара пользователя
viacheslavmezentsev
Сообщения: 6
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Выглядит вызов функций вот так. Осталось только аккуратно их все завести и создать примеры использования. Меня больше всего интересуют возможности проектирования цифровых фильтров.
Вложения
bessel_i0()
bessel_i0()

Аватара пользователя
viacheslavmezentsev
Сообщения: 6
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Оно работает :) Вот так выглядит пример с функцией filter_iir(). Как закончу, выложу тут ссылку на использование набора функций в этой программе.
Вложения
пример с filter_iir()
пример с filter_iir()

Аватара пользователя
viacheslavmezentsev
Сообщения: 6
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Попробовал заменить BLAS и LAPACK на OpenBLAS. Компилируется и работает пока. Жаль только библиотека OpenBLAS поставляется только как dll. Не нашёл статических lib-файлов. К сожалению, для сборки моего дополнения вместе со стандартными BLAS и LAPACK мне нужно таскать за собой 200 Мб статических фортрановских библиотек, если я компилирую интеловским компилятором. Как собрать эти библиотеки полностью статическими я не нашёл. Компилятор суёт зависимости и всё.
У нас сборка идёт на удалённом сервере из svn-репозитория и держать там 200 Мб неохота. Поэтому я пока остановился на OpenBLAS в качестве замены. Это утяжеляет дополнение до 17 Мб в сжатом состоянии. Дополнение работает для обеих разрядностей.

Залил проект дополнения в общедоступный репозиторий: DSP Library (C#, C++/CLI, VS2019). Он настроен для сборки как дополнение для SMath Studio.
Страничка на форуме SMath Studio с описанием дополнения: DSP Library. Вся справочная информация по нему теперь будет там.
Вложения
Генерация псевдослучайных чисел
Генерация псевдослучайных чисел

Аватара пользователя
viacheslavmezentsev
Сообщения: 6
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Сборочный сервер что-то заглючил, не могу собрать текущую версию исходников. Выглядит многообещающе. После добавления функций нужно ещё описать как их применять в математическом пакете. Есть некоторые отличия.
Вложения
dspl_fir_linphase.pdf.zip
dspl_fir_linphase.sm
(238.46 КБ) 11 скачиваний
Пример с dspl_fir_linphase()
Пример с dspl_fir_linphase()

Аватара пользователя
Бахурин Сергей
Администратор
Сообщения: 1078
Зарегистрирован: 05 окт 2010, 19:55
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение Бахурин Сергей »

Очень приятно, что библиотека приносит пользу. В ней кстати, еще довольно шустрые FFT алгоритмы реализованы и свертки если что. Вообще если есть необходимость в каких-то функциях, то вполне могу дописать. Надо только знать какие именно нужны.

Аватара пользователя
viacheslavmezentsev
Сообщения: 6
Зарегистрирован: 20 ноя 2021, 00:45
Контактная информация:

Re: Создание дополнения для SMath Studio

Сообщение viacheslavmezentsev »

Спасибо, что выложили. Я постараюсь по возможности "обернуть" максимальное количество функций, кроме тривиальных. Кстати, я использую динамическое связывание, но немного в другом смысле. Для .Net используется свой механизм загрузки и нет необходимости в экспортировании имён функций, как это делается обычным способом. Да и текущий код, отвечающий за механизм инициализации указателей на функции, я бы подсократил.

Существует один приём на случай, когда в библиотеке несколько сотен функций и можно ошибиться, если по нескольку раз одно и то же имя должно присутствовать в нескольких частях кода. Для C++ я использую такой приём здесь: ppp.cpp
Вкратце, там создаётся глобальный список и функции при определении уже попадают в этот список "неявным" образом. Т.е. формирование списка функций получается как бы само собой при начальной загрузке (подключении библиотеки). Тонкость основана на том, что компилятор позволяет вызывать функции в инициализаторах. Поэтому можно декларировать каждую функцию (прототип) только один раз, а при динамической загрузке просто перебирать их массив, как это сделано в коде в самом низу (EnumerateExistingFunctions). Но это для C++, там есть удобный тип vector для этой цели. В случае же C нужен простой список или статический массив. Короче говоря, я думаю, что можно существенно подсократить и упростить содержимое подключаемых файлов. В моём случае функций было больше 200 и очень легко было ошибиться при copy-paste. Пришлось придумать полуавтоматический метод.

По поводу использования быстрых FFT алгоритмов. Я там заметил кое-где использование структуры fft_t. В каких-то случаях её нужно специальным образом инициализировать. В математическом пакете нужно скрыть этот механизм и я пока не понял как. Т.е. пользователь не должен задумываться, что нужно делать какую-то подготовительную работу для вызова этих функций. Вот у меня и возник вопрос: можно ли как-то это автоматизировать для любого размера входного вектора?
Вложения
БИХ фильтры
БИХ фильтры
КИХ фильтры
КИХ фильтры

Ответить