1、离散系统卷积计算
在信号与系统的学习中,我们经常会遇到如下图这种求离散LTI系统卷积的问题。
离散LTI系统的卷积计算公式为:y[n]=x[n]*h[n],计算可以采用列表法和卷积公式法,我们在此采用卷积公式法来计算。卷积公式法的计算包括四步:翻转,平移,相乘,相加。计算难度并不高,但过程较为麻烦,我们可以用python语言编程来实现计算。
2、程序目标
①能够直接输入数据。
②计算过程体现卷积公式法的步骤。
③输出结果直接明了。
④不调用其他模块。
3、程序实现
①首先采用列表格式进行输入,输入内容如上面图片示例便为:-2,-1,0,1用英文逗号间隔。
# 按列表格式输入,keysx为x[n]的位置信息,valuesx为x[n]的数值信息
keysx = input("请输入x[n]的位置信息,用逗号分隔: ").split(",")
valuesx = input("请输入x[n]的数值信息,用逗号分隔: ").split(",")
# 此时列表中的数据为str类型,需要进行类型转换:
int_keysx = [int(x) for x in keysx]
int_valuesx= [int(x) for x in valuesx]
# 同理,keysh为h[n]的位置信息,valuesh为h[n]的数值信息
keysh = input("请输入h[n]的位置信息,用逗号分隔: ").split(",")
valuesh = input("请输入h[n]的数值信息,用逗号分隔: ").split(",")
# 与上边同理,类型转换为int类型
int_keysh = [int(h) for h in keysh]
int_valuesh= [int(h) for h in valuesh]
# 简化变量名
xk=int_keysx
xv=int_valuesx
hk=int_keysh
hv=int_valuesh
②卷积公式法位置信息是通过x[n]左/右限+h[n]左/右限得到的,下边是代码实现
# l为y[n]的左限,r为y[n]的右限
l=xkl+hkl # x[n]左限+y[n]左限
r=xkr+hkr # x[n]右限+y[n]右限
def locate(l,r): # 通过y[n]的左右限生成位置信息的列表
loc=[]
while l<=r:
loc.append(l)
l += 1
return loc
③在卷积公式法中h[n]的位置信息需要进行翻转,然后再与x[n]的位置信息进行相乘和相加操作,因为书面计算具体过程,无法做到一比一转化为程序实现,所以我们可以将思维转换一下。
我们可以认为翻转后的h[n]与x[n]的相乘操作,是由列表内元素对应相乘得到的,可以通过补零操作将计算方式转化为下面:
此时就可以认为卷积公式法的相乘再相加操作,就是x[n]的数值信息列表中各元素,与h[n]的数值信息列表中各元素对应相乘,再将乘积相加。程序实现如下:
# 对hv(h的数值信息)进行翻转
hv.reverse()
# xv的长度lenx,hv的长度lenh
lenx=len(xv)
lenh=len(hv)
# tim平移操作次数(同时为补0后列表长度)
tim=lenx+lenh-1
# 按操作次数即位置长度进行补0操作
nx=tim-lenx # xv的补零位数
nh=tim-lenh # hv的补零位数
n=1
while n<=nh: # while循环末尾补0
hv.append(0)
n+=1
print(hv)
xv.reverse() # 对x[n]的数值信息进行补0操作
m=1 # 与上边相同,但x[n]不需要翻转,所以执行两次翻转
while m<=nx:
xv.append(0)
m+=1
xv.reverse()
print(xv)
yn=[]
s=0
while s<tim: # while循环嵌套for in循环计算相乘相加结果,并保存在yn列表中
mul = []
for i in range(0, tim):
mul.append(xv[i] * hv[i])
add=0
for j in mul:
add+=j
print("结果为:",add)
yn.append(add)
hv.insert(0, hv.pop()) # 通过此操作实现列表内元素的流动
s+=1
# y[n]的数值信息yn与位置信息locate函数的返回值loc
print(yn)
print(locate(l,r))
# 要进行绘图调用matplotlib模块
import matplotlib.pyplot as plt
# 绘制散点图
plt.scatter(locate(l,r),yn)
# 显示图形
plt.show()
4、总结
本程序是在程序运行时,输入x[n]与h[n]的四组数据,得到y[n]的两组数据。可以将整体结构进一步凝练,并定义为函数。个人水平有限,希望各位大佬不吝赐教。