Разработка цифрового БИХ-ФВЧ Баттерворта, страница 4

double y1[3]={ 1.00000000000000,     -0.24379838906509,         0};

double x2[3]={ 1.00000000000000,   -2.53952222895923,              1.61558182696610};

double y2[3]={ 1.00000000000000,    -0.49153269144504,              0.06798950631853};

double x3[3]={ 1.00000000000000,   -2.43847917577143,                1.51103832193082};

double y3[3]={  1.00000000000000.   -0.50358928380089,               0.09418575446632};

double x4[3]={ 1.00000000000000,    -2.27586838906861,              1.34356001048993};

double y4[3]={ 1.00000000000000,    -0.52454581599867,              0.13971957046668};

double x5[3]={  1.00000000000000,   -2.09080630925029,               1.15404066484925};

double y5[3]={ 1.00000000000000,    -0.55581735189653,              0.20766554887937};

double x6[3]={ 1.00000000000000,    -1.90949144504352                0.96878603922254};

double y6[3]={ 1.00000000000000,    -0.59965669193688                0.30291853508911};

double x7[3]={ 1.00000000000000,     -1.57395946203672                0.62483383844160};

double y7[3]={  1.00000000000000,   -0.65950171414082               0.43294824845380};

double x8[3]={  1.00000000000000,  -1.64125672697907               0.69405783956813};

double y8[3]={ 1.00000000000000,    -0.74055879058406              0.60906696574850};

double x9[3]={   1.00000000000000,   -1.75467267541226                0.81039948287221};

double y9[3]={ 1.00000000000000,    -0.85078957390062              0.84857355764226};

double x[N + 17];                                      // входной сигнал

DWORD WINAPI  Bat_thread_code(LPVOID)          // поток вычисления выходного сигнала

  {

    int i;

    double y[N + 17];                                   // выходной сигнал.

    DWORD n,n1;

    n = GetTickCount();                             // засекаем время начала вычисления выходного сигнала

    for (i = 0; i < 17 ; i++)

    y[12] = 0;                                              // цикл вычисления выходного сигнала

    for (i = 3; i < N + 3; ++i)

      {

        y[i] = x1[3]*x[i - 3];

        for(int j = 0; j < 3;++j)

          y[i] = y[i] + x1[j]*x[i - j] + y1[j+1]*y[i - j - 1];

        }

       for (i = 3; i < N + 3; ++i)

      {

        y[i] = x2[3]*x[i - 3];

        for(int j = 0; j < 3;++j)

          y[i] = y[i] + x1[j]*x[i - j] + y2[j+1]*y[i - j - 1];

        }

        for (i = 3; i < N + 3; ++i)

      {

        y[i] = x3[3]*x[i - 3];

        for(int j = 0; j < 3;++j)

          y[i] = y[i] + x3[j]*x[i - j] + y3[j+1]*y[i - j - 1];

        }

         for (i = 3; i < N + 3; ++i)

      {

        y[i] = x4[3]*x[i - 3];

        for(int j = 0; j < 3;++j)

          y[i] = y[i] + x4[j]*x[i - j] + y4[j+1]*y[i - j - 1];

        }

        for (i = 3; i < N + 3; ++i)

      {

        y[i] = x5[3]*x[i - 3];

        for(int j = 0; j < 3;++j)

          y[i] = y[i] + x5[j]*x[i - j] + y5[j+1]*y[i - j - 1];

        }

        for (i = 3; i < N + 3; ++i)

      {

        y[i] = x6[3]*x[i - 3];

        for(int j = 0; j < 3;++j)

          y[i] = y[i] + x6[j]*x[i - j] + y6[j+1]*y[i - j - 1];

        }

        for (i = 3; i < N + 3; ++i)

      {

        y[i] = x7[3]*x[i - 3];

        for(int j = 0; j < 3;++j)

          y[i] = y[i] + x6[j]*x[i - j] + y6[j+1]*y[i - j - 1];

        }

        for (i = 3; i < N + 3; ++i)

      {

        y[i] = x8[3]*x[i - 3];

        for(int j = 0; j < 3;++j)

          y[i] = y[i] + x6[j]*x[i - j] + y6[j+1]*y[i - j - 1];

        }

        for (i = 3; i < N + 3; ++i)

      {

        y[i] = x9[3]*x[i - 3];

        for(int j = 0; j < 3;++j)

          y[i] = y[i] + x6[j]*x[i - j] + y6[j+1]*y[i - j - 1];

        }

    n1 = GetTickCount() - n;                  // время вычисления выходного сигнала в миллисекундах

    printf("%d ms",n1);

            return 0;

  }

void main()

  {

    int i;

    unsigned long ThreadId;

    for (i=0;i<17;++i) x[i] = 0;                                                          //вычисление входного сигнала

    for (i = 1; i < N ; ++i)                                                                  

          x[i+12] = sin(2*pi*1000*Td*i) + sin(2*pi*6000*Td*i);               CreateThread(NULL,0,Bat_thread_code,x,0,&ThreadId);                  // создание потока

    getch();

  }      

Заключение

            В результате проделанной работы был спроектирован БИХ-фильтр высоких частот Баттерворта, который удовлетворяет спецификациям, указанным в задании. При проектировании применялся метод, основанный на использовании аналогового прототипа, а переход к цифровому фильтру был осуществлен с помощью метода билинейного преобразования. На следующем этапе была получена последовательная форма реализации цифрового фильтра. Она представляет собой каскадное соединение (последовательное) 8-ми фильтров 2-ого порядка и 1-ого фильтра 1-ого порядка. Для проверки работоспособности фильтра было проведено его тестирование, которое дало результаты, удовлетворяющие требованиям. И в завершении работы было осуществлено программирование фильтра и оценка его быстродействия, так, например, было получено, что при количестве отсчетов 10000 время обработки одного отсчета составляет 3,2мкс. Такой фильтр вполне может использоваться для фильтрации сигналов, но естественно могут возникать какие-то погрешности и неточности в его работе. Также в цифровых фильтрах можно легко изменять коэффициенты, а следовательно, и характеристики фильтра, не изменяя структуры набора, что создает уникальную возможность осуществления последовательного спектрального анализа фактически на одном цифровом фильтре; наконец, создаются самые широкие возможности для синтеза перестраиваемых, адаптивных и многофункциональных фильтров.

Список литературы

1.  Голышев Н.В., Щетинин Ю.И. Теория и обработка сигналов, часть 2, учебное пособие. Новосибирск: НГТУ 1998. -115 с.

2.  Каппелини В., Константинидис А.Дж., Эмилиани П.  Цифровые фильтры и их применение.

      М: Энергоатомиздат, 1983.- 360 с.

3.  Г. Мошиц, П. Хорн  Проектирование активных фильтров.   М: Мир, 1984. - 320 с.

4.   Гутников В.С.  Фильтрация измерительных  сигналов.  Л.: Энергоатомиздат.  Ленингр. отдел.                      

      1990. – 192 с.