用python实现离散LTI系统的卷积公式计算,优化了输入方式,输出结果包含位置信息和数值信息

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]的两组数据。可以将整体结构进一步凝练,并定义为函数。个人水平有限,希望各位大佬不吝赐教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值