Olegus 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба Мне тут советовали попробовать Matlab Coder для генерации кода для работы с матрицами для контроллера, быстро и хорошо получилось. Теперь я решил таким же образом генернуть c помощью Matlab Coder фильтр скользящего среднего используя функцию y = filter(b,a,x); Генерация прошла успешно, но как я обнаружил в сишных файлах моя функция пустая, может я не туда смотрю. M.файл function y = Moving_averig_my(x) windowSize = 5; b = (1/windowSize)*ones(1,windowSize); a = 1; y = filter(b,a,x); Ну и сишный (основной как я понимаю) /* * File: Moving_averig_my.c * * MATLAB Coder version : 3.2 * C/C++ source code generated on : 09-Apr-2019 21:15:12 */ /* Include Files */ #include "rt_nonfinite.h" #include "Moving_averig_my.h" /* Function Definitions */ /* * Arguments : double x * Return Type : double */ double Moving_averig_my(double x) { return x * 0.2; } /* * File trailer for Moving_averig_my.c * * [EOF] */ Вход на 0,2 умножается и на выход.(Откуда эта цифра 0,2 вообще взялась). Это что значит? При генерации никаких сообщений, что мол Coder не поддерживает данную функцию не было, весь пакет файлов сгенерировался. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegus 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба Вот все сгенерировал Matlab Coder. Example особо не помог. Filter_moving_average.rar Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegus 0 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба И вроде на сайте Matlab https://www.mathworks.com/help/coder/ug/functions-supported-for-code-generation-alphabetical-list.html написано, что данная функция поддерживает генерацию С/С++. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 9 апреля, 2019 Опубликовано 9 апреля, 2019 · Жалоба Умная оптимизация, всего лишь. Деление на 5 (а деление, даже аппаратное, обычно требует не один такт CPU для выполнения) заменяется на умножение на 0.2, которое на современных архитектурах, в большинстве случаев, занимает 1 такт. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegus 0 10 апреля, 2019 Опубликовано 10 апреля, 2019 · Жалоба Так и почему сгенерированная функция пустая. Проверил ее в Simulink все работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tpeck 0 10 апреля, 2019 Опубликовано 10 апреля, 2019 · Жалоба 30 minutes ago, Olegus said: Так и почему сгенерированная функция пустая. Проверил ее в Simulink все работает. Ну так вы на вход подаете вектор размерностью 1. На выходе вам вернулся вектор размерностью 1 умноженный на 1-й коэффициент передачи вашего фильтра = 0.2. Остальные 4 коэффициента вы не используете, если подаете вектор размерностью 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegus 0 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба В 10.04.2019 в 13:48, Tpeck сказал: Ну так вы на вход подаете вектор размерностью 1. На выходе вам вернулся вектор размерностью 1 умноженный на 1-й коэффициент передачи вашего фильтра = 0.2. Остальные 4 коэффициента вы не используете, если подаете вектор размерностью 1. Именно так, спасибо. Все получилось. Единственное из вектора сигнала с датчика (у меня размерность 100) первые 4 значения скачок а затем все ровно. Это связано с размерностью окна и начальными условиями наверное? От этого не избавится? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Tpeck 0 11 апреля, 2019 Опубликовано 11 апреля, 2019 · Жалоба 4 minutes ago, Olegus said: Единственное из вектора сигнала с датчика (у меня размерность 100) первые 4 значения скачок а затем все ровно. Это связано с размерностью окна и начальными условиями наверное? От этого не избавится? если я правильно понимаю, то это переходная характеристика фильтра. От переходной характеристики не избавиться. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegus 0 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба Исследую далее возможности Matlab по генерации кода на Си. С помощью Filter Design создал ФНЧ, затем генернул m-функцию этого фильтра, промоделировал в Simulink, все работает, затем с помощью Matlab Coder сгенерировал Си код, запрограммировал контроллер stm32F303. Подаю для теста единицу на фильтр, а он дает значение в два раза большее, не могу понять почему!!! (в Simulink на ту же единицу на выходе "1" в установ. режиме). Подаю на этот фильтр сигнала с акселерометра фильтр динамику повторяет с учетом своей полосы т.е. вроде живет, но эта большая постоянная ошибка, в разы!? Код такой: Сначала инициализация фильтра (без вызова этой функции не работает) Low_pass_for_accel_initialize(); затем в бесконечном цикле кручу функцию: double Ax_calib_out_LPF = Low_pass_for_accel((double)1); Matlab Coder создает в папке сгенерированного Си-кода пример использования этой функции (чтобы понять как ей пользоваться). Вот он. Может я что-то делаю не так? main.c Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegus 0 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба 49 minutes ago, Olegus said: ? Кто ж на STM32 double использует?! Переделайте на float как минимум. После этого можно дальше смотреть. А так я из Matlab десятки фильтров нагенерил в С-и всяческих: IIR, FIR, Калмана и проч. и ни разу не было расхождений между матлабом и результатом работы в микроконтроллере. Эт на случай если вы грешите на Matlab. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olegus 0 14 апреля, 2019 Опубликовано 14 апреля, 2019 · Жалоба Я использую double потому что Matlab Coder не предлагает float, a только double или single и не для всех типов генериться код. Это вопрос точности, затрат ресурсов, а у меня дикое расхождение хотя фильтр живой!? можно привести в уже сгенеированном коде переменные к типу float, но не думаю, что это что-то даст, хотя может я неправ. Я фильтр скользящего окна так делал из Matlab Coder вроде все работала с double. Мне кажется тут у меня какая-то очевидная ошибка я просто не вижу ее. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 25 15 апреля, 2019 Опубликовано 15 апреля, 2019 · Жалоба 15 hours ago, AlexandrY said: А так я из Matlab десятки фильтров нагенерил в С-и всяческих: IIR, FIR, Калмана и проч. и ни разу не было расхождений между матлабом и результатом работы в микроконтроллере. Эт на случай если вы грешите на Matlab. Справедливости ради: Матлаб не использует для вычислений ни double ни float типа IEEE 754. Он считает с точностью 16 десятичных цифр, округляя последнюю. Теоретически эту точность можно повысить - но у меня он при этом падает. И поэтому безусловно результаты вычислений в Матлабе, и на Си или калькуляторе - будут отличаться. Для развлечения можно проверить чему равен sin(pi) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlexandrY 3 15 апреля, 2019 Опубликовано 15 апреля, 2019 · Жалоба 1 hour ago, _4afc_ said: И поэтому безусловно результаты вычислений в Матлабе, и на Си или калькуляторе - будут отличаться. Не. В Matlab работает типизация. Какой тип укажете с таким Matlab и будет вычислять. У меня вычисления бит в бит совпадают когда надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_4afc_ 25 15 апреля, 2019 Опубликовано 15 апреля, 2019 · Жалоба 2 hours ago, AlexandrY said: Не. В Matlab работает типизация. Какой тип укажете с таким Matlab и будет вычислять. У меня вычисления бит в бит совпадают когда надо. Не совсем так. floating-point-agreement-between-matlab-and-c Ну и у меня не совпадают DevCpp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться