Я думаю, что здесь есть небольшая путаница со сверткой. Мы используем свертку во временной области, чтобы вычислить реакцию линейной системы на произвольные входные данные. Для этого нам нужно знать импульсную характеристику системы. Будьте осторожны при переключении между непрерывной и дискретной системами - см., например, http://en.wikipedia.org/wiki/Impulse_invariance.
Импульсную характеристику (непрерывную) вашей системы (которую я предполагаю для напряжения резистора цепи LR) я определил для удобства как функцию времени t
: IR = lambda t: (R/L)*np.exp(-(R/L)*t) * H
.
Я также предположил, что ваши входные данные представляют собой ступенчатую функцию Хевисайда, которую я определил на временном интервале [0, 1] для временного шага 0,001 с.
Когда мы сворачиваем (дискретно), мы эффективно переворачиваем одну функцию и сдвигаем ее вдоль другой, умножая соответствующие значения и затем беря сумму. Чтобы использовать непрерывную импульсную характеристику со ступенчатой функцией, которая фактически состоит из последовательности дельта-функций Дирака, нам нужно умножить непрерывную импульсную характеристику на временной шаг dt
, как описано в ссылке Википедии выше об импульсной инвариантности. NB - настройка H[0] = 0.5
также важна.
Мы можем визуализировать эту операцию ниже. Любой заданный красный маркер представляет отклик в данный момент времени t
и является «суммовым произведением» зеленого входа и перевернутой импульсной характеристики, сдвинутой вправо на t
. Я попытался показать это с помощью нескольких серых импульсных откликов.
Код для расчета находится здесь.
import numpy as np
import matplotlib.pyplot as plt
R = 1e3 # Resistance
L = 3. #Inductance
dt = 0.001 # Millisecond timestep
# Define interval 1 second long, interval dt
t = np.arange(0, 1, dt)
# Define step function
H = np.ones_like(t)
H[0] = 0.5 # Correction for impulse invariance (cf http://en.wikipedia.org/wiki/Impulse_invariance)
# RL circuit - resistor voltage impulse response (cf http://en.wikipedia.org/wiki/RL_circuit)
IR = lambda t: (R/L)*np.exp(-(R/L)*t) * H # Don't really need to multiply by H as w is zero for t < 0
# Response of resistor voltage
response = np.convolve(H, IR(t)*dt, 'full')
Дополнительный код для создания сюжета находится здесь:
# Define new, longer, time array for plotting response - must be same length as response, with step dt
tp = np.arange(len(response))* dt
plt.plot(0-t, IR(t), '-', label='Impulse response (flipped)')
for q in np.arange(0.01, 0.1, 0.01):
plt.plot(q-t, IR(t), 'o-', markersize=3, color=str(10*q))
t = np.arange(-1, 1, dt)
H = np.ones_like(t)
H[t<0] = 0.
plt.plot(t, H, 's', label='Unit step function')
plt.plot(tp, response, '-o', label='Response')
plt.tight_layout()
plt.grid()
plt.xlabel('Time (s)')
plt.ylabel('Voltage (V)')
plt.legend()
plt.show()
Наконец, если у вас все еще есть некоторая путаница в отношении свертки, я настоятельно рекомендую «Цифровая обработка сигналов: практическое руководство для инженеров и ученых» Стивена В. Смита.
26.01.2015