Смотреть в сторону применения хрени типа stm32f4xx с аппаратным блоком плавучки и winfilter с даблами.Результат можно прям сразу запускать на процессоре.Отдельная песня с применением фильтра Бесселя.Матлаб его вообще игнорирует по причине невозможности корректной цифровой реализации а винфильтр как-то синтезирует но возможен траходром.Целочисленные коэффициенты требуют глубокого вникания в тему.
Вот пример полосового фильтра 48-52Гц
/**************************************************************
WinFilter version 0.8
http://www.winfilter.20m.com
akundert@hotmail.com
Filter type: Band Pass
Filter model: Butterworth
Filter order: 2
Sampling Frequency: 4 KHz
Fc1 and Fc2 Frequencies: 0.048000 KHz and 0.052000 KHz
Coefficents Quantization: float
Z domain Zeros
z = -1.000000 + j 0.000000
z = -1.000000 + j 0.000000
z = 1.000000 + j 0.000000
z = 1.000000 + j 0.000000
Z domain Poles
z = 0.994943 + j -0.076018
z = 0.994943 + j 0.076018
z = 0.994472 + j -0.080427
z = 0.994472 + j 0.080427
***************************************************************/
#define NCoef 4
float iir(float NewSample) {
float ACoef[NCoef+1] = {
0.00004595038040017619,
0.00000000000000000000,
-0.00009190076080035238,
0.00000000000000000000,
0.00004595038040017619
};
float BCoef[NCoef+1] = {
1.00000000000000000000,
-3.97883065352601670000,
5.94890707902649480000,
-3.96119229923324710000,
0.99115359586283902000
};
static float y[NCoef+1]; //output samples
static float x[NCoef+1]; //input samples
int n;
//shift the old samples
for(n=NCoef; n>0; n--) {
x[n] = x[n-1];
y[n] = y[n-1];
}
//Calculate the new output
x[0] = NewSample;
y[0] = ACoef[0] * x[0];
for(n=1; n<=NCoef; n++)
y[0] += ACoef[n] * x[n] - BCoef[n] * y[n];
return y[0];
}