На ARM7TDMI 66МГц удавалось сделать целочисленный БИХ ФНЧ 6 порядка. Работало в риалтайме при входном датарейте 100кГц при разрядности данных 16 бит. Правда, на это уходило ~90% времени МК. У вас входная частота ниже, частота МК выше, ядро Cortex. Возможно, и порядок фильтра нужен поменьше. И разрядности, может, 8 бит достаточно.
Выглядело примерно так:
//БИХ ФНЧ Чебышева 6-го порядка с частотой среза 710 Гц и неравномерностью
//в полосе пропускания 0.1 дБ. Датарейт на входе 99992.7667 Гц.
#pragma optimize=s high
inline short IIR0_6x_LP_710Hz(short IIRSample)
{
#define IIR0_6x_LP_710Hz_Part1() \
long long SectionOut; \
long long Temp64; \
const long Sin = 28002460; \
const long A01 = 526672187; \
const long A02 = -258374833; \
const long _ZCF0 = 1048576; \
const long _semi_ZCF0 = _ZCF0/2; \
const long _ACF_ZFcorrected0 = 256; \
Z02 = Z01; \
Z01 = Z00; \
Temp64 = (long long)Z01*A01 + (long long)Z02*A02; \
Temp64 /= _ACF_ZFcorrected0; \
Temp64 += (long long)Sin*IIRSample; \
if(Temp64 < 0) Z00 = (Temp64 - _semi_ZCF0)/_ZCF0; \
else Z00 = (Temp64 + _semi_ZCF0)/_ZCF0; \
SectionOut = (long long)Z01*2; \
SectionOut += Z00; \
SectionOut += Z02; \
const long A11 = 529103498; \
const long A12 = -261034975; \
const long _ZCF1 = 4096; \
const long _semi_ZCF1 = _ZCF1/2; \
const long _ACF_ZFcorrected1 = 65536; \
Z12 = Z11; \
Z11 = Z10; \
#define IIR0_6x_LP_710Hz_Part2() \
Temp64 = (long long)Z11*A11 + (long long)Z12*A12; \
Temp64 /= _ACF_ZFcorrected1; \
Temp64 += SectionOut; \
if(Temp64 < 0) Z10 = (Temp64 - _semi_ZCF1)/_ZCF1; \
else Z10 = (Temp64 + _semi_ZCF1)/_ZCF1; \
SectionOut = (long long)Z11*2; \
SectionOut += Z10; \
SectionOut += Z12; \
const long A21 = 533538639; \
const long A22 = -265703397; \
const long _ZCF2 = 2048; \
const long _semi_ZCF2 = _ZCF2/2; \
const long _ACF_ZFcorrected2 = 131072; \
Z22 = Z21; \
Z21 = Z20; \
Temp64 = (long long)Z21*A21 + (long long)Z22*A22; \
Temp64 /= _ACF_ZFcorrected2; \
Temp64 += SectionOut; \
if(Temp64 < 0) Z20 = (Temp64 - _semi_ZCF2)/_ZCF2; \
else Z20 = (Temp64 + _semi_ZCF2)/_ZCF2; \
SectionOut = (long long)Z21*2; \
SectionOut += Z20; \
SectionOut += Z22; \
const long _Sout = 131072; \
const long _semiSout = _Sout/2; \
if(SectionOut < 0) SectionOut = (SectionOut-_semiSout)/_Sout; \
else SectionOut = (SectionOut+_semiSout)/_Sout; \
if(SectionOut > 32767) SectionOut = 32767; \
if(SectionOut < -32767) SectionOut = -32767; \
IIRSample = SectionOut; \
IIR0_6x_LP_710Hz_Part1();
IIR0_6x_LP_710Hz_Part2();
return IIRSample;
}