Лабораторочки / ЦОС 2
.docxТекст кода:
clear all; close all; clc;
% 1. Формирование входного сигнала
x1 = 0; T1 = 0.003; T2 = 0.008; Fd = 5000; dx = 1/Fd;
U1 = 8; U2 = -3; U3 = 4; U4 = 0;
t1 = x1:dx:T1-dx;
t2 = T1:dx:T2;
k = [t1, t2];
a1 = (U2 - U1)/T1; b1 = U1; u1 = a1*t1 + b1;
a2 = (U4 - U3)/(T2 - T1); b2 = U3 - a2*T1; u2 = a2*t2 + b2;
u = [u1, u2];
% Добавление нулей
u_zero = [u, zeros(1, length(u))];
% 2. Коэффициенты фильтра
b = [0.0197, -0.0171, 0.0333, -0.0171, 0.0197];
a = [1, -3.0330, 3.8118, -2.2911, 0.5554];
% 3. Пропускание сигнала через фильтр
y = filter(b, a, u_zero);
% График входного и выходного сигналов
figure(1);
subplot(2,1,1);
stem(u, 'b');
title('Входной сигнал');
xlabel('Номер отсчета'); ylabel('x(k)');
grid on;
subplot(2,1,2);
stem(y, 'r');
title('Выходной сигнал');
xlabel('Номер отсчета'); ylabel('y(k)');
grid on;
% 4. Прямая форма
max_direct = max(max(abs(u_zero)), max(abs(y)));
fprintf('Прямая форма: max = %f\n', max_direct);
% 5. Каноническая форма
b_canonical = [1];
s_canonical = filter(b_canonical, a, u_zero);
figure(2);
stem(s_canonical, 'g');
title('Внутренний сигнал (каноническая форма)');
xlabel('Номер отсчета'); ylabel('s(k)');
grid on;
max_canonical = max(abs(s_canonical));
fprintf('Каноническая форма: max = %f\n', max_canonical);
% 6. Транспонированная форма
states = [];
s = [];
y_t = zeros(1, length(u_zero));
for i = 1:length(u_zero)
[y_t(i), s] = filter(b, a, u_zero(i), s);
states = [states s];
end
figure(3);
plot(states');
title('Внутренние сигналы (транспонированная форма)');
xlabel('Номер отсчета'); ylabel('s_i(k)');
legend('s1', 's2', 's3', 's4');
grid on;
max_transposed = max(abs(states(:)));
fprintf('Транспонированная форма: max = %f\n', max_transposed);
% 7. Характеристики фильтра в FVTool
fvtool(b, a);
% 8. Разложение на простые дроби
[r, p, k_coeff] = residuez(b, a);
disp('Вычеты r:'); disp(r);
disp('Полюсы p:'); disp(p);
disp('Целая часть k:'); disp(k_coeff);
disp('Модули полюсов:'); disp(abs(p));
disp('Фазы полюсов (рад):'); disp(angle(p));
disp('Модули вычетов:'); disp(abs(r));
disp('Фазы вычетов (рад):'); disp(angle(r));
Формирование входного сигнала
Рис. 1 – Формирования входного сигнала, добавление нулевых отсчетов и задание коэффициентов фильтра (стр. 1 – 16)
u_zero = [u, zeros(1, length(u))]; – Добавляем нулевые отсчёты в конец сигнала, чтобы увидеть затухающие переходные процессы после окончания сигнала.
Пропускание сигнала через фильтр
Рис. 2 – Код для пропускания сигнала через фильтр и построения графиков входного и выходного сигналов (стр. 17 – 31)
y = filter(b, a, u_zero); – функция filter реализует алгоритм дискретной фильтрации, на вход подается сигнал u_zero с добавленными нулями, на выход – отфильтрованный сигнал y
Оформляем графики только через функцию stem, для дискретных сигналов нужна именно такая форма графика, а не непрерывная линия
Рис 3. – Графики входного и выходного сигналов
Анализ прямой формы реализации дискретного фильтра
Рис. 4 – Структурная схема прямой формы реализации дискретного фильтра
Рис. 5 – Код анализа прямой формы реализации (стр. 31 – 33)
max_direct = max(max(abs(u_zero)), max(abs(y)));
abs(u_zero) — модули всех отсчётов входного сигнала
max(abs(u_zero)) — максимальное по модулю значение входного сигнала
max(abs(y)) — максимальное по модулю значение выходного сигнала
max(... , ...) — выбираем наибольшее из двух
Анализ канонической формы реализации дискретного фильтра
Рис. 6 – Структурная схема канонической формы реализации дискретного фильтра
Рис. 7 – Код анализа канонической формы реализации (стр. 34 – 43)
b_canonical = [1]; – коэффициент числителя 1
s_canonical = filter(b_canonical, a, u_zero); – Пропускаем входной сигнал через этот фильтр, на выходе получаем сигнал с линии задержки — внутреннее состояние канонической формы
max_canonical = max(abs(s_canonical)); – выводим максимальное по модулю значение
Рис. 8 – График внутреннего сигнала (каноническая форма)
Анализ транспонированной формы реализации дискретного фильтра
Рис. 9 – Структурная схема транспонированной формы реализации дискретного фильтра
Рис. 10 – Код анализа транспонированной формы реализации (стр. 44 – 60)
states = []; – пустая матрица для хранения истории внутренних состояний
s = []; – начальное состояние фильтра (пустое = нулевое)
y_t = zeros(1, length(u_zero)); – массив для выходного сигнала, заполненный нулями
for i = 1:length(u_zero)
[y_t(i), s] = filter(b, a, u_zero(i), s); – один отсчёт на вход, один на выход, обновлённое состояние
states = [states s]; – добавляем новый столбец (состояние в текущий момент) к матрице
end
Создаем цикл, так как Функция filter с дополнительным параметром s позволяет получить доступ к внутреннему состоянию. В цикле обрабатываем каждый отсчёт по отдельности, после каждого сохраняем состояние.
plot(states'); – транспонируем матрицу, чтобы каждый внутренний сигнал стал строкой
Рис. 10 – График внутренних сигналов (транспонированная форма)
Форма реализации |
Макс. состояние |
Прямая |
8 |
Каноническая |
200.280919 |
Транспонированная |
13.116203 |
Таблица 2 – Таблица результатов
Построение графиков характеристик фильтра
Рис. 11 – Функция для вызова характеристик фильтра в FVTool (стр. 61 – 62)
Рис. 12 – График АЧХ
Рис. 13 – График ФЧХ
Рис. 14 – График групповой задержки
Рис. 15 – График импульсной характеристики
Рис. 16 – График расположение нулей и полюсов функции передачи на комплексной плоскости
Получение аналитической формулы для импульсной характеристики фильтра
Рис. 17 – Код для разложения на простые дроби (стр. 63 – 71)
[r, p, k_coeff] = residuez(b, a);
residuez — разложение рациональной функции передачи на сумму простых дробей
r — вычеты
p — полюсы
k_coeff — целая часть (полиномиальная, если степень числителя ≥ степени знаменателя)
Рис. 18 – Результат работы программы (вывод значений)
|
Модуль |
Фаза, рад |
|
Вычеты |
|
r1 |
0.0645 |
2.0443 |
r2 |
0.0645 |
-2.0443 |
r3 |
0.2428 |
-1.4819 |
r4 |
0.2428 |
1.4819 |
|
Полюсы |
|
p1 |
0.9399 |
0.6251 |
p2 |
0.9399 |
-0.6251 |
p3 |
0.7929 |
0.3132 |
p4 |
0.7929 |
-0.3132 |
|
Целая часть |
|
k |
0.0355 |
|
Таблица 3 – Полюсы, вычеты и целая часть функции передачи фильтра
Аналитическая формула импульсной характеристики:
h(k)=0,0355⋅δ(k)+0,1290⋅(0,9399)k⋅cos(0,6251k+2,0443)+0,4856⋅(0,7929)k⋅cos(0,3132k−1,4819)
Вывод:
В ходе лабораторной работы дискретный сигнал из ЛР №1 был пропущен через рекурсивный фильтр 4-го порядка (вариант 10). На графиках входного и выходного сигналов наблюдаются искажения, вносимые фильтром, а также затухающий переходный процесс после окончания входного воздействия, что характерно для рекурсивных фильтров.
Анализ трёх форм реализации фильтра показал, что каноническая форма даёт наибольшее внутреннее состояние (200,28), что значительно превышает значения прямой (8) и транспонированной (13,12) форм. Это объясняется тем, что в канонической форме элементы памяти расположены в рекурсивной части, где сигналы накапливаются, в то время как в прямой форме хранятся непосредственно входные и выходные отсчёты, а в транспонированной — промежуточные суммы.
С помощью FVTool получены частотные характеристики фильтра: АЧХ, ФЧХ, групповая задержка, а также импульсная характеристика и карта нулей и полюсов. Разложение функции передачи на простые дроби позволило получить аналитическую формулу импульсной характеристики: сумма экспоненциально затухающих косинусоид с добавлением дельта-функции. Все полюсы фильтра находятся внутри единичной окружности (модули 0,94 и 0,79), что подтверждает устойчивость фильтра. Полученная аналитическая формула полностью соответствует численной импульсной характеристике, построенной в FVTool.
