В задачах обработки сигналов основное применение фильтров заключается в выделении полезного сигнала из аддитивной смеси его с шумом. Пусть входной сигнал представляет собой сумму дискретных гармоник с частотами 1500 Гц (шум) и 6000 Гц (полезный сигнал). Первая гармоника входит в полосу задерживания фильтра, вторая - в полосу пропускания. Из рис. 13 следует, что выходной сигнал фильтра воспроизводит только вторую гармонику и подавляет первую.
Рис. 13. Сигналы с частотами 1500 и 6000 Гц, суммарный сигнал и сигнал на выходе фильтра.
Код, с помощью которого получены результаты на рис. 13:
N=1000;
i=0:1:N-1;
Tt=1./Ft;
s=2*sin(2*pi*1500*Tt*i);
s1=sin(2*pi*6000*Tt*i);
x=s+s1;
subplot(411)
plot (i, s), axis([0,1000,-2,2]),
set(gca,'FontName','Times New Roman Cyr','FontSize', 10),
title('Сигнал с частотой 1500 Гц' )
subplot(412)
plot (i, s1), axis([0,1000,-2,2]),
set(gca,'FontName','Times New Roman Cyr','FontSize', 10),
title('Сигнал с частотой 6000 Гц')
subplot(413)
plot (i, x), axis([0,1000,-2,2]),
set(gca,'FontName','Times New Roman Cyr','FontSize', 10),
title('Сигнал + шум')
subplot(414)
F=filter(numd, dend, x);
plot(i, F), axis([0,1000,-2,2]),
set(gca,'FontName','Times New Roman Cyr','FontSize', 10),
title('Сигнал на выходе фильтра')
xlabel('Дискретные отсчеты, n')
Пронаблюдаем, каким будет сигнал после фильтрации при подаче сигналов
с частотами 2000 и 8000 Гц:
N=1000;
i=0:1:N-1;
Tt=1./Ft;
s=sin(2*pi*2000*Tt*i);
s1=sin(2*pi*8000*Tt*i);
subplot(411)
plot (i, s), axis([0,1000,-2,2]), set(gca,'FontName','Times New Roman Cyr','FontSize', 10),
title('Сигнал с частотой 2000 Гц' )
grid on
subplot(412)
F=filter(numd, dend,s);
plot(i, F), axis([0,1000,-2,2]), set(gca,'FontName','Times New Roman Cyr','FontSize', 10),
title('Сигнал на выходе фильтра')
grid on
subplot(413)
plot (i, s1), axis([0,1000,-2,2]), set(gca,'FontName','Times New Roman Cyr','FontSize', 10),
title('Сигнал с частотой 8000 Гц' )
grid on
subplot(414)
F=filter(numd, dend,s1);
plot(i, F), axis([0,1000,-2,2]), set(gca,'FontName','Times New Roman Cyr','FontSize', 10),
title('Сигнал на выходе фильтра')
grid on
xlabel('Дискретные отсчеты, n')
Рис. 14. Выходные сигналы фильтра.
Как видно из представленного графика, что фильтр пропускает сигналы с частотами 2000 и 8000 Гц, представляющие в спроектированном фильтре верхнюю и нижнюю частоты среза.
Далее, необходимо рассмотреть, как фильтр будет реагировать на сигналы со следующими частотами: 1247 Гц – нижняя граничная частота полосы задерживания и 11000 Гц – частота, которая сходит в переходную полосу фильтра. На рис. 15 приведены графики на выходе фильтра с соответствующими частотами. И судя по ним, можно сказать, что фильтр пропускает их с большим послаблением. Также из графиков видна задержка сигнала на выходе фильтра, обуславливающаяся нелинейностью ФЧХ фильтра.
Рис. 15. Выходные сигналы фильтра, при входных с
частотами 1247 Гц и 11000 Гц, соответственно.
Рис. 16. Выходные сигналы фильтра, при входных с частотами 1247 Гц и 11000 Гц, соответственно (увеличенный масштаб)
Рис. 17. Выходные сигналы фильтра, при входных с
частотами 50 Гц и 13000 Гц, соответственно.
Фильтр пропускает без искажения гармоники сигнала, входящие в полосу пропускания фильтра (в интервале от 2000 до 8000 Гц), с допустимым ослаблением (не более 0,707), пропускает те гармоники сигнала, частота которых входит в переходную полосу фильтра (в интервалах от 1247 до 2000 Гц и от 8000 до 11000 Гц), и практически не пропускать гармоники сигнала, находящиеся в полосе задерживания фильтра.
Программирование фильтра и оценка быстродействия
Для реальной оценки быстродействия фильтра разработана программа на языке Visual С++, иллюстрирующая один из примеров реализации фильтра.
В программе за входной сигнал принят уже использованный ранее с частотой 5000 Гц, что входит в полосу пропускания фильтра.
Листинг программы реализации фильтра с комментариями:
#include <iostream.h>
#include <math.h>
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void sleep( clock_t wait )
{
clock_t goal;
goal = wait + clock();
while( goal > clock() ) ;
}
#define N 5000 // Количество отсчетов
#define L 1 // Количество раз обработки этих отсчетов
void main()
{
double y[N],x[N]; // определяем массивы a и b
double a[17]={ 1.00000000000000, -8.677802923343,
36.377624181453, -98.198275640578,
191.631314325146, -287.108772148849,
341.728963363368, -329.485746185612,
259.925095008817, -168.242894288576,
89.022621415581, -38.096391080543,
12.927857754314, -3.364906624499,
0.634202105561, -0.077466072584,
0.004634197868
};
double b[17]={ 0.00049884915809, 0.00000000000001,
-0.00399079326485, 0.00000000000040,
0.01396777642546, 0.00000000000205,
-0.027935552855810, 0.00000000000307,
0.03491944106372, 0.00000000000190,
-0.02793555285419, 0.00000000000046,
0.01396777642641, 0.00000000000005,
-0.00399079326474, 0.00000000000000, 0.00049884915809
};
int Fd=40000; //частота дискретизации
double Td=1/Fd;
clock_t start, finish; // обозначаем переменные, работающие со временем
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.