圆周卷积时域操作代码周期延拓翻折最终结果都要绘制在一张图上并且不能直接用现有函数
以下是一个实现圆周卷积时域操作的代码示例:
import numpy as np
import matplotlib.pyplot as plt
def circular_convolution(x, h):
N = len(x)
y = np.zeros(N)
for n in range(N):
for k in range(N):
y[n] += x[k] * h[(n-k) % N]
return y
def circular_extension(x, N):
extended_x = np.zeros(N)
for i in range(len(x)):
extended_x[i] = x[i]
for i in range(len(x), N):
extended_x[i] = x[i % len(x)]
return extended_x
def circular_fold(x, N):
folded_x = np.zeros(N)
for i in range(len(x)):
folded_x[i] = x[i]
for i in range(len(x), N):
folded_x[i] = x[N-i]
return folded_x
# 输入信号
x = np.array([1, 2, 3, 4])
# 系统响应
h = np.array([1, -1, 1, -1])
N = max(len(x), len(h))
# 周期延拓
extended_x = circular_extension(x, N)
extended_h = circular_extension(h, N)
# 圆周卷积
y1 = circular_convolution(extended_x, extended_h)
# 翻折
folded_x = circular_fold(x, N)
folded_h = circular_fold(h, N)
# 圆周卷积
y2 = circular_convolution(folded_x, folded_h)
# 绘制图形
plt.subplot(3, 1, 1)
plt.stem(x)
plt.title('Input Signal')
plt.subplot(3, 1, 2)
plt.stem(h)
plt.title('Impulse Response')
plt.subplot(3, 1, 3)
plt.stem(y1)
plt.stem(y2, linefmt='r-', markerfmt='ro')
plt.title('Circular Convolution')
plt.legend(['Circular Convolution with Extended Signals', 'Circular Convolution with Folded Signals'])
plt.tight_layout()
plt.show()
这段代码首先定义了三个函数:circular_convolution用于计算圆周卷积,circular_extension用于实现周期延拓,circular_fold用于实现翻折。
然后,定义了输入信号x和系统响应h,并计算出了延拓后的信号extended_x和extended_h,以及翻折后的信号folded_x和folded_h。
接下来,分别对延拓后的信号和翻折后的信号进行圆周卷积,得到y1和y2。
最后,使用Matplotlib库绘制三个子图,分别表示输入信号、系统响应和圆周卷积结果。其中,圆周卷积结果使用红色标记并添加图例。最后通过plt.tight_layout()调整子图之间的间距,并使用plt.show()显示图形。
注意:这段代码未经过全面测试,可能存在错误。您可以根据实际需要进行适当的修改和调整。
原文地址: https://www.cveoy.top/t/topic/i6eo 著作权归作者所有。请勿转载和采集!