Фиксированный цифровой фильтр звонка в C - PullRequest
1 голос
/ 08 ноября 2011

Я пытаюсь закодировать цифровой фильтр вызова на микроконтроллере AVR, и у меня возникли некоторые проблемы с реализацией диаграммы состояний в арифметике с фиксированной запятой.Вот картина потока сигналов, для которого я пытаюсь написать код: enter image description here

Редактировать: (Я считаю, что уравнение для 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;  
}

К сожалению, я, кажется, только что создал плохой генератор случайных чисел, так как этот код генерирует много мусоразаполняя мой выходной буфер!Если кто-то может указать, где я могу пойти не так, или если у него есть идея реализации, которая была бы лучше, это было бы очень ценно.

1 Ответ

1 голос
/ 10 ноября 2011

Код на самом деле правильный - но знак уравнения для T_c действительно должен быть положительным , а не отрицательным.В первом издании книги он показан как отрицательный, и кажется, что это изображение было взято из второго издания книги, в котором уравнение было исправлено.Если T_c оценивается с отрицательной экспонентой, колебания будут увеличиваться, но если она положительна, колебания будут уменьшаться, чего мы и хотим.Работа с отрицательным значением T_c и переключение знака вычитания со второй на последнюю строку также работает.

...