В дополнение рабочий код на фильтр 2 порядка... Исходник из библиотеки приложен.
Мой код (фильтр 2 порядка):
#define _PSVPAGE( n ) __builtin_psvpage( n )
#define SetupFilter( fil, state1, state2, coeffs, section )\
fil.numSectionsLess1 = section - 1;\
fil.coeffsBase = (fractional *)coeffs;\
fil.coeffsPage = _PSVPAGE( coeffs );\
fil.delayBase1 = state1;\
fil.delayBase2 = state2;\
fil.finalShift = 0x0
//Количество секций
#define sum_LPFNumSections 1
const fractional sum_LPFCoefs[] = {
0x001D, // b( 1,0)/2
0x003B, // b( 1,1)/2
0x001D, //-a( 1,0)/2
0x780A, // b( 1,2)/2
0xC77F //-a( 1,2)/2
};
IIRTransposedStruct sum_LPFFilter; //Структура фильтра
fractional sum_LPFStates1[sum_LPFNumSections * 2];
fractional sum_LPFStates2[sum_LPFNumSections * 2];
//Входной сигнал (отсчеты АЦП)
fractional sum_inputSignal __attribute__((space(xmemory)));
//Выходной сигнал (выход фильтра)
fractional sum_outputSignal __attribute__((space(xmemory)));
int main (void)
{
...
SetupFilter(sum_LPFFilter, sum_LPFStates1, sum_LPFStates2, sum_LPFCoefs, sum_LPFNumSections);
IIRTransposedInit(&sum_LPFFilter); //Инициализация цифрового фильтра
...
while (1)
{
if (Отсчет АЦП готов)
{
IIRTransposed(1, &sum_outputSignal, &sum_inputSignal, &sum_LPFFilter);
...
}
...
}
}
Если теперь меняю коэффициенты на
const fractional sum_LPFCoefs[] = {
0x0014, // b( 1,0)/2
0x0014, // b( 1,1)/2
0x7FD6, //-a( 1,0)/2
0x0000, // b( 1,2)/2
0x0000 //-a( 1,2)/2
};
Выход улетает "вверх" и не возвращается