3、学习使用python的矩阵乘法函数np.dot,按照定义,编程实现圆周卷积函数circonv(x1,x2,L),求出序列x1=和x2=[2,5,4,3]的线性卷积和L点圆周卷积,并分别绘图; L=5+a,a为
时间: 2023-06-10 14:03:42 浏览: 82
非负整数。
非常感谢您的提问。为了回答您的问题,我需要先解释一下矩阵圆周卷积的概念。
矩阵圆周卷积是指对于长度为 L 的两个序列 x1 和 x2,将它们拼接在一起,得到一个长度为 2*L 的新序列 x,并求出其线性卷积;然后,将该线性卷积序列按照 L 取模的方式转换成长度为 L 的圆周卷积序列 c,即 c[i] = Σ j=0 to L-1 (x1[j] * x2[(i-j) mod L])。
为了实现圆周卷积函数,我们需要先定义一个矩阵乘法函数 np.dot,并且将序列 x1 和 x2 拼接成长度为 2*L 的序列 x。下面是代码实现:
import numpy as np
import matplotlib.pyplot as plt
def np_dot(x1, x2):
result = 0
for i in range(len(x1)):
result += x1[i] * x2[i]
return result
def circonv(x1, x2, L):
x = np.concatenate((x1, x2))
linear_conv = np.zeros(2*L)
for i in range(2*L):
for j in range(2*L - i):
linear_conv[i] += np_dot(x[j:j+L], x1[i-(j+L)])
circular_conv = np.zeros(L)
for i in range(L):
circular_conv[i] = linear_conv[i] % L
return circular_conv
x1 = [1, 4, 2, 7, 5]
x2 = [2, 5, 4, 3]
L = 5
linear_conv = np.convolve(x1, x2)
circular_conv = circonv(x1, x2, L)
print("线性卷积结果:", linear_conv)
print("圆周卷积结果:", circular_conv)
plt.subplot(2, 1, 1)
plt.stem(linear_conv)
plt.title("线性卷积")
plt.subplot(2, 1, 2)
plt.stem(circular_conv)
plt.title("圆周卷积")
plt.show()
以上代码中,np.concatenate() 函数将 x1 和 x2 拼接成长度为 2*L 的新序列 x;np.convolve() 函数计算 x1 和 x2 的线性卷积;circonv() 函数实现了矩阵圆周卷积的计算过程。最后,我们用 matplotlib 库中的 stem() 函数分别绘制线性卷积和圆周卷积的图形。
阅读全文