2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 ФНЧ цифровая фильтрация на языке Cи
Сообщение05.11.2014, 18:44 
Аватара пользователя
Нашёл кучу примеров в интернете, но не удалось разобраться. Может кто-то подскажет или объяснит как она работает на примере простого кода?

 
 
 
 Re: ФНЧ цифровая фильтрация на языке Cи
Сообщение05.11.2014, 19:38 
Какие фильтры Вас интересуют: тип фильтра, КИХ, БИХ? Интересует расчет фильтров или сам алгоритм фильтрации?
Для каких задач? Уточните вопрос.

 
 
 
 Re: ФНЧ цифровая фильтрация на языке Cи
Сообщение06.11.2014, 11:19 
Аватара пользователя
Скорее КИХ. Мне нужно фильтровать отсчёты сигнала типа float, поступающие с термодатчика микроконтроллера MSP430. Отсчёты я получаю поочередно в коде на Си. Скорее всего, нужно понять как получить коэффициенты и как работает фильтр в коде.

 
 
 
 Re: ФНЧ цифровая фильтрация на языке Cи
Сообщение06.11.2014, 18:15 
Аватара пользователя
Alex9 в сообщении #927350 писал(а):
нужно понять как получить коэффициенты

В Матлабе. В программе FdaTool проектируете фильтр с нужными параметрами, и делаете экспорт коэффициентов.

Alex9 в сообщении #927350 писал(а):
как работает фильтр в коде

Лайонса читали уже?

 
 
 
 Re: ФНЧ цифровая фильтрация на языке Cи
Сообщение06.11.2014, 18:39 
Аватара пользователя
Нет, если можно, то поделитесь ссылкой.

 
 
 
 Re: ФНЧ цифровая фильтрация на языке Cи
Сообщение06.11.2014, 20:22 
Аватара пользователя
http://rutracker.org/forum/viewtopic.php?t=1729964

 
 
 
 Re: ФНЧ цифровая фильтрация на языке Cи
Сообщение11.11.2014, 21:55 
Возможно БИХ-фильтр будет эффективнее в вычислительном плане.
Фильтр можно рассчитать в Matlab. К примеру фильтр Баттерворта:
Код:
close all;
clear all;
% Порядок фильтра
order = 2;

% Нормированная частота среза
% Wn = Fd/(2*Fn), где Fd - частота дискретизации,Fn-частота среза в Гц
Wn = 0.2;

% Расчет фильтр
[b,a] = butter(order,Wn);
%[b,a] = besself(order,Wn);
b
a

% Вывод АЧХ
[h,w]=freqz(b,a);
figure('Name', 'Response');
subplot(211);
plot(w/(pi), abs(h));
subplot(212);
plot(w/(pi), unwrap(angle(h)));

Фильтр Бесселя имеет линейную ФЧХ, поэтому для некоторых задач он будет эффективнее и вносить меньше искажений.

Если Вам просто нужно сгладить сигнал - воспользуйтесь алгоритмом простого скользящего среднего: это просто скользящее усреднение по данным.

Так же для устранения шума подойдет и инерционное звено первого порядка: y[k] = y[k - 1] + K*( x[k] - y[k-1] );
Если вам надо фильтровать сигнал с датчика используйте выраженние
filtered_data += K*(in_data - filtered_data);
где K - определяет постоянную времени и подбирается в зависимости от условий и полосы пропускания.

Полезный ресурс http://dsplib.ru/

 
 
 [ Сообщений: 7 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group