ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
370703 Топик полностью
Argon (23.11.2012 21:29 - 21:35, просмотров: 229) ответил Alt@ir на Как организовать антиалиасинг? Микрофон, голос, дискретизация 8кГц.
На 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; }