Код
/************************************************************************
* *
* Библиотека для цифровой фильтрации. *
* Версия: 1.01. *
* *
* Файл: fir.c Дата создания: 08.07.2010г. *
* Последние изменения: 08.07.2010г. *
* Сапего Александр Леонидович. (sapegoal@mail.ru) *
* *
************************************************************************/
#include "stdint.h"
// Фильтр 2-го порядка исходя из формулы y0^ = a0*(x0+x2)+a1*x1 + b1*y0 + b2*y1 + c1*y0
// где a и b - коэффициенты, c - целая часть y0
// После выполнения производится сдвиг y.
// y1 -> y2, y0 -> y1, y0^ -> y0;
//
// В процедуру передаётся 2 параметра
// 1 - указатель на значения, в последовательности: x0,x1,x2,y0,y1,y2
// 2 - указатель на значения коэффициентов в последовательности: a0,a1,b1,b2,c1
// По финишу результат делится на 32768
struct data_s
{
int16_t x[3],y[3]; // Данные фильтра
};
struct coef_s
{
int16_t a0, a1, b1, b2, c1; // Коэффициенты фильтра
};
void fir2_16(uint8_t * data, uint8_t * coef)
{
struct data_s *d_s;
struct coef_s *c_s;
int32_t acc;
d_s = (struct data_s *) data;
c_s = (struct coef_s *) coef;
acc = (int32_t)(d_s->x[0] + d_s->x[2]) * (int32_t)c_s->a0;
acc += (int32_t)d_s->x[1] * (int32_t)c_s->a1;
acc += (int32_t)d_s->y[0] * (int32_t)c_s->b1;
acc += (int32_t)d_s->y[1] * (int32_t)c_s->b2;
acc >>= 15;
acc += d_s->y[0] * c_s->c1;
d_s->y[2] = d_s->y[1];
d_s->y[1] = d_s->y[0];
d_s->y[0] = acc;
}
Код
// Фильтр Баттерворта 4 порядка 1000 -> 100; 200 = -30 дб
//
// 1 звено y0 = 0,061885*(x0+x2) + 0,123770*x1 + 1,048600*y1 - 0,296140*y2
// Коэффициенты a0,a1,b1,b2,c1 = 2028, 4056, 1593, -9704, 1
// 2 звено y0 = 0,077956*(x0+x2) + 0,155913*x1 + 1,320910*y1 - 0,632739*y2
// Коэффициенты a0,a1,b1,b2,c1 = 2554, 5109, 10516, -20734, 1
//
int16_t fltr_c1[5] = {2028, 4056, 1593, -9704, 1},
fltr_c2[5] = {2554, 5109, 10516, -20734, 1};
Код
fir2_16((uint8_t *)&lin[cnt_line].x[0],(uint8_t *)fltr_c1);// Первое звено фильтра
fir2_16((uint8_t *)&lin[cnt_line].y[0],(uint8_t *)fltr_c2);// Второе звено фильтра
Так например. ))