圆周(循环)卷积
介绍略
圆周(循环)卷积过程
以两个序列做6点循环卷积为例子
- 补零(当两序列长度不等于N时)
- 周期延拓(有限长序列变周期序列)
- 反褶,取主值序列(周期序列的反褶)
- 圆周(循环)移位
- 在主值区间内进行相乘相加
代码实现
import numpy as np
# 填充零
def zero_padding(a, b, max_len):
max_len = 6
padded_a = np.pad(a, (0, max_len - len(a)), 'constant')
padded_b = np.pad(b, (0, max_len - len(b)), 'constant')
return padded_a, padded_b
def circular_convolution(a, b, N):
# 零填充序列
padded_a, padded_b = zero_padding(a, b, N)
print("填充的序列\n{}\n{}".format(padded_a,padded_b))
# 周期延拓若干次
periodic_a = np.tile(padded_a, 3)
periodic_b = np.tile(padded_b, 3)
print("周期延拓\n{}\n{}".format(periodic_a,periodic_b))
# 以原点为轴进行反褶
flipped_b = np.zeros_like(periodic_b)
for i in range(len(flipped_b)):
flipped_b[i] = periodic_b[-i+6]
print("翻折b序列\n{}\n".format(flipped_b))
# 取主值区间进行相乘相加
result = np.zeros(N)
for i in range(N):
# 向右循环移位
shifted_b = np.roll(flipped_b, i)[:N]
# print("b循环移位\n{}\n".format(shifted_b))
# 相乘相加
result[i] = np.sum(periodic_a[:N] * shifted_b)
print("循环卷积结果\n{}\n".format(result))
return result
# 做以下两个序列的6点循环卷积
a = np.array([1, 1, 1, 1, 1])
b = np.array([1, 2, 3])
# 以6点做循环 卷积
circular_conv_result = circular_convolution(a, b, 6)
这段代码首先对输入序列a和b进行零填充,使它们的长度达到6。然后对填充后的序列进行周期延拓,重复3次。接下来,对序列b进行翻折操作。之后,分别对翻折后的序列b进行循环移位,并与序列a进行相乘相加,最终得到循环卷积结果。
注意 本文参考华东理工大学《数字信号处理课程》关于循环卷积的内容用代码实现了一遍,有助于理解循环卷积的基本原理和操作,不代表真正的工程实现。
Reference
- 视频链接
https://www.bilibili.com/video/BV13P411P7Pv?p=42&vd_source=79bd183b688aadc954b121436a928d31