Linear system response by convolution with non-zero initial conditions

Всем известно, что такое импульсная переходная функция h линейной дискретной системы.
Но есть один тонкий момент: дискретная свертка y = h * u или
y[n]=\sum \limits _{{k=0}}^{{n}}h[k]u[n-k]
работает для моделирования отклика системы y на воздействие u только при нулевых начальных условиях. И почему-то нигде не сказано что делать, если у меня есть весовая функция h и ненулевые начальные условия.

 
На самом деле, получить формулу для отклика системы при заданных ненулевых начальных условиях не представляет большого труда, если учесть две идеи:
– отклик линейной системы представляет собой сумму отклика с нулевыми начальными условиями (это как раз вычисляется сверткой y = h * u) и отклика с заданными начальными условиями, но при нулевом входном воздействии:
y = h * u + y_0
– переходная функция h — это фактически вектор коэффициентов цифрового КИХ фильтра (мы полагаем, что система устойчива и в любом случае может быть представлена в виде КИХ-фильтра с достаточной точностью, поскольку коэффициенты h стремятся к нулю в хвосте)

Пусть d — вектор начальных состояний линий задержки (d_1 — состояние первого элемента, подключенного ко входу, d_2 — следующего и т.д.). Если мы знаем, что подавалось на вход системы в прошлый раз u_{prev}, то — это именно то, что осталось в линии задержки. Нарисовав структуру КИХ-фильтра, можно получить следующую формулу для его отклика на нулевой сигнал при заданном начальном состоянии.
y_0' = (h_{2,n})' * d = (h_{2,n})' * ({u_{prev}}_{1,n-1})'
где обозначено x’ — вектор x, записанный в обратном порядке; x_{m,k} — выбор элементов от x_m до x_k из вектора x.
Также предполагается, что входное воздействие u_{prev}, весовая функция h и выход y_0 — все одной длины n

Следующая функция в MATLAB — делает то, что мы хотим
% function calculates initial condition response to zero input for system h
function y_ic = calc_ic(u_prev,h)
N = length(u_prev);
d = fliplr(u_prev(1:N-1)); % delay line initial states
h_ = h(2:length(h)); h_ = fliplr(h_); % flip impulse response
% convolution for initial condition response
y_ic = conv(d,h_); y_ic = y_ic(1:N-1);
y_ic = fliplr(y_ic); y_ic(N) = 0;

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s