Я пытаюсь закодировать цифровой фильтр вызова на микроконтроллере AVR, и у меня возникли некоторые проблемы с реализацией диаграммы состояний в арифметике с фиксированной запятой.Вот картина потока сигналов, для которого я пытаюсь написать код: ![enter image description here](https://i.stack.imgur.com/49pxl.jpg)
Редактировать: (Я считаю, что уравнение для T_c выше должно быть e ^ [- 1 / (F_s * D)])
Вот что у меня так далеко.У меня есть подпрограмма, называемая smultfix, которая выполняет умножение фиксированной точки со знаком на два 8-битных целых числа со знаком и возвращает 16-битный продукт со знаком.F_c и T_c являются 8-битными знаковыми двоичными дробями.«Выход» и промежуточный шаг на стыке входа T_c и элемента задержки z1 рассматриваются как 16-битные двоичные дроби.Итак, у меня есть:
(предположим, что F_c и T_c определены в другом месте)
int8_t generateSample()
{
static int16_t z1 = 0x7FFF; //initialize first delay element to max positive value
static int16_t output;
int8_t byteOutput = 0;
int8_t bytez1 = 0;
bytez1 = (z1 & 0xFF00)>>8; //make z1 into an eight bit signed binary fraction for
//multiplication
output = (smultfix(bytez1,F_c)<<1) + output; //calculate output, shift product
//left once to
//remove double sign bit
byteOutput = (output & 0xFF00)>>8; //generate output byte
z1 = (-(smultfix(byteOutput,F_c)<<1)) - \
(smultfix(bytez1,T_c)<<1) //generate intermediate
//product z1
return byteOutput;
}
К сожалению, я, кажется, только что создал плохой генератор случайных чисел, так как этот код генерирует много мусоразаполняя мой выходной буфер!Если кто-то может указать, где я могу пойти не так, или если у него есть идея реализации, которая была бы лучше, это было бы очень ценно.