Использую фильтр 2 порядка.
Точнее два-три каскадно включенных таких фильтра
float iir_b2o4hz_1_1(float)
float iir_b2o4hz_1_2(float)
float iir_b2o4hz_1_3(float)
/**************************************************************
WinFilter version 0.8
http://www.winfilter.20m.com
akundert@hotmail.com
Filter type: Low Pass
Filter model: Bessel
Filter order: 2
Sampling Frequency: 8 KHz
Cut Frequency: 0.004000 KHz
Coefficents Quantization: float
Z domain Zeros
z = -1.000000 + j 0.000000
z = -1.000000 + j 0.000000
Z domain Poles
z = 0.997282 + j -0.001567
z = 0.997282 + j 0.001567
***************************************************************/
float iir_b2o4hz_1_1(float NewSample)
{
static float ACoef[2+1] = { 0.00000475623212008441,
0.00000951246424016882,
0.00000475623212008441};
static float BCoef[2+1] = { 1.00000000000000000000,
-1.99456353223009740000,
0.99457337504708221000};
static float y[2+1]; //output samples
static float x[2+1]; //input samples
uint8_t n;
//shift the old samples
for(n=2; 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<=2; n++) y[0] += ACoef[n] * x[n] - BCoef[n] * y[n];
return y[0];
}
В процессе прохождения сигнала через фильтр его уровень становится дискретным с дискретой примерно 1.5%
Те на входе изменяю сигнал плавно а на выходе ступеньки.
Изменив флоаты на даблы все приводится в норму.
Но ОЧЕНЬ хочется обойтись флоатами ибо разница в скорости раз в десять.
Флоаты это "Single precision data type for IEEE 754 arithmetic" 32бит с мантиссой 23разряда.
А 1.5% это всего-лишь 6разрядов.
Куда копать?
ЗЫ.Коэффициенты пробовал менять типа 0.00000475623212008441 на 0.475623212008441.
Не помогло.
Даблы 64бит с мантиссой 52бит