2015-03-08 848 views
1

我试图找到两个矩形脉冲的卷积。两个矩形脉冲的卷积Python

没有错误被抛出 - 我得到一个适当形状的波形输出 - 但是,我的答案的幅度似乎太大了,我也不确定如何拟合正确的x /时间轴到这个卷积。

此外,卷积的大小似乎取决于两个脉冲中采样的数量(基本上是采样频率) - 我认为这是不正确的。

由于我试图模拟一个连续时间信号,而不是离散的,我已经设置了很高的采样频率。

很明显,我做错了什么 - 但它是什么,我该如何纠正? 非常感谢 - 如果某些代码不是非常“pythonic”(最近的Java转换)!

编辑:虽然试图用手评估这一点,但我发现时间轴太小了2倍;再次,我不知道为什么会

import numpy as np 
import matplotlib.pyplot as plt 
from sympy.functions.special import delta_functions as dlta 

def stepFunction(t): #create pulses below from step-functions 
    retval = 0 
    if t == 0: 
     retval = 1 
    else: 
     retval = dlta.Heaviside(t) 
    return retval 

def hT (t=0, start=0, dur=8, samples=1000): 

    time = np.linspace(start, start + dur, samples, True) 
    data = np.zeros(len(time)) 
    hTArray = np.column_stack((time, data)) 

    for row in range(len(hTArray)): 
     hTArray[row][1] = 2 * (stepFunction(hTArray[row][0] - 4) - stepFunction(hTArray[row][0] - 6)) 
    return hTArray 

def xT (t=0, start=0, dur=8, samples=1000): 

    time = np.linspace(start, start + dur, samples, True) 
    data = np.zeros(len(time)) 
    hTArray = np.column_stack((time, data)) 

    for row in range(len(hTArray)): 
     hTArray[row][1] = (stepFunction(hTArray[row][0]) - stepFunction(hTArray[row][0] - 4)) 
    return hTArray  


hTArray = hT() #populate two arrays with functions 
xTArray = xT() 

resCon = np.convolve(hTArray[:, 1], xTArray[:, 1]) #convolute signals/array data 


Xaxis = np.linspace(hTArray[0][0], hTArray[len(hTArray) - 1][0], 
    len(resCon), endpoint=True) # create time axis, with same intervals as original functions 
#Plot the functions & convolution  
plt.plot(hTArray[:, 0], hTArray[:, 1], label=r'$x1(t)$') 
plt.plot(xTArray[:, 0], xTArray[:, 1], label=r'$x2(t)$') 
plt.plot(Xaxis, resCon) 

plt.legend(bbox_to_anchor=(0., 1.02, 1., .102), loc=3, 
    ncol=2, mode="expand", borderaxespad=0.) 

ax = plt.gca() 
ax.grid(True) 
ax.spines['right'].set_color('none') 
ax.spines['top'].set_color('none') 
ax.xaxis.set_ticks_position('bottom') 
ax.spines['bottom'].set_position(('data', 0)) 
ax.yaxis.set_ticks_position('left') 
ax.spines['left'].set_position(('data', 0)) 

plt.show() 

回答

2

当回旋离散信号,则需要相应地扩展,以保持信号的能量(在积分| X(t)| 2)常数:

import numpy as np 
import matplotlib.pyplot as plt 


n = 1000 
t = np.linspace(0, 8, n) 
T = t[1] - t[0] # sampling width 

x1 = np.where(t<=4, 1, 0) # build input functions 
x2 = np.where(np.logical_and(t>=4, t<=6), 2, 0) 

y = np.convolve(x1, x2, mode='full') * T # scaled convolution 
ty = np.linspace(0, 2*8, n*2-1) # double time interval 

# plot results:  
fg, ax = plt.subplots(1, 1) 
ax.plot(t, x1, label="$x_1$") 
ax.plot(t, x2, label="$x_2$") 
ax.plot(ty, y, label="$x_1\\star x_2$") 
ax.legend(loc='best') 
ax.grid(True) 

fg.canvas.draw() 
+0

对不起 - 只是增加一个后续问题 - 为什么时间间隔翻了一番,为什么要乘以等于| x(t)?|的时间间隔?谢谢! – davidhood2 2015-03-09 11:13:27

+1

输出数组的双倍长度与''np.convolve()''执行的方式有关,即使用''mode = full'' - 阅读相关文档。解释缩放的另一种方式:在* z(t)*上的离散化积分(这里是卷积或为能量)变为* sum_k z(t_k)* T *。 ''np.convolve()''假设''T = 1'',因此乘以''T''。 – Dietrich 2015-03-09 20:18:00