MATLAB генерация кода на C
MATLAB генерация кода на C
Есть ли в MATLAB возможность генерировать код на языке C? Конкретно в Filter Design and Analysis Tool(fdatool), при разработке фильтра есть возможность с генерировать файл(хидер) с коэффициентами фильтра...а еще нужен исходный код реализации фильтра.
- Бахурин Сергей
- Администратор
- Сообщения: 1119
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: MATLAB генерация кода на C
вы можете рассчитать коэффициенты фильтра в матлабе, забить из в хидер и использовать их в сишной функции фильтрации. Если надо сишную функцию цифровой фильтрации могу дать.
Re: MATLAB генерация кода на C
Добрый день Сергей!)
Я так и делаю...только хотелось изучить код фильтра MATLAB-а...
"Если надо сишную функцию цифровой фильтрации могу дать." - а какие у Вас C-ые функции? Буду очень признателен если дадите)
Заранее благодарен.
Я так и делаю...только хотелось изучить код фильтра MATLAB-а...
"Если надо сишную функцию цифровой фильтрации могу дать." - а какие у Вас C-ые функции? Буду очень признателен если дадите)
Заранее благодарен.
Re: MATLAB генерация кода на C
Добрый день! Столкнулись с аналогичным вопросом, генерируем фильтр в Filter Design and Analysis Tool получаем файл(хидер) с коэффициентами фильтра. А к этому всему нужен еще исходный код реализации фильтра. Можете ли вы его дать или ссылку на источник где можно его поискать.
- Бахурин Сергей
- Администратор
- Сообщения: 1119
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: MATLAB генерация кода на C
Функция dspl_filter_iir.
Исходные коды функции можно получить на github. Но обращаю внимание, что использование этой функции возможно при соблюдении условий LGPL лицензии. Т.е. вы не можете ее просто скоаировать и использовать.
Исходные коды функции можно получить на github. Но обращаю внимание, что использование этой функции возможно при соблюдении условий LGPL лицензии. Т.е. вы не можете ее просто скоаировать и использовать.
Re: MATLAB генерация кода на C
Сергей, спасибо за ссылку. Посмотрел исходный код но осталось не понятным как использовать полученный в Matlab хидер. У нас стоит задача фильтровать сигнал фильтром чебышева1 20 порядка. При использовании такого высокого порядка фильтра применение коэффициентов передаточной функции b и a не приводит к успеху. Filter Design and Analysis Tool генерируер SOS матрицу и вектор ScaleValues которую и записывает в h-фаил. В представленном исходном коде в качестве входных аргументов используются коэффициентов передаточной функции b и a. Каким образом применить полученную матрицу?
- Бахурин Сергей
- Администратор
- Сообщения: 1119
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: MATLAB генерация кода на C
Каждая sos это отдельный фильтр второго порядка. Вы можете поставить их 10 штук последовательно и получите каскад sos. Нужно посмотреть что вас за sos матрица. А если не секрет зачем вам такой фильтр аж 20 порядка?
- Бахурин Сергей
- Администратор
- Сообщения: 1119
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: MATLAB генерация кода на C
И еще момент. Можно попробовать забрать значения к-тов из матлаба в формате double тогда разрядность не потеряется и сишная функция будет работать нормально без заморочек с sos.
Re: MATLAB генерация кода на C
На выходе из Filter Design and Analysis Tool мы можем получить хидер или текстовый файл с коэффициентами (во вложении) но в какой последовательности подставлять коэффициенты в функцию фильтрации не понимаю.
Фильтр нужен для выполнения требований конструкторской документации по измерению сигналов вибрации.
Фильтр нужен для выполнения требований конструкторской документации по измерению сигналов вибрации.
- Вложения
-
- sos_filtr.zip
- (1.77 КБ) 503 скачивания
- Бахурин Сергей
- Администратор
- Сообщения: 1119
- Зарегистрирован: 05 окт 2010, 19:55
- Контактная информация:
Re: MATLAB генерация кода на C
Вот пример в матлабе как из данных файла sos.fcf получить к-ты секций второго порядка и построить АЧХ полученного фильтра
Если надо сишник то все тоже самое только вместо filter можно использовать мою функцию из DSPL
Вместо входного сигнала x подставить можно любой ваш входной сигнала и вектор y будет хранить выход вашего фильтра разбитого на SOS.
Код: Выделить всё
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));
Вместо входного сигнала x подставить можно любой ваш входной сигнала и вектор y будет хранить выход вашего фильтра разбитого на SOS.