zhuxianfeng 2020-06-01
最近舍友要写一份与循环卷积有关的报告,但是发现网上的都是matlab的循环卷积的代码,没有找到python的循环卷积代码,于是我就直接根据原理帮舍友用python实现了这个。
用的序列是x1=[1,2,3,4],x2=[1,1,1,1,0,0,0,0],以下是x1和x2的循环卷积的结果图。
话不多说,放代码了!
# -*- coding:utf-8 -*- import numpy as np import matplotlib.pyplot as plt #x1=[6,5,6,3,5,7,0,1] #x2=[7,1,2,9,4,3,20,1,2,3,5] x1=[1,2,3,4] x2=[1,1,1,1,0,0,0,0] #确定循环卷积序列的长度N N=max(len(x1),len(x2)) #补0 if len(x1)>len(x2): for i in range(len(x2),len(x1)): x2.append(0) else: for i in range(len(x1),len(x2)): x1.append(0) #序列x1周期延拓,以y轴为对称轴对称变换,截取0~N-1的序列 temp_x1=[] temp_x1.append(x1[0]) for i in range(1,len(x1)): temp_x1.append(x1[N-i]) print(temp_x1) #针对变化后的x1进行0~N-1的循环移动,获得一个N*N的cycle_matrix矩阵 x1=temp_x1 cycle_matrix=[] cycle_matrix.append(x1) for step in range(1,N): temp=[] for i in range(0,N): temp.append(0) for i in range(0,N): temp[(i+step)%N]=x1[i] cycle_matrix.append(temp) print(cycle_matrix) #矩阵相乘,获得循环卷积结果序列result cycle_matrix=np.array(cycle_matrix) x2=np.array(x2) result=np.matmul(cycle_matrix,np.transpose(x2)) result=list(result) nnum=[] for i in range(0,N): nnum.append(i) print(result,nnum) #画图 plt.bar (nnum,result,width=0.04,color =‘r‘) plt.xlabel (‘n‘) plt.ylabel (‘y‘) plt.title (‘result‘) plt.show ()