Как я понял, при расчете в таком виде
Цитата
// 1. Вычисление результата в рекурсивной ветви звена:
// D10 = Uadc + D11*a11 + D12*a12
void MyChannelClass::FilterOne(MyChannelClass *pntr)
{
//формат коэффициентов 4.12
//формат переменных фильтров 8.8
pntr->D10 = pntr->ADC_buffer;
//ывделяем из формата 12.20 число в формате 8.8
pntr->D10 = pntr->D10 + int( fmuls16x16_32( pntr->D11, pntr->a11)>>12 );
pntr->D10 = pntr->D10 + int( fmuls16x16_32( pntr->D12, pntr->a12)>>12 );
pntr->D12 = pntr->D11;
pntr->D11 = pntr->D10;
}
далее выполняется
// 2. Детектирование и сглаживание сигнала (амплитудное детектирование
// Цикл выборки НЧ в 16 раз больше периода квантования
// Uad1 = 4*b10*abs(D10)
реально вы получаете фильтр с коэффициентами b0=x, b1=0, b2=0, а не b0=x, b1=0, b2=-x. В результате АЧХ, конечно, изменяется, но описываемых вами чудес не наблюдается.
Посмотрел еще в FDATool как сказываются эффекты квантования на характеристики фильтра на 430 Гц. При формате коэффициентов 4.12 все нормально при условии использования режима переполнения wrap. Если же использованить saturate фильтр становится неустойчивым. А если верить FDATool переполнения случаются. Возможно, причина глюков в этом.
Если есть сомнения в программной реализации, попробуйте проверить ее в Simulink. Сделайте ваш фильтр как S-function и расчет делайте точно также как вы делаете в AVR'е, т.е. с теми же типами переменных, форматами и прочее.