[an error occurred while processing this directive]
|
остается постоянка по абсолютному значению равная 1266, что есть -124 дб относительно 2^31.
long sat_shl(long a)
{if ((a & 0x80000000) == ((a & 0x40000000) << 1))
return a << 1;
else
return a < 0 ? 0x80000000 : 0x7FFFFFFF;
}
long z00,z01,z10,z11;long mul(long a, long b)
{
__int64 tmp;tmp = ((__int64)a)*((__int64)b);
tmp += 0x40000000UI64;return tmp >> 31;
}
/*
B0 = 0,99881593277769 = 1072470442
B1 = -1,99763186555538 = -2144940883
B2 = 0,99881593277769 = 1072470442
A0 = 1
A1 = -1.99763046353970 = -2144939378
A2 = 0.99763326757106 = 1071200564
*/long filter (long data) // 1.31
{long acc; // 2.30
acc = mul( 1072470442, data);
acc += mul(-2144940883, z00);
acc += mul( 1072470442, z01);
acc -= mul(-2144939378, z10);
acc -= mul( 1071200564, z11);acc = sat_shl(acc);
z01 = z00;
z00 = data;
z11 = z10;
z10 = acc;return acc;
}