Получим АЧХ каскадной формы с округлением:
[z,p,k]=tf2zp(numd, dend)
sos=zp2sos(z,p,k)
[z, p, k]=sos2zp(sos)
[b_q, a_q]=zp2tf(z, p, k);
[H_q, f1]=freqz(b_q, a_q, 256, Ft);
figure(3)
hold on
plot(f, abs(H),'g','LineWidth',2),
plot( f1,abs(H_q), 'b'),
set(gca,'FontName','Times New Roman Cyr','FontSize',10)
grid on
legend('АЧХ спроектированного фильтра', 'АЧХ каскадного фильтра')
xlabel('Частота, Гц')
sos =
0.00175225785417 -0.00135965324556 0
1.00000000000000 -0.24379838906509 0
1.00000000000000 -2.53952222895923 1.61558182696610
1.00000000000000 -0.49153269144504 0.06798950631853
1.00000000000000 -2.43847917577143 1.51103832193082
1.00000000000000 -0.50358928380089 0.09418575446632
1.00000000000000 -2.27586838906861 1.34356001048993
1.00000000000000 -0.52454581599867 0.13971957046668
1.00000000000000 -2.09080630925029 1.15404066484925
1.00000000000000 -0.55581735189653 0.20766554887937
1.00000000000000 -1.90949144504352 0.96878603922254
1.00000000000000 -0.59965669193688 0.30291853508911
1.00000000000000 -1.57395946203672 0.62483383844160
1.00000000000000 -0.65950171414082 0.43294824845380
1.00000000000000 -1.64125672697907 0.69405783956813
1.00000000000000 -0.74055879058406 0.60906696574850
1.00000000000000 -1.75467267541226 0.81039948287221
1.00000000000000 -0.85078957390062 0.84857355764226
Так как спроектированный фильтр имеет 17-й порядок, то можно его представить как каскадное соединение восьми фильтров 2-ого порядка и одного фильтра 1-ого порядка.
Каскадная форма представления передаточной функции данного фильтра будет иметь вид:
Структурная схема последовательной формы:
где
Рис. 6 АЧХ исходного и каскадного фильтров.
Видно, что АЧХ каскадной формы с округлением не отличается от АЧХ исходной, то есть такая реализация вполне подходит для данного фильтра.
Тестирование фильтра
Пусть входной сигнал представляет собой сумму дискретных гармоник с частотами 1000 Гц (шум) и 5000 Гц (полезный сигнал). Первая гармоника входит в полосу задерживания фильтра, вторая - в полосу пропускания:
N=500; Tt=1/Ft; i=0:1:N-1;
s=2*sin(2*pi*1000*Tt*i);
s1=sin(2*pi*5000*Tt*i);
x=s+s1;
subplot(411)
plot(i, s), set(gca,'FontName','Times New Roman Cyr','FontSize',10)
title('Сигнал с частотой 1000 Гц' )
subplot(412)
plot(i, s1),set(gca,'FontName','Times New Roman Cyr','FontSize',10)
title('Сигнал с частотой 5000 Гц')
subplot(413)
plot(i, x),set(gca,'FontName','Times New Roman Cyr','FontSize',10)
title('Сигнал, содержащий низкочастотые шумы')
subplot(414)
F=filter(numd, dend, x)
plot(i, F),set(gca,'FontName','Times New Roman Cyr','FontSize',10)
title('Сигнал после фильтрации')
Рис. 7. Сигналы с частотами 1000 и 5000 Гц, суммарный сигнал и сигнал на выходе фильтра.
Пронаблюдаем, каким будет сигнал после фильтрации при подаче сигналов с частотами 2350 Гц и 3000 Гц, которые являются граничными частотами задерживания и пропускания проектируемого фильтра соответственно:
Рис. 8. Сигнал с частотой 2350 Гц на входе фильтра (верхний график) и на выходе (нижний график).
Рис. 9. Сигнал с частотой 3000 Гц на входе фильтра (верхний график) и на выходе (нижний график).
Как видно из представленных графиков, фильтр пропускает сигнал с частотой 3000 Гц, представляющую в спроектированном фильтре частоту среза и подавляет сигнал с частотой 2350 Гц – граничной частотой задерживания фильтра.
Далее, необходимо рассмотреть, как фильтр будет реагировать на сигнал с частотой 7000 Гц. На рис. 10 приведены графики на входе и выходе фильтра. И судя по ним, можно сказать, что фильтр пропускает сигнал практически без подавления.
Рис. 10. Сигнал с частотой 7000 Гц на входе фильтра (верхний график) и на выходе (нижний график).
В итоге, по представленным графикам можно сделать вывод о том, что спроектированный фильтр полностью соответствует заданной спецификации: подавляет сигналы, имеющие частоту менее либо равную 2350 Гц, и пропускает сигналы с частотами 3000 Гц и выше.
Программирование фильтра и оценка его быстродействия
Для оценки быстродействия полученного фильтра была разработана программа на языке C++, в качестве компилятора использовался Microsoft Visual C++ 6.0.
В написанной программе расчет входного сигнала производится в главной функции программы, а выходного сигнала - в отдельном потоке, где для его вычисления организован цикл. Для анализа быстродействия вычисления выходного сигнала была использована функция API GetTickCount(), которая возвращает количество миллисекунд, прошедших с начала работы. Перед циклом вычисления выходного сигнала переменной n присваивается значение GetTickCount(), а по завершению цикла еще раз вызывается функция GetTickCount() и по разности между ее значением и значением переменной n определяется время вычисления цикла. Данный метод дает приблизительную оценку времени вычисления цикла, более того эта оценка зависит от конфигурации и свободных системных ресурсов компьютера, на котором запускается программа. При запуске программы на компьютере с процессором Intel Pentium4 (512k L2) 2,4 GHz для N=10000, где N - количество отчетов, он выполнялся порядка t=32 мс, значит время обработки одного отсчета (Т) в режиме реального времени будет равно: Т = время обработки всех отсчетов(t)/количество отсчетов = t/N=3,2 мкс. Можно менять число отсчетов N, например:
N |
t |
T |
10000 |
32мс |
3,2мкс |
20000 |
156мс |
7,8мкс |
50000 |
718мс |
14,36мкс |
100000 |
1503мс |
15,03мкс |
Листингпрограммы:
#include <iostream>
#include <math.h>
#include <stdio.h>
#include <windows.h>
#include <conio.h>
#define N 10000 // количество отчетов
double pi = 3.141592623582;
double fd = 15000; // частота дискретизации
double Td = 1/fd; // период дискретизации
double x1[3]={ 0.00175225785417 , -0.00135965324556, 0 };
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.