MATLAB генерация кода на C

Аватара пользователя
mbk
Сообщения: 15
Зарегистрирован: 18 июн 2012, 11:41

MATLAB генерация кода на C

Сообщение mbk »

Есть ли в MATLAB возможность генерировать код на языке C? Конкретно в Filter Design and Analysis Tool(fdatool), при разработке фильтра есть возможность с генерировать файл(хидер) с коэффициентами фильтра...а еще нужен исходный код реализации фильтра.

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

Re: MATLAB генерация кода на C

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

вы можете рассчитать коэффициенты фильтра в матлабе, забить из в хидер и использовать их в сишной функции фильтрации. Если надо сишную функцию цифровой фильтрации могу дать.

Аватара пользователя
mbk
Сообщения: 15
Зарегистрирован: 18 июн 2012, 11:41

Re: MATLAB генерация кода на C

Сообщение mbk »

Добрый день Сергей!)
Я так и делаю...только хотелось изучить код фильтра MATLAB-а...
"Если надо сишную функцию цифровой фильтрации могу дать." - а какие у Вас C-ые функции? Буду очень признателен если дадите)
Заранее благодарен.

Владимир
Сообщения: 4
Зарегистрирован: 11 янв 2017, 14:25

Re: MATLAB генерация кода на C

Сообщение Владимир »

Добрый день! Столкнулись с аналогичным вопросом, генерируем фильтр в Filter Design and Analysis Tool получаем файл(хидер) с коэффициентами фильтра. А к этому всему нужен еще исходный код реализации фильтра. Можете ли вы его дать или ссылку на источник где можно его поискать.

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

Re: MATLAB генерация кода на C

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

Функция dspl_filter_iir.

Исходные коды функции можно получить на github. Но обращаю внимание, что использование этой функции возможно при соблюдении условий LGPL лицензии. Т.е. вы не можете ее просто скоаировать и использовать.

Владимир
Сообщения: 4
Зарегистрирован: 11 янв 2017, 14:25

Re: MATLAB генерация кода на C

Сообщение Владимир »

Сергей, спасибо за ссылку. Посмотрел исходный код но осталось не понятным как использовать полученный в Matlab хидер. У нас стоит задача фильтровать сигнал фильтром чебышева1 20 порядка. При использовании такого высокого порядка фильтра применение коэффициентов передаточной функции b и a не приводит к успеху. Filter Design and Analysis Tool генерируер SOS матрицу и вектор ScaleValues которую и записывает в h-фаил. В представленном исходном коде в качестве входных аргументов используются коэффициентов передаточной функции b и a. Каким образом применить полученную матрицу?

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

Re: MATLAB генерация кода на C

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

Каждая sos это отдельный фильтр второго порядка. Вы можете поставить их 10 штук последовательно и получите каскад sos. Нужно посмотреть что вас за sos матрица. А если не секрет зачем вам такой фильтр аж 20 порядка?

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

Re: MATLAB генерация кода на C

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

И еще момент. Можно попробовать забрать значения к-тов из матлаба в формате double тогда разрядность не потеряется и сишная функция будет работать нормально без заморочек с sos.

Владимир
Сообщения: 4
Зарегистрирован: 11 янв 2017, 14:25

Re: MATLAB генерация кода на C

Сообщение Владимир »

На выходе из Filter Design and Analysis Tool мы можем получить хидер или текстовый файл с коэффициентами (во вложении) но в какой последовательности подставлять коэффициенты в функцию фильтрации не понимаю.
Фильтр нужен для выполнения требований конструкторской документации по измерению сигналов вибрации.
Вложения
sos_filtr.zip
(1.77 КБ) 357 скачиваний

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

Re: MATLAB генерация кода на C

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

Вот пример в матлабе как из данных файла sos.fcf получить к-ты секций второго порядка и построить АЧХ полученного фильтра

Код: Выделить всё

clear all; close all; clc;

%Это матрица SOS из файла sos.fcf размером 10 строк 6 столбцов
SOS = [                                                           
1  0  -1                    1  -1.8867640724468351  0.92517081112871102;
1  0  -1                    1  -1.5258233225679898  0.90533464175233458;
1  0  -0.99999999999999989  1  -1.7346513971386999  0.84967388748391226;
1  0  -1                    1  -1.6456687950694271  0.83933452243216689;
1  0  -1                    1  -1.9751951458356249  0.9927772976886946 ;
1  0  -1                    1  -1.9568699648947216  0.97678235921399059;
1  0  -0.99999999999999989  1  -1.8207261065013256  0.88538899268378146;
1  0  -1                    1  -1.5710265072893341  0.86024124030502069;
1  0  -1                    1  -1.5249435571993033  0.96606604353432879;
1  0  -1                    1  -1.9297641957906844  0.95557339249630724;
];
   

% вектор Scale Values: 
Scale = [                                                        
0.014596161131115632                                                   
0.87589938224418817                                                    
0.18471332922283085                                                    
0.126731009163638                                                      
0.09906476998206161                                                    
0.014392258483404963                                                   
0.1872273312580465                                                     
0.68922523577890604                                                    
0.086735906182831821                                                   
3.6955756683410086  
];

% Здесь будем считать реакцию фильтра 
% на единичный импульс как каскад SOS

% длинный входной сигнал чтобы получить
% характеристики длинного фильтра
N = 16384; 
x = zeros(1, N);
x(9) = 1; % единичный импульс

y = x;

% Цикл по секциям второго порядка (их 10)
for k = 1:10
  
  % первые 3 значения k-ой строки матрицы SOS  
  % это к-ты b  k-ой секции второго порядка
  b = SOS(k, 1:3); 
  
  % вторые 3 значения k-ой строки матрицы SOS  
  % это к-ты a  k-ой секции второго порядка
  a = SOS(k, 4:6); 
  
  % расчет выхода k-ой секции 
  % y это выход предыдущей секции 
  % (для первой секции просто входной сигнал)
  % При расчете используем scale из файла
  y = Scale(k) * filter(b,a,y); 
    
end

% Теперь в y выход фильтра 20 порядка
% Посчитаем его АЧХ
H = 20*log10(abs(fft(y)));

%нормированная частота от 0 до 2.
frq = 2*(0:N-1)/N;

%График АЧХ от для частоты от 0 до 1
figure; plot(frq(1:N/2), H(1:N/2));


Если надо сишник то все тоже самое только вместо filter можно использовать мою функцию из DSPL
Вместо входного сигнала x подставить можно любой ваш входной сигнала и вектор y будет хранить выход вашего фильтра разбитого на SOS.

Ответить