Вот что у меня получилось:
Код
//float ACoef[3]={1, -1.913780606355776, 0.917346934620046};
//float BCoef[3]={1, 2, 1};
int16_t ACoef[3]={16384, -31355, 15029};
int16_t BCoef[3]={16384, 32767, 16384};
int y[3], x[3];
int16_t NewSample;
//*Фильтр Баттерворта 2ого порядка Low-Pass-------------------------------------------------
for(n=2; n>0; n--) {x[n]=x[n-1]; y[n]=y[n-1];} //Сдвигаем старые значения
//Вычисляем новое выходное значение
x[0]=NewSample<<4; y[0]=BCoef[0]*x[0];
y[0]=y[0]>>15;
for(n=1; n<=2; n++) {y[0]+=(BCoef[n]*x[n])-(ACoef[n]*y[n]);
y[0]=y[0]>>15;}
Рассчитал коэффициенты фильтра, умножив, исходные полученные в Matlab на 16384. Также я сдвигаю полученные в 12 битном АЦП отсчеты на 4 влево (x[0]=NewSample<<4;) для приведения к формату Q1.15 и еще сдвигаю рассчитанный выходной сигнал на 15 вправо. После этого вывожу отсчеты на ЦАП. Фильтр не работает т.е. искаженная синусоида проходит без фильтрации и фазовый сдвиг вместо 90гр получился около 5гр (см. рис., входная синусоида желтая).
С float арифметикой все работало, один в один как в Matlabe:
Правильная фильтрация:
Что я делаю не так?
Сообщение отредактировал sidy - Jul 4 2013, 09:35