Рис. 9. Сигнал помехи, полезный сигнал, их аддитивная смесь и сигнал на выходе фильтр.
Из графика видно, что фильтр хорошо пропускает высокочастотную полезную составляющую и подавляет низкочастотные помехи.
Фрагмент Matlab Script для иллюстрирования работы фильтра на граничных частотах:
N=1000;
i=0:1:N-1;
s1=sin(2*pi*2750*i/20000);
s2=sin(2*pi*3000*i/20000);
F1=filter(numd, dend, s1);
F2=filter(numd, dend, s2)
subplot(211);
plot(i, F1);
title('Реакция фильтра на сигнал с частотой 2750 Гц');
subplot(212);
plot(i, F2);
title('Реакция фильтра на сигнал с частотой 3000 Гц');
Рис.10. Фильтрация сигналов с граничными частотами.
График наглядно иллюстрирует, что фильтр на граничной частоте полосы задерживания – задерживает сигнал, а на граничной частоте пропускания – пропускает сигнал.
Программирование фильтра и оценка быстродействия.
Для оценки быстродействия полученного фильтра используется программа на языке C++, в качестве компилятора использовался Microsoft Visual C++ 6.0 (программа модифицирована под данный фильтр, основа программы – программа для оценки быстродействия фильтра студентки Худяковой Т.Н гр. АО-21).
//Листинг программы для оценки быстродействия
#include <stdio.h>
#include <iostream.h>
#include <math.h>
#include <windows.h>
#include <conio.h>
#define MAXS 100000 // максимальная размерность массивов
//входного и выходного сигналов
#define N 20000 // число отсчетов
int por=2; // порядок фильтров для каскадной формы
double b,B,a,A; // переменные для вычисления отсчетов
// выходного сигнала
double pi=3.141592653589;
double Fd=20000;
double Td=1/Fd;
double y[MAXS]; // массив для формирования отсчетов
// выходного сигнала
double x[MAXS]; // массив для формирования отсчетов
//входного сигнала
double exit1[MAXS]; // массивы передачи сигнала между элементами
double exit2[MAXS]; // каскадной формы фильтра
double exit3[MAXS];
double exit4[MAXS];
double exit5[MAXS]; // каскадной формы фильтра
double exit6[MAXS];
double exit7[MAXS];
double X1[3]={0.00173780201716, 0.00353414054081, -0.00174147401282};
// коэффициенты полиномов числителя ПФ фильтра 2-го порядка
double Y1[3]={1,1.10768915931740 ,0.38282971367742};
// коэффициенты полиномов знаменателя ПФ фильтра 2-го порядка
double X2[3]={1,-2.33796856625263,1.37505253116290};
double Y2[3]={1, 0.53005925145465,0.51793859935682};
double X3[3]={1, -2.20520122302418,1.23962425399669};
double Y3[3]={1, -0.11844312649894,0.67196892494537};
double X4[3]={1, -2.04427933438687,1.07558708082703};
double Y4[3]={1, -0.59154364917854,0.78886911535303};
double X5[3]={1, -1.70336367792585,0.72971206012283};
double Y5[3]={1, 0.04692258458613,0.85937500000000};
double X6[3]={1, -1.77938551227314,0.80650626817012};
double Y6[3]={1, -1.07064940469863,0.92928004581301};
double X7[3]={1, -1.89611746554437,0.92484530450940};
double Y7[3]={1, -1.16456064244377,0.97730710590806};
double OS(double x[],int n, double m1[],double m2[])
// функция расчета выходного сигнала фильтра 2-го порядка
{
for(int i=0;i<por+1;i++)
{
b=m1[i]*x[n-i];
B=b+B;
}
for(i=1;i<por+1;i++)
{
a=m2[i]*y[n-i];
A=a+A;
}
y[n]=B-A;
return y[n];
}
DWORD WINAPI Thread_filter(LPVOID)
// отдельный поток для фильтрации сигнала
{
double OS(double x[],int n,double m1[],double m2[]);
// определение функции расчета выходного сигнала с фильтра 2-го порядка
double s,s_1;
//определение переменных для подсчета временного интервала фильтрации
s = GetTickCount();
// получение значения счетчика времени
for(int n=0;n<N;n++) // фильтрация входного сигнала
{
exit1[n]=OS(x,n,X1,Y1);
exit2[n]=OS(exit1,n,X2,Y2);
exit3[n]=OS(exit2,n,X3,Y3);
exit4[n]=OS(exit3,n,X4,Y4);
exit5[n]=OS(exit4,n,X5,Y5);
exit6[n]=OS(exit5,n,X6,Y6);
exit7[n]=OS(exit6,n,X7,Y7);
}
s_1 = GetTickCount() - s;
// вычисление времени фильтрации входного сигнала в миллисекундах
cout<<endl;
cout<<"N="<<N;
cout<<endl;
cout<<"General time to filtering : ";
cout<<s_1<<" ms"<<endl;
cout<<"Time to filtering ones sample: ";
cout<<(s_1*1000)/N<<"mcs"<<endl;
return 0;
}
void main()
{
unsigned long ThreadId; // определение идентификатора потока
for(int j=0;j<N;j++)
{
x[j]=2*cos(2*pi*12100*Td*j)+cos(2*pi*9800*Td*j);
// расчет гармонического входного сигнала
}
CreateThread(NULL,0,Thread_filter,x,0,&ThreadId);
// создание и запуск потока для начала фильтрации сигнала
getch();
}
Программа выполнялась на персональном компьютере, на базе процессора IntelCeleronD 331 с тактовой частотой 2,66 Гц, 512 Mb RAM.
Таблица 1. Результаты работы программы для определения быстродействия фильтра
N |
t |
T |
2000 |
62 мс |
31 мкс |
5000 |
172 мс |
34.4 мкс |
10000 |
344 мс |
34.4 мкс |
20000 |
703 мс |
35.15 мкс |
50000 |
1750 мс |
35 мкс |
Среднее время обработки одного отсчета составляет 33,99 мкс.
Заключение.
В ходе данной курсовой работы был спроектирован цифровой БИХ-фильтр верхних частот Чебышева 1 рода (пульсация в зоне проводимости), удовлетворяющий заданной спецификации. Фильтр был рассчитан методом билинейного преобразования, относящегося к методам, основанным на аналоговых прототипах, из-за простоты проектирования и высокого качества результирующего фильтра. Получившийся фильтр имеет довольно хорошую амплитудно-частотную характеристику, но его фазо-частотная характеристика нелинейная.
Была предложена каскадная (последовательная) форма реализации фильтра, выполненная на 7 фильтрах второго порядка. АЧХ полученной системы полностью удовлетворяет спецификации.
Также было проведено тестирование фильтра, где фильтр показал себя с лучшей стороны. Тестирование заключалось в пропускании через фильтр аддитивной смеси двух сигналов: высокочастотного (полезного) и низкочастотного (помехи). На выходе наблюдалась только высокочастотная составляющая, что свидетельствует о хорошей работе фильтра.
В последнем пункте курсовой работы была произведена оценка быстродействия фильтра.
Список литературы.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.