Проектирование цифрового БИХ-фильтра Чебышева 1-го типа верхних частот. Вариант 1, страница 5

В данной работе было осуществлено проектирование цифрового фильтра верхних частот Чебышева первого типа, который удовлетворяет спецификациям, указанным в задании. В качестве метода проектирования был выбран переход от аналогового прототипа непосредственно к цифровому фильтру путем билинейного преобразования. Результаты проектирования представлены в виде графиков амплитудно-частотной, фазочастотной характеристик, а также диаграммы нулей и полюсов, которые являются доказательством того, что фильтр соответствует заданной спецификации. Небольшие отклонения имеют граничные частоты полосы пропускания и полосы задерживания, но при этом уменьшается переходная полоса фильтра, что является весьма желательным. В ходе анализа методов реализации фильтров, была выбрана последовательная (каскадная) реализация, поскольку реальные цифровые фильтры имеют ограничения по количеству разрядов в коэффициентах, а такой метод позволяет заметно снизить погрешности, оказываемые квантованием и округлением.

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


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

1.  Доц. Щетинин Ю.И. Конспект лекций по курсу «Теории и обработки сигналов». Лекции №24-28. 2005-2006 учебный год.

2.  Богнер Р., Константинидис А. Введение в цифровую фильтрацию. М.: Мир,1976 – 216 с.

3.  Применение цифровой обработки сигналов. Под ред. Э.Оппенгейма. М.:Мир,1980–552с.

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

Приложения

Приложение 1. Программа фильтра на С++.

Листинг кода программы:

#include <stdio.h>

#include <conio.h>

#include <math.h>

#include <iostream.h>

#include <windows.h>

int N=1000,M=14,Fd=5000;     //количество отсчетов, порядок фильтра и частота //дискретизации

double pi=3.141592653589;

double b,var,a,var1,                              //обозначение промежуточных переменных

x[10000],                                             //отсчеты входного сигнала фильтра

y[10000],                                             //отсчеты выходного сигнала фильтра

out1[10000],

out2[10000],                

out3[10000],

out4[10000],

out5[10000],

out6[10000],

out7[10000],

//формирование передаточных функций звеньев второго порядка:                  

num1[3]={1,- 2.1054687500. 1.1054687500},                          

den1[3]={1, 0.710937500, 0.2851562500},                  

num2[3]={1-2.06250000, 1.0625000000},                               

den2[3]={1, -0.28906250, 0.582031250},

num3[3]={1-1.902343750, 0.902343750},

den3[3]={1, -0.96093750,0.734375000},

num4[3]={1-1.996093750, 0.89843750.},

den4[3]={1,0.03125000,0.816406250},

num5[3]={1-1.937500, 0.937500},

den5[3]={1-1.433593750, 0.9687500},

//описание функции filter(), осуществляющей фильтрацию

double filter(double x[],int n, double numc[],double denc[])      

{                                                                                                                                                        

            for(int i=0;i<M+1;i++)

                                    {

                                               var=numc[i]*x[n-i];      //вычисление суммы элементов bk*x(n-k)

                                               b=var+b;

                                    }

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

                                    {

                                               var1=denc[i]*y[n-i];      //вычисление суммы элементов ak*y(n-k)

                                               a=var1+a;

                                    }

            y[n]=b-a;                      //вычисление выходного сигнала фильтра

                                               //по уравнению y(n)=bk*x(n-k)-ak*y(n-k)

return y[n];

}         

void main()

{                                                                                

for(int n=0;n<N;n++)

            {           //формирование отсчетов входного сигнала

                        x[n]=2*cos((2*pi*100*n)*1/Fd)+cos((2*pi*1500*n)*1/Fd);      

            }

            double time,time1;                   

            time=GetTickCount();                                      //определение текущего времени

            for(n=0;n<N;n++)                                                         //фильтрация входного сигнала

            {                      //постепенное прохождение входного сигнала через все звенья системы:

                        out1[n]=filter(x,n,num1,den1);

                        out2[n]=filter(out1,n,num2,den2);

                        out3[n]=filter(out2,n,num2,den2);

                        out4[n]=filter(out3,n,num2,den2);

                        out5[n]=filter(out4,n,num2,den2);

                        out6[n]=filter(out5,n,num2,den2);

                        out7[n]=filter(out6,n,num2,den2);

            }

            time1=GetTickCount()-time;                 //определение времени выполнения фильтрации

            cout<<"Number of samples : ";

            cout<<"N="<<N<<endl;

            cout<<"Time of filtering : ";

            cout<<time1<<" ms"<<endl;

            cout<<"Time of filtering one sample: ";

            cout<<(time1)/N<<" ms"<<endl;          

getch();

}