У випадку лінійних систем з постійними параметрами для аналізу проходження будь-якого сигналу достатньо знати результат проходження елементарного імпульсу у вигляді дельта-функції. Для дискретних систем також можна ввести в розгляд одиничну імпульсну функцію
Лінійна комбінація імпульсних характеристик
називається дискретної лінійної згорткою.
10.2. Дискретна згортка і її звернення
Дискретна згортка, що є основою алгоритму дискретної фільтрації, в MATLAB обчислюється за допомогою функції conv:
z = conv(x, у);
Знаючи результат згортки і один з згортаємих векторів, можна знайти другий. Дана операція (вона називається зверненням згортки - deconvolution) зводиться до поділу поліномів. У MATLAB ця операція реалізується з допомогою функції deconv, що має наступний синтаксис: [q, r] = deconv (b, a). Тут b - результат згортки (коефіцієнти полінома-чисельника), а - один з згортаємих векторів (коефіцієнти полінома-знаменника). Вихідні параметри мають наступний сенс: q - результат ділення поліномів (частка; quotient), тобто шуканий другий вектор згортки, r - залишок (remainder) від ділення поліномів (якщо вектор b дійсно є згорткою вектора a з чим-небудь, залишок від ділення буде нульовим).
10.3. Функція дискретної фільтрації
Основна функція, що реалізує дискретну фільтрацію в MATLAB, носить ім'я filter. У найпростішому вигляді вона має такий синтаксис:
у = filter(b, а, х);
Тут b - вектор коефіцієнтів нерекурсивний частини фільтра (чисельника функції передачі), а - вектор коефіцієнтів рекурсивної частини фільтра (знаменника функції передачі), х - вхідний сигнал. Повертаємой величиною є вектор відліків вихідного сигналу фільтра. Якщо перший елемент вектора а не дорівнює 1, значення векторів b і а нормуються - діляться на а(1).
function Example10_1
x=[1 3 2];
h=[1 2 3 4];
y=conv(x, h)
y =
1 5 11 17 18 8
[q, r]=deconv(y, h)
q =
1 3 2
r =
0 0 0 0 0 0
y=filter(h,1,x)
y =
1 5 11
y=filter(h,1,[x 0 0 0])
y =
1 5 11 17 18 8
h=[1 2 3 4];
convmtx(h, 4)
ans =
1 2 3 4 0 0 0
0 1 2 3 4 0 0
0 0 1 2 3 4 0
0 0 0 1 2 3 4
10.4. Компенсація фазового зсуву
При фільтрації сигналів в ряді випадків виникає вимога збереження фазових співвідношень у вхідному сигналі. Для цього потрібно фільтр з лінійною ФЧХ або, що те ж саме, з постійною (не залежить від частоти) фазової затримкою.
Для реалізації фільтрації з нульовим фазовим зрушенням в MATLAB призначена функція filtfilt. Синтаксис виклику функції filtfilt такий же, як для функції filter: у = filtfilt (b, а, х).
Наведемо приклад, який демонструє компенсацію фазового зсуву за допомогою функції filtfilt. Створимо сигнал у вигляді прямокутного імпульсу, доповненого з обох сторін нулями:
>> s=[zeros(50, 1); ones(100,1); zeros(50, 1)];
В якості фільтра використовуємо ФНЧ Чебишева першого роду з досить сильними пульсаціями АЧХ в смузі пропускання (3 дБ) і низькою частотою зрізу (0,05 частоти Найквіста), щоб вихідний імпульс був помітно спотворений:
>> [b, a]=cheby1(5, 3, 0.05);
Обробляємо сигнал за допомогою функцій filter і filtfilt і будуємо графіки вхідного і вихідних сигналів:
function Example10_2
s=[zeros(50, 1); ones(100,1); zeros(50, 1)];
[b, a]=cheby1(5, 3, 0.05); % компенсація фазового зсуву
s1=filter(b, a, s);
s2=filtfilt(b, a, s);
plot(s)
hold on
plot(s1, '--')
plot(s2, '-.')
hold off % На екрані вхідний сигнал (суцільна лінія), результат звичайної фільтрації (пунктирна лінія) і фільтрації з компенсацією фазового зсуву (штрих-пунктирна лінія).
Питання для самоперевірки
1. Що таке імпульсна характеристика?
2. У чому сутність дискретної згортки і її звернення?
3. Що таке функція дискретної фільтрації?
4. Що таке компенсація фазового зсуву