代码语言:javascript复制
import numpy as np#导入NumPy工具包,主要用于数组相关操作
#定义一维数组卷积计算函数
def MyConvolve(input,kernel):
#对h[n]进行180°翻转
kernel_flipped=np.array([kernel[len(kernel)-1-i] for i in range(len(kernel))])
len_input=len(input)#x[n]的长度
len_kernel=len(kernel)#h[n]的长度
#对输入数组进行零填充来解决卷积计算过程中的边缘对齐
padding=np.zeros(len_kernel-1,dtype='int')#填充数值为0
temp_pad=np.append(padding,input)#通过数组合并的方式进行填充
input_pad=np.append(temp_pad,padding)#0填充后的数组
#定义一个数组保存卷积结果,数组长度为:x[n]的长度 h[n]的长度-1
con_array=np.array(range(len_input len_kernel-1))#对x[n]与h[n]进行卷积计算
for m in range(len(con_array)):
sum_con=0
for n in range(len(kernel_flipped)):
sum_con=sum_con input_pad[n m]*kernel_flipped[n]
con_array[m]=sum_con#输出卷积结果
print("Input Signal:",input)
print("Convolution Kernel:",kernel)
print("Convolution:",con_array)
if __name__=='__main__':
input=[1,3,5,7,9,11,13]
kernel=[2,4,6,8]
kernel_flipped=kernel[::-1]
MyConvolve(input,kernel)
MyConvolve(input,kernel_flipped)
Input Signal: [1, 3, 5, 7, 9, 11, 13] Convolution Kernel: [2, 4, 6, 8] Convolution: [ 2 10 28 60 100 140 180 190 166 104] Input Signal: [1, 3, 5, 7, 9, 11, 13] Convolution Kernel: [8, 6, 4, 2] Convolution: [ 8 30 62 100 140 180 220 140 74 26]
算法:边缘卷积计算是在输入信号x[n]的前后部分添加一些采样点并将这些采样点的值皆设为0再进行卷积计算。